模拟登录古诗词网

主要思路:

  1. 对登录界面发送请求,网址:https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx
  2. 由于该网址密码输错三次会有验证码,我们就需要第三方平台帮忙破解验证码。小编采用的斐斐打码平台,当然平台打码是需要收费的,但是比较便宜,还有首充优惠。验证码的类型可以查看,不同类型的验证码收费不一样在这里插入图片描述
  3. 爬取验证码图片保存,运用打码平台获取验证码。
  4. 我们再登录时打开我们的抓包工具,会发现一个网址:https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx
  5. 该网址是再登录时,向服务器发送的请求,我们发现里面携带了一些参数在这里插入图片描述
    我们发现后面五个参数分别是网址,邮箱/电话,密码,验证码,登录,但是前面两个参数就很奇怪了。不过没关系,仔细找找我发现他在登录界面时的网页里有:https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx
  6. 获取全部参数后,还不能直接马上发送请求,因为再发送想服务器发送请求中有可能携带了cookie,所以还得创建一个session会话保存cookie。
  7. 最后保存源码到本地,就实现了模拟登录。

附上源码

# coding=utf-8
import os, sys
import hashlib
import time
import json
import requestsFATEA_PRED_URL = "http://pred.fateadm.com"def LOG(log):# 不需要测试时,注释掉日志就可以了print(log)log = Noneclass TmpObj():def __init__(self):self.value = Noneclass Rsp():def __init__(self):self.ret_code = -1self.cust_val = 0.0self.err_msg = "succ"self.pred_rsp = TmpObj()def ParseJsonRsp(self, rsp_data):if rsp_data is None:self.err_msg = "http request failed, get rsp Nil data"returnjrsp = json.loads(rsp_data)self.ret_code = int(jrsp["RetCode"])self.err_msg = jrsp["ErrMsg"]self.request_id = jrsp["RequestId"]if self.ret_code == 0:rslt_data = jrsp["RspData"]if rslt_data is not None and rslt_data != "":jrsp_ext = json.loads(rslt_data)if "cust_val" in jrsp_ext:data = jrsp_ext["cust_val"]self.cust_val = float(data)if "result" in jrsp_ext:data = jrsp_ext["result"]self.pred_rsp.value = datadef CalcSign(pd_id, passwd, timestamp):md5 = hashlib.md5()md5.update((timestamp + passwd).encode())csign = md5.hexdigest()md5 = hashlib.md5()md5.update((pd_id + timestamp + csign).encode())csign = md5.hexdigest()return csigndef CalcCardSign(cardid, cardkey, timestamp, passwd):md5 = hashlib.md5()md5.update(passwd + timestamp + cardid + cardkey)return md5.hexdigest()def HttpRequest(url, body_data, img_data=""):rsp = Rsp()post_data = body_datafiles = {'img_data': ('img_data', img_data)}header = {'User-Agent': 'Mozilla/5.0',}rsp_data = requests.post(url, post_data, files=files, headers=header)rsp.ParseJsonRsp(rsp_data.text)return rspclass FateadmApi():# API接口调用类# 参数(appID,appKey,pdID,pdKey)def __init__(self, app_id, app_key, pd_id, pd_key):self.app_id = app_idif app_id is None:self.app_id = ""self.app_key = app_keyself.pd_id = pd_idself.pd_key = pd_keyself.host = FATEA_PRED_URLdef SetHost(self, url):self.host = url## 查询余额# 参数:无# 返回值:#   rsp.ret_code:正常返回0#   rsp.cust_val:用户余额#   rsp.err_msg:异常时返回异常详情#def QueryBalc(self):tm = str(int(time.time()))sign = CalcSign(self.pd_id, self.pd_key, tm)param = {"user_id": self.pd_id,"timestamp": tm,"sign": sign}url = self.host + "/api/custval"rsp = HttpRequest(url, param)if rsp.ret_code == 0:LOG("query succ ret: {} cust_val: {} rsp: {} pred: {}".format(rsp.ret_code, rsp.cust_val, rsp.err_msg,rsp.pred_rsp.value))else:LOG("query failed ret: {} err: {}".format(rsp.ret_code, rsp.err_msg.encode('utf-8')))return rsp## 查询网络延迟# 参数:pred_type:识别类型# 返回值:#   rsp.ret_code:正常返回0#   rsp.err_msg: 异常时返回异常详情#def QueryTTS(self, pred_type):tm = str(int(time.time()))sign = CalcSign(self.pd_id, self.pd_key, tm)param = {"user_id": self.pd_id,"timestamp": tm,"sign": sign,"predict_type": pred_type,}if self.app_id != "":#asign = CalcSign(self.app_id, self.app_key, tm)param["appid"] = self.app_idparam["asign"] = asignurl = self.host + "/api/qcrtt"rsp = HttpRequest(url, param)if rsp.ret_code == 0:LOG("query rtt succ ret: {} request_id: {} err: {}".format(rsp.ret_code, rsp.request_id, rsp.err_msg))else:LOG("predict failed ret: {} err: {}".format(rsp.ret_code, rsp.err_msg.encode('utf-8')))return rsp## 识别验证码# 参数:pred_type:识别类型  img_data:图片的数据# 返回值:#   rsp.ret_code:正常返回0#   rsp.request_id:唯一订单号#   rsp.pred_rsp.value:识别结果#   rsp.err_msg:异常时返回异常详情#def Predict(self, pred_type, img_data, head_info=""):tm = str(int(time.time()))sign = CalcSign(self.pd_id, self.pd_key, tm)param = {"user_id": self.pd_id,"timestamp": tm,"sign": sign,"predict_type": pred_type,"up_type": "mt"}if head_info is not None or head_info != "":param["head_info"] = head_infoif self.app_id != "":#asign = CalcSign(self.app_id, self.app_key, tm)param["appid"] = self.app_idparam["asign"] = asignurl = self.host + "/api/capreg"files = img_datarsp = HttpRequest(url, param, files)if rsp.ret_code == 0:LOG("predict succ ret: {} request_id: {} pred: {} err: {}".format(rsp.ret_code, rsp.request_id,rsp.pred_rsp.value, rsp.err_msg))else:LOG("predict failed ret: {} err: {}".format(rsp.ret_code, rsp.err_msg))if rsp.ret_code == 4003:# lack of moneyLOG("cust_val <= 0 lack of money, please charge immediately")return rsp## 从文件进行验证码识别# 参数:pred_type;识别类型  file_name:文件名# 返回值:#   rsp.ret_code:正常返回0#   rsp.request_id:唯一订单号#   rsp.pred_rsp.value:识别结果#   rsp.err_msg:异常时返回异常详情#def PredictFromFile(self, pred_type, file_name, head_info=""):with open(file_name, "rb") as f:data = f.read()return self.Predict(pred_type, data, head_info=head_info)## 识别失败,进行退款请求# 参数:request_id:需要退款的订单号# 返回值:#   rsp.ret_code:正常返回0#   rsp.err_msg:异常时返回异常详情## 注意:#    Predict识别接口,仅在ret_code == 0时才会进行扣款,才需要进行退款请求,否则无需进行退款操作# 注意2:#   退款仅在正常识别出结果后,无法通过网站验证的情况,请勿非法或者滥用,否则可能进行封号处理#def Justice(self, request_id):if request_id == "":#returntm = str(int(time.time()))sign = CalcSign(self.pd_id, self.pd_key, tm)param = {"user_id": self.pd_id,"timestamp": tm,"sign": sign,"request_id": request_id}url = self.host + "/api/capjust"rsp = HttpRequest(url, param)if rsp.ret_code == 0:LOG("justice succ ret: {} request_id: {} pred: {} err: {}".format(rsp.ret_code, rsp.request_id,rsp.pred_rsp.value, rsp.err_msg))else:LOG("justice failed ret: {} err: {}".format(rsp.ret_code, rsp.err_msg.encode('utf-8')))return rsp## 充值接口# 参数:cardid:充值卡号  cardkey:充值卡签名串# 返回值:#   rsp.ret_code:正常返回0#   rsp.err_msg:异常时返回异常详情#def Charge(self, cardid, cardkey):tm = str(int(time.time()))sign = CalcSign(self.pd_id, self.pd_key, tm)csign = CalcCardSign(cardid, cardkey, tm, self.pd_key)param = {"user_id": self.pd_id,"timestamp": tm,"sign": sign,'cardid': cardid,'csign': csign}url = self.host + "/api/charge"rsp = HttpRequest(url, param)if rsp.ret_code == 0:LOG("charge succ ret: {} request_id: {} pred: {} err: {}".format(rsp.ret_code, rsp.request_id,rsp.pred_rsp.value, rsp.err_msg))else:LOG("charge failed ret: {} err: {}".format(rsp.ret_code, rsp.err_msg.encode('utf-8')))return rsp### 充值,只返回是否成功# 参数:cardid:充值卡号  cardkey:充值卡签名串# 返回值: 充值成功时返回0##def ExtendCharge(self, cardid, cardkey):return self.Charge(cardid, cardkey).ret_code### 调用退款,只返回是否成功# 参数: request_id:需要退款的订单号# 返回值: 退款成功时返回0## 注意:#    Predict识别接口,仅在ret_code == 0时才会进行扣款,才需要进行退款请求,否则无需进行退款操作# 注意2:#   退款仅在正常识别出结果后,无法通过网站验证的情况,请勿非法或者滥用,否则可能进行封号处理##def JusticeExtend(self, request_id):return self.Justice(request_id).ret_code### 查询余额,只返回余额# 参数:无# 返回值:rsp.cust_val:余额##def QueryBalcExtend(self):rsp = self.QueryBalc()return rsp.cust_val### 从文件识别验证码,只返回识别结果# 参数:pred_type;识别类型  file_name:文件名# 返回值: rsp.pred_rsp.value:识别的结果##def PredictFromFileExtend(self, pred_type, file_name, head_info=""):rsp = self.PredictFromFile(pred_type, file_name, head_info)return rsp.pred_rsp.value### 识别接口,只返回识别结果# 参数:pred_type:识别类型  img_data:图片的数据# 返回值: rsp.pred_rsp.value:识别的结果##def PredictExtend(self, pred_type, img_data, head_info=""):rsp = self.Predict(pred_type, img_data, head_info)return rsp.pred_rsp.valuedef TestFunc(filname,pred_type):pd_id = "用户账号"  # 用户中心页可以查询到pd信息pd_key = "用户密钥"app_id = "开发者账号"  # 开发者分成用的账号,在开发者中心可以查询到app_key = "开发者密钥"# 识别类型,# 具体类型可以查看官方网站的价格页选择具体的类型,不清楚类型的,可以咨询客服pred_type = pred_typeapi = FateadmApi(app_id, app_key, pd_id, pd_key)# 查询余额balance = api.QueryBalcExtend()  # 直接返余额# api.QueryBalc()# 通过文件形式识别:file_name = filname# 多网站类型时,需要增加src_url参数,具体请参考api文档: http://docs.fateadm.com/web/#/1?page_id=6result =  api.PredictFromFileExtend(pred_type,file_name)   # 直接返回识别结果# rsp = api.PredictFromFile(pred_type, file_name)  # 返回详细识别结果'''# 如果不是通过文件识别,则调用Predict接口:# result 			= api.PredictExtend(pred_type,data)   	# 直接返回识别结果rsp             = api.Predict(pred_type,data)				# 返回详细的识别结果'''# just_flag = False# if just_flag:#     if rsp.ret_code == 0:#         # 识别的结果如果与预期不符,可以调用这个接口将预期不符的订单退款#         # 退款仅在正常识别出结果后,无法通过网站验证的情况,请勿非法或者滥用,否则可能进行封号处理#         api.Justice(rsp.request_id)# card_id         = "123"# card_key        = "123"# 充值# api.Charge(card_id, card_key)# LOG("print in testfunc")# rsp = FateadmApi.PredictFromFile(pred_type, file_name, head_info="")return result
if __name__ == "__main__":print(TestFunc('pag_Code.jpg','30500'))

