вывод категорий
Some checks failed
continuous-integration/drone/push Build encountered an error
continuous-integration/drone Build is passing

This commit is contained in:
2026-04-11 00:28:29 +10:00
parent 0fb2dc63e0
commit 8de5320b42
2 changed files with 27 additions and 36 deletions

33
main.py
View File

@@ -26,32 +26,18 @@ import uvicorn
import requests import requests
# Добавляем импорт psycopg2
import psycopg2
# Локальные импорты # Локальные импорты
# import settings_work as sw # import settings_work as sw
import work_parser as wp import work_parser as wp
DOCUMENTS_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "documents") DOCUMENTS_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "documents")
# Создаём соединение с PostgreSQL
conn = psycopg2.connect(
dbname="parsed_url",
user="postgres",
password="qwertyqwerty123123",
host="45.129.78.228",
connect_timeout=100,
options="-c statement_timeout=30000" # таймаут запроса 30 сек
)
conn.autocommit = True
@asynccontextmanager @asynccontextmanager
async def lifespan(app: FastAPI): async def lifespan(app: FastAPI):
"""Управление жизненным циклом приложения""" """Управление жизненным циклом приложения"""
# Startup # Startup
scheduler.add_job(scheduled_parser_1, "cron", hour=10, minute=0) scheduler.add_job(scheduled_parser_1, "cron", hour=0, minute=0)
scheduler.add_job(scheduled_parser_2, "cron", hour=11, minute=0) scheduler.add_job(scheduled_parser_2, "cron", hour=1, minute=0)
scheduler.start() scheduler.start()
yield yield
# Shutdown # Shutdown
@@ -416,7 +402,7 @@ def start_pars_all_istochnik(url:str, promt:str):
continue continue
# Фильтрация по ключевым словам (пример для новостных сайтов) # Фильтрация по ключевым словам (пример для новостных сайтов)
path_lower = parsed.path.lower() # path_lower = parsed.path.lower()
# if any(keyword in path_lower for keyword in ['/news/', 'article', '2026', '2027', '/blog/', '/post/']): # if any(keyword in path_lower for keyword in ['/news/', 'article', '2026', '2027', '/blog/', '/post/']):
print(f"Парсинг {abs_url}") print(f"Парсинг {abs_url}")
if check_url(abs_url) == False and wp.check_error_url(abs_url): if check_url(abs_url) == False and wp.check_error_url(abs_url):
@@ -488,10 +474,19 @@ def get_tasks_offset(limit: int = Query(10, gt=0), offset: int = Query(0, ge=0))
def get_settings(): def get_settings():
return wp.get_all_promt() return wp.get_all_promt()
@app.get("/categories_promt", summary="Метод получения categories_promt")
def get_categories_promt():
return wp.get_all_categories_promt()
class Source(BaseModel):
url: str
name: str
promt: str
# POST метод для установки настроек # POST метод для установки настроек
@app.post("/settings", summary="Метод сохранения настроек парсера") @app.post("/settings", summary="Метод сохранения настроек парсера")
def set_settings(settings: wp.Source): def set_settings(settings: Source):
return wp.update_promt(settings) return wp.update_promt(settings.url, settings.name, settings.promt)
@app.delete("/delete_task/{task_id}", summary="Метод удаления задачи") @app.delete("/delete_task/{task_id}", summary="Метод удаления задачи")
def delete_task(task_id: int): def delete_task(task_id: int):

View File

