某赞 滑块 如违规版主麻烦删下
直接放代码~```
import json
import math
import time
from loguru import logger
import requests
from Crypto.Cipher import AES
import base64
import random
import ddddocr
ocr = ddddocr.DdddOcr()
logger.success("""\n _____ _____ ____ __ ______
/ ___/ /|///_// / / ____/
\__ \ / /|_/ / / / / / / __/
___/ // // /_/ / / /___ / /___
/____//_//_//___//_____//_____/
\n有赞Captcha\nBy:Smile""")
basic_headers = {
"user-agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'
}
host="passport.youzan.com"
token_url=f'https://{host}/api/captcha/get-behavior-captcha-token.json?bizType=15'
class youzan:
def __init__(self):
# 密钥和 IV
self.eventData='{"cx":126,"cy":33,"scale":0.5,"slidingEvents":[{"mx":32,"my":200,"ts":1746556441652},{"mx":0,"my":0,"ts":1},{"mx":1,"my":0,"ts":23},{"mx":1,"my":0,"ts":18},{"mx":1,"my":0,"ts":6},{"mx":1,"my":0,"ts":3},{"mx":0,"my":0,"ts":2},{"mx":1,"my":0,"ts":3},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":2},{"mx":1,"my":0,"ts":2},{"mx":0,"my":0,"ts":1},{"mx":1,"my":0,"ts":2},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":2},{"mx":1,"my":0,"ts":2},{"mx":0,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":2},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":-1,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":2,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":2,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":2,"my":0,"ts":1},{"mx":1,"my":-1,"ts":1},{"mx":2,"my":0,"ts":1},{"mx":2,"my":0,"ts":1},{"mx":0,"my":0,"ts":1},{"mx":2,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":2,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":2,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":2,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":2,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":2,"my":-1,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":2,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":2,"my":0,"ts":1},{"mx":1,"my":-1,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":2,"my":0,"ts":1},{"mx":0,"my":0,"ts":1},{"mx":2,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":-1,"ts":1},{"mx":0,"my":0,"ts":1},{"mx":2,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":0,"my":0,"ts":1},{"mx":2,"my":-1,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":0,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":0,"my":0,"ts":1},{"mx":2,"my":-1,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":0,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":-1,"ts":1},{"mx":1,"my":0,"ts":4},{"mx":0,"my":0,"ts":1},{"mx":1,"my":0,"ts":2},{"mx":1,"my":0,"ts":2},{"mx":0,"my":-1,"ts":1},{"mx":1,"my":0,"ts":1},{"mx":1,"my":0,"ts":2},{"mx":0,"my":0,"ts":5},{"mx":0,"my":0,"ts":8},{"mx":0,"my":0,"ts":7},{"mx":0,"my":0,"ts":7},{"mx":0,"my":0,"ts":7}]}'
self.key = 'youzan.com._key_'
self.iv = 'youzan.com.aesiv'
self.token=""
self.tokenObj=None
self.bg=None
self.slide=None
self.pos=None
self.cy=0
# 初始化
def getToken(self):
res = requests.get(url=token_url, headers=basic_headers).json()
try:
self.token = res['data']
except Exception:
logger.error("get token fail!")
return self.token
def getTokenObj(self):
url = f'https://{host}/api/captcha/get-behavior-captcha-data.json?token={self.token}&captchaType=1'
res = requests.get(url=url, headers=basic_headers).json()
try:
self.tokenObj = res['data']
self.bg=res['data']['captchaObtainInfoResult']['bigUrl']
self.slide = res['data']['captchaObtainInfoResult']['smallUrl']
self.cy=res['data']['captchaObtainInfoResult']['cy']
except Exception:
logger.error("get TokenObj fail!")
return self.tokenObj
def ocr(self):
img_bg=requests.get(self.bg, timeout=10).content
img_slide=requests.get(self.slide, timeout=10).content
pos=ocr.slide_match(img_slide, img_bg, simple_target=True)
self.pos=pos
return pos
def captcha_slide(self):
url=f'https://{host}/api/captcha/check-behavior-captcha-data.json'
_head=basic_headers
eventData_obj=json.loads(self.eventData)
print(self.pos,self.cy)
eventData_obj['cx'] = math.ceil(self.pos['target']/2)
eventData_obj['cy'] = math.ceil(self.cy/2)
eventData_obj['slidingEvents']['ts'] = int(time.time()*1000)
self.eventData=json.dumps(eventData_obj)
print(self.eventData)
userBehaviorData=aes_encrypt(self.eventData,self.key,self.iv)
logger.info("userBehaviorData->"+userBehaviorData)
_head.update({"content-type":"application/x-www-form-urlencoded"})
form_data = {
"token": self.token,
"bizType": "15",
"bizData": "",
"captchaType": "1",
"userBehaviorData": userBehaviorData
}
res = requests.post(url=url,data=form_data,headers=_head).json()
logger.info(res)
return res
def iso10126_pad(data, block_size):
padding_length = block_size - (len(data) % block_size)
padding = bytes() + bytes()
return data + padding
def iso10126_unpad(data):
padding_length = data[-1]
return data[:-padding_length]
def aes_encrypt(plaintext, key, iv):
cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8'))
padded_plaintext = iso10126_pad(plaintext.encode('utf-8'), AES.block_size)
ciphertext = cipher.encrypt(padded_plaintext)
return base64.b64encode(ciphertext).decode('utf-8')
def aes_decrypt(ciphertext, key, iv):
ciphertext = base64.b64decode(ciphertext)
cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8'))
decrypted_data = cipher.decrypt(ciphertext)
unpadded_data = iso10126_unpad(decrypted_data)
return unpadded_data.decode('utf-8')
if __name__ == '__main__':
yz = youzan()
token=yz.getToken()
logger.info(yz.getTokenObj())
logger.info(yz.ocr())
logger.info(yz.captcha_slide())
url = "https://oauth.youzan.com/api/login/by-pass.json"
headers = {
"accept": "application/json, text/plain, */*",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"cache-control": "no-cache",
"content-type": "application/x-www-form-urlencoded",
"origin": "https://oauth.youzan.com",
"pragma": "no-cache",
"referer": "https://oauth.youzan.com/login/password?clientId=84050d9ed73fdddc1c&redirectUrl=https%3A%2F%2Fcdp.youzan.com%2Fredirect%3Fpath%3D%252F&scope=auth_user",
"sec-ch-ua": "\"Chromium\";v=\"136\", \"Microsoft Edge\";v=\"136\", \"Not.A/Brand\";v=\"99\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0",
# 合并 curl 中的 -b 参数(Cookie)到 headers
"Cookie": "_kdt_id_=91433235; yz_log_uuid=04f248cf-cbc1-4086-9a43-b3af636ed5ee; yz_log_ftime=1736672314431; KDTSESSIONID=YZ1366424082224013312YZJB2UlvPo; Hm_lvt_7bec91b798a11b6f175b22039b5e7bdd=1745822491; _clck=jwj431|2|fvg|0|1944; Hm_lvt_7fff7ceede91c07fb0a2f9c1850d7987=1746553078; HMACCOUNT=AA6B7D8C82B4E03B; yz_fp_hash=92a97848381090fa79f5ef7bc765fe41; _efmdata=Ug3qG4cap1b9cFfbEj48rWQP%2BKxJf8DAcKMBgDd89Pd%2FAjC5aniSvGjkLcTMCuGE2JzCPdc9FoWf8h%2FjR81hcJDeSrD9id7N8P1m4Erxysw%3D; _exid=ff7L%2FrHf5QdAdWaSa0famEW4R3W0UYCxSr0iEZvDHX5wlJeeFAO9BPe2BKs4tfFhoU2v8QRlVpwxaIFMBMXh0A%3D%3D; dfp=889befecaeb46639153a2b41c7d7da7c2ce2a356; captcha_sid=YZ1369488530002628608YZJmc3ElSh; Hm_lpvt_7fff7ceede91c07fb0a2f9c1850d7987=1746553445; ec=HvDv9iFi-1746553445000-ab7276b90c989-219138801; yz_log_seqb=1746561056879; yz_log_seqn=2"
}
data = {
"countryCode": "+86",
"mobile": "",#你的手机号
"password": "5LiYAUQAszj+iZcTfy7S3A==",#这里自己逆把
"redirectUrl": "https://cdp.youzan.com/redirect?path=%2F",
"clientId": "84050d9ed73fdddc11",
"scope": "auth_user",
"name": "智能客户增长",
"showTuiguangProtocol": "false",
"autoLogin": "true",
"captchaCode": token
}
res = requests.post(url, headers=headers, data=data).json()
logger.info(res)
```
页:
[1]