本文是在原作者授权下发表的。
原文链接:http://www.jianshu.com/p/816594c83c74
文本|解决方法
最近由于需要一直研究微博上的爬虫,第一步就是模拟登陆。其实挺难的,需要一些经验。为了让朋友以后少走弯路,我在这里附上我的分析过程和代码。
首先,我们用正常账号登录,看看会有什么请求。这里我用Http Analyzer捕获包(Filders也是不错的选择)。以下是正常登录过程的截图:
图1
接下来,我将详细解释每个过程。
第一步:预登录。
现在微博、空等大型网站基本都是输入用户名后再做编码或者加密。这里在用户名输入框输入我的账号,可以看到服务器会通过抓包工具返回一个字符串:
图2
这一步是预登录过程。学生可以自己尝试。我们需要在登录时使用servertime、nonce、pubkey等字段。当然这不是我自己的猜测,接下来的步骤会说明。
还有一点是预登录的网址:
http://login.sina.com.cn/sso/prelogin.php?词条=微博& ampcallback = Sinasocontroller . PreLoginCallback & amp;su = & amprsakt = mod & ampcheckpin = 1 & ampclient = SSO log in . js(v 1 . 4 . 18)amp;_=1461819359582
这里su的值是你自己用户名的编码值。但也许你会问我怎么知道的。我以后再说。实际测量后,如果不在这里给su传递参数,其实是可以的。为了最逼真地模拟用户登录,我们最好带上它的价值。
请看图1中http://i.sso.sina.com.cn/js/ssologin.js的第一个js请求。学生可以点进去看看。这是一系列的加密文件,比如上面提到的加密用户名和密码。如果有同学非要问我怎么找到这个加密文件,我只能说:反复抢包。在浏览器中输入weibo.com之后,找到请求路径的js文件,然后用代码格式化工具打开它,一个一个地查找,并在代码中搜索关键字。例如,我们可以在这里搜索“现时”、“服务器时间”等。,我们就能找到加密文件。
打开加密文件,我们可以看到加密用户名的代码。在加密的js文件中搜索“username”,我们可以看到有一行代码:
_ username = sinaSSOEncoder..encode(URL encode(username));_现在可以直接找到编码方法(代码太多就不贴了),然后就可以找到对应的方法了。为了验证我们的猜测,我们可以复制webstorm中的encode函数,用自己的用户名运行,返回的结果就是su的值,这个值也将在后面的帖子提交中用到。如果你有一定的加密经验,可能一眼就看出这是代码。python中有一个模块可以做到这一点。让我们回到图1,http://login.sina.com.cn/sso/login.php?客户端=ssologin.js(v1.4.18)这个地址是数据后提交的地址,下面是我自己提交的数据:
图三
这里我们需要自己构造su(加密用户名)、sp(加密密码)、servertime、nonce、rsakv等数据,其他数据不需要改动。有同学问我为什么其他数据不用改。可以多次登录查看更改的值,那么那些值就是需要构造的值,其他的值可以直接使用。这里的su,su,servertime,nonce,rsakv rsakv都已经得到,所以现在需要的只是sp值。我们还是按照原来的方法在js文件中寻找“sp”,可以找到代码requests.sp=password,所以只需要看看密码是如何构造的。通过搜索,您可以看到密钥加密代码:
password = RSa key . encrypt([me . server time,me.nonce]。加入(" t") "n "密码)
这段代码就是加密密码的代码。有经验的同学会知道用的是rsa加密,python中有相应的RSA加密库。但是我们假设没有人能够看到或者知道python中有第三方库rsa。这时,我想向你介绍一下我的一些经历。我已经知道有三种模拟登录方案:a)最简单高效的,直接将js源代码转换成相应的python代码,模拟加密过程进行加密;b)使用selenium phantomjs/firefox的方案直接模拟人工操作,填写表单,提交数据进行模拟登录,最简单,效率稍低。如果学生对这种简单暴力的方式感兴趣,可以在我的github上查看源代码c),通过pyv 8/pyxecjs渲染js代码,这是本文的主要方式。第一种方式,微博如果调整登录加密算法,加密码一定要改。第二种方式和第三种方式没有这个问题。
因为使用Python3,不支持PyV8,所以选择了Pyexecjs,和Python 3类似,也可以直接执行js代码。我对Java代码也不是很熟悉,所以直接定义了一个函数来处理加密密码,并没有过多修改其加密源代码:
函数get_pass(mypass,nonce,servertime,rsakey){
varRSAKey = newsinaSSOEncoder。RSakey();
RSAKey.setPublic(rsakey," 10001 ");
password = RSa KeY . encrypt([server time,nonce]。join("t") "n" mypass)
返回密码
}
这个函数实际上是副本加密文件的加密过程代码。为了测试,我直接使用随机数、服务器时间、rsakey等数据。,这是我在之前的登录中捕捉到的,在webstorm中调用这个函数,但是我报告了一个错误,提示“navigator未定义”,这是webstorm使用的nodejs的运行时环境,navigator是浏览器的一个属性,所以操作上会有问题。所以我只是用phantomjs作为运行时环境。考虑到有些同学不知道如何使用phantomjs,我在这里简单说一下。使用windows的同学应该去phantomjs官网下载它的可执行文件,然后设置环境变量。在命令行输入“phantomjs some.js”来执行some.js的文件,其实和在命令行执行python或者java文件是一样的。不清楚可以用百度来执行命令行执行python的方法,复制一下就行了,不清楚就问我。使用ubuntu的同学可以直接使用sudo apt-get安装phantomjs,然后就可以安装使用了。我直接用phantomjs运行加密的js文件,真的很不错。原因是phantomjs其实是一个没有ui的浏览器,自然支持navigator、window等属性。Pyexecjs支持phantomjs作为运行时环境。pyexecjs git主页的具体用法如代码所示。
用open('G:/java/sinajs.js ',' r ')作为f:
source = f.read()
phantom = execjs.get('PhantomJS ')
getpass = phantom.compile(源代码)
mypass = getpass.call('getpass ',mypass,nonce,servertime,pubkey)
这个代码可以得到加密的密码。
之后可以进行帖子提交,提交地址可以从抓包工具上看到:http://login.sina.com.cn/sso/login.php? client = SSO log in . js(v 1 . 4 . 18)。
根据经验,这里的流程基本完成。不过微博有点坑。这里还有一个步骤,类似于图1所示的http://passport.weibo.com/wbsso/login?URL = http://Weibo . com/ajaxlogin . PHP?framelogin = 1 & amp回调;= parent . Sinasocontroller . FeedurlCallback & amp;ticket = ST-NTc3 ntg1 mjmwnw = =-1461911127-gz-1de 185 df 04280 D7 e 96 bdcd 14 d9 D8 e 235 & amp;Retcode=0,这一步会重定向请求,返回当前账户的登录信息,如下图所示:
图三
那么问题来了,如何得到上面要求的地址。分析以上地址,有一个票字段。这应该是您登录的凭据,因此该地址应该由服务器返回。如果没有,那么至少是服务器返回了票据,所以我们在请求这个url之前使用包抓取工具检查返回的信息,发现有与上面的url一致的信息:
图四
这段代码使用了帖子回复的内容,所以我们可以直接从中提取我们需要的网址。然后使用get方法请求上面的url,它将进行重定向并直接返回登录信息。这时候就意味着成功着陆。
PS:授人以鱼不如授人以渔,这是我的信念。有些老手可能觉得我写的很啰嗦,但其实很多新手可能不知道这些细节,所以我把新浪微博模拟登陆过程的分析都写了出来。另外,除了这种方法,本文提到的另外两种方法也实现了。最暴力的方式是使用第三方库rsa。我对代码有详细的评论,另外一个方法是使用selenium phantomjs。我对代码中的关键地方也有评论。
说话便宜,给我看代码!
最后,我呈现这篇文章的所有模拟登录代码(如果你喜欢或阅读它来帮助你,你可能希望在github和welcome fork上给出一个星号)
代码链接,欢迎叉和星星:https://github.com/w1796246076/smart_login/
标题:pexels,CC0授权。
1.《登陆新浪微博 超详细的Python实现新浪微博模拟登陆》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《登陆新浪微博 超详细的Python实现新浪微博模拟登陆》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/guonei/1194291.html