这是斐斐打码平台的源码,我封装成一个包了,再爬虫代码引入就行了

# coding=utf-8import requests
from lxml import etree
import fateadm_apisession = requests.Session()
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36"
}
session = requests.Session()
"""
原因是验证码图片使用的是urlretrive进行的请求,该次请求的时候,服务器端会返回cookie.所以对验证码图片的请求必须使用session进行,将cookie存储在
session中,然后使用session继续进行登录请求即可完成.
session对象和requests作用几乎一样,都可以进行请求的发送,并且请求发送的方式也是一致的,
session进行请求的发送,如果会产生cookie的话,则cookie会自动被存储到session对象中
"""
response = session.get(url=url, headers=headers)
html = etree.HTML(response.text)
pag_src = 'https://so.gushiwen.cn' + html.xpath('//*[@id="imgCode"]/@src')[0]
VIEWSTATE = html.xpath('//*[@id="__VIEWSTATE"]/@value')[0]
VIEWSTATEGENERATOR = html.xpath('//*[@id="__VIEWSTATEGENERATOR"]/@value')[0]
# print(pag_src)
src_response = session.get(url=pag_src, headers=headers).content
with open('./pag_Code.jpg', 'wb') as f:f.write(src_response)print("图片保存成功!!!")
code_text = fateadm_api.TestFunc('pag_Code.jpg', pred_type='30500')
num = code_text
# print(num)
data = {'__VIEWSTATE': VIEWSTATE,'__VIEWSTATEGENERATOR': VIEWSTATEGENERATOR,'from': 'http://so.gushiwen.cn/user/collect.aspx','email': '17784757553','pwd': 'jianwei20001112','code': num,'denglu': '登录'
}
login_url = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
login_text = session.post(url=login_url, headers=headers, data=data).text
with open('古诗词登录.html', 'w', encoding='utf-8') as f:f.write(login_text)
print("登录成功!!")

