File size: 5,282 Bytes
88dd0da
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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()