PHP的日月光华/复旦泉BBS发文脚本
2010-07-13 7:16 by hackerzhou20100821最新更新:豆瓣/人人/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); ?>