最近由于须要一贯在研究微博的爬虫,第一步便是仿照上岸,从开始摸索到走通仿照上岸这条路实在还是挺困难的,须要一定的履历,为了让朋友们往后少走点弯路,这里我把我的剖析过程和代码都附上来。

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

图1

php模拟关注微博超具体的Python实现新浪微博模仿上岸小白都能懂 Node.js

接下来我会详细解释各个过程。

第一步:预上岸。

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

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

图三

这里我们须要自己布局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/login.php?client=ssologin.js(v1.4.18)。

根据履历,到这里过程基本就完了。
但是微博有点坑啊,这里还须要有一步,便是图一所示的类似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,这一步会将要求重定向,返回当前账号的上岸信息,如下图:

图三

那么问题来了,怎么获取上面的要求地址呢。
剖析上面地址,有ticket字段,这个该当是让你上岸的凭据,以是这个地址该当是做事端返回的,如果不是,最少ticket是做事端返回的,于是我们又利用抓包工具查看在要求这段url之前返回的信息,创造有和上述url吻合的信息:

图四

这段代码是利用post后回答的内容,以是可以直接从中提取出我们须要的url。
然后再利用get办法要求上述的url,它会经历一次重定向,直接返回上岸信息。
这个时候,就代表成功上岸了。

PS:授人以鱼不如授人以渔,这是我一贯秉承的信念。
可能有的老手以为我写得很啰嗦,但实在很多新手可能都不知道这些细节,以是我把我在剖析新浪微博仿照上岸的过程全写了出来。
其余,除了这种办法,本文提到的其余两种办法也有实现。
最暴力的办法须要利用rsa这个第三方库,详细我在代码上有详细注释,还有一种是利用selenium+phantomjs这种办法,我也在代码中关键地方有注释.

Talk is cheap,show me the code!

当然末了少不了小编的福利啦!
关注,转发,私信“01”就可以获取哦!