domovoy_bot/scraper_gis/services/gis_harvester/harvester.py

92 lines
3.7 KiB
Python

import json
import os
import subprocess
import time
import re
from pathlib import Path
from playwright.sync_api import sync_playwright
# --- CONFIG ---
QUEUE_FILE = "/app/services/gis_harvester/data/full_queue.json"
STORAGE_ROOT = Path("/app/services/gis_harvester/archive")
NAS_IP = "192.168.10.105"
NAS_PATH = "/volume1/web/legal/gis/raw"
BOT_TOKEN = "8725618164:AAH1tGalq-pw1l0t4P5c0sdLkCVJdh7IE7M"
CHAT_ID = "197957361"
def send_tg_status(msg):
subprocess.run(["curl", "-s", "-X", "POST", f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage",
"-d", f"chat_id={CHAT_ID}&text={msg}&parse_mode=markdown"])
def sync_to_nas(local_path, remote_folder):
target = f"{NAS_PATH}/{remote_folder}"
subprocess.run(["ssh", f"matrixhasyou@{NAS_IP}", f"mkdir -p {target}"])
for f in os.listdir(local_path):
src = local_path / f
dst = f"{target}/{f}"
with open(src, "rb") as fd:
subprocess.run(["ssh", f"matrixhasyou@{NAS_IP}", f"cat > '{dst}'"], stdin=fd)
def run_harvest():
if not os.path.exists(QUEUE_FILE):
print("❌ Очередь не найдена!")
return
with open(QUEUE_FILE, "r") as f:
queue = json.load(f)
total = len(queue)
print(f"[*] Начало жатвы {total} целей...")
with sync_playwright() as p:
try:
browser = p.chromium.connect_over_cdp("http://127.0.0.1:9222")
page = browser.contexts[0].pages[0]
for index, item in enumerate(queue):
num = item['number'].replace('/', '_').replace(' ', '_')[:50]
local_dir = STORAGE_ROOT / num
# Заходим в каждое дело
try:
print(f"[{index+1}/{total}] Обработка {num}...")
page.goto("https://my.dom.gosuslugi.ru" + item['href'])
page.wait_for_load_state("networkidle")
time.sleep(10)
# Скриншот
local_dir.mkdir(parents=True, exist_ok=True)
page.screenshot(path=str(local_dir / "evidence.png"), full_page=True)
# Скачивание
download_btn = page.get_by_text("Скачать все").first
if download_btn.is_visible():
with page.expect_download(timeout=120000) as download_info:
download_btn.click()
download = download_info.value
zip_path = local_dir / "attachments.zip"
download.save_as(str(zip_path))
# Синхронизируем
sync_to_nas(local_dir, num)
status = "✅ ZIP + Скрин"
else:
sync_to_nas(local_dir, num)
status = "⚠️ Только скрин"
# Информирование
bar = "" * ((index + 1) * 10 // total) + "" * (10 - ((index + 1) * 10 // total))
msg = f"🌾 **ЖНЕЦ ГИС ЖКХ**\n\n🎯 {item['number'][:50]}\nСтатус: {status}\n\n[{bar}] {index+1}/{total}"
send_tg_status(msg)
except Exception as e:
print(f"⚠️ Ошибка на {num}: {e}")
page.goto("https://my.dom.gosuslugi.ru/citizen-cabinet/#!/appeals/applicant/search")
time.sleep(5)
browser.close()
except Exception as e:
send_tg_status(f"🚨 СБОЙ ЖНЕЦА: {str(e)}")
if __name__ == "__main__":
run_harvest()