广告
返回顶部
首页 > 资讯 > 精选 >如何使用Charles和requests模拟微博登录
  • 202
分享到

如何使用Charles和requests模拟微博登录

2023-06-02 06:06:41 202人浏览 薄情痞子
摘要

这篇文章主要讲解了“如何使用Charles和requests模拟微博登录”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Charles和requests模拟微博登录”吧!1. 用Cha

这篇文章主要讲解了“如何使用Charles和requests模拟微博登录”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Charles和requests模拟微博登录”吧!

1. 用Charles记录整个登录过程

首先,我们运行Charles并开始记录。然后打开Chrome浏览器,选择使用Charles代理,打开微博首页 ,出现登录页面(如果之前登录过微博,要先退出登录)。输入用户名和密码进行登录,登录成功后就可以停止Charles的记录。这样我们就用Charles完整记录下了微博的登录过程。见图:

如何使用Charles和requests模拟微博登录

我们把整个登录过程写出一个python类,它的定义为:

class WeiboLogin:    user_agent = (        'Mozilla/5.0 (windows NT 5.1) AppleWEBKit/536.11 (Khtml, like Gecko) '        'Chrome/20.0.1132.57 Safari/536.11'    )    def __init__(self, username, passWord, cookies_tosave='weibo.cookies'):        self.weibo_user = username        self.weibo_password = password        self.cookies_tosave = cookies_tosave        self.session = requests.session()        self.session.headers['User-Agent'] = self.user_agent

接下来我们分析登录过程,并逐一实现这个类的各个方法。

2. 分析登录过程

把Charles的主窗口切换到“Sequence”标签页,

如何使用Charles和requests模拟微博登录

我们可以按加载时间顺序观察Charles记录的微博登录过程,我们发现第一个可疑的请求的Host是:

  • login.sina.com.cn

点击该条记录,下方出现该条请求的完整内容,它的路径是:

GET /sso/prelogin.PHP?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&rsakt=mod&client=ssologin.js(v1.4.19)&_=1542456042531 Http/1.1

这个GET请求的参数_=1542456042531看起来是个时间戳,这个在ssologin.js(看后面是如何找到的)定义为preloginTimeStart,可以用int(time.time()*1000)得到。

从prelogin.php这个名字看,它是一个预登陆,即在你输入用户名和密码前,它先从服务器拿点东西过来:

如何使用Charles和requests模拟微博登录

Python实现这个prelogin:

    def prelogin(self):        preloginTimeStart = int(time.time()*1000)        url = ('https://login.sina.com.cn/sso/prelogin.php?'               'entry=weibo&callback=sinaSSOController.preloginCallBack&'               'su=&rsakt=mod&client=ssologin.js(v1.4.19)&'               '_=%s') % preloginTimeStart        resp = self.session.get(url)        pre_login_str = re.match(r'[^{]+({.+?})', resp.text).group(1)        pre_login = JSON.loads(pre_login_str)        pre_login['preloginTimeStart'] = preloginTimeStart        print ('pre_login 1:', pre_login)        return pre_login

这些预先拿过来的东西有什么用呢?目前为止还不知道,继续往下看。

补充:关于认证码

昨天最初写这篇教程的时候,没有碰到验证码。今天就碰到验证码跳出来了,真是大快人心,可以把这部分补充上了。

对比昨天的prelogin的URL参数不能发现,今天的多了两个参数:

  • su=xxxxx 就是加密的那个(实为base64编码)用户名

  • checkpin=1 告诉服务器要检查验证码(我去,自己写爬虫绝对不会这么干)

带着这两个参数请求服务器,返回来的也会多了showpin的值:

如何使用Charles和requests模拟微博登录

既然要显示pin(验证码),就要下载验证码,它的地址是:

https://login.sina.com.cn/cgi/pin.php?r=2855501&s=0&p=aliyun-a34a347956ab8e98d6eb1a99dfDDD83bc708

这个是怎么来的呢?直接按Ctrl+F 打开“Text to Find”窗口搜索“pin.php”:

如何使用Charles和requests模拟微博登录

这个Find窗口很有用,它让我们可以在记录的所有请求和响应里面查找特定文本,并且它还支持正则表达式、大小写敏感、只找全词。只找全词,对查找su这样的短词很有帮助,可以过滤大量包含它的词,比如super。

这里要特别说明一下,为什么只选在”Response Body”里面查找。
因为我们是要找上面的URL是如何生成的,我们认为它是在某个js文件的某段代码实现的,所以它一定是在 Response Body 里面的,这样也可以过滤掉很多无关信息。

