python github登陆_利用Python模拟GitHub登录!
最近学习了Fiddler抓包工具的简单使用,通过抓包,我们可以抓取到HTTP请求,并对其进行分析。现在我准备尝试着结合Python来模拟GitHub登录。
Fiddler抓包分析
首先,我们想要模拟一个网站的登录,我们必须要简单了解其大致过程。
在这里,我通过Fiddler来抓取GitHub登录的请求,从网页上登录的URL为: https://github.com/login ,抓包结果如下:
左边的是会话列表,右边的是请求和响应的数据。一般情况下,登录都是用POST请求,因为我在左边的会话列表中设置了显示RequestMethod一列,因此能够很方便的找到POST请求。当然,Fiddler默认不显示RequestMethod,如果没有设置,还可以通过命令“=post”来快速过滤POST请求。
在GitHub登录时,我们通过抓包发现,GitHub登录的URL虽然时https://github.com/login,但发生了302重定向,其真正提交POST表单数据的URL是 https://github.com/session ,当登录成功时,则会跳转到 https://github.com/ 首页。
打开WebForm,我们可以看到POST表单数据提交的值,可以发现,只有authenticity_token、login、password三个字段是会变化的,其余的每次登录都是固定的值。而login、password分别是我们登录的用户和密码,因此我们只需要分析出 authenticity_token 从何而来,便可以实现模拟登录了。
至于如何确定 authenticity_token 从哪个页面返回的,我们直接在响应数据中搜索就行了,或者把数据复制出来再进行搜索。最后我们会发现,authenticity_token 是在 https://github.com/login 这个请求中返回的,只不过用 hidden 隐藏起来了。
好了,到目前大致流程我们已经梳理清楚了,接下来我们便通过Python来实现模拟GitHub登录。
代码实现
本人环境:PyCharm 2018.2.4、Python3.7.0
1. 设置请求头和Session
# 设置Session
self.s = requests.session()
# 设置请求头
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:44.0) Gecko/20100101 Firefox/44.0"
}
# 在使用Fiddler时进行请求,通过该代码忽略SSLError错误
self.s.verify = False
在这里,我们设置了Session会话对象,Session相当于1个微型浏览器,能够自动帮我们保持请求中的某些参数(如cookies),有了它,我们一般不需要额外去处理cookies、header等。
假如我们是在Fiddler打开的状态下,通过代码进行请求,那么将会遇到SSLError的错误,而当加上 self.s.verify = False 这行代码后,我们便可以忽略该错误。
requests.exceptions.SSLError: HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /login (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1045)')))
注意:
我们通过上面的代码忽略了SSLError的错误后,再次运行,这时仍然会出现2行警告,这2个警告并不影响我们的登录,可以不管它。
D:\Python\installation\lib\site-packages\urllib3\connectionpool.py:847: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)
D:\Python\installation\lib\site-packages\urllib3\connectionpool.py:847: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)
如果我们想去掉这2行警告,也可以通过如下代码来解决(针对Python3):
import urllib3
urllib3.disable_warnings()
2. 获取authenticity_token
login_url = "https://github.com/login"
r = self.s.get(login_url, headers = self.headers)
authenticity_token = re.findall('', r.text)
print("authenticity_token:{}".format(authenticity_token))
return authenticity_token[1]
当我们访问 https://github.com/login 时,登录界面会生成隐藏参数authenticity_token,而这恰是我们在登录提交表单时需要用到的参数。我们可通过正则表达式 re.findall 来获取authenticity_token。另外,我们还会发现,HTML界面中存在2个authenticity_token,因此通过正则返回的是一个长度为2的列表,经过分析,GitHub在登录时用到的是列表中的第二个元素,即authenticity_token[1]。
3. 模拟登录
def github_login(self, authenticity_token, username, password):
session_url = "https://github.com/session"
body = {
"authenticity_token":authenticity_token,
"commit":"Sign in",
"login":username,
"password":password,
"utf8":"✓",
"webauthn-support":"unknown"
}
r = self.s.post(session_url, headers = self.headers, data = body)
title = re.findall('
(.+?)',r.text)
print("title:%s" %title[0])
return title[0]
我们在上面得到authenticity_token后,便可以来实现登录了。通过POST请求提交表单后,我们需要判断是否登录成功。在这里,我是通过页面的标题来判断GitHub是否登录成功,当然,还有许多方法可以用于判断。
Python资源共享群:484031800
4. 通过 title 判断是否登录成功
def is_login_success(self, title):
if "GitHub" == title:
return True
else:
return False
GitHub登录成功后,界面的标题会显示"GitHub",而登录失败时,一般显示的标题则是"Sign in to GitHub · GitHub"。
OK,以上就是通过Python模拟GitHub登录的过程,难度不大,相信大多数人阅读后都应该可以进行实践。
附源码:
import requests
import re
import urllib3
urllib3.disable_warnings()
class Github_Login():
def __init__(self):
# 设置Session
self.s = requests.session()
# 设置请求头
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:44.0) Gecko/20100101 Firefox/44.0"
}
# 在使用Fiddler时进行请求,通过该代码忽略SSLError错误
self.s.verify = False
# 获取 authenticity_token
def get_authenticity_token(self):
login_url = "https://github.com/login"
r = self.s.get(login_url, headers = self.headers)
authenticity_token = re.findall('', r.text)
print("authenticity_token:{}".format(authenticity_token))
return authenticity_token[1]
# 模拟登录,并返回 title
def github_login(self, authenticity_token, username, password):
session_url = "https://github.com/session"
body = {
"authenticity_token":authenticity_token,
"commit":"Sign in",
"login":username,
"password":password,
"utf8":"✓",
"webauthn-support":"unknown"
}
r = self.s.post(session_url, headers = self.headers, data = body)
title = re.findall('
(.+?)',r.text)
print("title:%s" %title[0])
return title[0]
# 通过 title 判断是否登录成功
def is_login_success(self, title):
if "GitHub" == title:
return True
else:
return False
if __name__ == '__main__':
github = Github_Login()
authenticity_token = github.get_authenticity_token()
title = github.github_login(authenticity_token, username = "用户名", password = "密码")
login_result = github.is_login_success(title)
print(login_result)
如有错误,欢迎指出!
python github登陆_利用Python模拟GitHub登录!相关推荐
- python github登陆_用Python模拟登陆GitHub并获取信息
最近在研究如何对搜狗搜索公众号文章进行爬取,由于需要用到Cookies,所以这回先了解下Cookies的相关知识. 搜狗的反爬有点厉害,即使我用了高匿代理,它还是会提醒我IP访问过于频繁,然后跳转验证 ...
- socket模拟http的登陆_利用 Python + Selenium 实现自动登陆签到
工具是人手的延伸,用的好了,它可以成为我们身体的一部分,用不好,它就只是别人身体的一部分. 这是众所周知的道理,但是落实到每个人的具体实践上却是千差外别. 比如我们熟悉的 web 自动化测试工具 Se ...
- python selenium截图_利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)...
对WebElement截图 WebDriver.Chrome自带的方法只能对当前窗口截屏,且不能指定特定元素.若是需要截取特定元素或是窗口超过了一屏,就只能另辟蹊径了. WebDriver.Phant ...
- python爬虫背景_利用Python代码实现一键抠背景功能
前言 又是一个逛csdn发现的一个有趣的小项目,可以一键抠背景,需要用到removebg模块及其API,API可从其官网免费获取,网址如下https://www.remove.bg/zh ps:加上/ ...
- python pdf报告_利用python设计PDF报告,jinja2,whtmltopdf,matplotlib,pandas
转自:https://foofish.net/python-crawler-html2pdf.html 工具准备 弄清楚了网站的基本结构后就可以开始准备爬虫所依赖的工具包了.requests.beau ...
- python扫雷脚本_利用Python实现自动扫雷小脚本
自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. 代码已上传至GitHub: https://github.com/chestnu ...
- python高斯求和_利用Python进行数据分析(3)- 列表、元组、字典、集合
本文主要是对Python的数据结构进行了一个总结,常见的数据结构包含:列表list.元组tuple.字典dict和集合set. image 索引 左边0开始,右边-1开始 通过index()函数查看索 ...
- python发送邮箱_利用Python自动发送电子邮件
在利用Python进行发送邮件时主要借助smtplib和email两个模块,其中smtplib主要用来建立服务器链接.服务器断开的工作,而email模块主要用来设置一些与邮件本身相关的内容,比如收件人 ...
- python扫雷脚本_利用 Python 实现 自动扫雷 小脚本
原标题:利用 Python 实现 自动扫雷 小脚本 自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式.一.准备工作1.扫雷游戏 我是 ...
最新文章
- 北大数学天才毕业后坚持出家:理想现实间的挣扎
- linux下安装nagios
- linux 清理指定大小的文件
- vuejs单文件组件:安装 webpack 和 vue-cli
- React中jsx的规则
- MapReduce中的排序(附代码)
- 【目标检测】目标检测中的多尺度检测(Multi-Scale),FPN,RPN
- ValidatorUtil验证工具类判断手机、ip地址、邮箱,身份证等
- 蓝桥杯_等差素数列_java
- DDMS中data打不开
- c语言程序已知两点求一般式方程,已知两点求直线方程一般式
- KGB知识图谱开创技术应用新渠道
- js输出类面试题(二)
- 使用TimerOne库
- Linux驱动-platform设备驱动
- 【Chrome】从Google官网下载 Google Chrome 离线安装包
- 金仓数据库 KingbaseGIS 使用手册(6.8. 几何对象输入函数)
- 【笔记】H.265/HEVC 视频编码(四)——预测编码
- GHM:Gradient Harmonized Single-stage Detector
- linux系统调用:exit()与_exit()函数详解【转】
热门文章
- Netty工作笔记0012---Channel应用案例3
- JAVA面试要点010---重入锁_ReentrantLock 详解
- 微信公众开放平台开发05---jetty部署异常:rg.apache.jasper.JasperException: PWC6345: There is an error in invoking ja
- 人脸标注工具源码解读
- override(C# 参考)
- opencv函数medianBlur( );
- vue中warning_5种处理Vue异常的方法
- 【10天基于STM32F401RET6智能锁项目实战第2天】(分别用库函数和寄存器点灯)
- 半径为r的均匀带电球体_一半径为R的均匀带电球体,其电荷的体密度为ρ.求(1)球外任一点的电势;(2)球表面上的电势;(3...
- 百度页面的html5结构,HTML5+CSS3网站设计基础教程