抖音sign值生成失效分析(2020-03)
之前的sign生成方法: 抖音视频分享页面_signature
我简单检查了一遍发现是sign值错误。
一开始我以为是抖音更新了sign的生成方法,经过检查和与之前的代码对比,生成方法还是与之前一样。
于是我猜测应该是我的程序被识别出来,导致被ban掉。
我用selenium打开了链接:https://www.iesdouyin.com/share/user/102064772608
一经对比果然发现是selenium被识别到了。 (右图为正常浏览)
查看下接口。返回的数据是空的,这说明我们该驱动生成的sign值不正确。
为了进一步追踪导致生成错误的原因,我选择了一个固定的抖音ID下 的 tac 和 dytk,放到了本地执行生成sign的代码。
经过对比,发现在相同的可见参数下,生成的sign值 其中只有9位是不一样的。 我们接下来就可以一个一个排除干扰因素。
这样大致就有了方向,我查看了下两个浏览器的 navigator。
除了基本的 webdriver = True 之外,还有 languages 不大相同 (其他的指纹信息太难对比了)。
按照以往的经验,直接给了一个开发者模式的options,访问之后,webdriver还是为True。 在网上搜索后,发现是谷歌浏览器自 79.0.3945.36版本开始,修复了非无头模式下“自动化” navigator.webdriver是未定义的问题。 这里有几个解决方法:
- 1 将Chrome回滚一个版本,ChromeDriver回滚对应Chrome的版本即可。(pass,对于我来说在服务器调试太过繁琐)
- 2 启用mitmproxy拦截请求,在请求发送到服务端之前修改js文件,来掩盖webdriver指纹信息。(pass,目前并无法判断服务短是否只根据navigator.webdriver来进行ban选)
3: 最新检索出来的结果,也是目前我正在使用的方法,可以在linux 运行。 使用 driver.execute_cdp_cmd 命令。代码如下:
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
""" })
接下来我们启动一个 使用execute_cdp_cmd命令的界面。
虽然navigator.webdriver 已经变成未定义了,但是可以看到 接口返回的数据还是为空。
不要着急。我再次选择一个固定的抖音ID下 的 tac 和 dytk,放到了本地执行生成sign的代码。
好像距离真相又近了一步,这已经可以发现,我们目前模拟生成的sign值 只和真实的值 在ASCII上差了1位。
我没有继续去查询还有哪些driver指纹被识别出来,实在太劳民伤财了。
这里经过我大约有200多次的测试。我组合出来所有字符的变换规则,基本上是固定的。
# less_list:如果我们生成的sign值 倒数第二位字符(X)在该列表中,那么真实的值需要用值(X)的ASCII减去1。比如m要换成l。
less_list = ['d','V','J','t','m','L','R','l','X','b','Z','B','r','3','v','N','D','P','9','1','H','7','T','z','j','f','x','p','h','5','F','.']
# add_list: 和less相反,真实值需要用假X的ASCII+1,比如假值为M,真值则为n。
add_list = ['a','K','W','M','u','Q','S','A','e','U','O','Y','I','0','k','E','y','c','w','2','s','8','4','6','C','o','g','q','-','i','G','n',]
通过ASCII - sign值切换代码:
sig = '我们初次生成出来的值'
less_list = ['d','V','J','t','m','L','R','l','X','b','Z','B','r','3','v','N','D','P','9','1','H','7','T','z','j','f','x','p','h','5','F','.']
add_list = ['a','K','W','M','u','Q','S','A','e','U','O','Y','I','0','k','E','y','c','w','2','s','8','4','6','C','o','g','q','-','i','G','n',]
if sig[-2] in less_list:
flag = '-1'
sig = sig[:-2] + chr(ord(sig[-2])-1) + sig[-1:]
elif sig[-2] in add_list:
flag = '+1'
sig = sig[:-2] + chr(ord(sig[-2])+1) + sig[-1:]
else:
print("新字符:",sig) # 可能会出现新字符, 新字符默认取 ASCII +1
sig = sig[:-2] + chr(ord(sig[-2])+1) + sig[-1:]
访问更多内容可查看专栏:爬虫案例合集
相关文章
- HTTP协议学习
- 图解 Google V8 # 14:字节码(二):解释器是如何解释执行字节码的?
- G3ENa HENF450268R2 组成了拟域靠近电磁辐射源
- G3ESa HENF318736R1 将功率传输到非常靠近源的接收器
- C语言题解 | 移除元素(多种解法)
- G3FE HENF452697R1 反馈行为金属探测器
- G3FK HENF452878R1 横跨安导电体在变化中磁场
- SIP协议概述
- 图解 Google V8 # 15:隐藏类:如何在内存中快速查找对象属性?
- C语言题解 | 去重数组&&合并数组
- QT可执行文件编译打包,生成用来发给别人执行的文件。
- 谷粒学苑项目实战(二):讲师管理模块搭建(上)
- Go --- go-elasticsearch介绍及简单使用
- Go ---- godog的使用
- TCP/IP编程调用Windows的库实现UDP网络通信(代码实例)
- 数据结构 | 单链表
- Go --- 使用各服务商的短信服务,实现短信验证等需求(一)
- Go --- 使用各服务商的短信服务,实现短信验证等需求(二)
- GitHub 近两万 Star,无需编码,可一键生成前后端代码 上
- GitHub 近两万 Star,无需编码,可一键生成前后端代码 下