一、如何分析浏览器信息
(一)工具
- Firefox浏览器
下载地址:http://www.firefox.com.cn/download/ - Firebug:Firefox浏览器扩展
Firefox浏览器自带了开发者工具栏,但是,Firebug的界面会更简洁、更好用一些,下面的分析过程,我们将以Firebug为示例讲解。 - 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:如何登录知乎
<?php/*** 模拟登录知乎* @author Zjmainstay* @website http://www.zjmainstay.cn/php-curl* @date 2016/10/14*/require_once __DIR__.'/../vendor/autoload.php';//知乎模拟登录//账号信息$email = 'user_email@email.com';$password = 'password';$autologin = new PHPCurl\CurlAutoLogin();//登录缓存cookie文件$loginCookieFile = '/tmp/login_cookie.txt';if(file_exists($loginCookieFile)) {$cookie = file_get_contents($loginCookieFile);}//登录信息缓存,知乎频繁登录会出现验证码!!if(empty($cookie)) {$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'";$content = $autologin->execCurl($curl1);//偶然发现csrf没有用,所以直接赋值了useless$email = urlencode($email);$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}'";$content = $autologin->execCurl($curl2);$autologin->lockLastCookieFile();$homeUrl = 'https://www.zhihu.com/';$isLogin = $autologin->assertContainStr($autologin->getUrl($homeUrl), '退出');if($isLogin) {echo "已登录";} else {exit('未登录,请检查账号密码');}file_put_contents($loginCookieFile, $autologin->getLastCookieContent());}$autologin->setLastCookieFile($loginCookieFile);//获取我的收藏(未做登录缓存过期判断处理)$url = 'https://www.zhihu.com/collections';$content = $autologin->getUrl($url);$pattern = '#<h2[^>]*?zm-item-title[^>]*?>\s*<a href="([^"]+)" >(.*?)</a>#is';if( preg_match_all($pattern, $content, $matches) ) {foreach($matches[0] as $key => $val) {echo "{$matches[2][$key]}({$matches[1][$key]})\n";}}
示例2:如何登录博客园
(1)PHP程序部分
<?php/*** 模拟登录博客园* @author Zjmainstay* @website http://www.zjmainstay.cn/php-curl* @date 2016/10/14*/require_once __DIR__.'/../../vendor/autoload.php';$autologin = new PHPCurl\CurlAutoLogin();//登录缓存cookie文件$loginCookieFile = '/tmp/cnblog_login_cookie.txt';if(file_exists($loginCookieFile)) {$cookie = file_get_contents($loginCookieFile);}$username = 'Zjmainstay';$password = 'password';//登录信息缓存,频繁登录会出现验证码!!if(empty($cookie)) {//登录页$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'";$content = $autologin->execCurl($curl1);//获取VerificationToken$pattern = "#'VerificationToken': '([^']+)'#is";if(!preg_match($pattern, $content, $match)) {throw new Exception('无法解析获得登录页VerificationToken');}$verificationToken = $match[1];//基于node.js获取博客园登录用户名和密码加密结果$content = file_get_contents("http://localhost:8111?input1={$username}&input2={$password}");$encryptInfo = json_decode($content, true);$postData = sprintf('{"input1":"%s","input2":"%s","remember":false}', $encryptInfo['input1'], $encryptInfo['input2']);$contentLength = strlen($postData);//提交登录信息$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'";//通过前置处理传入post数据内容$content = $autologin->execCurl($curl2, function($parseCurlResult) use ($postData) {$parseCurlResult['post'] = $postData;return $parseCurlResult;});$autologin->lockLastCookieFile();$homeUrl = 'http://i.cnblogs.com/';$isLogin = $autologin->assertContainStr($autologin->getUrl($homeUrl), '修改密码');if($isLogin) {echo "已登录\n";} else {exit("未登录,请检查账号密码\n");}file_put_contents($loginCookieFile, $autologin->getLastCookieContent());}$autologin->setLastCookieFile($loginCookieFile);//获取我的随笔$url = 'https://i.cnblogs.com/';$content = $autologin->getUrl($url);$pattern = '#<td class="post-title">\s*<a href="/([^"]+)"[^>]*>(.*?)</a>#is';if( preg_match_all($pattern, $content, $matches) ) {foreach($matches[0] as $key => $val) {echo "{$matches[2][$key]}({$matches[1][$key]})\n";}}
(2)node.js加密串生成部分
由于js代码字符较多,请点击下载源码:博客园模拟登录加密内容node.js代码
未经同意禁止转载!
转载请附带本文原文地址:PHP cURL模拟登录与采集分析过程详解,首发自 Zjmainstay学习笔记




