#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""batch6_probe3.py —— 江西厅可达性 / 宾阳+大足 正文与分页 / 缙云 JPAAS API 试探"""
import re
import subprocess
import urllib.parse

import requests
from bs4 import BeautifulSoup

requests.packages.urllib3.disable_warnings()
UA = ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 "
      "(KHTML, like Gecko) Chrome/124.0 Safari/537.36")
H = {"User-Agent": UA, "Accept-Language": "zh-CN,zh;q=0.9"}


def sh(cmd):
    try:
        p = subprocess.run(cmd, shell=True, capture_output=True, timeout=40)
        return (p.stdout + p.stderr).decode("utf-8", "ignore")
    except Exception as e:
        return "ERR " + str(e)[:60]


print("=" * 100)
print("【A. 江西厅可达性诊断】")
print("  DNS:", sh("getent hosts sthjt.jiangxi.gov.cn || nslookup sthjt.jiangxi.gov.cn 2>&1 | tail -3")[:200].strip())
print("  ping:", sh("ping -c 2 -W 3 sthjt.jiangxi.gov.cn 2>&1 | tail -3")[:200].strip())
for u in ["https://sthjt.jiangxi.gov.cn/", "http://sthjt.jiangxi.gov.cn/jxssthjt/col/col42221/index.html"]:
    tmpl = "curl -sk -o /dev/null -w 'HTTP %%{http_code} | %%{size_download}B | %%{time_total}s' --max-time 20 '%s'"
    print("  %-58s %s" % (u[:56], sh(tmpl % u).strip()[:100]))
    tmpl4 = "curl -sk4 -o /dev/null -w 'v4: HTTP %%{http_code} | %%{size_download}B' --max-time 20 '%s'"
    print("  %-58s %s" % ("  ↑强制IPv4", sh(tmpl4 % u).strip()[:100]))
print("  A 记录(dig):", sh("dig +short A sthjt.jiangxi.gov.cn 2>&1 | head -3").strip()[:120])
print("  AAAA 记录:", sh("dig +short AAAA sthjt.jiangxi.gov.cn 2>&1 | head -3").strip()[:120])
print("  服务器有 IPv6 吗:", sh("ip -6 addr show scope global 2>/dev/null | head -4 || echo '(无)'").strip()[:160])
print("  curl -v 头 20 行:", sh("curl -skv --max-time 15 https://sthjt.jiangxi.gov.cn/ 2>&1 | head -12"))

print()
print("=" * 100)
print("【B. 宾阳：正文容器 + 分页】")
L = "http://www.binyang.gov.cn/gk/xxgkml/shgysyjslygk/hjbhly/jsxmhjyxpjsp/"
h = sh("curl -sk --max-time 30 -A '%s' '%s'" % (UA, L))
print("  列表字节:", len(h))
print("  createPageHTML:", list(dict.fromkeys(re.findall(r"createPageHTML\([^)]*\)", h)))[:3])
print("  分页块:", re.sub(r"\s+", " ", (re.search(r".{300}createPageHTML.{200}", h, re.S) or type("x", (), {"group": lambda s, n=0: ""})()).group(0))[:500] if "createPageHTML" in h else "无")
d = "http://www.binyang.gov.cn/gk/xxgkml/shgysyjslygk/hjbhly/jsxmhjyxpjsp/t6730026.html"
hd = sh("curl -sk --max-time 30 -A '%s' '%s'" % (UA, d))
soup = BeautifulSoup(hd, "html.parser")
print("  详情字节:", len(hd), "| <p> 总数:", hd.count("<p"), "| <table>:", hd.count("<table"))
print("  所有 div 的 (class, p数, 文本长度) 前 12:")
stats = []
for dv in soup.find_all("div"):
    inner = "".join(str(c) for c in dv.contents)
    cls = " ".join(dv.get("class") or []) or (dv.get("id") or "")
    stats.append((inner.count("<p"), len(dv.get_text(" ", strip=True)), cls))
for pc, tx, cls in sorted(stats, reverse=True)[:12]:
    print("     p=%-3d 文本=%-6d %s" % (pc, tx, cls[:40]))


