前言

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

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)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

github的python代码怎么跑_如何利用Python模拟GitHub登录详解相关推荐

  1. python面向对象难学_学不下去了!?详解Python面向对象核心概念,简历没跑了

    目前代码技能已经成了测试同学面试考核的刚需,对于测试开发来讲需求最大的是java和python两门语言,二者也都是面向对象语言.对于刚入门代码的同学来说面向对象相关的概念比较难于理解,而面向对象编程相 ...

  2. python代码封装加密_静态编译python源代码,使用Nuitka加密你的py源码

    Nuitka,100%兼容标准python2/python3,静态编译你的python程序 1. 概述 Nuitka(nuitka.net)可以将python代码转换为C++,然后编译为可执行文件,其 ...

  3. python朋友圈动态_如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)

    前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往下继续深入. 一.代码实现 1.修改Scrapy项目中的items.py ...

  4. 如何用python进行相关性分析_如何利用python进行时间序列分析

    题记:毕业一年多天天coding,好久没写paper了.在这动荡的日子里,也希望写点东西让自己静一静.恰好前段时间用python做了一点时间序列方面的东西,有一丁点心得体会想和大家分享下.在此也要特别 ...

  5. python编程应用中级_如何利用Python辅助开发HSK中级课程-数据统计篇

    HSK中级(4级)课程的开发难度比1-3级大上许多.原因主要有:生词量翻倍:3级是300个新增词,4级是600个新增词(脑容量明显不够了) 语法数量猛增:3级的语法数量在50左右,而4级的语法数量,基 ...

  6. 利用python进行数据分析数据集_《利用Python进行数据分析》终章·数据分析案例·学习笔记(二)...

    一.第14章 数据分析案例 本书正文的最后一章,我们来看一些真实世界的数据集.对于每个数据集,我们会用之前介绍的方法,从原始数据中提取有意义的内容.展示的方法适用于其它数据集,也包括你的.本章包含了一 ...

  7. python识别图片文字_如何利用Python识别图片中的文字

    一.前言 不知道大家有没有遇到过这样的问题,就是在某个软件或者某个网页里面有一篇文章,你非常喜欢,但是不能复制.或者像百度文档一样,只能复制一部分,这个时候我们就会选择截图保存.但是当我们想用到里面的 ...

  8. 如何用python修改pdf内容_如何利用python将pdf文件转化为txt文件?

    https://www.wukong.com/answer/6579491774144708872/?iid=15906422033&app=news_article&share_an ...

  9. 利用python查询电脑配置_干货|利用Python将地址转换为经纬度坐标

    本文主要讲述利用Python将文本格式的地址转换为数字格式的经纬度坐标数据,主要步骤有: 注册高德地图API账号,申请Web服务的Key 了解并测试地理编码API服务 利用Python实现地址转坐标 ...

最新文章

  1. 新手学python还是c语言_py和c语言究竟新手该学哪个?
  2. Reference resources
  3. pycharm报黄提示(黄色高亮警告):non-default parameter follows default parameter(定义时将没有默认值的参数放到了有默认值参数的后面)
  4. 一个域名可以绑定多个公众号_如何在同一个浏览器中同时登录多个公众号?
  5. 算法训练营08-分治和回溯
  6. 分享一个CSS3的网格系统架构 - ResponsiveAeon
  7. html语言怎样设置密码类型,html – 在使用contenteditable div时模仿密码类型输入
  8. PIE SDK栅格生成等值线、面
  9. [JLOI2008] CODES
  10. SEO学习必上的网址大全
  11. 人脸识别技术全面总结
  12. PackageManagerService
  13. 怎么把计算机模式重置,Windows10 WinRE模式下如何重置系统
  14. 最简单的分压和低频滤波电路
  15. strncasecmp() 函数
  16. 中国联通和中国电信如合并要抗衡中国移动需要时间
  17. echarts 矩阵图用法
  18. EV2400配合bqStudio的使用及电量计相关
  19. linux18.04安装显卡驱动,Ubuntu18.04安装nvidia显卡驱动
  20. 星火传递之Fuji M268dw打印机共享使用教程

热门文章

  1. 解决 maps to localhost, but this does not map back to the address
  2. 一个Web开发的客户端基础技术测试Demo
  3. 当async/await遇上forEach
  4. 容器编排技术 -- Kubernetes kubectl create service 命令详解
  5. Top20的OpenSSH服务器最佳安全实践--SSHD_CONFIG配置文件详细解读
  6. 下班老忘记打卡,在电脑上做一个定时下班打卡的弹窗
  7. jenkins 拉取git源码超时
  8. 更换 PVE7 软件仓库源和 CT 模板(LXC)源为国内源
  9. 【网站】Bing每日壁纸API分享
  10. 快速上手Linux核心命令(三):文件和目录操作命令