自分が文章を書く場所はほとんどこのブログだけなのですが、mixiにも外部ブログ設定をしてエントリーを表示されていました。ただ、この外部ブログではリンクが表示されるだけで内容を読むためにはこのブログに飛んでこないといけませんでした。さらに、マイミクの中には携帯だけでしかmixiを見ない人も結構いて、そういう人にはまったくブログの内容が読めない状態になっていました。
先日、mixi日記投稿用APIの使い方も分かったし、すぐにshimookaさんがPEARのパッケージを作ってくれた事もあるので、今度はブログからmixi日記に自動的にエントリーを投稿するような仕組みを作ってみました。
[2008/12/13:追記]
逆順ソートのコードが間違っていたので治しました。>thanks ハシモトさん
用意するもの
・SimpleXML関数を使っているのでPHP5以上でないと動きません。
→PHP4の人は別のXMLパーサーに置き換えてみて下さい。
・mixi日記への投稿は、せっかくなのでPEAR::Services_MixiAPIを使います。
→インストールと使い方は下記参照
日記投稿APIを追加したServices_MixiAPI 0.2.0リリース – Do You PHP はてな
・下記のPHPファイルを「rss2mixi.php」とか名前をつけてサーバに設置して下さい。
→PHPファイルから書き込みを行なう下記ファイルに書込権限を与えておいて下さい。
- rss2mixi.link.database.txt : 投稿済みのエントリーをストアするファイル
- rss2mixi_tmp_file.jpg : アップロードする画像の一時保存先
・cronかなんかで自動実行されるように設定してください。
PHPソース
<?php /** * RSS2mixi * * RSS読み込んでmixi日記に自動投稿します。 * * @author yager <yager[ at ]creazy.net> */ mb_language("japanese"); mb_internal_encoding("UTF-8"); require_once 'Services/MixiAPI/Diary.php'; require_once 'Services/MixiAPI/Image.php'; require_once 'Services/MixiAPI/Factory.php'; error_reporting(E_ALL); //------------------------------------------------------------ // Settings //------------------------------------------------------------ /** * RSS設定 */ $rss = '{読み込みたいRSSのURL}'; /** * mixi設定 */ $user = '{mixiのアカウント}'; $pass = '{mixiのパスワード}'; $id = '{mixiのユーザID}'; /** * 送信済みエントリーをストアしておくためのデータファイル * @memo 別のファイル名で設置した場合はここを修正してください。 * 書き込み権限を与えておく事を忘れずに。 * chmod 666 {データファイル名} */ $posted_file = './rss2mixi.link.database.txt'; $img_tmp_file = './rss2mixi_tmp_file.jpg'; //------------------------------------------------------------ // Get data //------------------------------------------------------------ $posted_links = explode("\n",file_get_contents($posted_file)); // RSSの展開 $root = simplexml_load_file($rss); $items = array(); foreach ( $root->channel->item as $item ) { $items[] = $item; } // 古いものから処理するために順番を逆転 // 2008/12/13 mod: rsort から krsort に変更 //rsort($items); krsort($items); //------------------------------------------------------------ // Post mixi //------------------------------------------------------------ foreach ( $items as $item ) { // すでにポスト済みの記事はスキップ if ( in_array($item->link,$posted_links) ) continue; // 投稿データ $title = $item->title; $link = $item->link; $description = $item->description; $photo_url = ''; // 添付画像URL取得 $matches = array(); if ( preg_match('/<img.*?src=[\'\"](.*.jpg)[\'\"].*?>/i',$description,$matches) ) { // JPEGのIMGタグがあったら添付画像として $photo_url = $matches[1]; echo $photo_url . "<br />\n"; } // 本文の成形 $description = preg_replace( // 画像タグはカメラアイコン+URL '/<img.*?src=[\'\"](.*?)[\'\"].*?>/ie' ,"'([m:133]$1)'" ,$description ); $description = preg_replace( // リンクタグはPCアイコン+TinyURL '/<a.*?href=[\'\"](.*?)[\'\"].*?>(.*?)<\/a>/ie' ,"'([m:196]$2:'.tinyurl('$1').')'" ,$description ); $description = strip_tags($description); $description = $description."\n\n".$item->link; // debug echo $title . "<br />\n"; echo $link . "<br />\n"; echo "<pre>".$description."</pre><hr />\n"; // mixiにポスト $diary = new Services_MixiAPI_Diary($item->title, $description); if ( $photo_url ) { if ( $fp = fopen($img_tmp_file,"w") ) { fwrite($fp,file_get_contents($photo_url)); fclose($fp); } $diary->setImage(new Services_MixiAPI_Image($img_tmp_file)); } $service = Services_MixiAPI_Factory::getInstance( Services_MixiAPI_Factory::API_MODE_POSTDIARY, $user, $pass, $id); $service->setDiary($diary); $service->execute(); // ポスト済みに登録 if ( $fp = fopen($posted_file,"a") ) { fwrite($fp,$item->link."\n"); fclose($fp); } } /** * TinyURL変換関数 * @param String $url 変換したいURL * @return String 変換後のTinyURL */ function tinyurl($url) { $tiny = file_get_contents('http://tinyurl.com/api-create.php?url='.urlencode($url)); return $tiny; } ?>
コメントたくさん書いてあるので基本的にはソース読んでください。
必ず書き換えが必要なのは {読み込みたいRSSのURL}、{mixiのアカウント}、{mixiのパスワード}、{mixiのユーザID} になります。
機能説明
・新しいエントリーがあった場合だけ、mixi日記に投稿します。
(内容の変更とかは検知しません。簡易版なので・・・)
・エントリー内にIMGタグがあり、かつ、JPEG画像だった場合は初めの1つだけ添付画像としてアップロードします。
・エントリー内のIMGタグ(画像)はアイコン+URLに変換されます。
・エントリー内のAタグ(リンク)はアイコン+TinyURLに変換されます。
・RSS2.0ベースのXML構造を想定しているのでATOMとかだとPATHが合わないと思います。
その場合は、51行目とか66行目~68行目あたりのPATHを直してやれば良い気がします。
まとめ
なるべく汎用的にできないかと思ってRSSから引っ張ってくるようにしたんだけど、ATOMに対応してなかったりして中途半端ですね。あくまで自分が使う用のスクリプトなんで適当に直して使って下さい。
あと、このスクリプトで指定しているRSSのURLは、公開しているRSSではなくて専用のRSSをMTのテンプレートを追加して作りました。というのも、公開しているRSSは全文公開していないし、マイミクの人たちは技術ネタはほとんど興味が無いみたいなので、日常ネタが多いカテゴリーだけ流すようにしています。この辺は、ブログとmixiの使い分けみたいなのがある人はちゃんと考えておくと読んでもらいやすそうです。
関連エントリー
・ブログのエントリーをGREE日記に自動投稿する「RSS2GREE」
・mixi日記と外部ブログの微妙な関係
・mixi日記投稿用APIを使ってPHPからmixi日記にポスト
WordPress の更新内容を mixi へ投稿するスクリプト RSS2mixi with MagpieRSS
ブログのエントリーをmixi日記に自動投稿する「RSS2mixi」 ::: creazy photograph で配布されているスクリプト RSS…
このエントリーを読みましてコードを参考にさせて頂いておりますが1点。
逆順ソートですが、配列内部がxmlのobject(?)なのでkrsortである必要がある感じでありました。
>ハシモトさん
おっしゃる通り、krsortであるべきでしたね。遅まきながら直しておきました。
30分おきにcron実行しているのですが、30分以内に複数回投稿しない気付かないんですね…。
確認不足でした。反省。