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

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

関連記事

YouTube HD Suite バージョン2を公開します

【2010/08/02:追記】 YouTube HD Suite 公式ページができました。 先週YouTubeがついにフルHD(1080p)に対応を発表し、今週末にはいよいよ内部的にも正式に対応が始ま …

ツイポーート、リニューアル後1ヶ月の利用状況

GW前に「ツイポーート/twport」のversion3を公開してから、早くも1ヶ月経過しました。大幅なインターフェイス変更をしているので使って頂いている方たちの反応が気になっていましたが、ある意味予 …

AmaQuick v3.1.1 ブックマークレット更新(選択文字列対応、Kindle価格不具合対応)

少し前に、久しぶりにAmaQuickの更新を行いました。 AmaQuick 公式ページ | Creazy!

ドラゴンボール全巻がYouTubeで無料配信!ページめくりが速すぎる場合のスロー再生方法

つい先日攻殻機動隊S.A.C全26話無料配信でウハウハしたばかりですが、今度は名作漫画ドラゴンボールを全巻配信だそうです! MANGAPOLO Official Manga Channel &#821 …

livedoor Reader に色んなSBMのブックマーク数を表示するGreasemonkey

こんなグリモン作りました。 スクリプトは下記に置いてありますのでどうぞ。 ・http://labs.creazy.net/greasemonkey/ldr_with_sbm_count_images. …

スポンサードリンク

スポンサードリンク