python如何实现模拟登录_超详细的Python实现新浪微博模拟登陆(小白都能懂)

最近由于需要一直在研究微博的爬虫,第一步便是模拟登陆,从开始摸索到走通模拟登陆这条路其实还是挺艰难的,需要一定的经验,为了让朋友们以后少走点弯路,这里我把我的分析过程和代码都附上来。

首先,我们先用正常的账号登陆,具体看会有些什么请求。这里我用的是Http Analyzer抓包(Filders也是一个不错的选择)。下面是正常登陆流程的截图:

816594c83c74

图1

接下来我会详细说明各个过程。

第一步:预登陆。

现在微博、空间等大型网站在输入用户名后基本都会做编码或者加密处理,这里在用户名输入框输入我的账号,通过抓包工具可以看到服务器会返回一段字符串:

816594c83c74

图2

这一步就是预登陆过程,同学们可以自己试试。登陆的时候我们需要用到其中的servertime、nonce、pubkey等字段。当然这个不是我自己猜想的,后面的步骤会做说明。

还有一点,就是预登陆的url:

http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.18)&_=1461819359582

这里su的值是自己用户名经过base64编码的值。但可能你们会问我是如何知道的呢,待会儿我会讲到。经过实测,如果我们这里不给su传参数,其实也是可以的。为了最真实的模拟用户登录,我们最好还是带上它的值。

请看图一的第一条js请求http://i.sso.sina.com.cn/js/ssologin.js,同学们可以点进去看,这个就是前面提到的加密用户名和密码等一系列的加密文件了,如果有同学非要问我是怎么找到这个加密文件的,我也只有说:反复抓包,从在浏览器输入weibo.com过后就找js文件请求路径,然后再用代码格式化工具打开,挨着一个一个看,在代码中搜关键字,比如这里我们可以搜"nonce"、“servertime”等,就能找到加密文件了。

打开加密文件我们可以看到加密用户名的代码,在加密js文件中搜索'username',可以看到有一行代码为:

username = sinaSSOEncoder.base64.encode(urlencode(username));现在我们可以直接查找encode方法(代码太多就不贴上来了),即可查找到对应方法了,为了验证我们的猜想,我们可以在webstorm中copy这个encode函数带上自己的用户名运行,返回的结果就是su的值,这个值在之后进行post提交的时候也会用到。如果对加密有一定经验的同学可能一眼就会看出这个是base64编码,python中有个base64模块可以干这个事情。我们再回到图一,http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)这个地址就是进行post提交数据的地址,下面是我自己提交的数据:

816594c83c74

图三

这里我们需要自己构造su(加密后的用户名),sp(加密后的密码),servertime,nonce,rsakv等数据,其它数据都不用变。有同学问我为哈其它数据不用变?你自己可以多登陆几次,看变化的值,那么那些值就是需要构造的值,其它值就直接拿过来用就行了。这里的su,servertime,nonce,rsakv都已经拿到了,所以当前需要的就只是sp的值了。我们还是按照原来的方法在js文件中查找“sp”,可以找到requests.sp=password这段代码,所以我们就只需要看password怎么构造的了。通过查找可以看到关键加密代码:password = RSAKey.encrypt([me.servertime,me.nonce].join("\t") +"\n"+ password)

这一段代码便是加密密码的代码,有经验的同学一看就知道是用的RSA加密,python中也有相应的rsa加密库可用。但是我们假设大家都没看出来或者不知道python中有rsa这个第三方库。这时候就要给大家介绍一些我的经验了,我现在已经知道的有三种模拟登陆方案:a)最简单暴力,效率也是最高的,直接把js源码转化为相应的python代码,模拟加密流程进行加密 b)使用selenium+phantomjs/firefox的方案直接模拟人的操作填写表单提交数据进行模拟登陆,这种方式最为简单,效率稍微低一些。如果有同学对这种简单暴力的方式感兴趣,可以到我的github上查看一下源码 c)比较折中的方案,通过pyv8/pyexecjs等渲染js代码进行执行,本文主要就是讲的这种方式。第一种方式如果是遇到微博调整了登陆加密算法,就必须改加密代码,第二种方式和第三种方式不存在这个问题。

