php使用curl模拟登录discuz以及模拟发帖

最近要用到curl模拟登录并抓取页面信息,从网上看到了一段很不错的源代码。虽然我要抓取的目录不是discuz构架,不过毕竟有借鉴意义,先摘录过来再说。等有时间了再学习更改下。

/i', contents,matches);
if(!empty(matches)) {formhash = matches[1];
} else {
    die('Not found the forumhash.');
}
//POST数据,获取COOKIE,cookie文件放在网站的temp目录下cookie_file = tempnam('./temp','cookie');
ch = curl_init(login_url);
curl_setopt(ch, CURLOPT_HEADER, 0);
curl_setopt(ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt(ch, CURLOPT_POST, 1);
curl_setopt(ch, CURLOPT_POSTFIELDS, post_fields);
curl_setopt(ch, CURLOPT_COOKIEJAR, cookie_file);
curl_exec(ch);
curl_close(ch);
//取到了关键的cookie文件就可以带着cookie文件去模拟发帖,fid为论坛的栏目IDsend_url = discuz_url."post.php?action=newthread&fid=2";ch = curl_init(send_url);
curl_setopt(ch, CURLOPT_HEADER, 0);
curl_setopt(ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt(ch, CURLOPT_COOKIEFILE, cookie_file);contents = curl_exec(ch);
curl_close(ch);
//这里的hash码和登陆窗口的hash码的正则不太一样,这里的hidden多了一个id属性
preg_match('//i', contents,matches);
if(!empty(matches)) {formhash = matches[1];
} else {
    die('Not found the forumhash.');
}post_data = array();
//帖子标题
post_data['subject'] = 'test2';
//帖子内容post_data['message'] = 'test2';
post_data['topicsubmit'] = "yes";post_data['extra'] = '';
//帖子标签
post_data['tags'] = 'test';
//帖子的hash码,这个非常关键!假如缺少这个hash码,discuz会警告你来路的页面不正确post_data['formhash']=formhash;ch = curl_init(send_url);
curl_setopt(ch, CURLOPT_REFERER, send_url);       //伪装REFERER
curl_setopt(ch, CURLOPT_HEADER, 0);
curl_setopt(ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt(ch, CURLOPT_COOKIEFILE, cookie_file);
curl_setopt(ch, CURLOPT_POST, 1);
curl_setopt(ch, CURLOPT_POSTFIELDS,post_data);
contents = curl_exec(ch);
curl_close(ch);
//清理cookie文件
unlink(cookie_file);
?>

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注