如果对你有帮助,别忘了点赞加关注,谢谢!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/50422.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

随机古诗词

利用HTML CSS js 制作的随机游戏 <html> <head><meta charset"utf-8" /><title>随机古诗词</title><style>#box {width: 1000px;margin: 0 auto;background: rgb(3, 0, 7);color: rgb(11, 160, 224);height: 1000px;line-height…

机器自动翻译古文拼音 - 十大宋词 - 声声慢 寻寻觅觅 李清照

声声慢寻寻觅觅 宋李清照 寻寻觅觅&#xff0c;冷冷清清&#xff0c;凄凄惨惨戚戚。 乍暖还寒时候&#xff0c;最难将息。 三杯两盏淡酒&#xff0c;怎敌他、晚来风急。 雁过也&#xff0c;最伤心&#xff0c;却是旧时相识。 满地黄花堆积&#xff0c;憔悴损&#xff0c;如今…

app 上架到苹果应用商店

https://appstoreconnect.apple.com/ 登陆 可供销售 就是我的app提交申请并通过的状态 添加新建APP 信息 填写完就创建 按照提示进行填写 注意上传图片可以用苹果手机截屏 在做作图软件 做成需要得像素上传 重点记录 构建版本&#xff08;别的挺简单&#xff09; 打开m…