def show_body(html, name):
    soup = BeautifulSoup(html, "html.parser")
    best = None
    for dv in soup.find_all("div"):
        inner = "".join(str(c) for c in dv.contents)
        tx = dv.get_text(" ", strip=True)
        if len(tx) > 120:
            score = inner.count("<p") * 3 + len(tx) / 100.0
            if best is None or score > best[0]:
                best = (score, " ".join(dv.get("class") or []) or (dv.get("id") or ""), inner, tx)
    if best:
        print("     【%s】最可能正文容器: %s (p=%d 文本=%d)" % (name, best[1][:40], best[2].count("<p"), len(best[3])))
        print("       ", best[3][:220])


print()
print("=" * 100)
print("【C. 大足：正文容器 + 分页】")
L = "https://www.dazu.gov.cn/qzfjz/glz_101897/zwgk_53321/fdzdgknr_53323/lzyj_100471/qzfjz/"
h = sh("curl -sk --max-time 30 -A '%s' '%s'" % (UA, L))
print("  列表字节:", len(h))
for pat in [r"createPageHTML\([^)]*\)", r"page_\d+\.html", r"index_\d+\.html", r'class="[^"]*page[^"]*"', r"totalpage\s*[:=]\s*\d+"]:
    mm = list(dict.fromkeys(re.findall(pat, h, re.I)))[:4]
    if mm:
        print("  %-28s %s" % (pat[:28], [str(x)[:60] for x in mm]))
m = re.search(r'href="(\./\d+/t\d+_\d+\.html)"', h) or re.search(r'href="([^"]*t\d+_\d+\.html)"', h)
print("  详情链接样例:", m.group(1) if m else "未找到")
if m:
    d = urllib.parse.urljoin(L, m.group(1))
    hd = sh("curl -sk --max-time 30 -A '%s' '%s'" % (UA, d))
    print("  详情字节:", len(hd), "| <p>:", hd.count("<p"), "| <table>:", hd.count("<table"))
    show_body(hd, "大足")
    atts = re.findall(r'href="([^"]+\.(?:pdf|doc|docx|xls|xlsx|zip|rar))"', hd, re.I)
    print("  附件:", len(atts), atts[:3])

print()
print("=" * 100)
print("【D. 缙云 JPAAS：读 queryData 拿真实 API 参数】")
import json as _json
import html as _html
base = "https://www.jinyun.gov.cn"
for col in ["1229425888", "1229856959"]:
    u = base + "/col/col%s/index.html" % col
    h = sh("curl -sk --max-time 30 -A '%s' '%s'" % (UA, u))
    print("\n  --- col%s (%d 字节) ---" % (col, len(h)))
    qd = re.findall(r'queryData="([^"]+)"', h)
    print("    queryData 标签数:", len(qd))
    for q in qd[:2]:
        qq = _html.unescape(q)
        print("     原始:", qq[:400])
        try:
            d = _json.loads(qq)
            print("     解析:", _json.dumps(d, ensure_ascii=False)[:400])
        except Exception as e:
            print("     解析失败:", str(e)[:60])
    # 直接按参考里的 GET 接口试探
    if qd:
        qq = _html.unescape(qd[0])
        try:
            d = _json.loads(qq)
            did = d.get("dataId") or d.get("pageId") or col
            webid = d.get("webId") or "3658"
            tpl = d.get("tplSetId") or ""
            tagid = d.get("tagId") or "列表"
            url = ("%s/api-gateway/jpaas-publish-server/front/page/build/unit"
                   "?parseType=bulidstatic&webId=%s&tplSetId=%s&pageType=column&tagId=%s"
                   "&editType=null&pageId=%s&paramJson=%s"
                   % (base, webid, tpl, urllib.parse.quote(tagid), did,
                      urllib.parse.quote('{"pageNo":1,"pageSize":20}')))
            out = sh("curl -sk --max-time 25 -A '%s' '%s'" % (UA, url))
            print("     API → %d 字节: %s" % (len(out), out[:300].replace("\n", " ")))
        except Exception as e:
            print("     构造 API 失败:", str(e)[:70])
