如何利用Python模拟GitHub登录详解


Posted in Python onJuly 15, 2019

前言

最近学习了Fiddler抓包工具的简单使用,通过抓包,我们可以抓取到HTTP请求,并对其进行分析。现在我准备尝试着结合Python来模拟GitHub登录。

Fiddler抓包分析

首先,我们想要模拟一个网站的登录,我们必须要简单了解其大致过程。
在这里,我通过Fiddler来抓取GitHub登录的请求,从网页上登录的URL为:https://github.com/login ,抓包结果如下:

如何利用Python模拟GitHub登录详解

左边的是会话列表,右边的是请求和响应的数据。一般情况下,登录都是用POST请求,因为我在左边的会话列表中设置了显示RequestMethod一列,因此能够很方便的找到POST请求。当然,Fiddler默认不显示RequestMethod,如果没有设置,还可以通过命令“=post”来快速过滤POST请求。

如何利用Python模拟GitHub登录详解

在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登录详解

好了,到目前大致流程我们已经梳理清楚了,接下来我们便通过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('<input type="hidden" name="authenticity_token" value="(.+?)" />', 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('<title>(.+?)</title>',r.text)
    print("title:%s" %title[0])
    return title[0]

我们在上面得到authenticity_token后,便可以来实现登录了。通过POST请求提交表单后,我们需要判断是否登录成功。在这里,我是通过页面的标题来判断GitHub是否登录成功,当然,还有许多方法可以用于判断。

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('<input type="hidden" name="authenticity_token" value="(.+?)" />', 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('<title>(.+?)</title>',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 相关文章推荐
python调用java模块SmartXLS和jpype修改excel文件的方法
Apr 28 Python
在CentOS6上安装Python2.7的解决方法
Jan 09 Python
Python中的pack和unpack的使用
Mar 12 Python
Python对List中的元素排序的方法
Apr 01 Python
python自动发送邮件脚本
Jun 20 Python
python爬虫之线程池和进程池功能与用法详解
Aug 02 Python
基于Python对数据shape的常见操作详解
Dec 25 Python
python3中的eval和exec的区别与联系
Oct 10 Python
pytorch之添加BN的实现
Jan 06 Python
解决jupyter notebook import error但是命令提示符import正常的问题
Apr 15 Python
django自带的权限管理Permission用法说明
May 13 Python
python实现取余操作的简单实例
Aug 16 Python
python中将两组数据放在一起按照某一固定顺序shuffle的实例
Jul 15 #Python
postman模拟访问具有Session的post请求方法
Jul 15 #Python
Django的models模型的具体使用
Jul 15 #Python
利用Python进行图像的加法,图像混合(附代码)
Jul 14 #Python
anaconda中更改python版本的方法步骤
Jul 14 #Python
详解使用python绘制混淆矩阵(confusion_matrix)
Jul 14 #Python
python+opencv像素的加减和加权操作的实现
Jul 14 #Python
You might like
php利用scws实现mysql全文搜索功能的方法
2014/12/25 PHP
php arsort 数组降序排序详细介绍
2016/11/17 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
2017/08/18 PHP
硬盘浏览程序,保存成网页格式便可使用
2006/12/03 Javascript
优秀js开源框架-jQuery使用手册(1)
2007/03/10 Javascript
Jquery下的26个实用小技巧(jQuery tips, tricks &amp; solutions)
2010/03/01 Javascript
模拟jQuery中的ready方法及实现按需加载css,js实例代码
2013/09/27 Javascript
点击按钮或链接不跳转只刷新页面的脚本整理
2013/10/22 Javascript
javascript简单实现图片预加载
2014/12/03 Javascript
Dropzone.js实现文件拖拽上传功能(附源码下载)
2016/11/22 Javascript
ztree简介_动力节点Java学院整理
2017/07/19 Javascript
关于HTML5的data-*自定义属性的总结
2018/05/05 Javascript
解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题
2018/08/30 Javascript
[03:19]2016国际邀请赛中国区预选赛第四日TOP10镜头集锦
2016/07/01 DOTA
[03:55]TI9战队采访——TNC Predator
2019/08/22 DOTA
python爬虫爬取淘宝商品信息(selenum+phontomjs)
2018/02/24 Python
使用Python设计一个代码统计工具
2018/04/04 Python
Python决策树之基于信息增益的特征选择示例
2018/06/25 Python
Python unittest 简单实现参数化的方法
2018/11/30 Python
Django 5种类型Session使用方法解析
2020/04/29 Python
Pandas替换及部分替换(replace)实现流程详解
2020/10/12 Python
Charlotte Tilbury美国官网:英国美妆品牌
2017/10/13 全球购物
高清安全摄像头系统:Lorex Technology
2018/07/20 全球购物
战友聚会主持词
2014/04/02 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
吃空饷专项整治方案
2014/10/27 职场文书
超市食品安全承诺书
2015/04/29 职场文书
幼师辞职信范文大全
2015/05/12 职场文书
妇联2016年六一国际儿童节活动总结
2016/04/06 职场文书
创业计划书之溜冰场
2019/10/25 职场文书
《天使的翅膀》读后感3篇
2019/12/20 职场文书
mysql 8.0.24 安装配置方法图文教程
2021/05/12 MySQL
python利用pandas分析学生期末成绩实例代码
2021/07/09 Python
浅谈Redis变慢的原因及排查方法
2022/06/21 Redis
nginx静态资源的服务器配置方法
2022/07/07 Servers
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android