最近、マザース上場が決まったからという訳ではないですが、GREEを結構使っています。
@see GREEはSNSから携帯ゲームサイトに方向転換してマザーズ上場!?
で、GREEの日記はだいぶ前にこのブログのRSSを読み込むように設定したままだったのですが、mixi同様外部ブログの場合は画像が見れなかったりするので、このままで読みにくいかなと感じました。
そこで、以前にmixi用に作った「RSS2mixi」と同じようなスクリプトをGREE用にも用意してみました。
RSS2GREEの下準備
日記設定を「GREE日記を設定する」にする
RSS取り込みではなく、GREE日記を使うようにします。
これをやると、過去の日記は消えてしまうかもしれませんのでご注意を。
「携帯メールから日記投稿」用アドレス取得
GREEには日記投稿するAPIが見当たらなく、外部から日記投稿するにはPEAR::HTTP_ClientかなんかでWebアクセスをシミュレートしないといけないかと思っていましたが、唯一外部からの投稿方法として「携帯メールから日記投稿」機能がありました。今回はこれを使うので専用アドレスを取得しておきます。
日記の投稿画面の左側に「携帯メールから日記投稿」用アドレスがあるので控えておきます。
PHPから添付メールを送るためのライブラリ「PHPMailer」を設置
PHPから添付ファイル付き(&mbstringがからんでいる)メールを送るのは結構めんどうなコードになるので、PHPMailerというメール送信用ライブラリを使ってみます。下記ページからスクリプトをダウンロードして適当なディレクトリに設置しておいてください。
Codeworx Technologies
RSS2GREEの設置
下記のファイルを「rss2gree.php」などと名前をつけてサーバーに設置してください。
<?php /** * RSS から GREE の日記に登録するスクリプト */ require "/path/to/library/phpmailer/class.phpmailer.php"; error_reporting(E_ALL); //------------------------------------------------------------ // Settings //------------------------------------------------------------ /** * RSS Settings */ $rss = 'あなたのブログのRSS URL'; /** * GREE Settings */ $gree_mail_to = '携帯メールから日記投稿用メールアドレス'; $gree_mail_from = 'GREEに設定したあなたの携帯メールアドレス'; /** * System Settings */ $posted_file = './rss2gree.link.database.txt'; $title_max = 24; //------------------------------------------------------------ // Get data //------------------------------------------------------------ $posted_links = explode("\n",file_get_contents($posted_file)); $root = simplexml_load_file($rss); $items = array(); foreach ( $root->channel->item as $item ) { $items[] = $item; } // 古いものから処理するために順番を逆転 rsort($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 = ''; if ( mb_strlen($title,'UTF-8') > $title_max ) { $title = mb_substr($title,0,$title_max-1,'UTF-8') . '…'; } // 添付画像URL取得 $matches = array(); if ( preg_match('/<img.*?src=[\'\"](.*.jpg)[\'\"].*?>/i',$description,$matches) ) { $photo_url = $matches[1]; echo $photo_url . "<br />\n"; } // 本文の成形 $description = preg_replace( '/<img.*?src=[\'\"](.*?)[\'\"].*?>/i' ,'([emoji id="74"]: $1)' ,$description ); $description = preg_replace( '/<a.*?href=[\'\"](.*?)[\'\"].*?>(.*?)<\/a>/ie' ,"'([emoji id=\"66\"]$2:'.tinyurl('$1').')'" ,$description ); $description = strip_tags($description); $description = preg_replace( '/\[emoji\sid=\"(.*)\"\]/' ,'<emoji id="$1">' ,$description ); $description .= "\n"; $description .= "--- この記事は「".$root->channel->title."」からの転載です ---\n"; $description .= $item->title . "\n"; $description .= $item->link . "\n"; // debug echo $title . "<br />\n"; echo $link . "<br />\n"; echo "<pre>".$description."</pre><hr />\n"; //メール送信処理(PHPMailer) $mail = new PHPMailer(); $mail->CharSet = "iso-2022-jp"; $mail->Encoding = "7bit"; $mail->AddAddress($gree_mail_to); $mail->From = $gree_mail_from; $mail->Subject = mb_encode_mimeheader(mb_convert_encoding($title,"JIS","UTF-8")); $mail->Body = mb_convert_encoding($description,"JIS","UTF-8"); //添付ファイル追加 if ( $photo_url ) { if ( $fp = fopen("gree_temp_file.jpg","w") ) { fwrite($fp,file_get_contents($photo_url)); fclose($fp); } $mail->AddAttachment("gree_temp_file.jpg"); } if (!$mail->Send()){ echo("メールが送信できませんでした。エラー:".$mail->ErrorInfo); } // ポスト済みに登録 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、$gree_mail_to、$gree_mail_from の各変数を自分のものに変更してください。
あとは、上記スクリプトをcronかなんかで定期的に実行すればOKです。
Tip’s
解説というほどではないですが、何点か注意点を書いておきます。
PHP5じゃないと動きません
RSSのパースにSimpleXMLを使っているのでPHP5以上じゃないと動きません。
PHP4の人は別のパーサーに置き換えてみてください。
メールの送信元(from:)を自分の携帯メールアドレスにする
GREEのメール投稿機能はあくまで「携帯から」送信される事を前提としているようで、from:に登録している携帯メールアドレスを登録しないとうまく動きませんでした。GREEは携帯メールアドレス必須なのでみなさん登録していると思いますが、それを入れればOKです。
メールタイトルが24文字までしか入らない?
GREE日記のタイトルは「全角30文字以内」となっているので、スクリプトでは30文字を超える場合は後ろを「…」などにして切り取ってみました。しかし、実際は24文字までしか受け付けてくれなかったので最大24文字で切る用に設定しています(>$title_max変数)
GREEで絵文字を使う
GREEは携帯絵文字に対応しており、このスクリプトでもアイコン代わりに使っています。
「<emoji id="絵文字番号">」な感じで送ったらうまく行きましたが、絵文字番号はPCで見てみて絵文字画像のファイル番号なんかをみればGREE絵文字のIDが分かります。ちなみに、
カメラアイコン:<emoji id="74">
PCアイコン:<emoji id="66">
でした。
他にも「<emoji id="docomo:16進数">」とかの指定もできましたが、深追いはやめましたw
PHPMailerの書き方
メール処理めんどくさがって、ライブラリ使ってしまいました。使い方などはこちらが詳しかったです。
PHPで日本語メールを送る – 応用編 (添付ファイル、HTMLメール) – EC studio 技術ブログ
PEAR::Mailとかに代用しても動くと思いますのでやってみてください。
まとめ
そういえばメールからの投稿ならmixiでも同じような仕組みでできそうですね。
GREE日記では添付ファイル3つまでいけるみたいですが、このスクリプトでは1個しか対応していないのでその内やってみたいです(ファイル容量200MBの上限もあるので1枚で十分かもしれないですが)。
適当なスクリプトですが、興味ある方使ってみてください。
関連エントリー
・GREEはSNSから携帯ゲームサイトに方向転換してマザーズ上場!?
・mixi日記と外部ブログの微妙な関係
・ブログのエントリーをmixi日記に自動投稿する「RSS2mixi」
・mixi日記投稿用APIを使ってPHPからmixi日記にポスト