This commit is contained in:
101
main.py
101
main.py
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user