参考资料:

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模拟新浪微博登录的过程和存在的问题。

标题名“基于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”(这两个值需要先从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(nonce) + '\n' + 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/...

这个项目还在调整阶段,还有很多缺陷需要完善,待功能成熟后,我也会围绕项目的设计目标,介绍一下实现方案。

php模拟关注微博,PHP基于laravel框架获取微博数据之一 模拟新浪微博登录相关推荐

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

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

  2. 基于Laravel框架开发的旅游网站管理系统PHP源码

    源码介绍 旅游网站管理系统是一款基于Laravel框架开发的在线旅游网站系统,一个类似企业网站的张家界旅游网站,主要目标是为了实现对张家界的各个景点,文化艺术,当地生活的描述.同时实现可以登陆注册网站 ...

  3. STM32G070RBT6基于Arduino框架下串口数据接收使用示例

    STM32G070RBT6基于Arduino框架下串口数据接收使用示例 相关篇<STM32G070RBT6基于Arduino串口的使用>

  4. ProxyPool proxy-pool: java 基于springboot框架获取代理ip

    PROXY-POOL: java 基于springboot框架获取代理ip

  5. javaweb课程设计-基于SSM框架的疫情数据统计分析系统源码+数据库,可以进行疫情数据录入、疫情数据查询、图表展示

    疫情数据统计分析系统 完整代码下载地址:基于SSM框架的疫情数据统计分析系统源码+数据库 介绍 疫情数据统计分析系统是一个基于SSM框架的网页端系统,项目中实现的功能如下:用户访问网站可以浏览全国疫情 ...

  6. php-cms,GitHub - lovelife10000/L-php-cms: 基于laravel框架开发的一款php CMS内容管理系统,前端采用angular、jquery技术...

    L-php-cms L-php-cms是基于php+laravel+angular编写的一套内容管理系统,Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework). ...

  7. 旅游网站管理系统简易版 php开源,基于Laravel框架开发的旅游网站管理系统PHP源码...

    温馨提醒: 1.店主平时较忙,最好是有能力自行安装的情况下购买,如不能自行安装,请先咨询店主再进行购买. 2.假如自身对源码理解不多,购买前请先详细理解源码情况,理解完毕后再购买. 3.因为源码属于可 ...

  8. 基于SSM框架的微博系统

    技术:Java.JSP等 摘要: 自上个世纪末起.互联网技术得到飞速发展,时至今日信息时代的到来,短短十几年,互联网就让我们见识到了它的魅力,在我们的生活中,网络无处不在,而信息的爆炸性发展也拓展了人 ...

  9. 用python写脚本筛选原创微博_基于python编写的微博应用

    本文实例讲述了基于python编写的微博应用,分享给大家供大家参考.具体如下: 在编写自己的微博应用之前,先要到weibo开放平台申请应用的公钥和私钥. 下载python版的SDK,打开example ...

最新文章

  1. jupyter读取图片并展示的两种方法
  2. 后 BERT 时代的那些 NLP 预训练模型
  3. [Translation]《击鼓》
  4. 虚拟桌面分屏_桌面中的灭霸 三星C49HG90 32:9超带鱼屏体验
  5. python可以调用c语言编写的底层代码吗_Python基础笔记系列十四:python无缝调用c程序...
  6. 解决开ServiceHost时候System.PlatformNotSupportedException: Operation is not supported on this platform.
  7. Process Explorer
  8. mysql 连接数和内存的关系_php-fpm进程数和mysql连接数之间的关系
  9. 什么是智慧房屋租赁系统
  10. love2d与imgui
  11. 2021瑞安高考成绩查询,2021年瑞安高考状元名单公布,瑞安文理科状元是谁多少分...
  12. 为何Emacs和Vim被称为两大神器
  13. 杭州地铁首末站周边停车场正酝酿停车收费优惠
  14. Android马甲包
  15. 零知识证明在区块链中的应用
  16. 利用 python 实现多张图片的无损拼接
  17. 2018第九届蓝桥杯JavaA组省赛真题详解
  18. 通读cheerio API
  19. 北航计算机九推经验,前辈种树 | 工科九推经验贴
  20. 单点登录 统一用户管理

热门文章

  1. 阿里云的域名绑定端口
  2. Linux下 XordDos(BillGates)木马查杀记录
  3. 通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败 错误 Connection refus
  4. 网络故障分析 PING大包丢包故障分析
  5. “知行-技术人的管理之路”书籍推荐
  6. matlab pca svd,关于使用SVD进行PCA主成分提取的代码问题!也是必须涉及到原理的!...
  7. WINDOWS下如何安装GCC(转载http://nirvana.cublog.cn;作者:北斗星君(黄庠魁))
  8. Batch Normalization、Instance normalization简单理解
  9. JHipster中文文档(一)
  10. mysql sum返回类型_MySQL的sum函数返回的类型