目錄
- 1. 背景介紹
- 2. 分析
- 3. 代碼實作
- 4. 總結
這篇博文我們繼續去學習開發中經常用到的編碼、訊息摘要演算法和加密演算法方面的知識,作為開發者,掌握這些知識可以讓我們在設計反爬蟲時有更豐富的搭配,而作為爬蟲工程師,掌握這些知識可以讓我們在面對 奇怪 的字串時能夠更快地找到突破口,在學習和掌握了 js 加密及逆向之后,我們可以處理的爬蟲問題如下:
(1) 模擬登錄中密碼加密和其他請求引數加密處理
(2) 動態加載且加密資料的捕獲和破解
1. 背景介紹
微信公眾平臺,簡稱公眾號,曾命名為 官號平臺、媒體平臺、微信公眾號,最終定位為 公眾平臺,無疑讓我們看到一個微信對后續更大的期望,
利用公眾賬號平臺進行自媒體活動,簡單來說就是進行一對多的媒體性行為活動,如商家通過申請公眾微信服務號通過二次開發展示商家微官網、微會員、微推送、微支付、微活動、微報名、微分享、微名片等,已經形成了一種主流的線上線下微信互動營銷方式,本文通過爬蟲去模擬微信公眾平臺的登錄,
2. 分析
點擊 此處 進入到微信公眾平臺的首頁面,然后滑鼠單擊 使用賬號登錄,如下圖所示:

緊接著在賬號和密碼輸入框中輸入賬號和密碼,如下圖所示:

在鍵盤中按下 <Fl2> 快捷鍵或者是滑鼠右鍵單擊選擇 檢查(inspect),打開瀏覽器開發者工具 (這里使用谷歌瀏覽器),然后在頂部導航條中選擇 Network 選項,又由于登錄一般都是使用的 ajax 請求,所以接著我們單擊下方的 XHR,在這些準備作業都做好之后,我們就可以點擊頁面中的 登錄 按鈕,監聽請求的 URL,如下圖所示,

我們在全域當中對 pwd 進行搜索,發現 pwd 分別包含在 1個 css 檔案及1個 js 檔案中,經過分析判斷,pwd 生成的規則最可能在 js 檔案中,如下圖所示:


進入到 js 源檔案中之后,點擊 Pretty-print 或者是 左下角的 {} 進行代碼格式化,然后 ctrl + f 再次對 pwd 關鍵字進行搜索,如下圖所示:


如果說滑鼠左鍵單擊或者是按住 ctrl + 滑鼠左鍵單擊仍然定位不到函式,我們可以采用斷點的方式進入,如下圖所示:


在這里我們可以定位到密碼經過一定格式處理后的回傳值,觀察發現,回傳值中有幾個不同的函式,我們可以通過滑鼠單擊每個函式定位到函式的定義位置,一般來說,使用到的函式,都會在同一個作用域中,即在距離包含該回傳值函式的上一層{} 中,找到所有的代碼之后,復制到 js 除錯工具中,博主在這里使用的是 發條js除錯工具V1.9 ,讀者可自行在網上搜索下載,如圖所示:

加載成功之后,我們去呼叫函式,輸入在網頁端輸入的密碼,看是否能生成對應加密后的字串,如下圖所示:

經過和網頁端對比發現,兩者完全一樣,此時我們就完全找到了 js 加密相關的函式,
3. 代碼實作
在上面的程序當中,我們找到了所有關于 js 加密的函式,接下來我們的處理方式有 2 種:
(1) 使用 Python 的語法規則去改寫所有的 js 加密函式,此種方法要求編碼者有足夠好的 python 基礎,難度較大,不建議使用,
(2) 使用 Python 中的第三方模塊去執行我們找到的 js 代碼,首先要進行安裝:
pip install PyExecJS # 讀者可以自行添加鏡像源
建議大家在使用這個模塊的時候,先安裝好 Node.js 環境,提供該模塊的學習網址,如下:
https://pypi.org/project/PyExecJS/
博主這里首先將找到的生成密碼相關的 js 代碼單獨放到一個 js 檔案中,然后通過 python 讀取檔案的方法將檔案中的 js 代碼讀取出來,緊接著呼叫安裝好的第三方模塊中的方法進行執行,如下圖所示:

示例代碼如下:
# -*- coding: UTF-8 -*-
"""
@author:AmoXiang
@file:wechat.py
@time:2020/12/01
"""
import execjs
# node = execjs.get() # 實體化一個物件
ctx = execjs.compile(open("./getPwd.js", "r", encoding="utf8").read()) # 編譯
funName = "getPwd({})".format("135790")
pwd = ctx.eval(funName)
print(pwd) # d3786ec2413a8cd9413bfcb24be95a73
程式運行結果如下:

4. 總結
- js 除錯工具 — 發條 js 除錯工具
- PyExecJs — 實作使用 python 執行 js 代碼 環境安裝:
- nodejs開發環境
- pip install PyExecJS
- js 演算法改寫初探 — 打斷點 (代碼除錯時,如果發現了相關變數的缺失,一般給其定義成空字典即可)
至此今天的案例就到此結束了,筆者在這里宣告,筆者寫文章只是為了學習交流,以及讓更多學習Python基礎的讀者少走一些彎路,節省時間,并不用做其他用途,如有侵權,聯系博主洗掉即可,感謝您閱讀本篇博文,希望本文能成為您編程路上的領航者,祝您閱讀愉快!

好書不厭讀百回,熟讀課思子自知,而我想要成為全場最靚的仔,就必須堅持通過學習來獲取更多知識,用知識改變命運,用博客見證成長,用行動證明我在努力,
如果我的博客對你有幫助、如果你喜歡我的博客內容,請點贊、評論、收藏一鍵三連哦!聽說點贊的人運氣不會太差,每一天都會元氣滿滿呦!如果實在要白嫖的話,那祝你開心每一天,歡迎常來我博客看看,
?編碼不易,大家的支持就是我堅持下去的動力,點贊后不要忘了關注我哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/233153.html
標籤:其他
