好友
阅读权限 30
听众
最后登录 1970-1-1
本帖最后由 xhtdtk 于 2021-3-19 11:38 编辑
先说点别的
目前各大院校的作业又开始了,虽然可以直接利用cookie进行请求,但很多人不知道cookie是什么在哪里,所以还是通过模拟登录来而获取cookie
这是我睡下午觉突然想的方法,这个方法没参考过别人的文章,但是那么简单肯定有很多人知道或者在别的地方发表过,各位知道我不是盗版就好
1、请求的url和登录表单数据
# 请求的url : https://www.qingshuxuetang.com/Login?_t=1615993555750
# 登录表单数据 :
username : 1
password : 1
deviceInfoQS : {"netType":1,"appType":3,"clientType":3,"deviceName":"PCWeb","osVersion":"Win32","appVersion":"5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3776.400 QQBrowser/10.6.4212.400","imei":"","mac":"","idfa":""}
type : 3
sessionId : 02415a85-a8e2-4324-bfe4-2f973efc2321
userInput : 1
ref :
2、分析
请求的url : _t为当前时间戳转换为毫秒
登录表单数据 :
①username 和 password 分别为 账号、密码
② deviceInfoQS 不知道是什么参数,可能与浏览器有关,无论登录成功与否都没有改变,是固定参数
③ type 与 deviceInfoQS 一样,不知道是什么参数,但也是 固定参数
④ sessionId 不知道是什么参数,不是固定参数,但是可以从别的接口获取
⑤ us erInput 用户需要输入的验证码,与 sessionId 在同一接口
⑥ ref 不知道是什么参数,一直是空值
3、根据分析,只要获取sessionId 和 us erInput(验证码) 就能完成登录
正常进入页面后在账号一行输入任意内容,便能获取一个 POST的url : https://www.qingshuxuetang.com/Svc/GetValIDA tionCode?_t=1615995065065
需要提交的表单数据都是固定参数,再查看reponse的内容,正是需要的 sessionId 和 验证码图片的二进制流
搜索了一下如何用python将二进制流转换为图片,没有找到自己想要的,于是使用selenium来打开验证码图片,图片正常显示,用户就能根据图片输入验证码了
4、代码及获取cookie
import requests
import time
import datetime
from selenium import webdriver
from bs4 import BeautifulSoup
import re
#创建一个会话
s=requests.session()
#账号密码
username=input("输入账号:")
password=input("输入密码:")
#获取当前时间戳
t = time.time()
rnd = int(round(t * 1000)) #毫秒级时间戳
#获取session和图片验证
param={'_t': str(rnd)}
data_code={"recv": str(username),"validationType": 3}
rep_getcode=s.post('https://www.qingshuxuetang.com/Svc/GetValidationCode',params=param,json=data_code)
sessionId=rep_getcode.json()['data']['sessionId']
print(sessionId)
code='data:image/png;base64,'+rep_getcode.json()['data']['code']
driver=webdriver.Chrome()
driver.get(code)
userInput=input("输入验证码:")
data_login={
'username': str(username),
'password': str(password),
'deviceInfoQS': '{"netType":1,"appType":3,"clientType":3,"deviceName":"PCWeb","osVersion":"Win32","appVersion":"5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3776.400 QQBrowser/10.6.4212.400","imei":"","mac":"","idfa":""}',
'type': '3',
'sessionId': str(sessionId),
'userInput': str(userInput),
'ref':''
}
rep_login=s.post('https://www.qingshuxuetang.com/Login?',params=param,data=data_login)
print(str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))+' 登录状态:'+rep_login.json()['message'])
num=0
for num_cookie in rep_login.cookies:
if num == 0:
cookie_1=re.findall('<Cookie (.*?) for',str(num_cookie))[0]
if num == 1:
cookie_2=re.findall('<Cookie (.*?) for',str(num_cookie))[0]
num = num + 1
cookie=cookie_1+'; '+cookie_2
print(cookie)
代码写的比较粗糙,不过思路介绍完了,你们一定能写出一个比我更好的,
为什么不用def进行封装,我比较懒,写出来能用就行,打扰大家欣赏代码的雅兴了
免费评分
查看全部评分
发帖前要善用【论坛搜索 】 功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。