Photo by BallGame68
タイトルの通り、blogの更新pingから、そのblogの最新記事をtwitterに投稿するプログラムです。
ほぼあちこちのサンプルソースの寄せ集めなので大してプログラミングした訳ではないですが、テストにちょっと苦労しまして。
(それは後述)
動作環境としては
・PHP5以上(simplexml_load_fileを使っているため、PHP4は不可)
・PEAR XML_RSSが動作する環境(大概大丈夫?)
→無ければこちらからダウンロードして、配置すれば問題ないと思う
と言うところでしょうか。
【設置方法】
【ソース】
でxreaの話。
最初xreaにアップしてテストをしていたのですが、正しくpingをpostしても、なぜか$_POSTの中が空になってしまいます。
どうやらxrea側でPEAR XML_RSSからの受信を制限しているようで(アナウンスはないですが)、それ故に正しく受け取れませんでした。
このために2時間ほど無駄な時間を使ってしまったし・・・
・PHP5以上(simplexml_load_fileを使っているため、PHP4は不可)
・PEAR XML_RSSが動作する環境(大概大丈夫?)
→無ければこちらからダウンロードして、配置すれば問題ないと思う
と言うところでしょうか。
【設置方法】
- 以下のソースをコピーして保存(例:twitping.php)
- twitterのログイン情報とping受信を許可するURLを変更する
- サーバーにアップロード
- まずは直接URLをたたいてみる。その時にPHPのエラーが出ず、 "XML error: Invalid document end at line 1" と出ているXMLが返ってくればOK
- お使いのブログツールの「更新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時間ほど無駄な時間を使ってしまったし・・・