抖音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:]

访问更多内容可查看专栏或私信我:爬虫案例合集

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

考古学家lx(李玺)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值