2016年10月14日 21:26:32

PHP cURL模拟登录与采集分析过程详解 Featured

作者: 

本文详细讲解如何对网站进行模拟登录与采集的步骤,并通过两个示例展示如何基于curl命令实现自动模拟登录,包括使用node.js对js加密过的内容进行处理。

一、如何分析浏览器信息

(一)工具

  1. Firefox浏览器
    下载地址:http://www.firefox.com.cn/download/
  2. Firebug:Firefox浏览器扩展
    Firefox浏览器自带了开发者工具栏,但是,Firebug的界面会更简洁、更好用一些,下面的分析过程,我们将以Firebug为示例讲解。
  3. Tamper:Firefox浏览器扩展
    Tamper是用来记录所有请求信息的扩展,主要用于协助分析。

(二)分析过程

1. 访问目标网站
2. 打开Firebug(快捷键:F12)
新安装的需要启用【控制台】、【网络】、【脚本】、【Cookie】
3. 清除【Cookie】
4. 重新访问目标网站
5. 设置【网络】为[保持]状态
[保持]状态可以保证页面提交表单刷新后,网络请求依然存在
如果是跨域名跳转,可能导致Firebug控制台消失,此时可以借助Tamper获取请求信息,或者在页面跳转前,快速多次按下Esc按钮(左上角),取消网络的跳转
6. 填写表单,提交登录请求
7. 利用【网络】,分析提交信息
  • 【网络】标签下有很多子标签,前面我们已经使用了[保持]标签
  • 如果选用[全部],则会发现有很多图片、css、js的请求,这些都是干扰我们的信息,所以,一般我们只需要关注[HTML]和[XHR]标签即可
    • [HTML]是页面请求信息
    • [XHR]是Ajax请求信息
  • 如果重复测试获取信息,[保持]状态下会导致控制台保留前面的请求信息,这时候我们可以通过[清除]标签来清空,再重新进行测试
8. 复制请求的cURL命令
9. 分析命令传输的参数与Cookie和前面页面响应内容的关联性
例如:csrf_token是登录常见的传递参数,它需要从上一个页面中解析得到
10. 如果遇到Cookie和响应内容都无法查找到的参数,Ctrl+S保存当前页面为全部,利用文本搜索该参数的位置

Ctrl+S保存当前页面为全部,会得到一个html文件和一个同名的_files目录,移动html文件到目录中,然后进入目录,利用grep或者notepad++(编辑器),进行内容搜索。
如果该参数来源于js函数,需要分析函数的复杂度,能直接翻译成php语言实现自然最好,如果不能,将该js文件中的内容,抽取到nodeServer.js中,利用node来执行js并得到结果。关于nodeServer.js的应用,请参考《基于nodejs实现js后端化处理

11. 利用cURL命令组装模拟登录程序

复制从前面得到的cURL命令,参考《PHP基于cURL实现自动模拟登录》逐步拼装请求

二、如何利用浏览器cURL命令实现模拟登录

示例1:如何登录知乎

  1. <?php
  2. /**
  3. * 模拟登录知乎
  4. * @author Zjmainstay
  5. * @website http://www.zjmainstay.cn/php-curl
  6. * @date 2016/10/14
  7. */
  8. require_once __DIR__.'/../vendor/autoload.php';
  9. //知乎模拟登录
  10. //账号信息
  11. $email = 'user_email@email.com';
  12. $password = 'password';
  13. $autologin = new PHPCurl\CurlAutoLogin();
  14. //登录缓存cookie文件
  15. $loginCookieFile = '/tmp/login_cookie.txt';
  16. if(file_exists($loginCookieFile)) {
  17. $cookie = file_get_contents($loginCookieFile);
  18. }
  19. //登录信息缓存,知乎频繁登录会出现验证码!!
  20. if(empty($cookie)) {
  21. $curl1 = "curl 'https://www.zhihu.com/' -H 'Host: www.zhihu.com' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:47.0) Gecko/20100101 Firefox/47.0' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' -H 'Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3' -H 'Accept-Encoding: gzip, deflate, br' -H 'Connection: keep-alive'";
  22. $content = $autologin->execCurl($curl1);
  23. //偶然发现csrf没有用,所以直接赋值了useless
  24. $email = urlencode($email);
  25. $curl2 = "curl 'https://www.zhihu.com/login/email' -H 'Accept: */*' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3' -H 'Connection: keep-alive' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'Cookie: q_c1=0daf021c52de4ef3b6a529ff4f1a6811|1470651590000|1470651590000; _xsrf=4e599680f57fee89a4dd1aebe0e38128; l_cap_id=\"NzFlNjRmZGE3ODJhNDJkMGI1NDc2YzQxYjliZDkwZTE=|1470651590|9d2ff3f78f14a0e32c7938f1d86023736b25a5bd\"; cap_id=\"OWFjNDkzYWYxNmZhNDBjN2JlZWJjNDhiNGUxYTJjNWI=|1470651590|652577038670a9b544e91d6cbcb5a355dfc29eee\"; n_c=1; d_c0=\"ABCAsUV-WgqPTnNCtsTsgzk-RdfrxZVFb8g=|1470651591\"; __utma=51854390.248018333.1470651592.1470651592.1470651592.1; __utmb=51854390.2.10.1470651592; __utmc=51854390; __utmz=51854390.1470651592.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmv=51854390.000--|3=entry_date=20160808=1; __utmt=1; _za=ee1a9bde-d629-4f05-b670-7adb1ee17a5f; _zap=64a770d4-5a33-4744-9602-4608f0f6f551' -H 'Host: www.zhihu.com' -H 'Referer: https://www.zhihu.com/' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:47.0) Gecko/20100101 Firefox/47.0' -H 'X-Requested-With: XMLHttpRequest' -H 'X-Xsrftoken: 4e599680f57fee89a4dd1aebe0e38128' --data '_xsrf=useless&password={$password}&captcha_type=cn&remember_me=true&email={$email}'";
  26. $content = $autologin->execCurl($curl2);
  27. $autologin->lockLastCookieFile();
  28. $homeUrl = 'https://www.zhihu.com/';
  29. $isLogin = $autologin->assertContainStr($autologin->getUrl($homeUrl), '退出');
  30. if($isLogin) {
  31. echo "已登录";
  32. } else {
  33. exit('未登录,请检查账号密码');
  34. }
  35. file_put_contents($loginCookieFile, $autologin->getLastCookieContent());
  36. }
  37. $autologin->setLastCookieFile($loginCookieFile);
  38. //获取我的收藏(未做登录缓存过期判断处理)
  39. $url = 'https://www.zhihu.com/collections';
  40. $content = $autologin->getUrl($url);
  41. $pattern = '#<h2[^>]*?zm-item-title[^>]*?>\s*<a href="([^"]+)" >(.*?)</a>#is';
  42. if( preg_match_all($pattern, $content, $matches) ) {
  43. foreach($matches[0] as $key => $val) {
  44. echo "{$matches[2][$key]}({$matches[1][$key]})\n";
  45. }
  46. }

示例2:如何登录博客园

