#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""硬验第二轮交付：28 条来源 URL 全量复测 + 关键年报引用查原文。"""
import csv
import json
import re
import subprocess
import time

import requests

D = ('/Users/liuxinyuan/Desktop/Minimax工作区/客户满意度2026/'
     '行业信息推送_M1-M5_2026-10-13')
UA = ('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 '
      '(KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36')
S = requests.Session()
S.headers.update({'User-Agent': UA})

rows = list(csv.reader(open(D + '/client_track_map_liu.csv', encoding='utf-8-sig')))[1:]
urls, owners = [], {}
for r in rows:
    for m in re.findall(r'https?://[^\s|]+', r[7]):
        u = m.rstrip('|,')
        urls.append(u)
        owners.setdefault(u, []).append(r[0])
urls = list(dict.fromkeys(urls))
print('══ ① 来源 URL 复测（独立 curl/requests）══')
bad = []
for u in urls:
    try:
        rr = S.get(u, timeout=25, allow_redirects=True)
        code, n = rr.status_code, len(rr.content)
        title = re.search(r'<title[^>]*>(.*?)</title>', rr.text, re.S | re.I)
        title = re.sub(r'\s+', ' ', title.group(1)).strip()[:50] if title else ''
        flag = '✓' if code == 200 else '✗'
        if code != 200:
            bad.append((u, code))
        print('  %s %-4s %7d 行%s  %s' % (flag, code, n, owners[u], u[:74]))
        if title:
            print('        ', title)
    except Exception as e:
        bad.append((u, str(e)[:40]))
        print('  ✗ ERR %s %s' % (u[:70], str(e)[:40]))
    time.sleep(1.0)
print('\n  复测结论: %d/%d 返回 200' % (len(urls) - len(bad), len(urls)))
if bad:
    print('  非 200 条目:', bad)

print()
print('══ ② 关键引用查原文（科华生物 2025 年报）══')
pdf = 'http://static.cninfo.com.cn/finalpage/2026-04-17/1225113420.PDF'
try:
    b = S.get(pdf, timeout=60).content
    p = '/tmp/kehua2025.pdf'
    open(p, 'wb').write(b)
    print('  下载 %d 字节' % len(b))
    import fitz
    doc = fitz.open(p)
    txt = []
    for i in range(min(len(doc), 200)):
        txt.append(doc[i].get_text())
    allt = '\n'.join(txt)
    print('  总页数:', len(doc))
    for kw in ['西安天隆', '苏州天隆', '西安华伟', '66.50%', '安瑞科']:
        c = allt.count(kw)
        print('    「%s」出现 %d 次' % (kw, c))
    # 提取含 66.50% 的上下文
    for m in list(re.finditer(r'66\.50%', allt))[:3]:
        seg = re.sub(r'\s+', ' ', allt[max(0, m.start() - 90):m.start() + 40])
        print('    上下文:', seg)
except Exception as e:
    print('  科华年报核验失败:', str(e)[:100])