通过上面的过滤,直接就定位了相关代码,双击进去,再稍微一搜,就发现对应的代码了:

var pincodeUrl = "https://login.sina.com.cn/cgi/pin.php";...return pincodeUrl + "?r=" + Math.floor(Math.random() * 100000000) + "&s=" + size + (pcid.length > 0 ? "&p=" + pcid : "")

有了这个js,用Python来实现就易如反掌了,小猿们可以自己试试看。

有了验证码的URL,我们就用self.session下载它并保存为文件,在POST 所有login数据前,通过<code>pin = input('>>please input pin:')</code>来获取,加入到POST数据里面一起POST发送即可。

第二条可疑的请求的Host跟第一条一样,路径是:

POST /sso/login.php?client=ssologin.js(v1.4.19) HTTP/1.1

这是一条POST,我来看看它POST的数据,选择这条记录,点击“Contents”标签,再点击“FORM”标签,可以看到它POST的数据:

如何使用Charles和requests模拟微博登录

这时候我们可以把这写POST的参数和prelogin得到的联系起来了。

参数:su
这个看上去是“加密”的username,即用户名。那它是怎么加密的呢?浏览器运行的是javascript,所以我们猜测是通过JS加密的,那么是哪段JS呢?看上面login.php路径里给了参数client=ssologin.js(v1.4.19),那我们就去ssologin.js里面找找,选择加载这个js文件的请求,“Contents”标签下面就会显示JS代码,按Ctrl+F查找username:

如何使用Charles和requests模拟微博登录

charles weibo login su

果然在这里,其实就是用base64编码了一下,算不上加密,于是我们就有了获得su的方法:

    def encrypt_user(self, username):        user = urllib.parse.quote(username)        su = base64.b64encode(user.encode())        return su

参数:sp
跟su同样的思路,还是在ssologin.js里面查找password,我们发现了加密password的算法

如何使用Charles和requests模拟微博登录

image

于是有了获得sp的方法:

    def encrypt_passwd(self, passwd, pubkey, servertime, nonce):        key = rsa.PublicKey(int(pubkey, 16), int('10001', 16))        message = str(servertime) + '\t' + str(nonce) + '\n' + str(passwd)        passwd = rsa.encrypt(message.encode('utf-8'), key)        return binascii.b2a_hex(passwd)

参数:prelt

既然ssologin.js就是管登录的,那我们还是在这里找prelt,Ctrl+F 查找到

request.prelt = preloginTime;

原理prelt就是preloginTime的简称,那我们再搜索preloginTime:

preloginTime = (new Date()).getTime() - preloginTimeStart - (parseInt(result.exectime, 10) || 0)

这里的preloginTimeStart就是请求prelogin.php时的时间戳,result.exectime就是prelogin请求返回结果里面的exectime。
哈哈哈,又找到了prelt的算法,其实这个prelt就是从请求开始到现在的时间差,似乎也没那么重要,随机一个就可以,不过还是用Python实现一下:

    def get_prelt(self, pre_login):        prelt = int(time.time() * 1000) - pre_login['preloginTimeStart'] - pre_login['exectime']        return prelt

目前,我们已经获得了登录的重要参数,接下来再看看登录请求的流程,在“Sequence”的 “Filter” 输入login,我们可以看到过滤后的请求,其中前三个就是登录的先后顺序:

如何使用Charles和requests模拟微博登录

其详细流程就是:

  1. prelogin从服务器获得一些参数

  2. 把加密的用户名密码等参数POST给https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)

  3. 第2步返回的是html代码,html代码里面重定向到另外的url (所以我们代码里面也要实现这个重定向)

  4. 第3步返回的还是html代码,里面通过JS先实现几个跨域设置,最后重定向到另外一个url(我们也要实现这部分操作)

第4步返回的HTTP头里面重定向到另外的URL,request会跟随这个重定向,不用我们实现。
用Python实现html代码里面的JS重定向的方法就是,用正则表达式提取出JS代码里面的重定向URL,然后用requests做GET请求。

