import os import requests from requests.exceptions import RequestException from bs4 import BeautifulSoup import concurrent.futures from io import BytesIO import streamlit as st def extract_part_numbers_and_manufacturers(url): try: response = requests.get(url) if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') links = soup.find_all('a') art_links = [link.get('href') for link in links if link.get('href') and link.get('href').startswith('/art')] if art_links: unique_art_links = list(set(art_links)) parts_info = [] part_urls = [] for link in unique_art_links: parts = link.split('-') if len(parts) >= 4: part_number = parts[1] manufacturer = '-'.join(parts[2:-1]) part_link = f'https://alfacars.com.ua/index.php?route=product/search&search={part_number}' part_info = f'{part_number} - {manufacturer}' parts_info.append(part_info) part_urls.append(part_link) if parts_info: chunks = [parts_info[i:i + 100] for i in range(0, len(parts_info), 100)] return chunks, part_urls else: return None, None else: return None, None else: return None, None except requests.RequestException: return None, None def get_manufacturer_info(manufacturer): try: url = f'https://avto.pro/makers/{manufacturer}' response = requests.get(url) if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') description = soup.find('div', {'class': 'maker-descr'}).text.strip() stars = soup.find('span', {'class': 'star-line'}) stars_html = ''.join(['★' if star.get('class') and 'star-line__star--full' in star.get('class') else '☆' for star in stars.find_all('i')]) if stars else '' st.write(f'Информация о фирме {manufacturer}:\n{description}\n{stars_html}') else: st.write('Ошибка при получении информации о фирме.') except requests.RequestException: st.write('Информация о фирме не найдена. Попробуйте ввести VIN-код.') def check_part_availability(part_urls): available_parts = [] with concurrent.futures.ThreadPoolExecutor() as executor: futures = {executor.submit(check_part_url, url): url for url in part_urls} for future in concurrent.futures.as_completed(futures): url = futures[future] try: result = future.result() if result: available_parts.append(url) except Exception as e: print(f"Ошибка при проверке {url}: {e}") return available_parts def check_part_url(url): try: response = requests.get(url) if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') buy_button = soup.find('button', {'onclick': lambda x: x and 'cart.add' in x}) if buy_button: return True except requests.RequestException as e: print(f"Ошибка при запросе {url}: {e}") return False def get_clickable_links(part_numbers_and_manufacturers): clickable_links = '' for part_info in part_numbers_and_manufacturers: part_number, manufacturer = part_info.split(' - ') part_number = part_number.split(' ')[0] url = f'https://alfacars.com.ua/index.php?route=product/search&search={part_number}' try: response = requests.get(url) if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') buy_button = soup.find('button', {'onclick': lambda x: x and 'cart.add' in x}) if buy_button: clickable_links += f'{part_number} - {manufacturer}\n' else: clickable_links += f'{part_number} - {manufacturer}\n' except requests.RequestException: clickable_links += f'{part_number} - {manufacturer}\n' return clickable_links def get_vin_info(vin_code): url = f"https://www.ilcats.ru/?vin={vin_code}&VinAction=Search" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36' } response = requests.get(url, headers=headers) if response.status_code == 200: soup = BeautifulSoup(response.content, "html.parser") table = soup.find("table") if table: rows = table.find_all("tr") info = "" for row in rows: cols = row.find_all("td") if len(cols) == 2: label = cols[0].text.strip() value = cols[1].text.strip() info += f"{label}: {value}\n" st.text(info) st.write(f"Показать информацию: https://starchik-vinco.hf.space?vin_code={vin_code}") else: st.write("") else: st.write("Ошибка при запросе информации о VIN-коде. Попробуйте еще раз.") def get_auto_lot_info(query): url = "https://ru.autoauctionspot.com/salvage-cars-auction/" payload = { 'lot-type-available-to-bid': '1', 'search-term': query, } images = [] # Определение переменной images перед использованием try: response = requests.post(url, data=payload) response.raise_for_status() soup = BeautifulSoup(response.content, 'html.parser') lot_title = soup.find('h1', class_='slider-name').text.strip() damage_info = soup.find('div', class_='char-line') damage_type_primary = damage_info.find('span', class_='char-info-envelope').text.strip() damage_type_secondary = damage_info.find_all('span', class_='char-info-envelope')[1].text.strip() lot_info = f"Лот: {lot_title}\nУщерб: {damage_type_primary}, {damage_type_secondary}\n" char_wrap = soup.find_all('div', class_='char-wrap') for char_box in char_wrap: char_lines = char_box.find_all('div', class_='char-line') for char_line in char_lines: char_name = char_line.find('span', class_='char-name').text.strip() char_info = char_line.find('span', class_='char-info').text.strip() lot_info += f"{char_name}: {char_info}\n" car_slider = soup.find('div', class_='car-slider') image_links = [figure.a['href'] for figure in car_slider.find_all('figure')] for link in image_links: image_response = requests.get(link) image_data = BytesIO(image_response.content) images.append(image_data) final_bid_info = soup.find('div', class_='copart-bid_final') final_bid_title = final_bid_info.find('span', class_='copart-bid-title').text.strip() final_bid_amount = final_bid_info.find('span', class_='copart-price').text.strip() final_bid_info = f"{final_bid_title}: {final_bid_amount}" return lot_info, images, final_bid_info except requests.RequestException as e: print(f"Ошибка при запросе {url}: {e}") return None, None, None except Exception as e: print(f"Необработанная ошибка в get_auto_lot_info: {e}") return None, None, None def search_part_info(part_code): found_results = False try: query = part_code.replace(' ', '+') url = f'https://dok.ua/result2/query?q={query}' response = requests.get(url) if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') links = soup.find_all('a') found_link = None for link in links: href = link.get('href') if href and '/result2/art?id=' in href: found_link = href break if found_link: found_url = f'https://dok.ua{found_link}' part_info_chunks, _ = extract_part_numbers_and_manufacturers(found_url) if part_info_chunks: part_numbers_and_manufacturers = [part_info for part_info_chunk in part_info_chunks for part_info in part_info_chunk] part_info_text = '\n'.join(part_numbers_and_manufacturers) + '\n' st.text(part_info_text) clickable_links = get_clickable_links(part_numbers_and_manufacturers) st.markdown(clickable_links, unsafe_allow_html=True) found_results = True else: get_manufacturer_info(part_code) else: lot_info, images, final_bid_info = get_auto_lot_info(query) if lot_info is not None and images is not None and final_bid_info is not None: st.text((lot_info or '') + "\n" + (final_bid_info or '')) if images: st.image(images) found_results = True get_vin_info(part_code) else: st.text("Нет результатов...") else: st.text(f"Ошибка при запросе {url}. Статус код: {response.status_code}") if not found_link and not found_results: st.text('Информация не найдена') except Exception as e: st.text(f"Ошибка в обработчике сообщений: {e}") if not found_results: st.text('Что-то пошло не так... Пожалуйста, попробуйте позже.') if __name__ == '__main__': st.title("Alfabot Streamlit") part_code = st.text_input("Введите код запчасти, VIN-код или название фирмы") if st.button("Поиск информации"): st.text("Идет поиск информации...") found_results = False try: query = part_code.replace(' ', '+') url = f'https://dok.ua/result2/query?q={query}' response = requests.get(url) if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') links = soup.find_all('a') found_link = None for link in links: href = link.get('href') if href and '/result2/art?id=' in href: found_link = href break if found_link: found_url = f'https://dok.ua{found_link}' part_info_chunks, _ = extract_part_numbers_and_manufacturers(found_url) if part_info_chunks: part_numbers_and_manufacturers = [part_info for part_info_chunk in part_info_chunks for part_info in part_info_chunk] part_info_text = '\n'.join(part_numbers_and_manufacturers) + '\n' st.text(part_info_text) clickable_links = get_clickable_links(part_numbers_and_manufacturers) st.markdown(clickable_links, unsafe_allow_html=True) found_results = True else: get_manufacturer_info(part_code) else: lot_info, images, final_bid_info = get_auto_lot_info(query) if lot_info is not None and images is not None and final_bid_info is not None: st.text((lot_info or '') + "\n" + (final_bid_info or '')) if images: st.image(images) found_results = True else: st.text("") else: st.text(f"Ошибка при запросе {url}. Статус код: {response.status_code}") if not found_link and not found_results: st.text('Информация не найдена') get_vin_info(part_code) except Exception as e: st.text(f"Ошибка в обработчике сообщений: {e}") if not found_results: st.text('Что-то пошло не так... Пожалуйста, попробуйте позже.')