由于我用的是Python3,并不支持PyV8,所以我选了和它类似的PyexecJS,这个也可以直接执行js代码。我也不是很熟悉Javascript代码,所以我直接定义了一个函数处理加密密码,并没对其加密源代码修改太多:function    get_pass(mypass,nonce,servertime,rsakey){

varRSAKey = newsinaSSOEncoder.RSAKey();

RSAKey.setPublic(rsakey,"10001");

password= RSAKey.encrypt([servertime,nonce].join("\t") +"\n"+ mypass)

return    password

}

这个函数中的东西其实就是copy的加密文件的加密过程代码。为了试验,我直接使用之前自己登陆抓到的nonce、servertime、rsakey等数据,在webstorm中调用这个函数,但是报错了,提示"navigator is undefined",webstorm 使用的nodejs的运行时环境,而navigator为浏览器的某个属性,所以运行会出问题。于是我就是用phantomjs来作为运行时环境.考虑到有同学不知道phantomjs怎么使用,这里我简要说一下吧。使用windows的同学先要去phantomjs官网下载它的可执行文件,然后设置环境变量。在命令行输入"phantomjs some.js"即可执行some.js文件,其实就和在命令行执行python或者java文件一样,如果不清楚的可以百度执行命令行执行python的方法,仿照着来就可以了,再不清楚就问我。使用ubuntu的同学可以直接用sudo apt-get install phantomjs,就可以安装使用了。我直接把加密的js文件使用phantomjs运行,果然好着呢。原因是因为phantomjs其实就是一款无ui的浏览器,自然支持navigator、window等属性。而pyexecjs支持使用phantomjs作为运行时环境,具体用法pyexecjs的git主页有,我也在代码中有所体现。with open('G:/javascript/sinajs.js','r') as f:

source = f.read()

phantom = execjs.get('PhantomJS')

getpass = phantom.compile(source)

mypass = getpass.call('get_pass',my_pass,nonce,servertime,pubkey)

这段代码就可以得到加密过后的密码了。

根据经验,到这里过程基本就完了。但是微博有点坑啊,这里还需要有一步,就是图一所示的类似http://passport.weibo.com/wbsso/login?ssosavestate=1493447127&url=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack&ticket=ST-NTc3NTg1MjMwNw==-1461911127-gz-1DE185DF04280D7E96BDCD14D9D8E235&retcode=0,这一步会将请求重定向,返回当前账号的登陆信息,如下图:

816594c83c74

图三

那么问题来了,怎么获取上面的请求地址呢。分析上面地址,有ticket字段,这个应该是让你登陆的凭据,所以这个地址应该是服务端返回的,如果不是,起码ticket是服务端返回的,于是我们又使用抓包工具查看在请求这段url之前返回的信息,发现有和上述url吻合的信息:

816594c83c74

图四

这段代码是使用post后回复的内容,所以可以直接从中提取出我们需要的url。然后再使用get方式请求上述的url,它会经历一次重定向,直接返回登陆信息。这个时候,就代表成功登陆了。

PS:授人以鱼不如授人以渔,这是我一直秉承的信念。可能有的老手觉得我写得很啰嗦,但其实很多新手可能都不知道这些细节,所以我把我在分析新浪微博模拟登陆的过程全写了出来。另外,除了这种方式,本文提到的另外两种方式也有实现。最暴力的方式需要使用rsa这个第三方库,具体我在代码上有详细注释,还有一种是使用selenium+phantomjs这种方式,我也在代码中关键地方有注释.

Talk is cheap,show me the code!

最后奉上本文的所有方式的模拟登陆代码(如果觉得喜欢或者看了对你有帮助,不妨在github上给个star,也欢迎fork)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567658.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wacom mac驱动_MAC系统装Wacom手绘板的方法及注意事项

