资讯专栏INFORMATION COLUMN

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

galois / 1454人阅读

摘要:模拟登录新浪微博的核心,也是与模拟登录最大的不同,密码加密。已经实现模拟新浪微博登录的功能,之后不再更新。

参考资料:
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/...

标题名“基于laravel框架”,因为整个获取新浪微博数据的系统是用的lavarel框架搭建的,使用了lavarel队列、命令等等工具。其实模拟新浪微博登录这部分完全可以用简单php程序页面实现,希望我下面的分析能够帮助感兴趣的朋友实现自己的模拟登录程序。
PS:AppHttpControllersAdminAuthorizeController控制器是本文的主程序,以下提及的代码都在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”(这两个值需要先从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) + "	" + str(nonce) + "
" + str(password) 
  pwd = rsa.encrypt(codeStr, RSAKey)  #使用rsa进行加密

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

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

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



这种做法有个很大的缺点,需要一个多带带的页面来生成加密后的密码,并且将密码传给最后的提交页面,也就是说页面需要多次跳转。

   var encrpt = getpass("{$preParam["sp"]}", "{$preParam["servertime"]}", "{$preParam["nonce"]}", "{$preParam["pubkey"]}" );
//     document.write(encrpt);
   window.location.href="/admin/authorize/browserLogin/?sp="+encrpt;

最后将加密的密码传递给最后的提交页,见getRsaPwd()方法。

我是在最终提交页browserLogin中将之前储存在文件中的各种参数提取与加密后的密码组合,最后post给新浪通行证登录页登录。

这里还有一点是之前介绍过的,需要填写验证码情况,如果预登录返回的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登录没有什么需要特别说明的,应该是在参数里面设置了入口weibo,所以返回的cookie可以直接使用到微博中,理论上这种方式可以在新浪全站模拟登录,不过我并没有试过其他子站。新浪只是在密码核验上比较严格,对于模拟登录的限制并不多。

综上,虽然使用PHP实现了模拟新浪微博登录,但比之Python还是很不方便的,毕竟Python做爬虫的有很多工具。不过在模拟登录微博的基础上获取微博数据过程中,使用lavarel这种框架实现了很多脚本功能,大大提高了抓取数据效率,这也是我使用lavarel开发这个小项目的原因。

https://github.com/daweilang/...
已经实现模拟新浪微博登录的功能,之后不再更新。

后续的新浪微博数据抓取分析,请关注 https://github.com/daweilang/...
这个项目还在调整阶段,还有很多缺陷需要完善,待功能成熟后,我也会围绕项目的设计目标,介绍一下实现方案。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22624.html

相关文章

  • Growth Hacker 奇技淫巧一则:零授权,抓取新浪微博任何用户的微博内容

    摘要:由于我需要获取普通用户的微博内容,因此还要想办法继续绕。默认是勾上的,也即是说微博团队主观上是希望用户勾上这个,从而借助判断来提高登录安全性的。我遂果断取消勾选该选项,输入任何一个自己的微博账号密码,点击登录。 有时或基于以下凡此种种需求,我们会想要去抓取新浪微博的内容: 产品冷启动,导入外部数据,而非从头积累; 通过大数据+语义分析获取用户兴趣行为偏好,提供智能推荐; 监控微博舆...

    wpw 评论0 收藏0
  • Growth Hacker 奇技淫巧一则:零授权,抓取新浪微博任何用户的微博内容

    摘要:由于我需要获取普通用户的微博内容,因此还要想办法继续绕。默认是勾上的,也即是说微博团队主观上是希望用户勾上这个,从而借助判断来提高登录安全性的。我遂果断取消勾选该选项,输入任何一个自己的微博账号密码,点击登录。 有时或基于以下凡此种种需求,我们会想要去抓取新浪微博的内容: 产品冷启动,导入外部数据,而非从头积累; 通过大数据+语义分析获取用户兴趣行为偏好,提供智能推荐; 监控微博舆...

    DevWiki 评论0 收藏0
  • selenium 自动化爬虫 5分钟爬取新浪李敖大师1751条微博.

    摘要:是一个浏览器自动化测试框架可以模拟用户的所有操作很久以前就想把李敖大师的所有微博爬取下来一直没空前天看见群里有人推荐和就学了做了个你们想爬别人的只要把李敖大师的地址换成你要的就行了我还没学不过我猜他就是去掉功能的浏览器这样可以让爬虫更快如果 selenium 是一个浏览器自动化测试框架.可以模拟用户的所有操作. 很久以前就想把李敖大师的所有微博爬取下来.一直没空,前天看见群里有人推荐s...

    zhichangterry 评论0 收藏0
  • 借助诗词API和微博图床搭建自动发图文微博机器人

    摘要:微博图床对于微博图床的理解得力于这篇文章利用微博当图床语言实现。源码如下上传图片到微博图床图片文件图片是否采用方式上传返回的数据微博提交正则表达式提取返回结果中的数据微博机器人源码列举了所要用到的几个重要,最后还是贴一下机器人的源码吧。 ​ 在2011年的时候,浙大的一位博士生借助微博的开放平台为他实验室的一台饮水机弄了个微博,名唤@浙大CCNT实验室饮水机,俗称饮水机娘。当年这...

    沈建明 评论0 收藏0
  • 23个Python爬虫开源项目代码,包含微信、淘宝、豆瓣、知乎、微博

    摘要:今天为大家整理了个爬虫项目。地址新浪微博爬虫主要爬取新浪微博用户的个人信息微博信息粉丝和关注。代码获取新浪微博进行登录,可通过多账号登录来防止新浪的反扒。涵盖链家爬虫一文的全部代码,包括链家模拟登录代码。支持微博知乎豆瓣。 showImg(https://segmentfault.com/img/remote/1460000018452185?w=1000&h=667); 今天为大家整...

    jlanglang 评论0 收藏0

发表评论

0条评论

galois

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<