今天我们拿 “堆糖,美图壁纸兴趣社区” 这个网站做案例吧。网址: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); }
感谢分享!