PHP的日月光华/复旦泉BBS发文脚本

2010-07-13 7:16 by hackerzhou

20100821最新更新:豆瓣/人人/BBS/开心/嘀咕/网易微博/新浪微博状态更新PHP代码终结版


一直说要做一个能够把博客同步到BBS的工具,趁着考完试的空写了一个PHP脚本。

早上移植到WordPress中作为插件的时候就一个很傻很傻问题纠结了一会儿,原因就是我是放到外网的服务器上测试,光华是0点到8点断外网访问的,于是直到脚本超时也无法更新成功,后来做了个反向代理api。其实那段检测时间然后更改bbs_host地址的那段对于校内站点的话可以不需要。

php下的curl功能相当强大,昨天调试post的时候发现只要加入curl_setopt($ch,CURLOPT_VERBOSE,true);这一句话就能很简单的查看实际提交到服务器上的HTTP头和返回情况,用来比较和正常的访问行为的差异,不过为了缩减代码量,就没有完全模仿浏览器操作,省略了User-Agent等部分HTTP Header,不影响功能。顺便熟悉了一下php下的传值和传引用的语法。

新版的bbs使用XSLT渲染XML来展示页面,虽然不得不说做的的确有点太烂了,XML的强格式要求导致只要服务器负载过大出现丢失部分XML数据的情况的话整个页面都无法显示,用容错性好的HTML的话就不会有这个问题,当然,这也跟BBS后台做得比较粗糙有关,经常出现XML不完整的情况。不过,对于爬虫来说,XML解析起来明显比HTML的解析要方便不少,不知道技术站长是怎么想的。对于一个互动性和功能性要求很强的论坛来说XSLT显然不是一个好选择,而且用的还是XSLT 1.0。

<?php
function updateBBS($title,$content,$boardId) {
	$title=iconv("UTF-8","GB2312",$title);
	$content=iconv("UTF-8","GB2312",$content);
	$bbs_username='##BBS用户名##';
	$bbs_password='##BBS密码##';
	$bbs_host='http://bbs.fudan.sh.cn/q';
	$hour=intval(date("H"));
	if($hour==0||($hour>=16&&$hour<=23)){
		$bbs_host='##能够在0点到8点访问bbs的api地址,没有的话这个去掉也没关系';
	}
	$cookie_jar=tempnam('./tmp','bbs');

	//Login
	$ch=&getBBSCurl($cookie_jar);
	curl_setopt($ch,CURLOPT_URL,$bbs_host."/bbs/login");
	curl_setopt($ch,CURLOPT_POSTFIELDS,'id='.urlencode($bbs_username).'&pw='.urlencode($bbs_password));
	$str=&sendAndResult($ch);

	//Post
	$ch=&getBBSCurl($cookie_jar);
	curl_setopt($ch,CURLOPT_URL,$bbs_host."/bbs/snd?bid=".$boardId."&f=&e=0");
	curl_setopt($ch,CURLOPT_REFERER,$bbs_host.'/bbs/pst?bid='.$boardId);
	curl_setopt($ch,CURLOPT_POSTFIELDS,'title='.rawurlencode($title).'&sig=2&text='.urlencode($content));
	$str=&sendAndResult($ch);

	//Logout
	$ch=&getBBSCurl($cookie_jar);
	curl_setopt($ch,CURLOPT_URL,$bbs_host."/bbs/logout");
	curl_setopt($ch,CURLOPT_POST,FALSE);
	curl_setopt($ch,CURLOPT_REFERER,$bbs_host.'/bbs/doc?board=Test');
	$str=&sendAndResult($ch);
}

function &getBBSCurl($jar){
	$ch=curl_init();
	curl_setopt($ch,CURLOPT_COOKIEJAR,$jar);
	curl_setopt($ch,CURLOPT_COOKIEFILE,$jar);
	curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE);
	curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
	curl_setopt($ch,CURLOPT_POST,TRUE);
	//No need to set user-agent
	//curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6');
	//Used for debug
	//curl_setopt($ch,CURLOPT_VERBOSE,true);
	return $ch;
}

function &sendAndResult(&$ch){
	$str=curl_exec($ch);
	curl_close($ch);
	unset($ch);
	return $str;
}

updateBBS("test","test php post article",417);
?>
本文基于 署名 2.5 中国大陆 许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 hackerzhou 并包含 原文链接
本文暂时还没有评论,你可以抢沙发哟。

发表评论