【考研初试】问题汇总及解答

●信息搜集 Q&#xff1a;哪里可以找考研资料&#xff1f; A&#xff1a;wx公众号、b站、知乎、csdn、王道论坛&#xff08;计算机考研&#xff09; &#xff08;资料一般是以百度网盘链接的形式分享&#xff0c;其实找网课视频最方便的是找到那种定期更新资料的网盘群&#x…

复试-专业问题

这是我的学长&#xff0c;SDZ学长整理&#xff0c;我就发出了&#xff0c;如果你们有幸去了浙大软科记得谢谢他&#xff0c;哈哈哈 这两种方法在形式上相像&#xff0c;其区别在于&#xff1a;pa是指针变量&#xff0c;a是数组名。值得注意的是&#xff1a;pa是一个可以变化的…

CPA2021_会计_东奥张志凤_02_会计概述、财务报告目标、会计基本假设和会计基础

文章目录 第一章 总论本章考情分析主要内容第一节 会计概述一、会计的定义二、会计的作用三、企业会计准则的制定与企业会计准则体系 第二节 财务报告目标、会计基本假设和会计基础一、财务报告目标二、会计基本假设三、会计基础 第一章 总论 本章考情分析 本章内容是会计准则…

20应用统计考研复试要点(part2)--统计学

学习笔记,仅供参考,有错必纠 具体原理:统计量及其抽样分布 ;数据的概括性度量 文章目录 贾俊平统计学数据的分布特征概率与概率分布统计量及其抽样分布贾俊平统计学 数据的分布特征 概率与概率分布 样本、事件和样本空间总体:是包含所研究的全部个体(数据)的集合。 样本:…

20应用统计考研复试要点(part24)--简答题

学习笔记,仅供参考,有错必纠 简答题 什么是数据的离散程度,列举5种,并说明其特点数据的离散程度反映的是各变量值远离其中心值的程度。 异众比率,是指非众数组的频数占总频数的比例,其计算公式为: 四分位差,也称为内距或四分间距,它是上四分位数与下四分位数之差用 Q d…

浙江工商大学813理学统计学复试常见问题整理总结——概率论部分

大家好&#xff01;本人是去年上岸浙江工商大学&#xff0c;本科是江苏省的一本&#xff0c;专业课成绩在135&#xff08;可以去官网查证&#xff09;。本人根据去年线上复试的个人情况并结合其他一些上岸的同学在复试中被问到的专业课问题进行整理汇总了如下的浙江工商大学813…

