之前写过自己在用的以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为辅”。 对照之前所说的缺点,关键就是:

  1. 取得Google+上发布的消息并按不同情况格式化以适合其他各种场合的阅读。

  2. 消息中附带的位置信息要能一起同步。

实现效果为:

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现成的

  1. 先配置好一个完全可以使用的tw2other,确保其同步工作正常。

  2. 将上面的代码改好附加到init.php中。

  3. 将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,大功告成