Photo by BallGame68
#この記事を@sefuumiに捧ぐ

タイトルの通り、blogの更新pingから、そのblogの最新記事をtwitterに投稿するプログラムです。

ほぼあちこちのサンプルソースの寄せ集めなので大してプログラミングした訳ではないですが、テストにちょっと苦労しまして。
(それは後述)

動作環境としては
・PHP5以上(simplexml_load_fileを使っているため、PHP4は不可)
・PEAR XML_RSSが動作する環境(大概大丈夫?)
 →無ければこちらからダウンロードして、配置すれば問題ないと思う

と言うところでしょうか。

【設置方法】
  1. 以下のソースをコピーして保存(例:twitping.php)
  2. twitterのログイン情報とping受信を許可するURLを変更する
  3. サーバーにアップロード
  4. まずは直接URLをたたいてみる。その時にPHPのエラーが出ず、 "XML error: Invalid document end at line 1" と出ているXMLが返ってくればOK
  5. お使いのブログツールの「更新ping通知先」に設置したURLを設定
これで動くと思います。

【ソース】
<?php

// twitterログイン情報
$twitterUsername = 'your_id';
$twitterPassword = 'your_pass';

// 更新を許可するURL
$arrowUrl = array('http://your.blog-address.com/');

require_once("XML/RPC.php");
require_once("XML/RPC/Server.php");
$GLOBALS['XML_RPC_defencoding'] = "UTF-8";

function pingReceived ($params) {
global $twitterUsername, $twitterPassword, $arrowUrl;
global $XML_RPC_erruser;
$p1 = $params->getParam(0);
$p2 = $params->getParam(1);
$name = $p1->scalarval(); //ブログ名
$url = $p2->scalarval(); //ブログのURL
// URLチェック
if (! in_array($url, $arrowUrl)) {
exit();
}

// html 読み込み
$hpData = file($url);
foreach($hpData as $hp) {
if (mb_ereg('rel\=\"alternate\" type\=\"application\/rss\+xml\"', $hp)) {
// rss情報取得
mb_ereg('href\=\"([^\"]*)\"', $hp, $reg);
$rssUrl = $reg[1];
}
}

// rssを読み込み、1件目の記事を取得
$rssData = simplexml_load_file($rssUrl);

foreach($rssData->item as $item) {
$message = $item->title . ':' . $item->description;
$message = mb_substr($message, 0, 140);
break;
}

// twitterへ投稿
$url = "http://twitter.com/statuses/update.xml?";
$params = "status=". rawurlencode($message);

$result = file_get_contents($url.$params , false, stream_context_create(array(
"http" => array(
"method" => "POST",
"header" => "Authorization: Basic ". base64_encode($twitterUsername. ":". $twitterPassword)
)
)));

//update ping返信
$value = new XML_RPC_Value("Thanks for the ping.", "string");
return new XML_RPC_Response($value);
}

$s =& new XML_RPC_Server(array("weblogUpdates.ping" => array("function" => "pingReceived")));

?>


でxreaの話。
最初xreaにアップしてテストをしていたのですが、正しくpingをpostしても、なぜか$_POSTの中が空になってしまいます。
どうやらxrea側でPEAR XML_RSSからの受信を制限しているようで(アナウンスはないですが)、それ故に正しく受け取れませんでした。
このために2時間ほど無駄な時間を使ってしまったし・・・

にほんブログ村 IT技術ブログ プログラム・プログラマへ