完整的登录流程的代码就是:

    def login(self):        # step-1\. prelogin        pre_login = self.prelogin()        su = self.encrypt_user(self.weibo_user)        sp = self.encrypt_passwd(            self.weibo_password,            pre_login['pubkey'],            pre_login['servertime'],            pre_login['nonce']        )        prelt = self.get_prelt(pre_login)        data = {            'entry': 'weibo',            'gateway': 1,            'from': '',            'savestate': 7,            'qrcode_flag': 'false',            'userticket': 1,            'pagerefer': '',            'vsnf': 1,            'su': su,            'service': 'miniblog',            'servertime': pre_login['servertime'],            'nonce': pre_login['nonce'],            'vsnf': 1,            'pwencode': 'rsa2',            'sp': sp,            'rsakv' : pre_login['rsakv'],            'encoding': 'UTF-8',            'prelt': prelt,            'sr': "1280*800",            'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.'                   'sinaSSOController.feedBackUrlCallBack',            'returntype': 'META'        }        # step-2 login POST        login_url = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)'        resp = self.session.post(login_url, data=data)        print(resp.headers)        print(resp.content)        print('Step-2 response:', resp.text)        # step-3 follow redirect        redirect_url = re.findall(r'location\.replace\("(.*?)"', resp.text)[0]        print('Step-3 to redirect:', redirect_url)        resp = self.session.get(redirect_url)        print('Step-3 response:', resp.text)        # step-4 process step-3's response        arrURL = re.findall(r'"arrURL":(.*?)\}', resp.text)[0]        arrURL = json.loads(arrURL)        print('CrossDomainUrl:', arrURL)        for url in arrURL:            print('set CrossDomainUrl:', url)            resp_cross = self.session.get(url)            print(resp_cross.text)        redirect_url = re.findall(r'location\.replace\(\'(.*?)\'', resp.text)[0]        print('Step-4 redirect_url:', redirect_url)        resp = self.session.get(redirect_url)        print(resp.text)        with open(self.cookies_tosave, 'wb') as f:            pickle.dump(self.session.cookies, f)        return True

代码中打印了很多信息,方便我们过程整个登录过程。

测试我们的实现就很简单了:

if __name__ == '__main__':    weibo_user = 'your-weibo-username'    weibo_password = 'your-weibo-password'    wb = WeiboLogin(weibo_user, weibo_password)    wb.login()

修改为你的微博账户和密码就可以测试起来啦。

感谢各位的阅读,以上就是“如何使用Charles和requests模拟微博登录”的内容了,经过本文的学习后,相信大家对如何使用Charles和requests模拟微博登录这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 如何使用Charles和requests模拟微博登录

