X-Bogus:X-Bogus是一种防数据包伪造的一个参数, 又称为x伪造,主要用于反爬虫,这个是某节公司下面基础服务,这个反爬虫机制几乎用在了它所有的产品中,不过,只要是能正常使用,这些东西都是透明的,X-Bogus生成算法。
获取方法参考某大佬文章:【爬虫实战】使用Python和JS逆向抖音X-Bogus参数获取N条视频-CSDN博客
msToken:msToken可以理解成Message Token,相当于每次消息请求的令牌,主要用于请求统计,这也是具有反爬虫的机制,如果相同msToken请求太多,也会被定义成恶意请求,这时候会出现验证码校验。所以我们在使用的时候,可以用uuid或者是雪花算法的id来模拟msToken,当然长度大于32位的唯一串最好
获取方法如下:
def get_ms_token(self, randomlength=107):"""根据传入长度产生随机字符串"""random_str = ''base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789='length = len(base_str) - 1for _ in range(randomlength):random_str += base_str[random.randint(0, length)]return random_str
__signature:signature是签名,主要是防止数据传输的过程中,“中间人”对数据进行串改。签名一般都是公钥加密,私钥验签。参与签名的参数有url地址中的参数,还有post请求中的内容,也会参与签名。signature主要用于post或者put表单的时候进行使用,其他情况暂时未遇到。
获取方法参考某大佬文章:
某音签名jsvmp还原__ac_signature-CSDN博客
__ac_nonce:临时加密参数,用于与_signature一起使用
ttwid:ttwid类似客户端id,即便是游客模式,也可以对页面数据进行埋点统计,通过收集ttwid下的用户行为数据,给与内容推荐和广告推荐。这个也是某节公司下的基础服务,所以生成的id,只要是某节下的服务都可以使用
webid:同ttwid,类似客户端id,也可以说是浏览器id,不过ttwid可在cookie获取,webid可在随意一个视频请求,返回的html文本的script里再通过正则获取
ttwid和webid获取方法:(js代码就在如上:某音签名jsvmp还原__ac_signature-CSDN博客,自己抄,因为怕版权问题就不复制了)
def get_ttwid_webid(self, req_url):"""获取 ttwid 和 webid:param req_url:请求的视频地址:return:"""try:response = requests.request("GET", req_url, headers=self.ttwid_webid_headers, verify=False, timeout=3)cookies_dict = response.cookies.get_dict()ac_nonce = cookies_dict.get('__ac_nonce')if(ac_nonce):ac_signature = execjs.compile(open(self.ac_sign_js_path).read()).call('func1', req_url, self.user_agent,ac_nonce)ttwid_webid_headers1 = copy.deepcopy(self.ttwid_webid_headers)ttwid_webid_headers1['Referer'] = req_urlttwid_webid_headers1['Cookie'] = f'__ac_nonce={ac_nonce}; __ac_signature={ac_signature}; __ac_referer=__ac_blank'response = requests.request("GET", req_url, headers=ttwid_webid_headers1, verify=False, timeout=3)if (("/captcha/index.js" in response.text) or ("Please wait...</body>" in response.text)):print("跳出验证码,暂停爬取")time.sleep(5)return self.get_ttwid_webid(req_url)else:render_data_text = \re.compile('\<script id=\"RENDER_DATA\" type\=\"application\/json\">(.*?)\<\/script\>').findall(response.text)[0]render_data_text = requests.utils.unquote(render_data_text)render_data_json = json.loads(render_data_text, strict=False)webid = render_data_json.get('app').get('odin').get('user_unique_id')cookies_dict = response.cookies.get_dict()ttwid_str = cookies_dict.get('ttwid')return ttwid_str, webidexcept (requests.exceptions.ProxyError, requests.exceptions.ReadTimeout,requests.exceptions.ConnectionError) as e:logging.error(e)time.sleep(5)return self.get_ttwid_webid(req_url)