点击关注,我们共同每天进步一点点!

最近学习了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

# 设置Sessionself.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 urllib3urllib3.disable_warnings()

2.获取authenticity_token

login_url = "https://github.com/login"r = self.s.get(login_url, headers = self.headers)authenticity_token = re.findall('"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]。

  1. 模拟登录

    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是否登录成功,当然,还有许多方法可以用于判断。

  1. 通过 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 requestsimport reimport urllib3urllib3.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)

原文地址:https://www.cnblogs.com/wintest/p/11183744.html

喜欢请关注,有用请转发~

升职、加薪、无漏测-点“在看”

python 通过title判断_利用Python模拟GitHub登录相关推荐

  1. python post请求 上传图片_利用python模拟实现POST请求提交图片的方法

    本文主要给大家介绍的是关于利用python模拟实现POST请求提交图片的方法,分享出来供大家参考学习,下面来一看看详细的介绍: 使用requests来模拟HTTP请求本来是一件非常轻松的事情,比如上传 ...

  2. python逐步回归筛选变量_利用python实现逐步回归

    逐步回归的基本思想是将变量逐个引入模型,每引入一个解释变量后都要进行F检验,并对已经选入的解释变量逐个进行t检验,当原来引入的解释变量由于后面解释变量的引入变得不再显著时,则将其删除.以确保每次引入新 ...

  3. python做游戏代码_利用Python基础代码语句,实现2G时代文字小游戏,世界如此简单!...

    相信许多80,90后都玩过2G时代的文字小游戏,它是来自QQ家园的专属回忆.偷菜,美味小镇,大乐斗,还有精武堂等等,虽然只是文字的输出,但是留给我们这一代的人的印象却是最深刻的.曾经流量很少,响应很快 ...

  4. 基于python的系统构建_利用python构建一个简单的推荐系统

    摘要: 快利用python构建一个属于你自己的推荐系统吧,手把手教学,够简单够酷炫. 本文将利用python构建一个简单的推荐系统,在此之前读者需要对pandas和numpy等数据分析包有所了解. 什 ...

  5. python朋友圈评论_利用Python实现朋友圈中的九宫格图片效果

    前言 大家应该经常在朋友圈看到有人发九宫格图片,其实质就是将一张图片切成九份,然后在微信中一起发这九张图即可. 说到切图,Python 就可以实现,主要用到的 Python 库为 Pillow,安装使 ...

  6. python ks值计算_利用Python计算KS的实例详解

    在金融领域中,我们的y值和预测得到的违约概率刚好是两个分布未知的两个分布.好的信用风控模型一般从准确性.稳定性和可解释性来评估模型.sOf免费资源网 一般来说.好人样本的分布同坏人样本的分布应该是有很 ...

  7. python实现邮件客户端_利用python实现简单的邮件发送客户端示例

    脚本过于简单,供学习和参考.主要了解一下smtplib库的使用和超时机制的实现.使用signal.alarm实现超时机制. #!/usr/bin/env python # -*- coding: ut ...

  8. python制作图片墙_利用python生成照片墙的示例代码

    PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了.其官方主页为:PIL. PIL历 ...

  9. 利用python进行数据分析 笔记_利用python进行数据分析--(阅读笔记一)

    原博文 2016-06-17 23:21 − 以此记录阅读和学习<利用Python进行数据分析>这本书中的觉得重要的点! 第一章:准备工作 1.一组新闻文章可以被处理为一张词频表,这张词频 ...

最新文章

  1. ubuntu16.06+vsftpd+nginx搭建图片服务器
  2. 小冰和她的兄弟姐妹们组团出道:唱歌跳舞写文章样样都会,而且都开放版权...
  3. game,match,competition,contest区别
  4. nlp mrc的损失是什么_田渊栋从数学上证明ICLR最佳论文“彩票假设”,强化学习和NLP也适用...
  5. Spring注解之@Import用法解析
  6. Linux学习总结(70)——Bash 脚本中常用的内置变量汇总
  7. bzoj 4451 : [Cerc2015]Frightful Formula FFT
  8. shell解析xml文件
  9. Java jar 如何防止被反编译
  10. 打开方式怎么用计算机程序,设置电脑默认软件打开方式的方法
  11. 小幅震荡市场下的期权投资策略举例
  12. php 转义反绡线,PHP汉字转拼音
  13. Linux中的ps指令详解
  14. 腾讯Redis压轴笔记,成功入职阿里
  15. Cox 比例风险模型中HR和置信区间
  16. XJOI 循环-分解质因式
  17. cad2016中选择全图字体怎么操作_CAD2016 软件安装教程
  18. 如何快速开通流量主要求微信小程序如何快速开通流量主
  19. cisco 3560x snmp 详细说明
  20. LinkOS——打造物联网的一站式服务平台

热门文章

  1. modelsim仿真中 do文件的写法技巧
  2. oracle双机python连接_Python连接Oracle
  3. 通过特征类型超参数控制权重类型
  4. 大话中文文本分类之前数据处理
  5. 大神总结的80个Python练手项目列表
  6. SQLServer之修改FOREIGN KEY约束
  7. Centos7 修改运行级别
  8. 使用eclipse搭建嵌入式开发环境
  9. Nginx 动静态访问分离
  10. [Android学习笔记]理解焦点处理原理的相关记录