ブログのエントリーを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日記にポスト

同じカテゴリーの記事

このページの一番上に戻る
  • Facebook
  • Twitter
  • Tumblr
  • Instagram
  • miil