爬蟲js逆向之加密參數破解--抖音第三方數據分析平臺的坑

2021-03-06 Python學習交流

爬蟲js逆向系列
我會把做爬蟲過程中,遇到的所有js逆向的問題分類展示出來,以現象,解決思路,以及代碼實現,這三方面解析,供大家參考

爬蟲認知
在程序猿所有的方向中,爬蟲是離money最近的一個方向,你的明白?而且爬蟲可發展的方向很多,前可走大數據,人工智慧,後可轉後端。而且爬蟲做得好,要求的技術棧還是比較全面的。如果你對爬蟲有興趣,歡迎加V:13809090874,一起溝通交流

免責申明:
此內容僅供學習交流使用,不用於商業用途,如果涉及侵權,聯繫作者刪除

1. 分析請求頭


請求頭內容如下:

POST /api/tiktok/ranking/tiktok_goods_sales_rank?ts=1602072436550&he=wqdvbhcTvwD2hXibw4L5RyPHeCsEZ8f7wrD2w4Sh&sign=5e1501c104122454 HTTP/1.1
Host: api.douchacha.com
Connection: keep-alive
Content-Length: 258
dcc-href: https://www.douchacha.com/cable
d-v: NCxaZGJRd3BDVFBzZmlaa1Z4WkhibXdvUUtVc2ZldzZsZ2hkZkR3b09UdWpWeGVPUk13NzlUd3F2VG54SHJLaFlVTkhibUU4YkVHa3BsdzYlMkZVcDhmYVNzZkN3NjhWajhmMkhpY1ROUThNZGtEd1prclV2MlEyVmlNJTJGQ2RiZXc1WkpSMzNVdVNjVHJIZkt3NVlUbzhiYlprZDVaaENVclZ3TWRrVk13cktVb3NiMFprUE13NXAlMkJ3cmNVdmglM0QlM0Q=
Authorization: eyJhbGciOiJIUzI1NiJ9.eyJ0eXBlIjoiUEMiLCJleHAiOjE2MDI2Njg2NDksInVzZXJJZCI6MTI5OTIyNjYzOTc0OTc1MDc4NCwiY3JlYXRlRGF0ZSI6IjIwMjAtMTAtMDcgMTc6NDQ6MDkifQ.ppW18NruEU9gpgRJgbYIaEUkvD7cTmfcRBXgOQ8vamE
Content-Type: application/json;charset=UTF-8
Accept: application/json, text/plain, */*
s-id: 371
dcc-r: https://www.douchacha.com/cable
d-t: 1602072436550
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36
j-id: sem
Origin: https://www.douchacha.com
Sec-Fetch-Site: same-site
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://www.douchacha.com/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9

url中有兩個加密參數he與ts,ts看著就像是時間戳(毫秒級)

請求頭中有幾個加密參數:d-v,Authorization,d-t

大家有沒有發現一個問題,就是這個網站沒有用cookies。對的,它沒有用cookies做身份校驗,而是用Authorization來做用戶校驗,所以我們必須要找到Authorization的加密方式。

2.尋找加密參數封裝的地方

對於去尋找目標網站的加密參數,有幾個思路跟大家分享一下:

直接搜關鍵詞,我們要找he,d-v這樣的加密參數,直接在js中搜,看是否能搜到,這也是最常用,最直接的辦法

對於一些完全混淆過的js,直接搜是無法搜到的,那麼就看它的調用棧,一層層斷點打進去。

對於我要爬的網站,還算友好,我直接搜he,d-v就搜到了相對應的代碼部分,如下圖


從這段代碼中,我們可以發現所有請求頭的加密參數都是在這裡封裝的。第6489行代碼:

t.url = "".concat(t.url, "?ts=").concat(e, "&he=").concat(s, "&sign=").concat(c);
1

這是url的封裝參數,ts與he,ts=e,he=s,sign=c

return i && (t.headers.common["Authorization"] = i),
t.headers.common["d-t"] = e,
u && (t.headers.common["j-id"] = u),
d && (t.headers.common["s-id"] = d),
g && (t.headers.common["dcc-href"] = g),
t.headers.common["dcc-r"] = document.referrer || "",
t

這是請求頭的封裝參數。
找到這裡後,我們就要去找這些值是怎麼生成的。
ts:

e = (new Date).getTime() + 1 * sessionStorage.getItem("diffDate") || 0
1

ts就是當前時間戳+session裡一個時間差,這個時間差通過閱讀源碼可以發現,這是頁面加載的時間,可以自己隨機生成一下
he:

i = JSON.parse(localStorage.getItem("token"))
s = window.he(i ? "uid" : "dt")
12

判斷localStorage中的token是否存在,存在就調用window.he(uid),不存在就調用window.he(「dt」),window對象的原生方法中沒有he這個方法,那麼he()就是他們自定義的方法,我們後面著重去找這個方法就可以了。
sign:

e = (new Date).getTime() + 1 * sessionStorage.getItem("diffDate") || 0
n = t.url.split("https://api.douchacha.com")[1];
o = n + e
c = window.sh(o)
1234

從這裡也可以看出sign值加密的方式,主要是找sh生成方法。o參數,我們可以模擬出來。
d-v:

l = window.btoa(window.v() + "," + window.hi("dt"));
t.headers.common["d-v"] = l
12

d-v這個參數就是主要找v()和hi()這兩個方法的聲明。
Authorization:

i = localStorage.getItem("token")
return i && (t.headers.common["Authorization"] = i),
12

token就是登錄時的帳號驗證信息

3.繼續潛入,找到加密方法生成方法

我們之前說過這個網站的主要加密地方為app.js和s.js。通過搜索方法名,我們可以很快的找到這些方法聲明的地方


我們搜到了這個方法的地方,但是這裡都是十六進位的加密,破解起來非常麻煩。這個js文件還好,只有400多行,把它完全破解,也還好,沒那麼費力。但是要是上萬行,幾萬行,那就要了老命了。
我們可以通過hook的方式,黑盒的方式來解決這個問題,沒必要搞定它是怎麼加密的。把這個js下載下來,利用python的execjs這個包去直接調用js函數。就可以解決問題。
注意:運行execjs包的時候,需要先安裝nodejs,不然會沒有js的運行環境
execjs包的安裝:

pip install PyExecJs
1

python代碼:

import execjs
js = execjs.compile(open(r"s_my_press.js").read())
url = 'https://api.douchacha.com/api/tiktok/ranking/user_list_gain'
diffdate = 0
n = str(int(round(time.time()*1000)) + diffdate)
# n = '1599562900780'
print('n:'+str(n))
e = url.split('https://api.douchacha.com')[1]
o = e+str(n)
r = js.call('he','1299226639749750784')
r = encode_b64_url(r)
print('he',r)
s = js.call('sh',o)
url = url+'?ts={}&he={}&sign={}'.format(n,r,s)
hi = encode_b64_url(js.call('hi',n))
print('hi:'+hi)
d_v = base64.b64encode((str(4) + ',' + hi).encode())
print('d_v'+str(d_v))

headers ={
'Host': 'api.douchacha.com',
'Connection': 'keep-alive',
'Content-Length': '101',
'dcc-href': 'https://www.douchacha.com/uppoint',
'd-v': d_v,
'Authorization': "eyJhbGciOiJIUzI1NiJ9.eyJ0eXBlIjoiUEMiLCJleHAiOjE1OTk4MjA1NjQsInVzZXJJZCI6MTI5OTIyNjYzOTc0OTc1MDc4NCwiY3JlYXRlRGF0ZSI6IjIwMjAtMDktMDQgMTg6MzY6MDQifQ.KCrYYx4hEqzv6CTJw2NlvD8pp-iRMw7IBgud_XwHHRE",
'Content-Type': 'application/json;charset=UTF-8',
'Accept': 'application/json, text/plain, */*',
's-id': '371',
'dcc-r': 'https://www.douchacha.com/uppoint',
'd-t': str(n),
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36',
'j-id': 'sem',
'Origin': 'https://www.douchacha.com',
'Sec-Fetch-Site': 'same-site',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://www.douchacha.com/uppoint',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9'
}
data = {"page_no":1,"page_size":20,"params_data":{"label_name":"","period":"DAY","period_value":"20200907"}}
r1 = sess.post(url,json=data, headers=headers, verify=False)
print(r1.text)
1234567891011121314151617181920212223242526272829303132333435363738394041424344

