# -*- coding: utf-8 -*-
r"""B103 — CHỐT: lấy ảnh GỐC album HÔM NAY của Zalo.
Mỗi lượt: click thumbnail trong .chat-message CUỐI (album hôm nay) -> đọc ĐÚNG ảnh đang hiển thị
(#imageShowMainImage img) -> canvas cap 1400 px -> lưu, md5 khử trùng.
⛔ Không quét 'mọi ảnh lớn trong DOM' (dễ vớ ảnh album NGÀY TRƯỚC mà viewer còn nhớ)."""
import base64, hashlib, os, re, subprocess, time

S = 'tri1310b'
DICH = r'C:\Claw 2\QC\images\_zalo_tri_1310_today'
CAN = 1400
os.makedirs(DICH, exist_ok=True)
LOG = open(r'C:\Claw 2\QC\_log_zalo_tri_1310_today.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()


JS_THUMBS = "(()=>{const ms=[...document.querySelectorAll('.chat-message')].filter(m=>m.querySelector('img.zimg-el')); const m=ms[ms.length-1]; if(!m) return '0'; const t=[...m.querySelectorAll('img.zimg-el')].filter(x=>x.naturalWidth<600); window.__T=t; return String(t.length);})()"
JS_CLICK = "(()=>{const t=window.__T||[]; const g=t[%d]; if(!g) return 'het'; g.scrollIntoView({block:'center'}); (g.closest('.img-center-box')||g.parentElement).click(); return 'ok';})()"
JS_GRAB = "(()=>{const i=document.querySelector('#imageShowMainImage img'); if(!i) return 'khong co anh hien thi'; const k=%d/i.naturalWidth; const w=Math.round(i.naturalWidth*k), h=Math.round(i.naturalHeight*k); const c=document.createElement('canvas'); c.width=w; c.height=h; c.getContext('2d').drawImage(i,0,0,w,h); try{window.__B=c.toDataURL('image/jpeg',0.9);}catch(e){return 'LOI '+e.message;} return w+'x'+h+' len='+window.__B.length;})()" % CAN

n = re.sub(r'\D', '', ev(JS_THUMBS)) or '0'
log('  album ở .chat-message CUỐI có %s thumbnail' % n)
seen, dem = set(), 0
for i in range(min(int(n), 20)):
    ev(JS_CLICK % i)
    time.sleep(3.5)
    r = ev(JS_GRAB)
    m1 = re.search(r'(\d+x\d+) len=(\d+)', r)
    if not m1:
        log('   thumb %d: %s' % (i + 1, r[-60:])); continue
    kich, tong = m1.group(1), int(m1.group(2))
    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)
    if len(chuoi) < tong * 0.9:
        log('   thumb %d: thiếu dữ liệu' % (i + 1)); continue
    th = base64.b64decode(chuoi.split(',', 1)[1])
    md5 = hashlib.md5(th).hexdigest()[:12]
    if md5 in seen:
        log('   thumb %d: TRÙNG md5 %s' % (i + 1, md5)); continue
    seen.add(md5); dem += 1
    ten = os.path.join(DICH, 'today_%02d.jpg' % dem)
    open(ten, 'wb').write(th)
    log('   %-16s %8d B  %-10s md5 %s  (thumb %d)' % (os.path.basename(ten), len(th), kich, md5, i + 1))
ev("(()=>{document.dispatchEvent(new KeyboardEvent('keydown',{key:'Escape',keyCode:27,which:27,bubbles:true})); return 1;})()")
log('  === CHỐT: %d ảnh trong %s' % (dem, DICH))
LOG.close()
