PHP基于laravel框架获取微博数据之一模拟新浪微博登录

  

参考资料:
http://www.csuldw.com/2016/11/10/2016-11-10-simulate-sina-login/
http://blog.csdn.net/fly_leopard/article/details/51148904
http://www.tuicool.com/articles/uIJzYff

http://blog.csdn.net/u010029983/article/details/46364113


模拟新浪微博登录是抓取新浪数据的基础,网上的参考资料大多介绍的是用Python开发,有一篇使用php模拟登录的资料还是在phpcms中实现的,也没有太深入分析。

PS:网上资料来源比较乱,不知道phpcms实现模拟微博登录的原作是不是csdn的t0mCl0nes,本篇介绍php模拟登录的核心借鉴的就是这篇文章。以下提及这篇文章以phpcms方案指代。


使用php模拟登录新浪微博和Python还是有些区别的,其中也存在一些问题,在这里我就简单分析一下php模拟新浪微博登录的过程和存在的问题。


项目地址:https://github.com/daweilang/GetWeiBoCookie


标题名“基于laravel框架”,因为整个获取新浪微博数据的系统是用的lavarel框架搭建的,使用了lavarel队列,命令等等工具。其实模拟新浪微博登录这部分完全可以用简单php程序页面实现,希望我下面的分析能够帮助感兴趣的朋友实现自己的模拟登录程序。

PS: Http \控制器\ Admin \ App \ AuthorizeController控制器是本文的主程序,以下提及的代码都在github该程序中。


这里所介绍的模拟新浪微博登录,具体是指通过新浪通行证模拟登录。新浪通行证是新浪的统一登录模式,新浪网(sina.com.cn)和微博(weibo.com)是两个不同的顶级域,正是通过新浪通行证,微博实现了跨域登录。对于跨域登录了解不多,不过新浪网使用的这种方式技术上应该是很深入的。


具体登录参数的抓包分析请参考上面和网上的一些文章,其中固定参数可以参考我的代码“配置/微博。php”的卷曲数组。


这里主要对结合php程序进一步说明。

当用户输入用户名并且焦点离开输入框后,登录页面会向" http://login.sina.com.cn/sso/prelogin.php?entry=weibo&调=sinaSSOController.preloginCallBack&苏=% s& rsakt=mod& checkpin=1,客户=ssologin.js (v1.4.18), _=% s”发送一次得到请求,其中用户名是经过base64_encode加密的,最后是个毫秒级的时间戳,其他参数可以固定。


该请求返回了一些参数,网上资料已经介绍了后面主要用到了“servertime”、“强奸犯”和“rsakv”这三个参数,不过其实”showpin”和“pcid”这两个参数也很重要,showpin为1的时候代表需要填写验证码,而验证码的生成需要“pcid”这个参数。

phpcms方案中将这些参数储存到饼干中,我的代码是储存到文件中,参数的取得和储存代码参见GetWeiboCookie的getPreUrl方法。


下面介绍的是,也是与Python模拟登录最大的不同,密码加密。

网上的文章都已经介绍了微博密码加密原理,使用<代码> RSA2 算法,“首先创建一个rsa <代码> 公钥,公钥的两个参数都是固定值,第一个参数是登录过程中<代码> prelogin。php代码中的<代码> pubkey> js代码文件中指定的“10001”(这两个值需要先从16进制转换成10进制,把“10001”转成十进制为“65537”),最后再加入<代码> servertime 和<代码> nonce 进行进一步加密。”

新浪通行证的流程是,在用户填写完用户名和密码提交后,请求“https://login.sina.com.cn/js/sso/ssologin.js”页面,这个js页面里就是上面的加密算法,使用js将密码加密。


这个流程使用Python模拟的代码是这样的:

,,,,,,RSAKey =, rsa.PublicKey (rsaPubkey, 65537), #创建公钥   ,,,,,#根据js拼接方式构造明文   ,,,,,codeStr =, str (servertime), +,‘\ t’, +, str(临时的),+,' \ n ', +, str(密码),   ,,,,,pwd =, rsa.encrypt (codeStr, RSAKey),, #使用rsa进行加密

短短三行代码,只需要安装rsa包…


百度了好久,没有找到php实现生成rsa公钥方法。

phpcms方案实现了一种解决方法,也就是按照新浪通行证的流程来实现,用ssologin的js方法来加密.phpcms方案对sso加密算法进行了一次封装,csdn博客上有该段js代码。我的js水平不高,完全借鉴了这段代码,在此基础上将加密算法提取到一个js文件中。

,,,,& lt; script  type=' text/javascript ', src=" https://www.yisu.com/js/prelogin.js "祝辞& lt;/script>   ,,,& lt; script  type=" text/javascript祝辞   ,,,function  getpass (pwd, servicetime nonce, rsaPubkey) {,,,,,,,   ,,,,,,,var  RSAKey=new  sinaSSOEncoder.RSAKey (),,,,,,,,,   ,,,,,,,RSAKey.setPublic (rsaPubkey,‘10001’),,,,,,,,,   ,,,,,,,var 密码=RSAKey.encrypt ([servicetime, nonce] . join (‘\ \ t) + ' \ \ n + pwd),,,,,,,,,   ,,,,,,,return 密码,,,,,   ,,,}   ,,,& lt;/script>

PHP基于laravel框架获取微博数据之一模拟新浪微博登录