@@ -1,6 +1,5 @@
import psycopg2 import psycopg2
from psycopg2.extras import RealDictCursor from psycopg2.extras import RealDictCursor
from pydantic import BaseModel
# Подключение к БД (укажи свои параметры) # Подключение к БД (укажи свои параметры)
conn = psycopg2.connect( conn = psycopg2.connect(
@@ -9,6 +8,8 @@ conn = psycopg2.connect(
password="qwertyqwerty123123", password="qwertyqwerty123123",
host="45.129.78.228", host="45.129.78.228",
# host="127.0.0.1" # host="127.0.0.1"
connect_timeout=10,
options="-c statement_timeout=30000" # таймаут запроса 30 сек
) )
conn.autocommit = True conn.autocommit = True
@@ -77,7 +78,6 @@ def update_task(task_id, **fields):
return True return True
def create_table_config_gpt(): def create_table_config_gpt():
with conn.cursor() as cur: with conn.cursor() as cur:
cur.execute(""" cur.execute("""
@@ -89,15 +89,7 @@ def create_table_config_gpt():
""") """)
print("Таблица config_gpt создана или уже существует") print("Таблица config_gpt создана или уже существует")
class Source (BaseModel): def update_promt(url: str, name: str, promt: str):
url: str
name: str
promt: str
def update_promt(data: Source):
if isinstance(data, dict):
data = Source.model_validate(data)
with conn.cursor() as cur: with conn.cursor() as cur:
cur.execute(""" cur.execute("""
INSERT INTO config_gpt (url, name, promt) INSERT INTO config_gpt (url, name, promt)
@@ -105,7 +97,7 @@ def update_promt(data: Source):
ON CONFLICT (url) DO UPDATE SET ON CONFLICT (url) DO UPDATE SET
name = EXCLUDED.name, name = EXCLUDED.name,
promt = EXCLUDED.promt promt = EXCLUDED.promt
""", (data.url, data.name, data.promt)) """, (url, name, promt))
conn.commit() conn.commit()
def get_promt(promt_name_url): def get_promt(promt_name_url):
@@ -114,7 +106,6 @@ def get_promt(promt_name_url):
promt = cur.fetchone() promt = cur.fetchone()
return promt['promt'] return promt['promt']
def get_all_promt(): def get_all_promt():
with conn.cursor(cursor_factory=RealDictCursor) as cur: with conn.cursor(cursor_factory=RealDictCursor) as cur:
cur.execute("SELECT * FROM config_gpt") cur.execute("SELECT * FROM config_gpt")
@@ -123,7 +114,13 @@ def get_all_promt():
sources = [{"url": row["url"], "name": row["name"], "promt": row["promt"]} for row in rows] sources = [{"url": row["url"], "name": row["name"], "promt": row["promt"]} for row in rows]
return {"sources": sources} return {"sources": sources}
def get_all_categories_promt():
"""Возвращает список всех значений поля name из таблицы config_gpt"""
with conn.cursor(cursor_factory=RealDictCursor) as cur:
cur.execute("SELECT name FROM config_gpt")
rows = cur.fetchall()
return [row["name"] for row in rows]
def create_table_error_url(): def create_table_error_url():
with conn.cursor() as cur: with conn.cursor() as cur:
@@ -158,7 +155,6 @@ def check_error_url(error_sources_url: str) -> bool:
""", (error_sources_url,)) """, (error_sources_url,))
row = cur.fetchone() row = cur.fetchone()
return row is None return row is None
@@ -170,5 +166,5 @@ def check_error_url(error_sources_url: str) -> bool:
# "name": "Корея", # "name": "Корея",
# "promt": "Задача: Перевод на русский язык и тематическая фильтрация новостных статей из китайской прессы. \n Необходимо переводить текст статьи и определять, относится ли она к КНР по указанным темам: \n 1. Перевод\n Переведи предоставленный китайский текст на русский язык, сохранив оригинальный смысл, стиль и структуру.\n Текст:\n {content}\n -------------------------------------\n 2. Отбирай исключительно новости, прямо относящиеся к Китаю, его безопасности, соседним странам и территориям, влияющим на интересы Китая.\n Если не относится к Китаю — считаем, что статья НЕ подходит, и отдаем пустой JSON:\n {\"text\": \"\", \"pereskas\": \"\", \"title\": \"\", \"topics\": []}\n Если привязка есть — переходи к шагу 3. \n -------------------------------------\n 3. Тематическая классификация\n Определи, относится ли статья к одной или нескольким темам из списка:\n 1) Военные новости — конфликты, учения, мобилизация, закупки вооружений. \n 2) Пограничная деятельность — охрана границы, пограничные учения, строительство или модернизация пограничной инфраструктуры, техника для пограничников. \n 3) Пункты пропуска на границе с РФ — изменения режима работы, строительство, реконструкция, оборудование, логистика. \n 4) Пограничные реки — состояние рек, экология, инфраструктурные проекты, мониторинг. \n 5) Чрезвычайные ситуации — природные и техногенные происшествия, особенно затрагивающие пограничные реки и прилегающие земли. \n 6) Санитарно-эпидемиологическая обстановка — эпидемии, эпизоотии, эпифитотии, угрозы и меры предотвращения. \n 7) Индустриальные проекты (арктическое/антарктическое направление). \n 8) Индустриальные проекты в приграничных районах — заводы, производства, технопарки, новые технологии. \n 9) Инфраструктурные проекты в приграничных районах — дороги, мосты, транспорт, логистика. \n 10) Культура малочисленных народностей (нанайцы, монголы, уйгуры, нанайцы и хэчжэ) — политика, традиции, бытовая жизнь нанайцев, монголов, уйгуров, и хэчжэ (малочисленных народов).\n\n Отметь только те темы, которым статья действительно соответствует.\n\n -------------------------------------\n 4. Формат ответа \n Вернуть строго JSON без пояснений и дополнительных слов:\n {\n \"translation_text\": \"<перевод текста статьи на русский язык (дословный, точный и без сокращений ) >\",\n \"short_text\": \"<пересказ переведённого текста>\",\n \"title\": \"<краткая суть новости (12 предложения)>\",\n \"category\": \"<названий категорий, которым соответствует статья>\"\n }\n Если статья не относится ни к одной теме или не привязана к нужным регионам — вернуть:\n {\"translation_text\": \"\", \"short_text\": \"\", \"title\": \"\", \"category\": \"\"}" # "promt": "Задача: Перевод на русский язык и тематическая фильтрация новостных статей из китайской прессы. \n Необходимо переводить текст статьи и определять, относится ли она к КНР по указанным темам: \n 1. Перевод\n Переведи предоставленный китайский текст на русский язык, сохранив оригинальный смысл, стиль и структуру.\n Текст:\n {content}\n -------------------------------------\n 2. Отбирай исключительно новости, прямо относящиеся к Китаю, его безопасности, соседним странам и территориям, влияющим на интересы Китая.\n Если не относится к Китаю — считаем, что статья НЕ подходит, и отдаем пустой JSON:\n {\"text\": \"\", \"pereskas\": \"\", \"title\": \"\", \"topics\": []}\n Если привязка есть — переходи к шагу 3. \n -------------------------------------\n 3. Тематическая классификация\n Определи, относится ли статья к одной или нескольким темам из списка:\n 1) Военные новости — конфликты, учения, мобилизация, закупки вооружений. \n 2) Пограничная деятельность — охрана границы, пограничные учения, строительство или модернизация пограничной инфраструктуры, техника для пограничников. \n 3) Пункты пропуска на границе с РФ — изменения режима работы, строительство, реконструкция, оборудование, логистика. \n 4) Пограничные реки — состояние рек, экология, инфраструктурные проекты, мониторинг. \n 5) Чрезвычайные ситуации — природные и техногенные происшествия, особенно затрагивающие пограничные реки и прилегающие земли. \n 6) Санитарно-эпидемиологическая обстановка — эпидемии, эпизоотии, эпифитотии, угрозы и меры предотвращения. \n 7) Индустриальные проекты (арктическое/антарктическое направление). \n 8) Индустриальные проекты в приграничных районах — заводы, производства, технопарки, новые технологии. \n 9) Инфраструктурные проекты в приграничных районах — дороги, мосты, транспорт, логистика. \n 10) Культура малочисленных народностей (нанайцы, монголы, уйгуры, нанайцы и хэчжэ) — политика, традиции, бытовая жизнь нанайцев, монголов, уйгуров, и хэчжэ (малочисленных народов).\n\n Отметь только те темы, которым статья действительно соответствует.\n\n -------------------------------------\n 4. Формат ответа \n Вернуть строго JSON без пояснений и дополнительных слов:\n {\n \"translation_text\": \"<перевод текста статьи на русский язык (дословный, точный и без сокращений ) >\",\n \"short_text\": \"<пересказ переведённого текста>\",\n \"title\": \"<краткая суть новости (12 предложения)>\",\n \"category\": \"<названий категорий, которым соответствует статья>\"\n }\n Если статья не относится ни к одной теме или не привязана к нужным регионам — вернуть:\n {\"translation_text\": \"\", \"short_text\": \"\", \"title\": \"\", \"category\": \"\"}"
# }) # })
# print(get_promt("japan")) # # print(get_promt("japan"))
# create_table_error_url() # # create_table_error_url()