20应用统计考研复试要点(part1)--统计学

学习笔记,仅供参考,有错必纠 贾俊平统计学 数据的搜集 数据的来源统计数据主要来自两条渠道:一个是数据的间接来源,即数据是由别人通过调查或实验的方式搜集的,使用者只是找到它们并加以使用。另一个是通过自己的调查或实验活动,直接获得第一手数据,对此我们称为数据的直…

江西财经大学2016-2022年研究生试题解析总结

前言&#xff1a; 1.卷子中的部分答案并非唯一&#xff0c;仅供参考 2.本总结是按题型进行分类的 3.2022年题型略微进行了改变&#xff0c;添加了程序分析题 1. 根据要求写出C语言表达式 2016年&#xff08;20分&#xff09; &#xff08;1&#xff09;三元运算符 ※ 答&am…

前端请求,后台一直返回404路径报错

心塞&#xff0c;找了一下午404报错&#xff0c;看图&#xff0c;报错是这样的 首先先知道404是什么问题&#xff1a;404 客户端请求的资源或者数据不存在(发现请求接口404,有两种情况一种是咱们写错接口了或者服 务端还没部署&#xff0c;在加一个就是后台写错了) 可以看一下这…

HTTP Status 404错误分析及解决方法

这是我之前因为复制一个项目,然后启动服务器时在网页报的错误,我用的myeclipse2016,我最后解决了这个问题,方法如下: 1,选中项目名右键>>Properties>>web就会出现,这样的. 在箭头指位置改成你当前的项目名,如果可以改动那就成功,重启myeclipse.运行就可以. 如…

项目一直报404的各种原因及解决方法

项目一直报404的各种原因及解决方法 404找不到的路径或资源的情况会经常出现,那么怎么样排查才能快速解决问题呢? 1. 路径和文件名 项目报404&#xff0c;首先应该考虑路径和文件名的匹配问题&#xff0c;多半是文件放错位置&#xff08;一般不会放错&#xff0c;毕竟都会放…

uniapp 跨域代理后请求报404

最近刚开始接触uni-app&#xff0c;H5页面&#xff0c;本地调试&#xff0c;请求报跨域 查了官方文档&#xff0c;devServer对应的就是webpack的devServer 于是在manifest.json中添加代码&#xff1a; 然而查了很多解决方法依旧没有成功&#xff0c;后来发现我的项目用的是vit…

使用Postman调试API遇到“400 Bad Request”问题

问题 今日使用Postman调试一个临时接手的API&#xff0c;参照调用程序代码填充好请求头、请求体参数&#xff08;post&#xff09;&#xff0c;Postman客户端始终提示“400 Bad Request”&#xff0c;调用失败&#xff01; 解决方案 尝试&#xff1a; 观察日志&#xff0c;…

Vite + Vue3 + Ts 解决打包生成的index.html页面 显示空白、报资源跨域、找不到资源、404-Page Not Found等错误

问题描述&#xff1a; 在用Vue3 Ts进行项目开发&#xff0c;通过Vite进行构建打包后&#xff0c;直接在本地以文件系统的方式&#xff0c;用浏览器直接打开打包生成后的dist目录下的index.html文件访问时&#xff0c;浏览器页面显示空白、打开控制台后有报错、该路径找不到对…

post提交数据返回404错误

使用post提交数据&#xff0c;发现无法执行success函数&#xff0c;后台的代码也正常执行了&#xff0c;但是就是无法执行success函数&#xff0c;执行error函数&#xff0c; 我在MainConfig中做了一个映射 js代码&#xff1a; 实在是看不出哪里错了 &#xff0c;求大神指点

Apipost测后台接口出现404错误的几种解决方式

1.url写错了&#xff1a;检查一下单词拼写和路径名&#xff0c;仔细检查有没有多写一个‘ / ’ 2.检查一下参数的类型有没有和代码中一致 3.检查一下Controller层的方法前有没有加ResponseBody注解&#xff0c;没有的要加上或者将Controller改为RestController也行&#xff08;…

后台程序正常,页面获取不到数据报404的原因-@ResponseBody

ResponseBody Responsebody 注解表示该方法的返回的结果直接写入 HTTP 响应正文&#xff08;ResponseBody&#xff09;中&#xff0c;一般在异步获取数据时使用&#xff0c;通常是在使用 RequestMapping 后&#xff0c;返回值通常解析为跳转路径&#xff0c;加上 Responsebody…