参考资料:http://www.csuldw.com/2016/11/10/2016-11-10-simulate-sina-login/http//blog.csdn.net/fly_leopard/article/details/51148904http://www.tuicool.com/articles/uIJzYffhttp://blog.csdn.net/u010029983/article/details/46364113等模拟新浪微博login是抓取新浪数据的基础。网上的大部分参考资料都是用Python开发的。有一篇用php模拟登录的文章,还是phpcms中实现的,没有深入分析。PS:网上的信息来源比较混乱。不知道phpcms模拟微博登录的原创作品是不是csdn的t0mCl0nes。本文介绍php模拟登录的核心参考。下面提到本文参考phpcms方案。使用PHP模拟登录新浪微博和Python还是有一些区别的,也存在一些问题。下面我就简单分析一下PHP模拟新浪微博登录的过程和存在的问题。项目地址:https://github.com/daweilang/...题目是“基于laravel框架”,因为整个获取新浪微博数据的系统都是用lavarel框架搭建的,使用lavarel队列,命令等工具。其实模拟新浪微博登录的部分可以用一个简单的php程序页面来实现。希望我下面的分析可以帮助有兴趣的朋友实现自己的模拟登录程序。PS:App\Http\Controllers\Admin\AuthorizeController控制器是本文的主程序,下面提到的代码都在github程序中。这里所说的模拟新浪微博登录,特指通过新浪通行证模拟登录。新浪通行证是新浪的统一登录方式。新浪网(sina.com.cn)和微博(weibo.com)是两个不同的顶级域名。微博就是通过新浪通行证实现跨域登录的。跨域登录我不是很了解,但是新浪网使用的方法从技术上来说应该是很有深度的。具体登录参数的抓包分析可以参考上面和网上的一些文章。固定参数可以参考我的代码“config/weibo.php”的curl数组。这里结合PHP程序进一步说明预登录以及预登录返回的参数。当用户输入用户名,焦点离开输入框时,登录页面会转到http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=%s&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.18)&_=%s发送GET请求,其中用户名经过base64_encode加密,最后是毫秒级时间戳。其他参数可以固定。该请求返回一些参数。网上的资料有介绍,“servertime”、“nonce”、“rsakv”这三个参数后面主要用到,但实际上“showpin”和“pcid”这两个参数也很重要。Showpin为1时表示需要填写验证码,验证码的生成需要参数“pcid”。在phpcms方案中,请求返回的这些参数是保存在cookie中的。我的代码存储在一个文件中。参数获取和存储代码参考GetWeiboCookie类的getPreUrl()方法。PHP模拟登录新浪微博的核心也是与Python模拟登录最大的区别,就是密码加密。网上的文章已经介绍了微博密码加密的原理,使用RSA2算法,“首先创建一个rsa公钥,公钥的两个参数是固定值,第一个参数是prelogin.php中的pubkey登录流程,第二个参数是加密js文件中指定的“10001”(这两个值需要先十六进制转十进制,“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(nonce)+'\n'+str(password)pwd=rsa.encrypt(codeStr,RSAKey)#使用rsa加密只需三行代码,只需要安装rsa包即可。..百度了很久,没有找到PHP生成rsa公钥的方法。phpcms方案实现了一个方案,即按照新浪通行证的流程实现,用ssologin的js方法加密。phpcms方案把sso加密算法封装了一次,csdn博客上有这段js代码。本人js水平不高,完全借用了这段代码,在此基础上将加密算法提取到一个js文件中。这种方法有一个很大的缺点。它需要一个单独的页面来生成加密后的密码,并将密码传递给最终的提交页面,这意味着该页面需要多次跳转。varencrpt=getpass('{$preParam['sp']}','{$preParam['servertime']}','{$preParam['nonce']}','{$preParam['pubkey']}');//文档.write(encrpt);window.location.href='/admin/authorize/browserLogin/?sp='+encrpt;最后将加密后的密码传给最终的提交页面,见getRsaPwd()方法。在最后的提交页面browserLogin中,我提取了之前保存在文件中的各种参数并结合加密后的密码,最后贴到新浪通行证登录页面进行登录。这里还有一点之前介绍过,需要填写验证码,如果登录前返回的showpin参数为1,则需要获取验证码图片,填写验证码登录。验证码图片地址为http://login.sina.com.cn/cgi/pin.php?r={$randInt}&s=0&p={$preParam['pcid']}r是一个随机的8位数字,p是登录前返回的pcid。如果有验证码,就会多一个手动填写验证码的过程。具体代码参考browserLogin()方法。与Python相比,这种方式最大的缺点是不能自动登录,即后台登录。Python不需要手动触发。有了用户名和密码后,就可以用程序模拟登录了,而PHP实现需要手动触发登录。另外,如果需要填写验证码,Python也有工具可以识别验证码,自动输入验证码,全程自动登录。这也是PHP难以实现的。后面的curl登录没有什么特别需要说明的。参数中要设置入口微博,这样返回的cookie可以直接在微博中使用。理论上这个方法可以用来模拟登陆新浪网,但是我没有。尝试了其他子站点。新浪只是在密码验证上比较严格,模拟登录没有太多限制。综上所述,虽然用PHP来模拟新浪微博登录,但是相对于Python来说还是很不方便的。毕竟Python有很多爬虫的工具。但是在模拟登录微博的基础上获取微博数据的过程中,使用lavarel的框架实现了很多脚本功能,大大提高了数据抓取的效率,这也是我使用lavarel开发这个小程序的原因项目。https://github.com/daweilang/...已实现模拟新浪微博登录功能,后续不再更新。后续新浪微博数据抓取分析,请关注https://github.com/daweilang/...本项目还在调整阶段,还有很多缺陷需要完善。功能成熟后,我也会围绕项目设计目标,介绍实现方案。