# -*- coding: utf-8 -*-
r"""B100 — lấy ảnh gốc album Zalo (bản chốt): chỉ click thumbnail NẰM TRONG ALBUM (parent class chứa --group-item),
mỗi click -> gom mọi img.zimg-el >=400px chưa gặp (khoá đuôi blob src), cap 1400px, md5 khử trùng."""
import base64, hashlib, os, re, subprocess, time

S = 'tri1310'
DICH = r'C:\Claw 2\QC\images\_zalo_tri_1310_full'
CAN = 1400
LOG = open(r'C:\Claw 2\QC\_log_zalo_tri_1310_full.txt', 'a', encoding='utf-8')
log = lambda *a: (print(*a, flush=True), LOG.write(' '.join(str(x) for x in a) + '\n'), LOG.flush())


def ev(js, t=240):
    r = subprocess.run(['browser-act', '--session', S, 'eval', js], capture_output=True, text=True,
                       encoding='utf-8', errors='replace', timeout=t)
    return ((r.stdout or '') + (r.stderr or '')).strip()


seen_src, seen_md5 = set(), set()
for f in os.listdir(DICH):
    if f.endswith('.jpg'):
        seen_md5.add(hashlib.md5(open(os.path.join(DICH, f), 'rb').read()).hexdigest()[:12])
log('  đã có sẵn %d ảnh | bắt đầu quét album...' % len(seen_md5))

n_thumb = int(re.sub(r'\D', '', ev("(()=>{const t=[...document.querySelectorAll('img.zimg-el')].filter(x=>x.naturalWidth<400 && /--group-item/.test((x.parentElement.className||''))); return String(t.length);})()")) or '0')
log('  album có %d thumbnail' % n_thumb)
for i in range(min(n_thumb, 20)):
    ev("(()=>{const t=[...document.querySelectorAll('img.zimg-el')].filter(x=>x.naturalWidth<400 && /--group-item/.test((x.parentElement.className||''))); const g=t[%d]; if(!g) return 'het'; g.scrollIntoView({block:'center'}); const c=g.closest('.img-center-box')||g.parentElement; (c||g).click(); return 'ok';})()" % i)
    time.sleep(3)
    ds = ev("(()=>{const l=[...document.querySelectorAll('img.zimg-el')].filter(x=>x.naturalWidth>=400); return JSON.stringify(l.map(x=>x.naturalWidth+'x'+x.naturalHeight+'#'+(x.src||'')));})()")
    try:
        ds = ds[ds.index('['):ds.rindex(']') + 1].replace('\\"', '"')
        arr = re.findall(r'"(\d+x\d+)#([^"]+)"', ds)
    except Exception:
        arr = []
    moi = 0
    for kich, src in arr:
        k = src.split('/')[-1][:22]
        if k in seen_src:
            continue
        r = ev("(()=>{const g=[...document.querySelectorAll('img.zimg-el')].find(x=>((x.src||'').indexOf('%s')>=0) && x.naturalWidth>=400); if(!g) return 'x'; const k=%d/g.naturalWidth; const w=Math.round(g.naturalWidth*k), h=Math.round(g.naturalHeight*k); const c=document.createElement('canvas'); c.width=w; c.height=h; c.getContext('2d').drawImage(g,0,0,w,h); try{window.__B=c.toDataURL('image/jpeg',0.9);}catch(e){return 'LOI';} return String(window.__B.length);})()" % (k, CAN))
        m_tong = re.search(r'(\d{4,})', r)          # browser-act có thể trả kèm dấu nháy -> bắt số bằng regex
        if not m_tong or int(m_tong.group(1)) < 5000:
            seen_src.add(k)
            log('   bỏ ảnh %s (eval trả: %s)' % (k[:10], r[-40:]))
            continue
        tong = int(m_tong.group(1))
        phan, vt = [], 0
        while vt < tong:
            z = ev('String(window.__B.slice(%d,%d))' % (vt, vt + 30000)).strip()
            if z.startswith('"') and z.endswith('"'):
                z = z[1:-1]
            phan.append(z); vt += 30000
        chuoi = ''.join(phan)
        seen_src.add(k)
        if len(chuoi) < tong * 0.9:
            log('   bỏ 1 ảnh (thiếu dữ liệu)'); continue
        th = base64.b64decode(chuoi.split(',', 1)[1])
        md5 = hashlib.md5(th).hexdigest()[:12]
        if md5 in seen_md5:
            continue
        seen_md5.add(md5)
        moi += 1
        ten = os.path.join(DICH, 'goc_%02d.jpg' % len(seen_md5))
        open(ten, 'wb').write(th)
        log('   %-16s %8d B  %-10s md5 %s  (thumb %d)' % (os.path.basename(ten), len(th), kich, md5, i + 1))
    if moi == 0:
        log('   thumb %d: không có ảnh mới' % (i + 1))

ev("(()=>{document.dispatchEvent(new KeyboardEvent('keydown',{key:'Escape',keyCode:27,which:27,bubbles:true})); return 1;})()")
log('  === CHỐT: %d ảnh gốc trong %s' % (len(seen_md5), DICH))
LOG.close()
