перевод
Some checks failed
continuous-integration/drone Build is failing

This commit is contained in:
2026-04-04 13:43:17 +10:00
parent 60224501ab
commit d4224de2e1
4 changed files with 166 additions and 48 deletions

101
main.py
View File

@@ -26,6 +26,8 @@ import requests
import settings_work as sw
import work_parser as wp
DOCUMENTS_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "documents")
@asynccontextmanager
async def lifespan(app: FastAPI):
"""Управление жизненным циклом приложения"""
@@ -49,11 +51,6 @@ scheduler = AsyncIOScheduler()
logging.basicConfig(filename="app.log", level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
logger = logging.getLogger(__name__)
@app.get("/logs")
def get_logs():
with open("app.log", "r") as file:
lines = file.readlines()[-10:] # последние 10 строк
return {"logs": lines}
# Инициализация таблицы статуса парсинга
wp.create_table()
@@ -208,12 +205,21 @@ def extract_text_from_url(url, timeout=10, verify=True):
# Общий запрос на GPT
def gpt_response_message(content, ist_number=1):
Promts = sw.read_settings().sources
# Promts = sw.read_settings().sources
# if ist_number == 1:
# contentGPT = Promts[0].prompt.replace('{content}', content)
# else:
# contentGPT = Promts[1].prompt.replace('{content}', content)
if ist_number == 1:
contentGPT = Promts[0].prompt.replace('{content}', content)
url_ist = "http://epaper.hljnews.cn/hljrb/pc/layout"
else:
contentGPT = Promts[1].prompt.replace('{content}', content)
url_ist = "https://def.ltn.com.tw/breakingnewslist"
contentGPT = wp.get_promt(url_ist).replace('{content}', content)
url = 'http://45.129.78.228:8484' #10.8.0.14:5500
params = {'text': contentGPT}
@@ -230,26 +236,18 @@ def gpt_response_message(content, ist_number=1):
logger.info(f"gpt_response_message: {ex}")
retries += 1
else:
restart_service('work_gpt.service')
print(f"\n\n\tПерезапуск GPT\n\n")
try:
response = requests.get(url, params=params, timeout=15)
return response.text
except Exception as ex:
print(f"Ошибка при запросе к GPT: {ex}")
logger.info(f"gpt_response_message: {ex}")
retries += 1
logger.info(f"Привышен лимит запросов {max_retries}")
return ""
# перезапуск сервиса GPT при неудачных попытках запроса
def restart_service(service_name):
try:
subprocess.run(['sudo', 'systemctl', 'restart', service_name], check=True)
time.sleep(30)
print(f"Сервис {service_name} успешно перезапущен")
except subprocess.CalledProcessError:
print(f"Не удалось перезапустить сервес {service_name}")
# def restart_service(service_name):
# try:
# subprocess.run(['sudo', 'systemctl', 'restart', service_name], check=True)
# time.sleep(30)
# print(f"Сервис {service_name} успешно перезапущен")
# except subprocess.CalledProcessError:
# print(f"Не удалось перезапустить сервес {service_name}")
# Общие функции проверки ссылок
@@ -296,9 +294,10 @@ def update_bd_and_create_document(response_text, article_date, url, parsed_at, o
print(requests.post('http://45.129.78.228:8002/save_parsed_data', json=data))
path_day = article_date.split()[0]
if not os.path.exists(path_day):
os.makedirs(path_day)
print(f"Создана папка: {path_day}")
documents_path = os.path.join(DOCUMENTS_DIR, path_day)
if not os.path.exists(documents_path):
os.makedirs(documents_path)
print(f"Создана папка: {documents_path}")
doc = Document()
doc.add_heading('Ссылка на статью', level=1)
@@ -316,7 +315,7 @@ def update_bd_and_create_document(response_text, article_date, url, parsed_at, o
doc.add_heading('Оригинальный текст', level=1)
doc.add_paragraph(original_text)
doc_name = f"{data['title']}.docx"
doc_path = os.path.join(path_day, doc_name)
doc_path = os.path.join(documents_path, doc_name)
doc.save(doc_path)
print(f"Сохранен документ: {doc_path}")
except Exception as ex:
@@ -397,12 +396,10 @@ def start_pars_two_istochnik():
# Функции для автоматического запуска
def scheduled_parser_1():
"""Планировщик для первого парсера"""
istochnik = "" # пустая строка = текущая дата
start_pars_one_istochnik(istochnik.split("."))
def scheduled_parser_2():
"""Планировщик для второго парсера"""
start_pars_two_istochnik()
class ParserOneRequest(BaseModel):
@@ -427,21 +424,51 @@ def get_tasks_offset(limit: int = Query(10, gt=0), offset: int = Query(0, ge=0))
# GET метод для получения настроек
@app.get("/settings", summary="Метод получения настроек парсера")
def get_settings():
return sw.read_settings()
return wp.get_all_promt()
# POST метод для установки настроек
@app.post("/settings", summary="Метод сохранения настроек парсера")
def set_settings(settings: sw.Source):
return sw.update_source(settings)
def set_settings(settings: wp.Source):
return wp.update_promt(settings)
@app.delete("/delete_task/{task_id}", summary="Метод удаления задачи")
def delete_task(task_id: int):
return print(wp.delete_task(task_id))
# @app.get("/file_download", summary="Метод для скачивания файла")
# async def download_file(path: str, title: str):
# path = f"./{path}/{title}.docx" #os.path.abspath(path)
# return FileResponse(path=path, filename=f'{title}.docx', media_type='multipart/form-data')
@app.get("/file_download", summary="Метод для скачивания файла")
async def download_file(path: str, title: str):
path = f"./{path}/{title}.docx" #os.path.abspath(path)
return FileResponse(path=path, filename=f'{title}.docx', media_type='multipart/form-data')
file_name = f"{title}.docx"
file_path = os.path.join(DOCUMENTS_DIR, path, file_name)
logger.warning(f"Файл: {file_path}")
# Проверяем существование файла
if not os.path.exists(file_path):
logger.warning(f"Файл не найден: {file_path}")
return {"error": "Файл не найден", "path": file_path}
# Возвращаем файл
response = FileResponse(
path=file_path,
filename=file_name,
media_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document"
)
response.headers["Access-Control-Allow-Origin"] = "*"
response.headers["Access-Control-Allow-Methods"] = "GET, OPTIONS"
response.headers["Access-Control-Allow-Headers"] = "Content-Type"
logger.warning(response)
return response
@app.get("/logs")
def get_logs():
with open("app.log", "r") as file:
lines = file.readlines()[-10:] # последние 10 строк
return {"logs": lines}
# if __name__ == "__main__":
# uvicorn.run("main:app", port=8001, reload=True)