前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「抓取」微信读书生成的唯一标识获取详情信息

「抓取」微信读书生成的唯一标识获取详情信息

作者头像
小丑同学
发布2020-12-22 15:08:47
1.7K0
发布2020-12-22 15:08:47
举报

昨天有位小姐姐请我帮忙,让我看如何生成获取微信读书里获取图书详细信息的唯一标识,业务方给她的需要是抓取微信读书里的详细信息,我当然是义不容辞的看一下。

定位来源

通过F12查看一下这个特殊的字符串是不是通过接口返回来的,如何是通过服务端返回来的,那么通过调取接口就可以获取到,如果不是调接口返回那么换一种思路。

很快通过查看network发现并不是接口直接返回,那么可能就是通过某一个特殊的标识,通过加密算法生成的唯一字符串

转化思路

通过页面元素自身的属性class查看,看看是不是存在动态的自定义属性

果不奇然在sources中找到了动态添加自定义属性的方法,可以看到a标签上的href属性是动态生成的

然后就可以按部就班的依次查找这个方法的参数以及返回值,找到这个方法最终来源就可以找到这个算法的核心了

查找方法

  • 查找方法中的参数

显然这个_0x4711f8['bookData']['bookInfo']['bookId']是图书的bookId

如果有疑问的话,我们可以看一下_0x4711f8这个对象是啥

有没有很熟悉的感觉vue,这个页面的开始使用过vue来写的,将接口https://weread.qq.com/web/bookListInCategory/all?maxIndex=20&rank=1里返回的数据存到了bookData属性里。

  • 查找方法

_0x3c43('0x6')代表的是readerURL方法名,双击上图标绿色的部分,浏览器会自动定位到代码部分即

点击右上角代码调试按钮,让代码部分继续往下走,进入我们找到的方法可以看到函数中有两个参数_0xe6d312是改变this的指向,arguments是我们传递过来的参数

下面查找_0xe6d312[_0x4c35('0x879')]方法,双击标红色的地方,自动跳到代码所在部分

继续通过断点调试,我们可以看到生成我们需要的字符串就是_0x1ef0a0['e'](_0x1dd4bb)这个方法

继续断点调试,最终找到算法的位置,即下图标红的位置。

node实现

下面我们通过node.js实现这个算法

const crypto = require("crypto");


function createId(bookId){
    let str = crypto.createHash("md5").update(bookId).digest('hex');

    let strSub = str.substr(0,3);

    let fa = function(id){
        if (/^\d*$/['test'](id)) {
            for (var len = id['length'], c = [], a = 0; a < len; a += 9) {
                var b = id['slice'](a, Math.min(a + 9, len));
                c['push'](parseInt(b)['toString'](16));
            }
            return ['3', c];
        }
        for (var d = '', i = 0; i < id['length']; i++) {
            d += id['charCodeAt'](i)['toString'](16);
        }
        return ['4', [d]];

    }(bookId);

    strSub += fa[0],
    strSub += 2 + str['substr'](str['length'] - 2, 2);
    for (var m = fa[1], j = 0; j < m.length; j++) {
        var n = m[j].length.toString(16);
        1 === n['length'] && (n = '0' + n),
        strSub += n,
        strSub += m[j],
        j < m['length'] - 1 && (strSub += 'g');
    }
    return strSub.length< 20 && (strSub += str.substr(0, 20 - strSub.length)),
    strSub += crypto.createHash("md5").update(strSub).digest('hex').substr(0, 3);;
}

let strId = createId(bookId)
console.log(strId);

效果如下图所示

通过对比我们生成的字符串和页面生成的是一致的,多次测试满足要求。

python实现

import hashlib
import re

def creatid(bookId):
    str = hashlib.md5(bookId.encode("utf8")).hexdigest()
    strSub = str[0:3]
    reg = re.search('(\d+)',bookId).group(1)
    if reg:
        lenth = len(bookId)
        for a in range(0,lenth):
            b = bookId[a:min(a+9,lenth)]
            c_str = hex(int(b))[2:]
            fa =['3',[c_str]]
            a += 9
            if a >= lenth:
                break
        strSub += fa[0]
        strSub += '2' + str[len(str)-2:]
        m = fa[1]
        for j in range(0,len(m)):
            n = hex(len(m[j]))[2:]
            if len(n) == 1:
                n = '0'+ n
            strSub += n + m[j]
        if len(strSub) < 20:
            strSub += str[0:20-len(strSub)]
        strSub += hashlib.md5(strSub.encode("utf8")).hexdigest()[0:3]
        print(strSub)


if __name__ == "__main__":
    creatid(bookId)

运行结果:

总结

以上就是本次的分享全部内容,其实用到了浏览器的调试node.js,这个对自身的前端知识和浏览器知识以及python都是一个考察,加油吧年轻人。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小丑的小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 定位来源
  • 转化思路
  • 查找方法
  • node实现
  • python实现
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档