Python之requests实现github模拟登录

文章目录

  • github 模拟登录
    • 前言
    • 模拟登录流程
    • 抓包操作
      • 查看登录表单的内容
      • 登录操作
    • 模拟登录操作
      • 在 main函数的调用
      • 获得 auth_token
      • 调用/session接口登录处理
      • 检测登录是否成功
    • 总结:

github 模拟登录

前言

前面学习了requests模块的基础学习后,接下来做一个实战应用,会涉及到requests的post 请求,请求头headers的设置,利用sesson保持 cookie状态等

模拟登录流程

如下图是模拟登录的流程,在知道了具体的流体后,写代码才能流畅。
在这里插入图片描述

抓包操作

在使用 chrom进行抓包操作时,需要新开一个无痕窗口

在这里插入图片描述

查看登录表单的内容

  • 主要是看html结构,可以知道提交的目标地址,提交的方式(POST|GET),提交的表单的主要字段。
  • 同时需要开启Preserve.log,这样子页面在跳转时,也那个记录前面的请求会话

在这里插入图片描述

登录操作

  • 通过提交登录表单,触发session 接口,从 request headers,以及Form Data,方便为后端准备数据
  • 同时发现 auth_token 值在不同页面,是不一样的,根据 post数据源的几种类比较判断,具体在前面的 requests模块介绍的文章,其值是属于存在静态页面中的预设值,一开始进到登录页时已经生成

在这里插入图片描述

模拟登录操作

完整代码链接:https://gitee.com/allen-huang/python/blob/master/crawler/do-request/login_github.py
根据上面的流程,后端在做模拟登录时,需要做3步如下:

  1. 通过 session.get获得github登录页面 生成的auth_token
  2. 组装 /session的 from data和请求头 headers,通过 session.post调用/session 请求
  3. 正则分析个人页的 title来验证,登录状态的验证

在 main函数的调用

if __name__ == '__main__':# todo 声明一个session对象,并设置请求头session = requests.session()session.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'}# todo: 1.获取登录页面的auth_tokenauth_token = get_auth_token(session)# todo:2.组装表单数据,使用 session.post(),请求/session,用来记录登录状态do_login(session)# todo: 3.通过请求github.com/用户名,验证是否登录成功chk_login_status(session)# insert_data = {#     "username": "hjc1985",#     "req_headers": resp.request.headers,#     "resp_headers": resp.request.headers,#     "resp_status": resp.status_code,#     "resp_body": resp.content.decode()# }# result = MongoPool().test.login_github.insert_one(insert_data)# print(result.inserted_id)

获得 auth_token

auth_token,这里是简写了,在 github 登录页中是authenticity_token,通过正则提取带有"authenticity_token"字段的值即可,代码如下:

def get_auth_token(session: Session) -> str:"""todo 先从github.com/login获取登录页面的html内容,然后通过正则表达式获取auth_token@param session:@return:"""resp = session.get('https://github.com/login')if resp.status_code != 200:print("请求失败,请稍后再试!")exit(0)login_html = resp.content.decode()auth_token = re.findall(r'name="authenticity_token" value="(.*?)"', login_html)[0]return auth_token

调用/session接口登录处理

注意:为了安全性考虑,这里的密码属性,password在文档展示不是真实的密码,因为,github提交的密码属于明码,没有进行二次加密过的。真实密码的登录请求我已测试通过的