本文链接: https://www.lsjlt.com/news/229146.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用Charles和requests模拟微博登录
    这篇文章主要讲解了“如何使用Charles和requests模拟微博登录”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Charles和requests模拟微博登录”吧!1. 用Cha...
    99+
    2023-06-02
  • 怎么用python模拟登录微博并打印信息
    本篇内容介绍了“怎么用python模拟登录微博并打印信息”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言今天为大家介绍一个模拟登录新浪微博...
    99+
    2023-06-02
  • 如何用Python模拟登录淘宝
    如何用Python模拟登录淘宝,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Python模拟登录淘宝,我知道,肯定是吸引了你,一起来看看吧!看了下网上有很多关于模拟登录淘宝...
    99+
    2023-06-02
  • 详解如何用Python模拟登录淘宝
    目录一、淘宝登录流程二、模拟登录实现1.判断是否需要验证码2.验证用户名密码3.申请st码4.使用st码登录5.获取淘宝昵称三、总结1.代码结构2.存在问题看了下网上有很多关于模拟登...
    99+
    2022-11-12
  • 如何使用微博自动记录俯卧撑个数
    根据SMART原则我制定了2016年的目标。每个月都有一个小目标,每个目标都是specific(具体)、Measurable(可度量)、Attainable(可实现)、Relevant(相关性)、Time-...
    99+
    2022-06-04
    俯卧撑 如何使用 个数
  • 如何利用Python实现模拟登录知乎
    环境与开发工具在抓包的时候,开始使用的是Chrome开发工具中的Network,结果没有抓到,后来使用Fiddler成功抓取数据。下面逐步来细化上述过程。模拟知乎登录前,先看看本次案例使用的环境及其工具:Windows 7 + Python...
    99+
    2023-05-18
    Python
  • 虚拟主机如何使用shh登录
    要使用SSH登录虚拟主机,你需要确保虚拟主机提供商已经为你的帐户配置了SSH访问权限。然后,按照以下步骤操作:1. 打开终端或命令提...
    99+
    2023-09-06
    虚拟主机
  • 在vue-cli中如何使用微信自动登录和分享
    这篇文章给大家分享的是有关在vue-cli中如何使用微信自动登录和分享的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、微信自动登录 //定义事件  meth...
    99+
    2022-10-19
  • 如何使用PHP实现微信扫码登录功能
    随着移动互联网的快速发展,微信作为一种重要的社交工具,已经逐渐成为人们日常生活中必不可少的一个部分。在许多网站和应用程序中,微信登录功能已经成为了一种趋势,因为它可以让用户直接使用已有的微信账号来登录,不需要再创建新的账户,同时也能提供更便...
    99+
    2023-05-14
    微信扫码登录 php
  • JavaWeb如何使用mvc模式实现登录功能
    这篇文章给大家分享的是有关JavaWeb如何使用mvc模式实现登录功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。部署项目、环境搭建 详细内容  1.导包  &...
    99+
    2023-06-29
  • 腾讯云服务器如何使用登录方式登录账号和密码
    1. 登录腾讯云官网 首先,打开浏览器,输入腾讯云官网地址(https://cloud.tencent.com/),进入腾讯云官网。 2. 进入腾讯云控制台 在腾讯云官网首页,点击右上角的“控制台”按钮,进入腾讯云控制台。 3. 选择云服...
    99+
    2023-10-26
    腾讯 如何使用 账号
  • 如何使用Python和Matla实现模拟退火法
    这篇文章主要为大家展示了“如何使用Python和Matla实现模拟退火法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用Python和Matla实现模拟退火法”这篇文章吧。1 Python...
    99+
    2023-06-29
  • SpringBoot如何实现使用反射模拟IOC和getBean
    这篇文章主要介绍“SpringBoot如何实现使用反射模拟IOC和getBean”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot如何实现使用反射模拟IOC和getBean”文章能帮...
    99+
    2023-07-05
  • spring使用策略模式如何实现多种场景登录方式
    这篇文章给大家介绍spring使用策略模式如何实现多种场景登录方式,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 @Autowired注解可以帮我们自动注入我们想要的 Bean。如果只是简单使用@Autowi...
    99+
    2023-06-22
  • 如何使用node和express连接mysql实现登录注册
    这篇文章将为大家详细讲解有关如何使用node和express连接mysql实现登录注册,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。数据库我选了比较“正式”的MySQL,...
    99+
    2022-10-19
  • 如何使用腾讯云服务器登录账号和密码
    登录腾讯云服务器的控制台: a. 点击开始菜单,选择控制面板,进入控制面板界面。 b. 在控制面板界面中,选择“添加/删除管理工具”,添加“Tencent Cloud Server Master”管理工具。 c. 在管理工具中,选择“管理...
    99+
    2023-10-27
    腾讯 如何使用 账号
  • 腾讯云服务器如何使用登录账号和密码
    腾讯云服务器使用登录账号和密码是一个非常基本的操作,但是在实际使用过程中,还需要额外注意一些问题。 以下是使用腾讯云服务器登录腾讯云服务器的详细步骤: 在登录界面中,您需要选择要使用的用户名和密码。这可能是一个字母、数字或特殊的组合,具...
    99+
    2023-10-26
    腾讯 如何使用 账号
  • 如何使用Go语言编写上门做菜系统中的用户登录模块?
    如何使用Go语言编写上门做菜系统中的用户登录模块?随着互联网的发展和智能手机的普及,上门做菜服务成为了现代生活中越来越受欢迎的选择。为了提供更加方便、便捷的服务,许多上门做菜平台都提供了用户登录功能。本文将介绍如何使用Go语言编写上门做菜系...
    99+
    2023-11-01
    Go语言 用户登录 上门做菜系统
  • 如何使用php函数来优化用户注册和登录功能?
    用户注册和登录功能是大多数网站的核心功能之一。为了提升用户体验和安全性,我们可以使用 PHP 函数来优化这些功能。本文将提供一些具体的代码示例,以帮助你更好地理解如何实现这些优化。密码加密用户的密码应该将存储为加密形式,以增加安全性。PHP...
    99+
    2023-10-21
    优化 PHP函数 注册登录
  • 腾讯云服务器如何使用手机登录账号和密码
    腾讯云服务器提供了许多云服务,可以通过使用手机登录账号和密码登录腾讯云服务器来登录这些云服务,以下是一个示例: 首先,您需要先登录您的个人账户,然后在“我”菜单中的“账户管理”中创建一个新账户。您可以使用电子邮件或手机短信等方式向腾讯云服...
    99+
    2023-10-26
    腾讯 如何使用 账号
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作