之前写过自己在用的以twitter为同步源的同步链,不料Google+横空出世,又多了个选择,这些天用下来感觉不错,能向不同圈子显示不同信息是最大的特点,发消息不用再小心翼翼了…… 由于G+还在测试阶段,没有开放API,从其他渠道同步到G+不太可能,那么只好将G+作为同步源,先同步到twitter上,剩下的就好办了。 试过用plusfeed取得自己G+的公共信息流(受限消息当然是被保护的)feed,再用各种基于feed的同步服务同步到twitter上,实际使用时发现那个公共信息流feed很不完善,单纯文字信息还好,如果是分享消息之类的就只有“你的评论+originally shared this post:”即无分享消息内容,又无附带链接,让人看了莫名其妙;而且无法同步消息中附带的位置信息。如此便只能作罢。 继承前篇“生命在于折腾”的精神,还是自己动手吧,一番Google捣腾后,摸索着将原来的改成:以Google+为主,twitter为辅的微博同步链”。 同步链关系图如下: 工作时先将消息发送到twitter,再从twitter取得消息同步到其他微博,这么转一下看起来很蛋疼,其实是因为还有第三方服务将他们的信息同步到twitter,单纯以G+作源那些第三方服务的信息就全漏掉了,这也是为什么说这个同步链是“以Google+为主,twitter为辅”。 对照之前所说的缺点,关键就是:
取得Google+上发布的消息并按不同情况格式化以适合其他各种场合的阅读。
消息中附带的位置信息要能一起同步。
实现效果为:
G+中发布普通文字消息: 就文字本身嘛 G+发布链接(利用添加链接功能而非直接写在文字里): 你的文字 http://链接地址 G+中发布媒体(例如图片,with后面的媒体类型会与其对应): 你发的文字 With image: http://到该消息页面的链接 G+中发布相册: 你的文字 ●相册名称 http://到该消息页面的链接 G+中分享他人消息: 分享消息: http://到该消息页面的链接 \\你的分享评论 能附带位置信息同步twitter,Buzz可冒泡
代码如下:
function getGplusContent() {
$output = file_get_contents('https://plus.google.com/_/stream/getactivities/?&sp=[1,2,"你的Google ID",null,null,5,null,"social.google.com",[]]');
$json = substr( $output, 4 );
$json = str_replace( '[,', '["",', $json );
while( strpos( $json, ',,' ) ) $json = str_replace( ',,', ',"",', $json );
$feedArray = json_decode($json);
if (file_exists ( 'googleplus.updatetime' )) {
$lastTime = file_get_contents ( 'googleplus.updatetime' );
}else{
$fileHandler = @fopen ( 'googleplus.updatetime', 'w+' );
@fwrite ( $fileHandler, $feedArray[1][0][0][5] );
@fclose ( $fileHandler );
return;
}
for($i=4;$i>=0;$i--) {
$currPost = $feedArray[1][0][$i];
$postArray = array();
if ($lastTime >= $currPost[5]) {
continue;
}
$linkUrl = "https://plus.google.com/".$currPost[21];
if (empty($currPost[43])) {
$msg = $currPost[20];
if(!empty($currPost[11][0][24])) {
if ($currPost[11][0][24][4]!="document") {
$msg .= ' With '.$currPost[11][0][24][4].":".shortenSinaUrl($linkUrl);
}elseif ($currPost[11][0][24][3] == "text/html"){
if ($currPost[11][0][47][1] == "picasa") {
$msg .= ' ●' . $currPost[11][0][3] .":".shortenSinaUrl($linkUrl);
}else{
if (empty($msg)) {
$msg = $currPost[11][0][3];
}
$msg .= " " . shortenSinaUrl($currPost[11][0][24][1]);
}
}
}
}else{
$msg = "分享消息:".$short_url = shortenSinaUrl($linkUrl);;
if(!empty($currPost[47])) {
$msg .= ' \\\\'.$currPost[47];
}
}
$postArray['status'] = $msg;
if(!empty($currPost[27])) {
$postArray['lat'] = $currPost[27][0];
$postArray['long'] = $currPost[27][1];
$postArray['place_id'] = $currPost[27][6][0];
}
$fileHandler = @fopen ( 'googleplus.updatetime', 'w+' );
@fwrite ( $fileHandler, $currPost[5] );
@fclose ( $fileHandler );
return $postArray;
break;
}
}
function shortenSinaUrl($long_url){
$apiKey='你的sina app key';
$apiUrl='http://api.t.sina.com.cn/short_url/shorten.json?source='.$apiKey.'&url_long='.$long_url;
$curlObj = curl_init();
curl_setopt($curlObj, CURLOPT_URL, $apiUrl);
curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curlObj, CURLOPT_HEADER, 0);
curl_setopt($curlObj, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
$response = curl_exec($curlObj);
curl_close($curlObj);
$json = json_decode($response);
return $json[0]->url_short;
}
需要修改的地方是: 1、将上面代码中“你的Google ID”替换成你自己的ID(就是访问自己资料页时地址栏里那一串数字)
$output = file_get_contents('https://plus.google.com/_/stream/getactivities/?&sp=[1,2,"你的Google ID",null,null,5,null,"social.google.com",[]]');
2、由于不是每个微博都会对消息中的链接进行缩短网址操作,所以加了个网址缩短的函数,本来是用bit.ly,无奈国内微博将其列为非法网址,就换了t.cn(代码源自标点符),去新浪开放平台申请个app再将app key替换上面代码中“你的sina app key”。
$apiKey='你的sina app key';
为了不加重服务器负担,以及防止造成刷屏,每次只从G+取5条最新信息,而5条中只取1条符合要求的用作更新,更新依据是对比最后一次同步消息与从G+取得消息的时间戳。 具体同步过程就用tw2other现成的
先配置好一个完全可以使用的tw2other,确保其同步工作正常。
将上面的代码改好附加到init.php中。
将index.php中的
$twitter = new Twitter ();
$twitter->setSyncLevel ( $twitterSyncLevel );
$content = $twitter->getContent ();
替换成:
$twitter = new Twitter ();
$contentArray = getGplusContent();
if (!empty($contentArray)) {
$twitter->postContent($contentArray);
}
$twitter->setSyncLevel ( $twitterSyncLevel );
$content = $twitter->getContent ();
OK,大功告成