import time,re,json,requests,io,random
import numpy as np
from PIL import Image, ImageFilter
from scipy import ndimage
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
urllib3=__import__('urllib3'); urllib3.disable_warnings()
o=Options(); o.set_preference('dom.webdriver.enabled',False)
o.set_preference('network.http.referer.spoofSource',True)
o.set_preference('network.http.referer.defaultReferrer','https://ein38eu95792b.4656hd15.cc/')
d=webdriver.Firefox(options=o); d.set_page_load_timeout(40)
try:
    d.get('http://127.0.0.1:9999/geetest_page.html'); time.sleep(6)
    info=d.execute_script("""function r(s){var e=document.querySelector(s);if(!e)return null;var b=e.getBoundingClientRect();return {t:b.top,l:b.left,w:b.width,h:b.height,bg:getComputedStyle(e).backgroundImage};}return {bg:r('.geetest_bg'),slice:r('.geetest_slice'),slicebg:r('.geetest_slice_bg'),btn:r('.geetest_btn')};""")
    def dl(u):
        m=re.search(r'url\("?([^")]+)"?\)',u or '');return requests.get(m.group(1).replace('http://','https://'),timeout=20,verify=False).content
    bg=Image.open(io.BytesIO(dl(info['bg']['bg']))).convert('RGB'); sl=Image.open(io.BytesIO(dl(info['slicebg']['bg']))).convert('RGBA')
    g=np.array(bg.convert('L')).astype(np.float32); sa=np.array(sl); mask=sa[:,:,3]>128
    ys,xs=np.where(mask); ax0,ay0=xs.min(),ys.min(); aw,ah=xs.max()-ax0+1,ys.max()-ay0+1
    top=int(round((info['slice']['t']-info['bg']['t'])*bg.size[1]/info['bg']['h'])); top=max(0,min(bg.size[1]-ah,top))
    edges=np.array(bg.convert('L').filter(ImageFilter.FIND_EDGES)).astype(np.float32)
    contour=ndimage.binary_dilation(mask)&~ndimage.binary_erosion(mask)
    scores=[]
    for x in range(0,bg.size[0]-aw-ax0+1):
        e=edges[top:top+ah,x+ax0:x+ax0+aw][contour[ay0:ay0+ah,ax0:ax0+aw]].mean()
        scores.append((e,x))
    top5=sorted(scores,reverse=True)[:5]; print('edge top5',top5)
    x=top5[0][1]; D=x*(info['bg']['w']/bg.size[0]); print('x',x,'D',D)
    btn=d.find_element(By.CSS_SELECTOR,'.geetest_btn')
    ActionChains(d).move_to_element(btn).perform(); time.sleep(0.3)
    ActionChains(d).click_and_hold().perform(); time.sleep(0.2)
    n=40; moved=0
    for i in range(1,n+1):
        t=i/n; p=1-(1-t)**3; target=D*p
        ActionChains(d).move_by_offset(target-moved,0).perform(); moved=target; time.sleep(random.uniform(0.015,0.035))
    ActionChains(d).release().perform(); time.sleep(4)
    print('validate',d.execute_script('return window.validateResult'))
    print('netlog',json.dumps(d.execute_script('return window.__netlog'),ensure_ascii=False)[:4000])
finally: d.quit()
