前言:做后台都知道页面肯定要做防翻墙的验证的,但是有时候如果要做定时任务访问页面时候又不想把防翻墙去除保证安全性,但是又想登录到这些页面那应该怎么办咧,本文夹杂着1天时候的摸索发现了这个规律,那就开始干吧,后来发现用guzzle很多问题一下解开了,
首先要避免的坑
- 不要跑到登录页面去提交参数即(***/login),而是要在点击提交时候的那个页面(***/logincheck),这样才是对的,不然你无法成功
- 网上的如果携带cookie文件的方式走不通那就直接携带cookie值就行,不要纠结,先把问题解决
登录
/**
* 实现登录返回cookie值
* @param $url
* @param array $params
* @param array $headers
* @return bool|mixed|string
*/
function post_curl($url, $params = [], $headers = [])
{
$httpInfo = array();
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0
(Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/41.0.2272.118 Safari/537.36');
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($ch, CURLOPT_URL, $url);
$response = curl_exec($ch);
if ($response === FALSE) {
return false;
}
curl_close($ch);
// 解析HTTP数据流
list($header, $body) = explode("\r\n\r\n", $response);
// 解析COOKIE
preg_match("/set\-cookie:([^\r\n]*)/i", $header, $matches);
//请求的时候headers 带上cookie就可以了
$cookie = explode(';', $matches[1])[0];
return $cookie;
}
//这里再次提醒不登录的首页,而是点了提交时候的页面
$url = "***/index/index/logincheck";
//这里具体的要根据你后台获取前台表单值的name来设置
$post = array(
'username' => '***',
'password' => '***',
'submit' => '现在登录'
);
//调用返回cookie值
$re = post_curl($url, $post, 1); //这里拿到的是cookie值
//var_dump($re);exit;
携带上面返回cookie就可以访问你想要访问的页面了
/**
* 传入cookie开始访问请求
* @param $cookie_file
* @return bool|string
*/
function getcontent($cookie_file){
$data_url = "***/index/ortest/**"; //数据所在地址
$ch = curl_init();
// curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
// $UserAgent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1;
.NET CLR 2.0.50727; .NET CLR 3.0.04506;
.NET CLR 3.5.21022; .NET CLR 1.0.3705; .NET CLR 1.1.4322)';
// curl_setopt($ch, CURLOPT_USERAGENT, $UserAgent);
curl_setopt($ch, CURLOPT_URL, $data_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,0);
curl_setopt($ch,CURLOPT_COOKIE,$cookie_file);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
//传入登录返回的cookie值带入访问想访问的页面即可
$ct = getcontent($re);
var_dump($ct);
到此我相信你能够愉快的解决了问题,如果还没有解决,沉下来思考一下想想那里应该会存在问题,相信问题很快可以得到解决的,加油
网友评论