今天在首页完成了腾讯微博+新浪微博+twitter三款微博的实时更新,实现了3款微博能同时聚集在一起,并即时更新内容。使用了sqlite轻型数据库保存同步的数据,并用xml远程调用接口,涉及的技术下文会讲到,首先来看一下效果(点击进入预览):
在本文之前我已经对各个微博的数据调用做了介绍,本文将讨论如何将3个不同微博的api数据整合到一起,并能实时更新显示:
原理是这样的:
1.首先要把获取到的微博消息汇总并保存起来,这里我用到了轻型数据库sqlite,基本语法和mysql相似,且不需要复杂的配置。
2.接下来用php来把sqlite中的数据读取出来,并格式成xml格式,方便远程传输。(这里要说明一下,因为我服务器本身不可访问Twitter数据,所以用了国外的一台可以访问Twitter的服务器作为微博数据汇总)
3.负责显示微博汇总信息的页面,也就是http://malu.me/ ,解析出远程的xml,并输出到页面。
4.为了实时更新,并且不影响页面打开速度,我用了另外一个php页面来专门进行xml更新,并把获取到的数据缓存到本地,然后用计划任务定时去访问这个php页面,模拟实时更新的效果。
根据此原理,开发思路就清晰了,下面来看一下Twitter是如何进行数据获取并写入sqlite的:
//写入sqlite function my_sqlite($type,$content,$time){ $db = sqlite_open("php_weibo.db",0666,$sqlite_error); if(trim($type) != "" && trim($content) != "" && trim($time) != ""){ $sql="INSERT INTO test (id,type, content, time) VALUES (NULL,'$type','$content',$time)"; $result = sqlite_exec($db,$sql); if($result){ echo "据添加成功!ok!"; }else{ echo '据添加不成功!error!'; } } } //把数据库中时间统一调用到数组中 $db = sqlite_open("php_weibo.db"); $sql = "select * from test"; $query=sqlite_query($db,$sql); while($row = sqlite_fetch_array($query)){ $time_arr[] = $row[time]; } $type = "twitter"; if($arr){ foreach ($arr as $tweet) { $datetime = $tweet[created_at]; $time = strtotime($datetime); $content = str_replace("'","''",$tweet[text]); if (in_array((string)$time, $time_arr, true)) { echo "---------未更新|不写入----------"; }else{ echo "$type | $content | $time "; my_sqlite($type,$content,$time); } } }else{ echo "twitter 数据获取失败!"; }
以上就是Twitter微博写入sqlite的源码,腾讯微博、新浪微博与之类似。一并写入sqlite数据库php_weibo.db中。
然后用另外一个php读取sqlite的值,并格式成xml:
//查询sqlite $db = sqlite_open("php_weibo.db"); $sql = "select * from test order by time desc LIMIT 0 , 20"; $query=sqlite_query($db,$sql); //建立xml while($row = sqlite_fetch_array($query)){ echo '<weibo type="'.$row[type].'" time="'.$row[time].'"><![CDATA['.$row[content].']]></weibo>'; }
在输出数据时,我只调用了后20条数据,也就是显示最近更新的20条微博,这样就不用考虑哪一种微博显示出来,从而能实现3种微博混搭显示(像犀利哥)。
下面只要解析这xml就能显示了,为了保证xml文件的正确性,我写了一段代码进行判断,如果有故障(xml文件不完整)则发邮件通知我:
$xml = new DOMDocument(); $xml->load('weibolist.xml'); foreach($xml->getElementsByTagName('weibo') as $weibo){ $content = $weibo->firstChild->nodeValue; $type = $weibo->getAttribute('type'); $time = $weibo->getAttribute('time'); if($content){ echo "-----------------本地XML数据 一切正常!------------------"; }else{ echo "---+----+---------本地XML文件有错误---------+----+---"; if(@mail("malu@malu.me","我的首页微博的xml文件出现故障","这封邮件是马路的监控系统发出的,请不要回复.请检查http://malu.me/网站首页")){ echo "successful send mail to malu.me!"; }else{ echo "error,no mail()"; } } }
三款微博同时发布显示就介绍到这里,由于能力有限,文章写的还不够完善,如果有疑问或有兴趣的读者欢迎在陋室博客里留言与我讨论。