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

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

想要学习Python?Python学习交流群:984632579满足你的需求,资料都已经上传群文件,可以自行下载!

第一步:预登陆。

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

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

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

http://login.sina.com.cn/sso/...

这里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提交数据的地址,下面是我自己提交的数据:

这里我们需要自己构造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)

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

之后,便可以进行post提交,提交地址可以从抓包工具看到:http://login.sina.com.cn/sso/...。

根据经验,到这里过程基本就完了。但是微博有点坑啊,这里还需要有一步,就是图一所示的类似

http://passport.weibo.com/wbs...,

这一步会将请求重定向,返回当前账号的登陆信息,如下图:

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

GitHub地址:https://github.com/SpiderClub/smart_login/tree/master/sina_login

超详细的Python实现新浪微博模拟登陆(小白都能懂)相关推荐

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

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

  2. 超详细的Python实现百度云盘模拟登陆(模拟登陆进阶) 1

    这是第二篇从简书搬运过来的文章(大家别误会,是我原创的).因为前一篇文章,我看反响还挺好的,所以把这篇也搬运过来了,其实目的还是为宣传自己的分布式微博爬虫(该项目的内容和工作量都很饱满啊,大家如果觉得 ...

  3. 超详细最新版pycharm安装教程,小白都能看懂

    一.下载pycharm 首先说明一下: python是一种基本编译环境,就像java和jar一样. pycharm是一种集成开发环境,为了能够让你快速编写代码,便于调试 1.官网下载:https:// ...

  4. python项目实战:模拟登陆CSDN

    2019独角兽企业重金招聘Python工程师标准>>> 前言 今天为大家介绍一个利用Python模拟登陆CSDN的案例,虽然看起来很鸡肋,有时候确会有大用处,在这里就当做是一个案例练 ...

  5. 新浪微博模拟登陆 java

    新浪微博模拟登陆 java 第一篇博客把经历记录下来,最近要做微博模拟登陆,网上找了大量的代码登陆都很繁琐,终于皇天不负有心人,找到了段简单的代码,也学习了. package us.codecraft ...

  6. python新浪微博模拟登陆

    一 一直苦恼于新浪微博API开放的接口限制太多.只能用爬虫获取数据,然后我花了很长时间去找模拟登陆代码,根本没有一个能成功的.于是我就参考了谋篇文章,对代码做了些小修改,终于可以用了. 相关参考可以看 ...

  7. python 大众点评模拟登陆_python项目实战:模拟登陆163邮箱,简单到爆

    前言 相信大家都会做一些有趣的Python项目,对于小白的我们来说,如果成功了的话,那成就感是非常爆棚的的,这也是非常有助学习. 接下来,为大家介绍一个selenium 模拟登陆163邮箱的代码 首先 ...

  8. Python爬虫之模拟登陆

    女神找我倾诉,实验室实验选不上,刚出来就被秒了,让我帮她选实验,我想我这万年单身的手速估计还是抢不过我这些师兄们,干脆写一个脚本吧,这样以后女神就找我选实验了,废话少说,切入主题,看这篇教程首先得保证 ...

  9. 利用python requests库模拟登陆知乎

    当初搜模拟登陆的时候在知乎上也找到一些内容. 以下是代码 import requests import time import json import os import re import sys ...

  10. python爬虫(一):模拟登陆微博

    最近花了不少时间来学python爬虫,觉得还是有很多问题的,比如说requests.get获得Pixiv的网页源代码,一直获取不到,不过我猜测大概是headers的问题,准备之后处理. 废话少说我们先 ...

最新文章

  1. Docker安全加固——利用LXCFS增强docker容器隔离性和资源可见性
  2. LeetCode贪心 最长回文串
  3. Java学习日志(四)
  4. java fastdfs 压测_利用jmeter+JAVA对RPC的单接口(dubbo接口等)进行性能测试,零基础(2)...
  5. BOMTool更新到1.3.0.8
  6. 将 datetimepicker 嵌入 bindingNavigator
  7. 最大连续子序列和(4种算法)
  8. dtw算法 c语言实现,DTW算法的python实现
  9. 删除讨厌的4199流氓软件
  10. android 图片ps处理图片大小,【精】【教程】用Photoshop调整图片大小,以方便上传到论坛...
  11. Java序列化与反序列化(一)
  12. 计算机如何访问苹果6s的相册,如何在电脑中打开苹果手机中的HEIC格式的照片?...
  13. 此电脑下的默认7个文件夹路径修改
  14. 2012年12月编程语言排行榜:年度语言非Objective-C莫属
  15. 中国剩余定理模版【中国剩余定理】
  16. bapi (物料主数据导入)的部分基础用法
  17. 央视影音大屏版apk下载_央视影音大屏版
  18. 基于Spark GraphX的图形数据分析
  19. java 多余的空格_java实现 删除输入的多余空格
  20. mastercam西门子840d后处理_对MasterCAM9.0中SINUMERIK840D钻孔循环后处理的修改.pdf

热门文章

  1. Android Error:Some file crunching failed, see logs for details
  2. java计算机毕业设计直播购物平台源码+数据库+系统+lw文档
  3. 计算长方体、四棱锥的表面积和体积 SDUT 3337
  4. 日语 N2 考试 时间分配、分值
  5. python手撕链表_图解_leetcode707_设计链表
  6. python 中in
  7. 何谓计算机思维(转载)
  8. 将excel表数据顺序与linux,Excel中表格数据进行颠倒顺序的设置方法
  9. js 基础-函数传参
  10. 使用浏览器监控页面变化,语音播报变化内容