文章目录

  前段时间,PT站的管理员突然Q我,让我帮忙看看他写的虎踞龙盘PT站模拟登录哪儿出了问题。说是想能够登录提交post,好自动填充种子的详细信息。

  看了一下发过来的代码,和普通的模拟登录差不多,使用了http://bbs.seu.edu.cn/bbslogin.php页面登录得到的cookie来模拟登录http://bbs.seu.edu.cn/bbslogin.php(PT站的登录页面)。照理说应该没问题,结果还是自动跳转到了登录页面。

  既然是为了模拟登录,又是和cookie有关,出了问题很自然的想到先抓包看看什么情况。结果打开charles抓包后发现通过bbs登录页面获得的cookie和登录pt使用的居然不一样,如下图所示:

  可以看见有很明显的不同之处,字段不是完全对应的,所以需要先获取bbs登录页面得到的cookie,然后再提取其中的字段进行拼接,得到可用于登录pt站的cookie。

  但是实际操作中又遇到了一个小问题,模拟发送用户名和密码登录bbs获取第一个cookie时,结果显示“你登录的窗口过多,是否踢出多余的窗口?”如下图:

  我明明只登录一个啊,奇怪。点击取消后会跳回登录页面,确定的话跳到一个本地不存在的页面(我是在本地的apache里实验的)。来来回回抓包几次的时候,发现了原因。

  登录过bbs一次后,下次即使退出账号重新登录,仍然会带着上一次登录得到的cookie过去(在没失效的前提下)。但是对于第一次登录而言,用户方是没有任何该站的cookie数据,因此bbs如果检查不到cookie中的某些字段(UTMPKEY等)便会弹出上图的对话框,点击确定后,此时便会在用户这一方写入UTMPKEY等的cookie数据,此时便能够正常的进行登录操作。

  知道了上述过程,解决方案便有了,三步走:第一步,获取随机关键验证cookie字段(UTMPKEY等字段);第二步,利用获取到的UTMPKEY等字段组合出的newCookie登录pt站,用以获取c_secure_pass等信息;第三步,构造最终Cookie,进行最终希望进行的操作(get或post等)。

  结果如下图所示(以获取http://bbs.seu.edu.cn/pt/details.php?id=60608&hit=1该页面信息为例)

  代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xh
tml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
</head>
<?php

function login_simulation_for_SEU_pt($username,$password,$targetUrl){
//echo "login simulation<br>";
//第一步,获取随机关键验证cookie字段,获得UTMPKEY等字段
$login_url="http://bbs.seu.edu.cn/bbslogin.php?mainurl=";
$post_fields="id=".$username."&passwd=".$password."&kick_multi=1";
$ch=curl_init($login_url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36');
curl_setopt($ch, CURLOPT_HEADER, 1); //将头文件的信息作为数据流输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //返回获取的输出文本流
curl_setopt($ch, CURLOPT_POST, 1);//使用post方式提交数据
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
$arr=curl_exec($ch);
preg_match_all('/Set-Cookie:(.*);/iU',$arr,$str); //正则匹配
curl_close($ch);

//第二步,利用获取到的UTMPKEY等字段组合出的newCookie登录pt站,用以获取c_secure_pass等信息
$cookieForPT=$str[1][1].";".$str[1][2].";".$str[1][8].";".$str[1][4]."; WWWPARAMS=0";
$login_pt_url="http://bbs.seu.edu.cn/pt/login.php";
$post_fields="id=".$username."&passwd=".$password."&CookieDate=&kick_multi=1";
$ch=curl_init($login_pt_url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36');
curl_setopt($ch, CURLOPT_HEADER, 1); //将头文件的信息作为数据流输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //返回获取的输出文本流
curl_setopt($ch, CURLOPT_COOKIE, $cookieForPT);
curl_setopt($ch, CURLOPT_POST, 1);//使用post方式提交数据
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
$arr=curl_exec($ch);
preg_match_all('/Set-Cookie:(.*);/iU',$arr,$str2); //正则匹配
curl_close($ch);

//构造最终Cookie,离最后的成功仅一步之遥
$cookie_final=$str[1][0].";".$str[1][1].";".$str[1][2].";".$str[1][4].";".$str[1][5].";".$str[1][6].";".$str[1][7].";".$str[1][8].";".$str[1][9].";".$str2[1][4].";".$str2[1][5].";".$str2[1][6].";".$str2[1][7].";".$str2[1][8];
$ch=curl_init($targetUrl);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14');
curl_setopt($ch, CURLOPT_COOKIE, $cookie_final);
$content=curl_exec($ch);
curl_close($ch);
return $content;
}

//demo,以访问某种子详情页面为例
$targetUrl="http://bbs.seu.edu.cn/pt/details.php?id=60608&hit=1";
$username="xxx";
$password="xxx";
$content=login_simulation_for_SEU_pt($username, $password, $targetUrl);
var_dump($content);
?>

</html>

  你只需要该一下$targetUrl、$username和$password即可。

  Enjoying it!

文章目录