Python模擬登陸TAPD


因為在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用的是

aes+151112164124.js

pad-zeropadding+151112164124.js

開始重點的,用上面執行js的方法,執行這個試試。
第一次報錯缺少對象,加上返回后成功!太牛了。

還缺少個必要的參數,password,相比上面那 password_encode 就是本尊了。返回加上,ok.
此處是encyrpt html測試圖片

最緊張的時刻來臨。到底數據加密的對不對呢?

組合數據,模擬登陸

找了一個登錄的改了一下,發現沒效果。Fiddler抓包時編輯器才報錯SSL。為什么呢?

強行忽略SSL,嘗試登錄了幾次還不成功。發現有驗證碼了。真有意思。加上驗證碼處理之后又發現沒有驗證碼了導致解析報錯,加個異常處理。ok

執行,看日志,跳轉成功!開森!
此處是日志圖片

還沒測有驗證碼的,可能因為用瀏覽器成功登錄一次就沒了。試錯幾次又出來了驗證碼。
此處是tapd 驗證碼頁
F5運行,輸入驗證碼。Bingo! 一次過的感覺超級好。再回去刷新瀏覽器登錄頁,無驗證碼。
此處是tapd無驗證碼頁

p.s. 還是想說破解的有點暴力,真沒想到上面獲取的token 和 encrypt 會有效很順利(看來其他js都是假動作)。

待優化

參考資料及注釋

感謝前輩們的詳細總結


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM