過程:
知道如何尋找登錄的接口
知道如何確定js的位置
知道如何觀察js的執行過程
知道js的執行方法
1. 確定網站的登錄的接口
登錄的form表單中action對應的url地址
通過抓包可以發現,在這個url地址和請求體中均有參數,切換到手機版,參數的個數少,分析js
2. 確定js的位置
通過點擊按鈕,然后點擊Event Listener,部分網站可以找到綁定的事件,對應的,只需要點擊即可跳轉到js的位置
部分網站的按鈕可能並沒有綁定js事件監聽,那么這個時候可以通過搜索請求中的關鍵字來找到js的位置,比如livecell
3. 觀察js的執行過程
找到js的位置之后,我們可以來通過觀察js的位置,找到js具體在如何執行,后續我們可以通過python程序來模擬js的執行,或者是使用類似js2py直接把js代碼轉化為python程序去執行
觀察js的執行過程最簡單的方式是添加斷點
添加斷點之后繼續點擊登錄,每次程序在斷點位置都會停止,通過如果該行有變量產生,都會把變量的結果展示在Scoope中
4. 執行js
觀察代碼知曉需要哪些參數,比如:
我們要登錄需要對密碼進行加密和獲取rkey字段的值
rkey字段的值我們直接發送請求rkey請求就可以獲得
密碼是先反轉然后使用RSA進行加密, js代碼很復雜, 我們希望能通過在python中執行js來實現
實現思路:
使用session發送rKey獲取登錄需要信息
根據獲取信息對密碼進行加密
使用session發送登錄請求
import requests import json import js2py # - 實現思路: # - 使用session發送rKey獲取登錄需要信息 # - url: http://activity.renren.com/livecell/rKey # - 方法: get # 獲取session對象 session = requests.session() headers = { "User-Agent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Mobile Safari/537.36", "X-Requested-With": "XMLHttpRequest", "Content-Type":"application/x-www-form-urlencoded" } # 設置session的請求頭信息 session.headers = headers response = session.get("http://activity.renren.com/livecell/rKey") # print(response.content.decode()) n = json.loads(response.content)['data'] # - 根據獲取信息對密碼進行加密 # - 准備用戶名和密碼 phoneNum = "131..." password = "****" # - 使用js2py生成js的執行環境:context context = js2py.EvalJs() # - 拷貝使用到js文件的內容到本項目中 # - 讀取js文件的內容,使用context來執行它們 with open("BigInt.js", 'r', encoding='utf8') as f: context.execute(f.read()) with open("RSA.js", 'r', encoding='utf8') as f: context.execute(f.read()) with open("Barrett.js", 'r', encoding='utf8') as f: context.execute(f.read()) # - 向context環境中添加需要數據 context.t = {'password': password} context.n = n # - 執行加密密碼的js字符 js = ''' t.password = t.password.split("").reverse().join(""), setMaxDigits(130); var o = new RSAKeyPair(n.e,"",n.n) , r = encryptedString(o, t.password); ''' context.execute(js) # - 通過context獲取加密后密碼信息 # print(context.r) password = context.r # - 使用session發送登錄請求 # - URL: http://activity.renren.com/livecell/ajax/clog # - 請求方法: POST # - 數據: # - phoneNum: 15565280933 # - password: (加密后生產的) # - c1: 0 # - rKey: rkey請求獲取的 data = { 'phoneNum': '131....', 'password': password, 'c1':0, 'rKey':n['rkey'] } # print(session.headers) response = session.post("http://activity.renren.com/livecell/ajax/clog", data=data) print(response.content.decode()) # 訪問登錄的資源 response = session.get("http://activity.renren.com/home#profile") print(response.content.decode())