大黄先生

导航

利用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)


    小白一枚,如发现有错误之处,欢迎指正。

 

posted on 2018-12-05 16:50  大黄先生  阅读(1290)  评论(3编辑  收藏  举报