1.先對(duì)今日頭條接口進(jìn)行抓包
https://www.toutiao.com/api/pc/list/feed?offset=0&channel_id=94349549395&max_behot_time=0&category=pc_profile_channel&disable_raw_data=true&aid=24&app_name=toutiao_web&_signature=_02B4Z6wo00901dMswnwAAIDCY90utx-uGVXTCMbAABU9qkwnAPv0iWmk40B-QunCGITEQjHDyFNHFE-QKDWSwqNwubTwMctJCpdmksArmYOWUAKFIgKzLhv3quWkkx5Ob9.65ALLjnvItx2nc6
發(fā)現(xiàn)這個(gè)_signature是會(huì)改變的
第一步 拿_signature這個(gè)會(huì)變動(dòng)的值去js里面搜 然后搜出來的js進(jìn)行一個(gè)一個(gè)的查找,找到差不多相似的就打上斷點(diǎn)進(jìn)行調(diào)試,調(diào)試完就開始分析js
經(jīng)過斷點(diǎn)調(diào)試發(fā)現(xiàn)S方法里面
var o = (null === (n = window.byted_acrawler) || void 0 === n ? void 0 : null === (r = n.sign) || void 0 === r ? void 0 : r.call(n, i)) || "";
這個(gè)值是我們需要的 然后進(jìn)行三元運(yùn)算進(jìn)行拆解最后得出
r.call(n,i) 是最有用的
r = n.sign
n = window.byted_acrawler
最后就是?window.byted_acrawler.sign.call(window.byted_acrawler,i)
然后就是看window.byted_acrawler是怎么生成的?
可以看到他是通過acrawler.js生成的
通過?jsdom把代碼改造成可以執(zhí)行的文件
//導(dǎo)入jsdom
const jsdom =require("jsdom")
const {JSDOM} = jsdom;
const dom =new JSDOM('<!DOCTYPE html><p>HELLO word</p>');
window = dom.window;
document = dom.window.document;
let params ={
location:{
hash:"",
? ? ? ? host:"www.toutiao.com",
? ? ? ? hostname:"www.toutiao.com",
? ? ? ? href:"https://www.toutiao.com/",
? ? ? ? origin:"https://www.toutiao.com",
? ? ? ? pathname:"/",
? ? ? ? port:"",
? ? ? ? protocol:"https:",
? ? ? ? search:""
? ? },
? ? navigator:{
appCodeName:"Mozilla",
? ? ? ? ? ? appName:"Netscape",
? ? ? ? ? ? appVersion:"5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
? ? ? ? ? ? cookieEnabled:true,
? ? ? ? ? ? deviceMemory:8,
? ? ? ? ? ? doNotTrack:null,
? ? ? ? ? ? hardwareConcurrency:8,
? ? ? ? ? ? language:"zh-CN",
? ? ? ? ? ? languages: (2) ["zh-CN", "zh"],
? ? ? ? ? ? maxTouchPoints:0,
? ? ? ? ? ? onLine:true,
? ? ? ? ? ? platform:"Win32",
? ? ? ? ? ? product:"Gecko",
? ? ? ? ? ? productSub:"20030107",
? ? ? ? ? ? userAgent:"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
? ? ? ? ? ? vendor:"Google Inc.",
? ? ? ? ? ? vendorSub:"",
? ? ? ? ? ? webdriver:false
? ? }
}
Object.assign(global,params)
acrawler.js js的內(nèi)容自己復(fù)制進(jìn)來
var un_sign_url =process.argv[2]
var sign =global.byted_acrawler.sign({url:un_sign_url});
console.log(sign);
import os
import subprocess
import execjs
npm安裝的jsdom 路徑
os.environ["NODE_PATH"] ="C:/Users/公司/AppData/Roaming/npm/node_modules"
url ="https://www.toutiao.com/api/pc/list/feed?offset=0&channel_id=94349549395&max_behot_time=0&category=pc_profile_channel&disable_raw_data=true&aid=24&app_name=toutiao_web"
#應(yīng)變儀下
signature = subprocess.getoutput('node ac.js "{}"'.format(url))
signature = signature.strip()
finally_url ="{}&_signature={}".format(url,signature)
print(finally_url)