因為在wiki中未找到需要的數據,查詢也很迷,打算用python登錄tapd抓取所需項目下的wiki數據,方便查找。
2018-9-30 19:12:44
幾步走
- 模擬登錄tapd
- 抓取wiki頁左側鏈接
- 拿到每頁markdown
- 存儲數據庫
模擬登錄TAPD
請求參數
data[Login][ref] https://www.tapd.cn/my_worktable?left_tree=1
data[Login][encrypt_key] GxYimlauXYHXtqflCRfP4MLxInPBlMJIfvw7D+vCxQE=
data[Login][encrypt_iv] M7IkutCvI9/jFyQc3owL+Q==
data[Login][site] TAPD
data[Login][via] encrypt_password
data[Login][email] xxxxx@vchangyi.com
data[Login][password] T0cbRTIoaM1z9ktIM6Wl2Q==
data[Login][login] login
dsc_token dDdgn7oC89YL6Waz
變量
data[Login][encrypt_key] 0royxaa8qvuNkffv0zGRpLKZg+80lBje4fEz876igzw=
data[Login][encrypt_iv] 2ouJgjQ6j3jp4O5hFH6k4A==
data[Login][password] m6YLZH4DVzXjD/eLyVT/nQ==
dsc_token 30CfdZ59sH3JIaNh
dsc_token 通過 dsc+180208173064.js 生成,多次請求地址沒有變化說明后面數字尾巴不是時間戳之類動態,試着獲取一下dsc_token。
獲取 token
tapd_dsc.gen_token_and_set_to_cookie()
PyV8
裝不上,用execjs
讀取
import execjs
sign_js_path = "./dsc+180208173064.js"
def get_js(path):
f = open(path, 'r', encoding='UTF-8') # 打開JS文件
line = f.readline()
html_str = ''
while line:
html_str = html_str + line
line = f.readline()
return html_str
def load_sign_js(js_str):
return execjs.compile(js_str)
def writeFile(js):
fo = open("dsc.js", "w")
fo.write(js)
fo.close()
sign_js = load_sign_js(get_js(sign_js_path))
writeFile(sign_js._source)
print(sign_js.call('tapd_dsc.gen_token_and_set_to_cookie'))
調用方法不成功,報錯,寫文件並用html測試,則是好的。調用姿勢不對。
提取函數放單獨文件,改一下就好了。先這樣
獲取encrypt
輕車熟路在首頁里找到了一串疑似生成encrypt的代碼,拿出來封裝一下
function encrypt(password){
var key = CryptoJS.MD5(Math.random() + '').toString();
password = CryptoJS.AES.encrypt(password, key, {mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.ZeroPadding});
password_encode = password.ciphertext.toString(CryptoJS.enc.Base64);
//360è®°ä½Â密ç Â在val的时候会有bug,导致登录ä¸ÂæˆÂ功
while($("#password_input").val() != password_encode){
$("#password_input").val(password_encode);
}
$("#encrypt_iv").val(password.iv.toString(CryptoJS.enc.Base64));
$("#encrypt_key").val(password.key.toString(CryptoJS.enc.Base64));
}
發現一個形似的
Python3 模擬手機登錄熊貓直播(panda.tv)
我還是先用js直接搞。
CryptoJS
用的是
pad-zeropadding+151112164124.js
開始重點的,用上面執行js的方法,執行這個試試。
第一次報錯缺少對象,加上返回后成功!太牛了。
還缺少個必要的參數,password,相比上面那 password_encode
就是本尊了。返回加上,ok.
最緊張的時刻來臨。到底數據加密的對不對呢?
組合數據,模擬登陸
找了一個登錄的改了一下,發現沒效果。Fiddler
抓包時編輯器才報錯SSL。為什么呢?
強行忽略SSL,嘗試登錄了幾次還不成功。發現有驗證碼了。真有意思。加上驗證碼處理之后又發現沒有驗證碼了導致解析報錯,加個異常處理。ok
執行,看日志,跳轉成功!開森!
還沒測有驗證碼的,可能因為用瀏覽器成功登錄一次就沒了。試錯幾次又出來了驗證碼。
F5運行,輸入驗證碼。Bingo! 一次過的感覺超級好。再回去刷新瀏覽器登錄頁,無驗證碼。
p.s. 還是想說破解的有點暴力,真沒想到上面獲取的token 和 encrypt 會有效很順利(看來其他js都是假動作)。
待優化
- 報錯輸出,如密碼錯誤等。 var errorMsg = "郵箱或手機不存在"; 用python正則表達式提取字符串
- 內容代碼優化,做第一篇新搭建博客日志。
參考資料及注釋
感謝前輩們的詳細總結
- Windows環境安裝PyV8並執行js語句
python 調用js中的方法 |
python 調用js中的函數- CryptoJS aes加密,需key 和偏移量 iv
- Python模擬京東登錄 登錄和驗證碼全用到,感謝
- [原創]Python模擬登陸某網教師教育網 看雪出品必屬精品,值得細看一次,只看到給js打斷點用到了並沒再細看了
- Requests高級用法
- urllib3 User Guide
- python requests 模擬網站登錄 取消ssl安全認證
self.s.verify = False
- 超詳細的Python實現百度雲盤模擬登陸(模擬登陸進階) 學到了pyv8或者pyexecjs庫能處理js
Couldn't find a tree builder with the features you requested: lxml. Do you need to install a parser library?
,模塊bs4引用報錯需要安裝lxml,網上說安裝麻煩,我這里直接pip可以的