?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)