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 这个参数获取不了,想要自动登录多看账号的想法失败。

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