def do_login(session: Session):"""todo 组装表单数据,使用 session.post(),请求/session,用来记录登录状态@param session: session对象@return:"""global resppost_data = {"commit": "Sign in","authenticity_token": auth_token,"login": "hjc1985","password": "123456",  # 登录密码,为了个人账号安全我这里不是真实密码"webauthn-conditional": "undefined","javascript-support": "true","webauthn-support": "supported","webauthn-iuvpaa-support": "supported","return_to": "https://github.com/login"}resp = session.post(url='https://github.com/session', data=post_data)if resp.status_code != 200:print("请求失败,请检查参数!")else:print("请求/session 成功!")

检测登录是否成功

在 github 中,个人中心地址github.com/用户名的标题内容结尾,是否含有GitHub,是判断登录状态的依据之一,如果 GitHub 不存在表示登录成功,反之则登录不成功。

def chk_login_status(session: Session):"""todo: 通过请求github.com/用户名,验证是否登录成功@param session:@return:"""resp = session.get('https://github.com/hjc1985')html_content = resp.contentres = re.findall(r'<title>(.+?)(GitHub)?</title>', html_content.decode('utf-8'))"""todo 使用 try...except...来判断索引对应的值是否存在"""try:end_str = res[0][1]except IndexError:end_str = ""if end_str == "":# 个人主页的title内容如果结尾没有GitHub,说明登录成功print("登录成功!")else:print("登录失败!")with open("github-profile.html", "wb") as f:f.write(html_content)
  • 登录成功的效果
    在这里插入图片描述
  • 登录不成功的效果
    在这里插入图片描述

总结:

  • 这是拿 github 模拟登录来对 requests模块的get, post方法,以及登录状态保持做的一个应用,主要是为了巩固知识点。
  • 它的登录机制还算是比较简单的,因为大部分值都是固定的可以获取到,像真正项目过程中,post 来源的数据都是需要调用接口,或 JS 逆向才能拿到。

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

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

相关文章

Pytorch学习 day14(模型的验证步骤)

如何利用已经训练好的模型&#xff0c;验证它的结果&#xff0c;步骤如下&#xff1a; 步骤一&#xff1a;加载测试输入并更改为合适尺寸 保存图片到指定文件夹下&#xff0c;注意是否为同级目录注意&#xff1a;返回上一级目录为“…/xxx"有时&#xff0c;我们自己的输…

前端React篇之React的生命周期有哪些?

目录 React的生命周期有哪些&#xff1f;挂载阶段&#xff08;Mounting&#xff09;更新阶段&#xff08;Updating&#xff09;卸载阶段&#xff08;Unmounting&#xff09;错误处理阶段&#xff08;Error Handling&#xff09; React常见的生命周期React主要生命周期 React的生…

每日一练:LeeCode-14、最长公共前缀【字符串+最值判定】

编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs ["flower","flow","flight"] 输出&#xff1a;"fl"示例 2&#xff1a; …

27-Java MVC 模式

Java空对象模式 实现范例 MVC模式代表 Model-View-Controller&#xff08;模型-视图-控制器&#xff09; 模式MVC模式用于应用程序的分层开发 Model&#xff08;模型&#xff09; - 模型代表一个存取数据的对象或 JAVA POJO 它也可以带有逻辑&#xff0c;在数据变化时更新控制…

渔业安全生产综合管理指挥系统-航迹数据优化方案

文章目录 引言I 轨迹数据模型II 轨迹信息索引III 数据同步方案3.1 多服务器多表同步3.2 增量数据同步3.3 执行IV 配置ESV 团队建设5.1 前端(web GIS)5.2 后端(Java)see also引言 背景: 目前系统查询轨迹数据比较慢的原因是没有进行读写分离,轨迹数据的查询和写入都是SQL…

Linux查看mysql安装目录

在Linux系统中&#xff0c;MySQL的安装目录通常位于/usr/local/mysql或/opt/mysql目录下。这些目录是MySQL在Linux系统中默认的安装目录&#xff0c;用户可以在这些目录下找到MySQL的所有文件和配置信息。 要查看MySQL的安装目录&#xff0c;可以使用以下命令&#xff1a; wh…

踏上机器学习的征程:探索基础概念与学习模式

摘要: 机器学习是当今科技领域最具前沿和应用价值的技术之一,它正在改变我们对数据的理解和利用方式。本文将引导读者深入了解机器学习的基本概念,包括监督学习、无监督学习和半监督学习等,并通过生动的例子解释这些概念,帮助读者迈出学习机器学习的第一步。 导言: 随着…

Ubuntu 如何安装 Beyond Compare?

Ubuntu20.04安装Beyond Compare 4.3.7 一、官网下载方式一&#xff1a;方法二&#xff1a;使用 .deb 包安装 二、安装相关依赖和bcompare三、破解常见错误解决方法 ) 文件比较工具Beyond Compare是一套由Scooter Software推出的文件比较工具。主要用途是对比两个文件夹或者文件…

AST解web控制流平坦化

此代码可以解决大部分 while if else 控制流平坦化原理&#xff1a; 先将 if 语句转为 switch 语句&#xff0c;再将 switch 分支合并&#xff0c;最后删除已合并的分支&#xff08;具体看代码&#xff09; 实现效果图 首先安装依赖&#xff1a; npm install babel/parser npm…

指针基础 - golang版

文章目录 1、指针2、基础语法2.1 定义指针2.2 取地址操作符 &2.3 解引用操作符 * 3、实战用法3.1 指针作为函数参数3.2 指针和结构体3.3 指针和接收者 1、指针 变量是存储值的地方&#xff1b;指针的值是一个变量的地址&#xff1b;不是所有的值都有地址&#xff0c;但是所…

【K8s】如何使用Kubernetes Ingress: Contour

使用Kubernetes Ingress: Contour 目录 使用Kubernetes Ingress: Contour没有 Ingress 控制器的情况Ingress 控制器的优势部署 Contour看到 Contour 在运行中总结推荐超级课程: Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战在处理Kubernetes时会遇到…

Java后端八股-------并发编程

图中的 synchronized方法如果没有锁&#xff0c;那么可能会有超卖&#xff0c;数据错误等情况。 加锁之后会按顺序售卖。 synchronized的底层是monitor。 线程没有竞争关系的时候&#xff0c;引入了轻量级锁&#xff0c;当需要处理竞争关系的时候一定要用到重量级锁(线程的…

数据挖掘与大数据的结合

随着大数据技术的不断发展和普及&#xff0c;数据挖掘在大数据环境下的应用也变得更加广泛和深入。以下将探讨大数据技术对数据挖掘的影响&#xff0c;以及如何利用大数据技术处理海量数据并进行有效的数据挖掘&#xff0c;同时分析大数据环境下的数据挖掘挑战和解决方案。 1.…

【Flutter】IOS运行工程二次启动崩溃问题。

问题 IOS14设备&#xff0c;切后台划掉&#xff0c;二次启动崩溃&#xff0c;看crash日志 一直提示第三方plugin注册问题。 一个一个尝试注掉&#xff0c;发现依然不行&#xff0c;创建了一个原生app&#xff0c;运行复现发现没问题&#xff0c;大概率是flutter的问题。 结论…

【RK32388 Android10, UNIK 4G模块导致usb hub出现 EMI】

文章目录 【RK32388 Android10&#xff0c; UNIK 4G模块导致usb hub出现 EMI 】背景调试过程解决相机掉线id变号发现EMI 出现 【RK32388 Android10&#xff0c; UNIK 4G模块导致usb hub出现 EMI 】 背景 在Android10 unik 的版本提测中&#xff0c;发现了一个问题&#xff0c…

Golang高效流控实践

流控对于构建高可靠弹性系统至关重要&#xff0c;本文介绍了Golang内置的流控组件&#xff0c;通过该组件就可以打造适合各种业务场景的流控系统。原文: Rate Limiting in Go: Controlling Traffic with Efficiency[1] Jon Cellier Unsplash 导言 流控(Rate limiting)是构建可扩…

Javaweb day17 day18 day19

mysql-DDL 数据库操作 写法 客户端工具 &#xff08;也可以使用idea&#xff09; 表 写法 约束 数据类型 案例 写法 表的查询修改删除 写法 删除

RTC的Google拥塞控制算法 rmcat-gcc-02

摘要 本文档描述了使用时的两种拥塞控制方法万维网&#xff08;RTCWEB&#xff09;上的实时通信&#xff1b;一种算法是基于延迟策略&#xff0c;一种算法是基于丢包策略。 1.简介 拥塞控制是所有共享网络的应用程序的要求互联网资源 [RFC2914]。 实时媒体的拥塞控制对于许…

Lua中文语言编程源码-第四节,更改linit.c初始化库函数, 使Lua加载中文库关键词(与所有的基础库相关)

源码已经更新在CSDN的码库里&#xff1a; git clone https://gitcode.com/funsion/CLua.git 在src文件夹下的linit.c初始化库的函数&#xff0c;用于lua.c和其他客户端。 增加加载中文库宏名列表&#xff0c;保留英文库宏名列表。 原始的代码为&#xff1a; static const …

​​SQLiteC/C++接口详细介绍之sqlite3类(十)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;九&#xff09; 下一篇&#xff1a;​​SQLiteC/C接口详细介绍之sqlite3类&#xff08;十一&#xff09; 30.sqlite3_enable_load_extension&#x…