抖音模拟登陆的实现

登陆参数加密

账号密码加密
Python实现对应的异或操作:

def encpyptwithXor(param):
    return [i ^ 0x5 for i in param.encode()]

然后return的时候调用了一个方法
在这里插入图片描述
点进去查看源码如下,即进行一些转换,最后进行一次类似于python切片的逻辑:
a为常量:
在这里插入图片描述在这里插入图片描述
接下来用python实现:

def byte_to_str(alist,bolean,length ) -> list:
    res = [0 for _ in range(length * 2)]
    bo = False
    i = 0
    while i < length:
        b = alist[i + bolean] & 0xFF
        bo1 = bo + True
        res[bo] = s[b >> 4]
        bo = bo1 + True
        res[bo1] = s[b & 0xF]
        i += 1
    return res

此为抓包显示的加密参数,原始参数为19920120000:在这里插入图片描述
运行测试效果:在这里插入图片描述
发现有些不一致,但后面结果一样,自然而然想到了+86(即国际区号)
测试一下:在这里插入图片描述
OK,剩下的搞定剩余参数即可。

错误码

errormessage
1101没有输入验证码
1102验证码错误
1009账号或密码错误
0账号密码错误,未注册也时显示该错误码
1039请使用手机验证码登陆(使用新设备会提示此错误码)

登陆成功的效果

在这里插入图片描述

准备写一个web服务,现在首要任务是在网上收集一些device_id和iid,怕我自己的被封。。

主逻辑代码,工具方法未贴出

# -*- coding: utf-8 -*-
# @Time    : 2019/6/27 18:06
# @Author  : Conderfly
# @Email   : coderflying@163.com
# @File    : login.py
import re
import base64
import requests
from server.utils.generate_check_url import generate_url
from server.utils.yundama import indetify
from server.utils.constants import s,headers


def encpyptwithXor(param):
    return [i ^ 0x5 for i in param.encode()]

def byte_to_str(alist,bolean,length ) -> list:
    res = [0 for _ in range(length * 2)]
    bo = False
    i = 0
    while i < length:
        b = alist[i + bolean] & 0xFF
        bo1 = bo + True
        res[bo] = s[b >> 4]
        bo = bo1 + True
        res[bo1] = s[b & 0xF]
        i += 1
    return res

def get_login_params(param):
    xor = encpyptwithXor(param=param)
    return "".join(byte_to_str(xor, False, len(xor)))

def douyin_login_params(mobile,password,captcha=""):
    mobile = "+86" +mobile
    mobile, password = get_login_params(mobile), get_login_params(password)
    login_params = {
        "mobile": mobile,
        "password":password,
    }
    url = generate_url("https://lf.snssdk.com/user/mobile/login/v2/?mix_mode=1",extract=login_params)
    url = re.sub(r'&mobile[\s\S]*?&as',"&as",url)
    form_data = {
        "mobile": mobile,
        "password": password,
        "mix_mode": 1,
        "retry": "no_retry",
    }
    if captcha:
        form_data["captcha"] = captcha
    return url, form_data

def login(mobile,password):
    message,captcha = "error",""
    while message != "success":
        url, form_data = douyin_login_params(mobile,password,captcha)
        response = requests.post(url,data=form_data,headers=headers,verify=False)
        response_json = response.json()
        data, message = response_json.get("data"), response_json.get("message")
        if message == "error":
            error_code = data.get("error_code")
            if error_code in [1101,1102]:
                # 验证码问题
                image_content = base64.b64decode(data.get("captcha").encode())
                captcha = indetify(image_content)
            elif error_code == 1009:
                # 密码错误
                return {"code":0,"message":"账号或密码错误。"}
            else:
                print(error_code)
        else:
            return {"code":1,"cookie":response.cookies.get_dict(),"message":response_json}


if __name__ == '__main__':
    res = login("199****2945", "********")
    print(res)
    print("input:+86199****2945")
    print("result:",get_login_params("199****2945"))

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值