上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

某赞 滑块 如违规版主麻烦删下

[复制链接]

该用户从未签到

6

主题

3

回帖

20

积分

助理工程师

积分
20

新人报道

发表于 2025-5-7 04:21:09 | 显示全部楼层 | 阅读模式

直接放代码~

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'][0]/2)
        eventData_obj['cy'] = math.ceil(self.cy/2)
        eventData_obj['slidingEvents'][0]['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([random.randint(0, 255) for _ in range(padding_length - 1)]) + bytes([padding_length])
    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)

发表回复

本版积分规则

快速回复 返回顶部 返回列表