利用Python的Requests框架模擬瀏覽器登錄易班


前言:本文主要內容是利用Requests框架模擬瀏覽器登錄易班,從而實現其他功能(我的初衷是去幫朋友搶講座,但是這里只將登錄,因為后面搶講座的內容so easy)

   本文主要能學到的內容的也就是易班的密碼加密提交

   廢話不多說,現在開始吧~~

  第一步:獲取登錄界面  

              login_page_url = "https://www.yiban.cn/login"
login_page_res = person.get(url=login_page_url)(加密方法在頁面的js文件中,有興趣的可以自行去查看)  

  第二步:獲取驗證碼

              captcha_check_url = "https://www.yiban.cn/captcha/index?Tue%20Dec%2004%202018%2000:01:2" \
"6%20GMT+0800%20(%E4%B8%AD%E5%9B%BD%E6%A0%87%E5%87%86%E6%97%B6%E9%97%B4)"
captcha_check_respond = person.get(url=captcha_check_url)
print(captcha_check_respond)
captcha_content = captcha_check_respond.content # 轉換類型
fb = open('captcha.jpg', 'wb') # 把字節類型轉換為圖片文件
fb.write(captcha_content)
fb.close()
check_in = input("請輸入圖片驗證碼>>>:")

 

  第三部:提交登錄信息(密碼的加密在此過程中,詳細講這部分)

 

                            

                            可以看到這是我們登錄時要提交是四個參數:account 賬號   password 密碼  captcha 驗證碼  keysTime 時間戳

        我們可以看到密碼很明顯就是被加密過的。

        既然是加密過的密碼,那我們就來看看他是怎么加密的???

                            

 

        找到了加密方法——JSEncrypt(), 百度得知是RSA加密方法。接下來就是找到g_param這個參數看看是啥玩意兒了。

                             

        找到了這個,繼續找login-pr是什么東西。(明顯看得出這是某一個標簽的id,因此我們去網頁源代碼中查找)

        

        果不其然,在網頁源代碼中找到了我們的公鑰,經過測試發現這個公鑰每次都是變化的,且同一個公鑰和密碼每次加密也是不相同的,

                            因此,我們在這看可以使用正則表達式來提取這兩個參數(意外之喜——需要提交的第四個參數也在這找到了)。

        我正則不是很好,提取的時候花了好長時間提取不出來,后面才知道是因為數據換行的問題

        值得一提的是,在使用Python加密時,需要導包,推薦使用pycryptodemo這個。(安裝:pip install pycryptodemo)

        安裝完成后找到該文件,把文件夾crypto的C改成大寫才能引用,我也不知道為啥。

 

        分析完了,下面直接貼上完整的代碼: 

        

import requests
import re
import rsa
from Crypto.PublicKey import RSA
import base64
import json

person = requests.Session()
person.headers = {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
# "Host": "q.yiban.cn",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
}


# 登錄易班
def login(user, password):

login_page_url = "https://www.yiban.cn/login"
login_page_res = person.get(url=login_page_url)
# print(login_page_res.text)
# 獲取公鑰並加密
public_key = re.findall(r"BEGIN PUBLIC KEY-----\sM(.*)-----END PUBLIC KEY", login_page_res.text, re.S)[0]
public_key = '-----BEGIN PUBLIC KEY-----\nM' + public_key + '-----END PUBLIC KEY-----'
print(public_key)
rsa_key = RSA.importKey(public_key)
x = rsa.encrypt(password.encode(), rsa_key)
rsa_pass = base64.b64encode(x).decode()
print(rsa_pass)
# 獲取時間戳
keys_time = re.findall(r"data-keys-time='(.*?)'", login_page_res.text)[0]
print(keys_time)
check_in = captcha()
# random = time.time()
# random = round(random, 2) # 只取兩位小數

# 登錄易班
login_url = "https://www.yiban.cn/login/doLoginAjax"
login_data = {
"account": user,
"password": rsa_pass,
"captcha": check_in,
"keysTime": keys_time
}
login_res = person.post(url=login_url, data=login_data)

# 獲取登錄結果
getlogin_url = "http://www.yiban.cn/ajax/my/getLogin"
getlogin_data = {
"": ""
}
getlogin_res = person.post(url=getlogin_url, data=getlogin_data)
print(getlogin_res)
getlogin_res_content = getlogin_res.json()
print(getlogin_res_content)


def captcha():
captcha_check_url = "https://www.yiban.cn/captcha/index?Tue%20Dec%2004%202018%2000:01:2" \
"6%20GMT+0800%20(%E4%B8%AD%E5%9B%BD%E6%A0%87%E5%87%86%E6%97%B6%E9%97%B4)"
captcha_check_respond = person.get(url=captcha_check_url)
print(captcha_check_respond)
captcha_content = captcha_check_respond.content # 轉換類型
fb = open('captcha.jpg', 'wb') # 把字節類型轉換為圖片文件
fb.write(captcha_content)
fb.close()
check_in = input("請輸入圖片驗證碼>>>:")
return check_in


if __name__ == '__main__':
user = input("請輸入賬號>>>: ")
password = input("請輸入密碼>>>: ")
login(user, password)


    小白一枚,如發現有錯誤之處,歡迎指正。

 


免責聲明!

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



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