這樣就可以成功的抓取到數據了。
當然這裡面會有一些小坑。

js中的window對象在execjs中運行會報錯,因為execjs沒有瀏覽器這個對象,所以我們必須要把window對象裡面的方法拎出來,用python去執行,比如window.btoa這是js中base64加密方法,必須用python的base64去重新生成

js中默認的編碼方式iso-8859-1,而python中不是,在調用python中base64加密時得要表明編碼方式為 iso-8859-1

至此,我們前期破解的工作已經完成。至於該網站的登錄問題,比較簡單,就不寫了。也很容易拿到token。後續會更新的,記得給我關注哦!

完整項目原始碼獲取加下交流群:  1136192749

相關焦點

  • 最全的 Python 反爬蟲及應對方案!
    解決方法:接入第三方驗證碼平臺,實時破解網站的驗證碼。缺點:影響正常的用戶體驗操作,驗證碼越複雜,網站體驗感越差。實現難度:★★ 6. 通過robots.txt來限制爬蟲robots.txt(統一小寫)是一種存放於網站根目錄下的ASCII編碼的文本文件,它通常告訴網絡搜尋引擎的漫遊器(又稱網絡蜘蛛),此網站中的哪些內容是不應被搜尋引擎的漫遊器獲取的,哪些是可以被漫遊器獲取的。
  • 讓你強無敵的 JavaScript 逆向高階課來襲
    既然是 JavaScript 逆向的內容,那麼肯定是圍繞著 JavaScript、圍繞著大家關注的技術點或者需求展開。這次課分為 3 個部分:1.加密和混淆的繞過實戰與分析思路2.常見驗證碼的繞過實戰與分析思路3.
  • JS逆向爬蟲---破解有道翻譯
    在上一篇文章python破解百度翻譯反爬機制---自製翻譯器就和各位讀者聊到了有道翻譯
  • 逆向爬蟲時,Python 如何正確調用JAR加密邏輯?
    前言在 App 端爬蟲過程中,遇到未知的參數,往往需要我們去逆向破解 App,針對參數的生成邏輯,使用 Python 去實現部分 App 參數的生成邏輯可能已經寫入到多個 JAR 文件中,這時候,我們只需要用 Python 執行 JAR 即可本篇文章將聊聊 Python 如何調用 JAR 中的方法2.
  • 逆向爬蟲時,Python 如何正確調用 JAR 加密邏輯?
    前言在 App 端爬蟲過程中,遇到未知的參數,往往需要我們去逆向破解 App,針對參數的生成邏輯,使用 Python 去實現部分 App 參數的生成邏輯可能已經寫入到多個 JAR 文件中,這時候,我們只需要用 Python 執行 JAR 即可本篇文章將聊聊 Python 如何調用 JAR 中的方法2.
  • 10 個爬蟲工程師必備的工具
    按照日常爬蟲流程順序來逐個介紹:爬蟲第一步:目標站點分析1.ChromeChrome屬於爬蟲的基礎工具,一般我們用它做初始的爬取分析,頁面邏輯跳轉、簡單的js調試、網絡請求的步驟等。當然,如果對方在服務端做了參數加密,那就涉及逆向工程方面的知識,那一塊又是一大籮筐的工具,這裡暫且不談同類工具:Fiddler、Wireshark、Anyproxy爬蟲第二步:分析站點的反爬蟲3.cUrl
  • 中國國家地名信息庫數據加密破解
    dmfw.mca.gov.cn/online/map.html難點分析抓包過程發現,數據都是加密的,需要破解該加密字符串,獲取明文數據密文解密分析抓包階段其實是有點迷茫的,只是明確是需要的數據都是加密的之外,其他沒有特別明顯的信息讓我們作為突破口,要研究的密文來自連結  https://dmfw.mca.gov.cn/9095/stname/list,是一個異步請求,按經驗來說,這種請求一般是寫在js裡進行執行的,只能以此為入口看能夠找到突破點嘗試全局搜索關鍵字 「stname
  • 爬蟲工程師最想要的手把手 JS 逆向系列教程!
    爬蟲是大數據時代不可或缺的數據獲取手段,它是綜合技術的應用體現。有取就有失,有攻就有防。開發者為了保護數據,不得已想出了很多辦法來限制爬蟲對數據的獲取。WEB 網站的構成使得 JavaScript 成為了開發者阻擋爬蟲的最佳選擇。
  • 逆向小程序破解工具篇-(微信開發者工具)
    首先聲明: 此次逆向Js只為學習交流使用,切勿用於其他非法用途,關鍵代碼均打碼剛剛寫過一篇,如何從小程序中把需要逆向的項目給打包導出到本地, 並翻譯成
  • 網易雲音樂PC客戶端加密API逆向解析
    ,腦海裡就想著替換然後對轉換流程動態分析了,事實有點不盡人意,該zip文件加密了。雖然cef自帶DevTools,但是已經被屏蔽掉了也無法在程序裡調出來,所以我想在JS文件中加上alert調試關鍵參數。然後我修改了core.js文件,按原來的密碼壓縮回去。但程序根本就起不來,為什麼呢,看看原版的.ntpk文件,很明顯還有一些奇怪的東西和zip文件一起合成了這個ntpk文件格式。
  • 成為一個爬蟲工程師,都需要學習那些知識?
    大數據流行的今天,網絡爬蟲成為了獲取數據的一個重要手腕。但要學習好爬蟲並沒有那麼簡單。由於學習點、學習方向等實在是太多了,而且它涉及到計算機網絡、後端編程、前端開發、App 開發與逆向、網絡安全、資料庫、自動化運維、機器學習、數據分析等各個方向的內容,它像一張大網一樣,把如今一些主流的技術棧都囊括在內。
  • 從零開始的python爬蟲速成指南
    崗位分析報告Selenium介紹抖音App視頻抓包Bilibili 用戶Bilibili 視頻Bilibili 小視頻Bing美圖爬蟲B站760萬視頻信息爬蟲博客園(node.js)百度百科(node.js)北郵人水木清華招聘百度雲網盤
  • 深度好文 | 了解爬蟲技術方方面面
    但很多時候,無論出於數據分析或產品需求,我們需要從某些網站,提取出我們感興趣、有價值的內容,但是縱然是進化到 21 世紀的人類,依然只有兩隻手,一雙眼,不可能去每一個網頁去點去看,然後再複製粘貼。所以我們需要一種能自動獲取網頁內容並可以按照指定規則提取相應內容的程序,這就是爬蟲。
  • 用Python破解有道翻譯反爬蟲機制
    那麼自從有道翻譯推出他的API服務的時候,就對這個接口做一個反爬蟲機制(如果大家都能免費使用到他的翻譯接口,那他的API服務怎麼賺錢)。這個反爬蟲機制在爬蟲領域算是一個非常經典的技術手段。那麼他的反爬蟲機制原理是什麼?如何破解?接下來帶大家一探究竟。一、正常的爬蟲流程:如果你要爬取他的翻譯接口,這個流程還是不能少的。
  • 我就想寫個爬蟲,到底要學多少東西啊?
    真正的數據是經過 JavaScript 執行的出來的,數據來源可能是 Ajax,也可能是頁面裡的某些 Data,也可能是一些 ifame 頁面等等,不過大多數情況下可能是 Ajax 接口獲取的。所以很多情況下需要分析 Ajax,知道這些接口的調用方式之後再用程序來模擬。但是有些接口帶著加密參數,比如 token、sign 等等,又不好模擬,咋整呢?
  • Python破解有道翻譯反爬蟲機制
    那麼自從有道翻譯推出他的API服務的時候,就對這個接口做一個反爬蟲機制(如果大家都能免費使用到他的翻譯接口,那他的API服務怎麼賺錢)。這個反爬蟲機制在爬蟲領域算是一個非常經典的技術手段。那麼他的反爬蟲機制原理是什麼?如何破解?接下來帶大家一探究竟。一、正常的爬蟲流程:如果你要爬取他的翻譯接口,這個流程還是不能少的。
  • 【權威發布】吾愛破解論壇2020年優秀、精華TOP榜(上)
    https://www.52pojie.cn/thread-1161419-1-1.html58datochan極驗反爬蟲防護分析之交互流程分析https://www.52pojie.cn/thread-1162853-1-1.html59jimmyzangHTML5視頻解密的方法(widevine的破解思路)https://www.52pojie.cn/thread-1162942-1-1.html60Silent_DXX
  • 就想寫個爬蟲,我到底要學多少東西啊?
    真正的數據是經過 JavaScript 執行的出來的,數據來源可能是 Ajax,也可能是頁面裡的某些 Data,也可能是一些 ifame 頁面等等,不過大多數情況下可能是 Ajax 接口獲取的。所以很多情況下需要分析 Ajax,知道這些接口的調用方式之後再用程序來模擬。但是有些接口帶著加密參數,比如 token、sign 等等,又不好模擬,咋整呢?
  • 極驗驗證碼(6.0.9)破解(四) 之 'aa' 參數調試和分析
    回顧2. 1 針對aa參數的js斷點調試3. 總結1. 回顧上篇文章[1] 介紹了'userresponse' 參數調試和分析,並將js執行過程整理出來,整理成python代碼。今天我們繼續進行極驗破解,這次我們介紹 'aa'參數的生成,距離上篇文章,已經過去快三個月了,工作很忙,又忙著結婚,一直抽不出來空,或者靜不下心來寫博客,今天總算是忙裡偷閒,也讓自己沉澱一下,準備更新極驗破解第4篇正當我擼起袖子準備大幹一番的時候,發現我的目標網站,關閉了相關功能頁面,不過還好基礎頁面還在,我還能接著用它的極驗滑塊接著幹,哈哈不廢話了
  • Python——爬蟲
    一、什麼是網絡爬蟲在隨著大數據時代的到來,網絡爬蟲在網際網路中的地位也越來越重要。而網際網路中的數據是海量存在的,那麼我們如何自動高效地獲取網際網路中我們感興趣的信息並為我們所用就成了一個重要的問題,而爬蟲技術就是為了解決這些問題而產生的。