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.hqwc.cn/news/536958.html

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

相关文章

Vulnhub - DC-1

希望和各位大佬一起学习&#xff0c;如果文章内容有错请多多指正&#xff0c;谢谢&#xff01; 个人博客链接&#xff1a;CH4SER的个人BLOG – Welcome To Ch4sers Blog DC-1 靶机下载地址&#xff1a;DC: 1 ~ VulnHub 0x01 信息收集 Nmap扫描目标主机&#xff0c;发现开…

链路聚合实验(思科)

华为设备参考&#xff1a; 一&#xff0c;技术简介 网络设备的链路聚合技术&#xff08;Link Aggregation&#xff09;是一种将多个物理链路捆绑在一起&#xff0c;形成一个逻辑链路的技术。这样做可以增加带宽、提高可靠性和实现负载均衡。 二&#xff0c;实验目的 橙色的阻…

【C++】—— 代理模式

目录 &#xff08;一&#xff09;什么是代理模式 &#xff08;二&#xff09;为什么使用代理模式 &#xff08;三&#xff09;代理模式实现步奏 &#xff08;四&#xff09;代码示例 &#xff08;五&#xff09;代理模式优缺点 &#xff08;一&#xff09;什么是代理模式 …

【代码随想录 | 链表 03】两两交换链表中的节点

文章目录 3.两两交换链表中的节点3.1题目3.2解法&#xff1a;虚拟头节点 3.两两交换链表中的节点 3.1题目 24.两两交换链表中的节点——力扣链接 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下…

数字孪生与智慧城市:实现城市治理现代化的新路径

随着信息技术的迅猛发展&#xff0c;智慧城市已成为城市发展的必然趋势。数字孪生技术作为智慧城市建设的重要支撑&#xff0c;以其独特的优势为城市治理现代化提供了新的路径。本文将探讨数字孪生技术在智慧城市中的应用&#xff0c;以及如何实现城市治理的现代化。 一、数字…

Games101笔记-变换

Scale Reflection Shear Rotate 没有额外提示默认绕原点旋转 线性变换 Transiation 不属于线性变换&#xff0c;仿射变换 齐次坐标 二维的点和向量增加一个维度 点加点等于两个点的中点 所有的仿射变换都可以写成齐次坐标的形式 在表示二维情况下的仿射变换时&#…

音视频开发之旅(75)- AI数字人进阶--GeneFace++

目录 1.效果展示和玩法场景 2.GeneFace原理学习 3.数据集准备以及训练的过程 5.遇到的问题与解决方案 6.参考资料 一、效果展示 AI数字人进阶--GeneFace&#xff08;1&#xff09; AI数字人进阶--GeneFace&#xff08;2&#xff09; 想象一下&#xff0c;一个专为你打造的…

[算法] 牛课题霸 - DP6 连续子数组最大和 - 动态规划

文章目录 题目链接解题过程思路一思路二 题目链接 DP6 连续子数组最大和 解题过程 思路一 两个for循环&#xff0c;遍历。 因为每个元素都要遍历两遍&#xff0c;所以时间复杂度O(n^2)。 简单的测试用例可以通过&#xff0c;但是提交时&#xff0c;一个巨大的数组用例&…

2024春秋蓝桥杯reverse——crackme01

尝试了下输入没有任何反应 查看——32位——IDA打开 我之前没怎么写过win32&#xff0c;所以我开始在string里面找flag,wrong,right什么的字符&#xff0c;都不行 然后我又在函数里面找main&#xff0c;也什么收获的没有,OK废话完了 在win32里面 关于弹窗的函数&#xff1a;…

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

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

C++入门篇(2)

1. 内联函数 1.1 概念 C中&#xff0c;以 inline 修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调用建立栈帧的开销&#xff0c;内联函数提升程序运行的效率。 #include <iostream> using namespace std;int Add(int…

DMSP夜间灯光卫星介绍和数据下载

DMSP(Defense Meteorological Sate-llite Program)是美国国防部的极轨卫星计划&#xff0c;与NOAA卫星同属于一类&#xff0c;只不过星上载荷不同。 DMSP卫星简介 现有DMSP为三轴姿态稳定卫星&#xff0c;运行在高度约830km的太阳同步轨道&#xff0c;周期约101min&#xff0c…