Creazy!

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

PHP 開発実績

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

投稿日:


最近、マザース上場が決まったからという訳ではないですが、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日記にポスト

-PHP, 開発実績

執筆者:


comment

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

関連記事

Google Analytics でアクセス解析しながら被ブックマーク数が確認できるUserScript

スミマセン、あまり時間がとれず個人的にお蔵入りさせていたネタを少し体裁整えて公開します。 「Google Analytics with SBM」とか名前付けましたが、下のスクリーンショットのようにGo …

YouTube HD Suiteが100万インストール達成!

・YouTube HD Suite 公式ページ [C!] YouTubeを高画質で再生したり、ダウンロードできるようにするUserScript(Greasemonkey)であるYouTube HD S …

AmaQuick v3.1.3 ブックマークレット更新(楽天ISBN13対応、商品ID取得不具合解消など)

久しぶりにAmaQuickの更新を行いました。実はアナウンスなしで3.1.2として不具合解消対応も行っていたのですが合わせてご報告いたします。 AmaQuick 公式ページ | Creazy!

Twitterのリストをタグクラウド風に見やすくするブックマークレット「Twitter Lists Cloud」

先週、公式に開始した Twitter のリスト機能ですが、すでにたくさんのリストが作成されてみなさん有効に使っているようですね。リスト機能の使い方などについては色んなところに書かれていますのでこのエン …

no image

GYM RankingでMSNの結果が出ていない件を修正しました

もう、ひと月前に公開したGYM Rankingなんですが、今日MSNの結果がでていないと教えてもらいました。 調べてみると案の定、MSNの検索結果のマークアップが変わっていました。

スポンサードリンク

スポンサードリンク