⚠️注意事项⚠️:一般Wacom官网的驱动会比苹果最新系统更新慢很多,所以如果你是最新系统,那官网的驱动你目前肯定用不了!要找客服去单独要。电话:4008105460 如果你刚好是老系统,那么恭喜你~?…

linux mplayer_移植mplayer播放器到EK200开发板的步骤浅析

mplayer是一款开源多媒体播放器,以gnu通用公共许可证发布此款软件可在各主流操作系统使用,一方面它资源占用率低;另一方面,无论是音频还是视频方面,它支持的格式相当全面,能支持播放大部分的音频、视频格式…

printf格式字符串和输出列表个数及类型不匹配案例

printf函数不会进行任何类型转换(包括隐式转换),它只是从内存中读出你所提供的元素的值(按照%d,%f等控制字符提示的格式) void main() {int i10.0/3;float j10.0/3;printf("%d\n",i); //3printf…

脚本自动定时打开链接_自动化构建系统

在软件开发过程中,特别是在一些大型多人合作开发的项目中,如何将各个人开发的不同模块集合为一个完整的系统,最终输出一个完整的目标文件,这个过程包括编译,发布,自动化测试等环节。这一过程的完善程度和流…

++ba--运算结果解析

int db&&a--; 此运算其实的操作为&#xff1a; db&&a,然后aa-1,所以d0&#xff0c;a-1. #include<stdio.h> void main() {/*double a97.3;double b98;double c;int c1;printf("%d\n",(int)(a/b));printf("%f",a/b);*/int a0,b2,…

python docker_Docker实践:python应用容器化

一、前言 容器使用沙箱机制&#xff0c;互相隔离&#xff0c;优势在于让各个部署在容器的里的应用互不影响&#xff0c;独立运行&#xff0c;提供更高的安全性。本文主要介绍python应用&#xff08;django&#xff09;跑在docker容器里&#xff0c;编写dockerfile实现镜像构建自…

mysql 默认事务隔离级别_上个厕所的功夫,搞懂MySQL事务隔离级别

“隔离级别” 出于MySQL四大特性(ACID)中的“I”&#xff0c;也就是隔离性。目的是实现数据、事务一致性“C”。MySQL在多线程并发场景下&#xff0c;可能会出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)这类并发问题&#xff0c;为了解决这些问…

Tg5032smn:高稳定性105℃高温

TG5032SMN是一款频率范围10MHz ~ 54MHz,具有高稳定的TCXO晶振&#xff0c;可与CMOS或限幅正弦输出。外部尺寸5.0 3.2 1.45mm&#xff0c;超小型,质地轻。该系列晶振的额定工作范围-40℃~&#xfe62;105C内可高稳定性工作&#xff0c;使得信号频率的误差很小。TG5032SMN与其他…

泰坦尼克号数据集_机器学习入门—泰坦尼克号生存率预测

项目名称&#xff1a;泰坦尼克号生存率预测1.导入数据这里使用kaggle kernel编写代码数据下载地址为&#xff1a;https://www.kaggle.com/c/titanic2.数据统计分析通过describe和info方法&#xff0c;我们可以发现Age&#xff0c;Cabin&#xff0c;Embarked和Fare的数据都有不同…

firefox flash插件_巧用firefox下载视频资源

技术应用场景&#xff1a;1. 免广告播放视频(含vip)2. 下载各大视频网站的视频资源步骤&#xff1a;1.提前下载安装以下程序&#xff1a;火狐浏览器(Firefox)https://www.lanzous.com/i98jfne火狐flash插件 https://www.lanzous.com/i98jercVideo DownloadHelper插件 https://w…

sdr 软件_无线电爱好者系列-1.通过SDR获取周围无线电信号及应用

一、什么是SDR?SDR就是Software Defined Radio,即软件定义无线电。之前的无线电通信系统都是基于特殊的硬件元器件完成无线电信号的接收和解码&#xff0c;例如混频器、滤波器、放大器、调制器和解调器、检波器等。而SDR是基于计算机完成相同的工作&#xff0c;也就是把无线电…

c python 内存冲突_Python在计算内存时应该注意的问题?

我之前的一篇文章&#xff0c;带大家揭晓了 Python 在给内置对象分配内存时的 5 个奇怪而有趣的小秘密。文中使用了sys.getsizeof()来计算内存&#xff0c;但是用这个方法计算时&#xff0c;可能会出现意料不到的问题。 文档中关于这个方法的介绍有两层意思&#xff1a; 该方法…

notepad多行编辑_Windows 10 UWP 推荐 | 极具现代感的轻量化文本编辑器:Notepads

柒才也许你正在用VS Code, Notepad或者Sublime&#xff0c;但是相信很多小伙伴跟我一样&#xff0c;在快速记录笔记或者修改配置文件的时候还是会用Windows系统自带的记事本Notepad.exe&#xff08;毕竟启动速度快&#xff0c;界面清爽&#xff09;可是问题在于Windows 10自带的…

python中读取txt文件、统计其中所有字母出现的频度_Python编程小技巧:如何统计序列中元素的出现频度...

原标题&#xff1a;Python编程小技巧&#xff1a;如何统计序列中元素的出现频度实际案例 某随机序列中&#xff0c;找到出现次数最高的三个元素&#xff0c;他们的出现次数是多少&#xff1f; 对某英文文章的单词进行词频统计&#xff0c;找到出现次数最高的10个单词&#xff0…

adsl服务器客户端配置cisco_【干货】Cisco路由排错经典案例分析

关注我&#xff0c;你的眼睛会怀孕对于网工来说&#xff0c;熟悉与掌握路由排错的思路和技巧是非常必要的。接下来&#xff0c;将对三例典型的路由故障排错案例进行分析。一、不堪重负&#xff0c;路由器外网口关闭1、网络环境某单位使用的是Cisco路由器&#xff0c;租用电信30…

centos sudo不能运行_如何在Linux中配置sudo访问权限

Linux 系统中 root 用户拥有 Linux 中全部控制权力。Linux 系统中 root 是拥有最高权力的用户&#xff0c;可以在系统中实施任意的行为。如果其他用户想去实施一些行为&#xff0c;不能为所有人都提供 root 访问权限。因为如果他或她做了一些错误的操作&#xff0c;没有办法去纠…

html文件中文在浏览器中显示乱码问题解决

利用浏览器打开html文件时&#xff0c;中文显示乱码&#xff0c;如下是原文件的内容 1 <html> 2 <head> 3 <title>狗熊王</title> 4 </head> 5 6 <body> 7 <p>狗熊王…

highscore软件_软件|标准物质PDF卡片查找HighScore

有宝物的柜子实用、有趣、干货2019.5.15 前面&#xff0c;我们介绍了Jade软件|MDI Jade 安装包、安装教程、使用手册软件|CasaXPS安装包、安装教程、基本操作&#xff01;今天分享↓↓↓HighScore的安装与简单使用(如有侵权&#xff0c;联系后台删除&#xff01;)第一部分&am…

js图片转二进制流_V8是如何执行一段JS代码的?

汇编器 编译器 解释器解释执行和解释执行什么是V8&#xff1f;V8执行Js代码的过程汇编器 编译器 解释器众所周知&#xff0c;计算机只能理解机器语言&#xff0c;而我们平时编程用的通常是高级语言&#xff0c;所以源代码通常都要经过层层转换最终变成机器语言运行。早期只有汇…

mockito mock void方法_一文让你快速上手 Mockito 单元测试框架

前言在计算机编程中&#xff0c;单元测试是一种软件测试方法&#xff0c;通过该方法可以测试源代码的各个单元功能是否适合使用。为代码编写单元测试有很多好处&#xff0c;包括可以及早的发现代码错误&#xff0c;促进更改&#xff0c;简化集成&#xff0c;方便代码重构以及许…