Creazy!

WEBエンジニア・ヤガーのテック・ガジェットブログ

PHP 開発実績

ブログのエントリーをmixi日記に自動投稿する「RSS2mixi」

投稿日:


自分が文章を書く場所はほとんどこのブログだけなのですが、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日記にポスト

-PHP, 開発実績

執筆者:


  1. MOMENTS より:

    WordPress の更新内容を mixi へ投稿するスクリプト RSS2mixi with MagpieRSS

    ブログのエントリーをmixi日記に自動投稿する「RSS2mixi」 ::: creazy photograph で配布されているスクリプト RSS…

  2. ハシモト より:

    このエントリーを読みましてコードを参考にさせて頂いておりますが1点。
    逆順ソートですが、配列内部がxmlのobject(?)なのでkrsortである必要がある感じでありました。

  3. yager より:

    >ハシモトさん
    おっしゃる通り、krsortであるべきでしたね。遅まきながら直しておきました。
    30分おきにcron実行しているのですが、30分以内に複数回投稿しない気付かないんですね…。
    確認不足でした。反省。

comment

メールアドレスが公開されることはありません。

関連記事

Apple整備済製品の最新情報をチェックできる、AppleOutletのページをリニューアルしました

Apple大好きヤガーです。こんばんは。 Appleの整備済製品のチェックに便利なAppleOutletページですが、新年早々にCreazy!の方はリニューアルしたものの、AppleOutletは古い …

「Gyazotter for Mac OSX」GyazoでキャプってそのままTwitterにポスト

見よう見まねでGyamblrをハックした前回のエントリーでも書きましたが、スクリプトいじればTwitterにポストする事もできるなぁと思って、サクッと作ってみました。 ※相変わらずMac専用ですのであ …

「ツイッター 会社と仕事はこう変わる」でツイポーートが掲載されました

全然知らなかったのですが、今月1日に発売のムックでツイポーートを紹介していただきました。ありがとうございます!

【更新】Flickr画像をすばやくブログにコピペするためのHTMLを表示する「FlickrQuickEmbed」

ボクもほぼ全ての写真を保存していて、ブログへも直接貼り付けているFlickrが新UIを試しているのですが、評判がかなり悪いようです。 Flickrの新しいデザイン(UI)に困っています – …

TwitGIFの不具合メンテナンスを行いました

Twitterの最新ツイート10件をアニメーションGIF形式で表示することができるTwitGIFですが、Twitter APIの変更の影響で最新情報を更新しないようになっていましたのでメンテナンスを行 …

スポンサードリンク

スポンサードリンク