(1)PHP程序部分

  1. <?php
  2. /**
  3. * 模拟登录博客园
  4. * @author Zjmainstay
  5. * @website http://www.zjmainstay.cn/php-curl
  6. * @date 2016/10/14
  7. */
  8. require_once __DIR__.'/../../vendor/autoload.php';
  9. $autologin = new PHPCurl\CurlAutoLogin();
  10. //登录缓存cookie文件
  11. $loginCookieFile = '/tmp/cnblog_login_cookie.txt';
  12. if(file_exists($loginCookieFile)) {
  13. $cookie = file_get_contents($loginCookieFile);
  14. }
  15. $username = 'Zjmainstay';
  16. $password = 'password';
  17. //登录信息缓存,频繁登录会出现验证码!!
  18. if(empty($cookie)) {
  19. //登录页
  20. $curl1 = "curl 'https://passport.cnblogs.com/user/signin?ReturnUrl=http%3A%2F%2Fwww.cnblogs.com%2F' -H 'Host: passport.cnblogs.com' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:48.0) Gecko/20100101 Firefox/48.0' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' -H 'Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3' -H 'Accept-Encoding: gzip, deflate, br' -H 'Referer: http://www.cnblogs.com/' -H 'Connection: keep-alive' -H 'Upgrade-Insecure-Requests: 1'";
  21. $content = $autologin->execCurl($curl1);
  22. //获取VerificationToken
  23. $pattern = "#'VerificationToken': '([^']+)'#is";
  24. if(!preg_match($pattern, $content, $match)) {
  25. throw new Exception('无法解析获得登录页VerificationToken');
  26. }
  27. $verificationToken = $match[1];
  28. //基于node.js获取博客园登录用户名和密码加密结果
  29. $content = file_get_contents("http://localhost:8111?input1={$username}&input2={$password}");
  30. $encryptInfo = json_decode($content, true);
  31. $postData = sprintf('{"input1":"%s","input2":"%s","remember":false}', $encryptInfo['input1'], $encryptInfo['input2']);
  32. $contentLength = strlen($postData);
  33. //提交登录信息
  34. $curl2 = "curl 'https://passport.cnblogs.com/user/signin' -X POST -H 'Host: passport.cnblogs.com' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:48.0) Gecko/20100101 Firefox/48.0' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3' -H 'Accept-Encoding: gzip, deflate, br' -H 'Content-Type: application/json; charset=utf-8' -H 'VerificationToken: {$verificationToken}' -H 'X-Requested-With: XMLHttpRequest' -H 'Referer: https://passport.cnblogs.com/user/signin?ReturnUrl=http%3A%2F%2Fwww.cnblogs.com%2F&AspxAutoDetectCookieSupport=1' -H 'Content-Length: {$contentLength}' -H 'Cookie: AspxAutoDetectCookieSupport=1; SERVERID=d0849c852e6ab8cf0cebe3fa386ea513|1476439733|1476438874' -H 'Connection: keep-alive'";
  35. //通过前置处理传入post数据内容
  36. $content = $autologin->execCurl($curl2, function($parseCurlResult) use ($postData) {
  37. $parseCurlResult['post'] = $postData;
  38. return $parseCurlResult;
  39. });
  40. $autologin->lockLastCookieFile();
  41. $homeUrl = 'http://i.cnblogs.com/';
  42. $isLogin = $autologin->assertContainStr($autologin->getUrl($homeUrl), '修改密码');
  43. if($isLogin) {
  44. echo "已登录\n";
  45. } else {
  46. exit("未登录,请检查账号密码\n");
  47. }
  48. file_put_contents($loginCookieFile, $autologin->getLastCookieContent());
  49. }
  50. $autologin->setLastCookieFile($loginCookieFile);
  51. //获取我的随笔
  52. $url = 'https://i.cnblogs.com/';
  53. $content = $autologin->getUrl($url);
  54. $pattern = '#<td class="post-title">\s*<a href="/([^"]+)"[^>]*>(.*?)</a>#is';
  55. if( preg_match_all($pattern, $content, $matches) ) {
  56. foreach($matches[0] as $key => $val) {
  57. echo "{$matches[2][$key]}({$matches[1][$key]})\n";
  58. }
  59. }

(2)node.js加密串生成部分
由于js代码字符较多,请点击下载源码:博客园模拟登录加密内容node.js代码



未经同意禁止转载!
转载请附带本文原文地址:PHP cURL模拟登录与采集分析过程详解,首发自 Zjmainstay学习笔记
阅读( 12788 )
看完顺手点个赞呗:
(25 votes)

1.PHP cURL群:PHP cURL高级技术
2.正则表达式群:专精正则表达式
3. QQ联系(加请说明):QQ联系博主(951086941)
4. 邮箱:zjmainstay@163.com
5. 打赏博主:

网站总访问量: