IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    用 Python 实现多看阅读签到领书币

    Hacper\'s Blog发表于 2018-09-30 14:17:04
    love 0

    image.png

    对 Android 多看阅读 APP 进行抓包,可以获取其每天签到领书币的请求接口。

    1
    2
    3
    4
    5
    6
    7
    
    POST /checkin/v0/checkin HTTP/1.1
    Host: www.duokan.com
    Content-Type: application/x-www-form-urlencoded
    Accept-Encoding:  gzip,deflate
    Cookie:  device_id=***************************;app_id=DkReader.Android;build=562180926;channel=TBVP2Y;user_type=1;device_hash=###################;device_hash_set=null;token=XXXXXXXXXXXXXXXXXXXXXXX;
    
    _t=1538224732&_c=10319
    

    请求头 Cookie 中的 token 来自账号登录成功后返回的数据里,请求体中的_t 参数是当前时间(时间戳),_c 是由时间戳和 device_id 计算得来的。

    用 Apk Extractor Lite 提取出多看阅读的安装包,再用 MT管理器 打开,反编译后可以得到生成 _t _C 参数的 JAVA 程序:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    public static String[] genCsrfCode() {
            String[] split = (ReaderEnv.get().getDeviceId() + '&' + ((int) (System.currentTimeMillis() / 1000))).split("");
            int i = 0;
            for (int i2 = 1; i2 < split.length; i2++) {
                i = generate(i, split[i2]);
            }
            return new String[]{"_t", String.valueOf(r4), "_c", String.valueOf(i)};
        }
    
    
    private static int generate(int i, String str) {
            return ((i * 131) + str.getBytes()[0]) % 65536;
        }
    

    类似的,可以写成 Python 程序:

    1
    2
    3
    
    import requests
    from datetime import datetime
    import time
    
    1
    2
    3
    4
    5
    6
    7
    
    config = {
        'device_id': '************************',
        'app_id': 'DkReader.Android',
        'build': '562180926',
        'device_hash': '######################',
        'token': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..'
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    def get_csrf_params(device_id):
        t = int(datetime.now().timestamp())
        string = device_id + '&' + str(t)
        i = 0
        c = 0
        while i < len(string):
            c = (c * 131 + string[i].encode()[0]) % 65536
            i += 1
        return t, c
    

    签到:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    def duokanqd(config):
        url = 'https://www.duokan.com/checkin/v0/checkin'
        Cookie = "device_id={device_id};app_id={app_id};build={build};channel=TBVP2Y;user_type=1;device_hash={device_hash};\
    device_hash_set=null;token={token};".format(**config)
        headers = {
            'Content-Type':
            'application/x-www-form-urlencoded',
            'User-Agent':
            'Dalvik/2.1.0 (Linux; U; Android 8.0.0; PRA-AL00X Build/HONORPRA-AL00X)',
            'Accept-Encoding':
            'gzip,deflate',
            'Cookie':
            Cookie
        }
    
        _t, _c = get_csrf_params(config.get('device_id', 'D0063006284a6677'))
        payload = {'_t': _t, '_c': _c}
        rsp = requests.post(url, headers=headers, data=payload)
        return rsp.json()
    
    1
    
    print(duokanqd(config))
    
    1
    
    {'msg': '今日已签到', 'result': 500002}
    

    写个定时任务,每天执行一下这个签到程序就可以自动领书币了。
    抓包获取的 token 总会到失效的一天,得通过多看的登录接口更新 token,其登录API为:

    1
    2
    3
    4
    5
    6
    7
    8
    
    POST /dk_id/api/wx/login HTTP/1.1
    Host: www.duokan.com
    Content-Type: application/x-www-form-urlencoded
    Cookie:  device_id=XXXXXXXXXXXXXXXX;device_hash=********************
    User-Agent:  Dalvik/2.1.0 (Linux; U; Android 8.0.0; PRA-AL00X Build/HONORPRA-AL00X)
    Accept-Encoding:  gzip
    
    package=com.duokan.reader&code=XXXXXXXXXXXXX&_t=1538236192&_c=60082
    

    这是我用微信账号授权登录的请求,code 这个参数是使用微信授权登录的一个临时令牌,code 是一次性的,用过就失效了。code 这个参数获取不了,想要自动登录多看账号的想法失败。

    如果不用微信登录,而直接用小米的账号密码登录,是不是可以成功登录多看呢?得注册个小米账号试试。



沪ICP备19023445号-2号
友情链接