import requests from bs4 import BeautifulSoup # Функция для получения новостей через API def get_news(api_key, query, language='ru', page_size=10): url = 'https://newsapi.org/v2/everything' params = { 'q': query, 'language': language, 'pageSize': page_size, 'apiKey': api_key } response = requests.get(url, params=params) if response.status_code == 200: return response.json()['articles'] else: print(f"Ошибка: {response.status_code}") return [] # Функция для получения тела статьи по ссылке def get_article_body(url): try: # Загружаем страницу response = requests.get(url) response.raise_for_status() # Проверяем, что запрос успешен soup = BeautifulSoup(response.text, 'html.parser') # Пример для Habr if 'habr.com' in url: body = soup.find('div', class_='article-formatted-body') if body: return body.get_text(strip=True) # Пример для Lenta.ru elif 'lenta.ru' in url: body = soup.find('div', class_='topic-body__content') if body: return body.get_text(strip=True) # Если сайт не поддерживается, возвращаем пустую строку return "" except Exception as e: print(f"Ошибка при получении статьи: {e}") return "" # Функция для обработки текста через LM Studio def process_text_with_lm(text, lm_api_url): if not text: return "" # Пример структуры статьи article_structure = ( "Структура статьи:\n" "1. Заголовок: Убедитесь, что он привлечет внимание.\n" "2. Введение: Кратко описать тему и зачем она важна.\n" "3. Основная часть: Подробное изложение фактов, данных и мнений по теме.\n" " - Подразделы: Если необходимо, разделите на несколько разделов.\n" "4. Заключение: Подвести итоги и дать рекомендации или вопросы для размышления.\n" "5. Источники: Указать используемые источники информации, если применимо.\n" ) # Отправляем текст в LM Studio с улучшенными промтами payload = { "model": "", # Убедитесь, что модель правильная "messages": [ {"role": "system", "content": "Вы — экспертный писатель, и ваша задача — создать качественную новостную статью."}, {"role": "user", "content": f"Напишите статью на основе следующего текста:\n{text}\n\n{article_structure}"} ], "temperature": 0.7, "max_tokens": 5000, # Увеличьте значение для более длинных статей "stream": False } try: response = requests.post(lm_api_url, json=payload) response.raise_for_status() # Проверим статус кода ответа return response.json()['choices'][0]['message']['content'] # Извлекаем содержимое ответа except Exception as e: print(f"Ошибка при обработке текста: {e}") return "" # Функция для обработки новостей с извлечением тела статьи и обработкой через LM Studio def process_news_with_body(news, lm_api_url): for article in news: title = article['title'] url = article['url'] # Получаем тело статьи body = get_article_body(url) # Обрабатываем тело статьи через LM Studio processed_body = process_text_with_lm(body, lm_api_url) # Выводим результат print(f"Заголовок: {title}") print(f"Ссылка: {url}") print(f"Обработанное тело статьи:\n{processed_body}") print('---') # Основная функция def main(): # Настройки api_key = 'c77fda8ccb9b446d88abc56bd6f548c1' # Замените на ваш API ключ от NewsAPI query = 'технологии' # Тема для поиска новостей lm_api_url = 'http://localhost:1234/v1/chat/completions' # Замените на ваш URL API LM Studio # Получаем новости news = get_news(api_key, query) # Обрабатываем новости process_news_with_body(news, lm_api_url) # Запуск программы if __name__ == "__main__": main()