今天我们拿 “堆糖,美图壁纸兴趣社区” 这个网站做案例吧。网址:https://www.duitang.com/
实现过程:
先说一下这个不分语言,能发送请求就能实现。

我们打开网站可以看到登录or注册的地方,直接点击

点击以后直接打开开发者控制台preserve log这个一定得勾选上,是持续记录日志的,网站登录成功以后会跳转那样我们就看不到请求数据了,所以要勾选上。
我这边是已经注册好了,那我就直接输入账号密码了。

我们点击登录按钮的时候可以看到有一条url是为:https://www.duitang.com/login/的请求,
那个就是登录请求,这个登录没有任何验证,这会让我们方便许多,我们再来看请求的参数,login_name这个是登录的账号;pswd这个我们看名字就知道是密码了,来curl模拟这个请求:
/**
* @param $url
* @param $data
* @return string
* 模拟登录
*/
function loginPost($url,$data){
$ch = curl_init();
$header=[
'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
];
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HEADER,1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
$datas = curl_exec($ch);
curl_close($ch);
return $datas;
}
这个是我封装好的函数,我们来发送一下登录请求:
<?php
header('Access-Control-Allow-Origin:*');
header('Content-type:application/json; charset=utf-8');
error_reporting(0);
$post_data=[
"login_name"=>"账号",
"pswd"=>"密码",
"ccode"=>"",
"token"=>"",
"remember"=>true,
"next"=>"/"
];
echo loginPost("https://www.duitang.com/login/",$post_data);
/**
* @param $url
* @param $data
* @return string
* 模拟登录
*/
function loginPost($url,$data){
$ch = curl_init();
$header=[
'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
];
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HEADER,1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
$datas = curl_exec($ch);
curl_close($ch);
return $datas;
}
我们来看输出结果:

我们看请求头信息就能看出来已经登录成功,第一个Set-Cookie就是我们要的东西,接下来我们可以验证一下这个cookie是否有效:
/**
* @param $url
* @param $cookie
* @return bool|string
* 携带cookie访问目标网址
*/
function get($url,$cookie){
$ch = curl_init();
$header = [
"Cookie: $cookie"
];
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36");
curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
$content = curl_exec($ch);
curl_close($ch);
return $content;
}

我们可以看到页面上已经显示我们登录进去的账号名字,说明cookie是有效的,但是里面的cookie有些是没有用的,而且我们每次都要模拟登录才能操作吗?我们接着来写:
用到的函数:
/**
* @param $str
* @param $leftStr
* @param $rightStr
* @return bool|string
* 截取字符串
*/
function getSubstr($str,$leftStr,$rightStr){
$left = strpos($str, $leftStr);
$right = strpos($str, $rightStr,$left);
if($left "'.$cookie.'"
);';
@file_put_contents('config.php', $newConfig);
}
这是我们用到的已经封装好的函数,我们可以直接在模拟登录那个地方返回精简有效的Cookie,因为我们模拟登录就是为了拿到cookie,所以我们直接在那里写就行了:
/**
* @param $url
* @param $data
* @return string
* 模拟登录
*/
function loginPost($url,$data){
$ch = curl_init();
$header=[
'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
];
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HEADER,1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
$datas = curl_exec($ch);
curl_close($ch);
return "dt_auth=".getSubstr($datas,"dt_auth=",";").";";
}
这个是我们修改以后的模拟登录,直接返回的是 cookie:

OK 没得问题,我们继续,cookie也不是很快就会失效的,所以我们可以把它存储一下就不用每次请求都要模拟登录一次了,我们创建一个存cookie的文件:如果文件不存在则自动创建
if (!is_file('config.php')) {
CookieSet('dt_auth;');
}
我们可以写一个判断,如果没有登录的cookie,就模拟登录一下并且存储带我们刚刚创建的config.PHP文件里面:
if (strpos(get("https://www.duitang.com/",$config['cookie']),"注册/登录")!==false){
CookieSet(loginPost("https://www.duitang.com/login/",$post_data));
}
这个时候我们cookie就会自动更新存储了,接下来就可以拿我们得到的cookie进行带身份操作,比如修改昵称,具体你要做什么操作看你自己了(可以做图床哦,在上传背景那个地方抓接口)
完整代码:
<?php
header('Access-Control-Allow-Origin:*');
header('Content-type:application/json; charset=utf-8');
error_reporting(0);
if (!is_file('config.php')) {
CookieSet('dt_auth;');
}
$post_data=[
"login_name"=>"账号",
"pswd"=>"密码",
"ccode"=>"",
"token"=>"",
"remember"=>true,
"next"=>"/"
];
//判断有没有登录状态,没有的话自动更新cookie
if (strpos(get("https://www.duitang.com/",$config['cookie']),"注册/登录")!==false){
CookieSet(loginPost("https://www.duitang.com/login/",$post_data));
}
//利用登录以后的cookie进行携带身份操作
/**
* @param $url
* @param $cookie
* @return bool|string
* 携带cookie访问目标网址
*/
function get($url,$cookie){
$ch = curl_init();
$header = [
"Cookie: $cookie"
];
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36");
curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
$content = curl_exec($ch);
curl_close($ch);
return $content;
}
/**
* @param $str
* @param $leftStr
* @param $rightStr
* @return bool|string
* 截取字符串
*/
function getSubstr($str,$leftStr,$rightStr){
$left = strpos($str, $leftStr);
$right = strpos($str, $rightStr,$left);
if($left <= 0 or $right < $left) return '';
return substr($str, $left + strlen($leftStr), $right-$left-strlen($leftStr));
}
/**
* @param $url
* @param $data
* @return string
* 模拟登录
*/
function loginPost($url,$data){
$ch = curl_init();
$header=[
'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
];
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HEADER,1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
$datas = curl_exec($ch);
curl_close($ch);
return "dt_auth=".getSubstr($datas,"dt_auth=",";").";";
}
/**
* @param $cookie
* 设置cookie
*/
function CookieSet($cookie){
$newConfig = '<?php
$config = array(
"cookie" => "'.$cookie.'"
);';
@file_put_contents('config.php', $newConfig);
}
感谢分享!