twitterの1日分のつぶやきをmixiに投稿するPerlスクリプト

これは何か

僕はもうmixiはあんまりというか全然やっていなくて、単に友人の生存を確認したりするのに使っているような状態だったり、自分の生存を友人に知らせたりするのに使っているような状態だったりします。

そういう使い方なら、twitterの方が断然向いているし、投稿も閲覧もカンタンでラクチンだったりするのですが、まだまだmixiオンリーで活動されてるおともだちとかも居たりして。。。 でもそういうおともだちにも僕のtweetを見て欲しいじゃないですかー。

mixiにもエコー改めボイスというつぶやき機能があったりするのですが、twitterとそちらに同時投稿というのもなんだか違う気がして。とゆーことで、ついろぐ(http://twilog.org/)に、僕のつぶやきを1日単位でまとめてもらってるので、それをmixiの日記として投稿することにしました! わーいヽ(´∀`)ノ

なんで、mixiの「外部日記機能」ではダメか

mixiには外部の日記やブログを使用する機能もありますが、1回余計にクリックしないといけないんですよね(PCでは)。
あれ、うざいですよね。そんなことまでして、外部日記見ませんよね。
ということで却下なのですー。

スクリプトのソース

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use DateTime;
use Encode;
use URI;
use LWP::UserAgent;
use LWP::Authen::Wsse;
use HTTP::Request::Common;
use HTML::Template;
use Web::Scraper;

#
# Your personal data
#
my $twitter_id     = 'lolicsystem';       #ご自分のに変えて下さい
my $mixi_auth_id   = '●●●●@●●●●'; #ご自分のに変えて下さい
my $mixi_password  = '●●●●';          #ご自分のに変えて下さい
my $mixi_member_id = 123578;              #ご自分のに変えて下さい
my $footer =<< '_FOOTEREND_';
--------
※ これは、僕のTwitterでのつぶやき(http://twitter.com/lolicsystem)を
ついろぐ(http://twilog.org/)で日ごとにまとめ、
それをmixi投稿APIを用いて投稿したものです。

スクリプトのソースは以下を参照して下さい。
http://d.hatena.ne.jp/lolicsystem/20090926/1253931843
_FOOTEREND_

#
# Scraping twilog (yesterday).
#
my $dt = DateTime->now(time_zone => 'local');
my $date = $dt->subtract(days => 1)->format_cldr('yyMMdd');

my $uri = URI->new("http://twilog.org/$twitter_id/date-$date/asc-nomen");
my $scraper = scraper {
    process '//h3[@class="bar-main2"]/text()', 'title' => 'TEXT';
    process '.tl-tweet', 'tweet[]' => scraper {
	process '.tl-text',     'text' => 'TEXT';
	process '.tl-posted>a', 'time' => 'TEXT';
    };
};
my $result = $scraper->scrape($uri);

#
# Making contents to write to mixi.
#
my $template = HTML::Template->new(filehandle => *DATA);
$template->param(TITLE  => $result->{title});
$template->param(TWEET  => $result->{tweet});
$template->param(FOOTER => $footer);

#
# Post to mixi.
#
my $ua = LWP::UserAgent->new();
$ua->credentials('mixi.jp:80', '', $mixi_auth_id, $mixi_password);
my $res = $ua->post(
		    "http://mixi.jp/atom/diary/member_id=$mixi_member_id",
		    'Content-Type' => 'application/atom+xml',
		    'content'      => encode('utf8', $template->output())
		    );
warn $res->content unless $res->code == 201;


__DATA__
<?xml version='1.0' encoding='utf-8'?>
<entry xmlns='http://www.w3.org/2007/app'>
  <title><TMPL_VAR NAME="TITLE">のつぶやき</title>
  <summary>
<TMPL_LOOP NAME="TWEET">
<TMPL_VAR NAME="TIME">
<TMPL_VAR NAME="TEXT">
</TMPL_LOOP>
<TMPL_VAR NAME="FOOTER">
  </summary>
</entry>

使い方

$twitter_id に、ご自分のtwitterなidを設定して下さい。僕のは、lolicsystem になります。
$mixi_auth_id に、ご自分のmixiのログイン時に使用しているe-mailアドレスを設定して下さい。僕のは、教えたげません。
$mixi_password に、ご自分のmixiのログイン時に使用しているパスワードを設定して下さい。僕のは、教えたげません。
$mixi_member_id に、ご自分のmixiのユーザID番号を設定して下さい。僕のは、123578 になります。
$footer には、投稿毎のフッターを適当に書いて下さい。

そして、本スクリプトを実行すると、昨日1日の間に行ったtweetが、mixiの日記として投稿されます。

やってること

昨日の日付から、抜き対象のtwilogURI作って、Web::Scraperで必要な情報抜いて、投稿用にテンプレートで整形して、mixiに投稿しておわりです。

実行例

こんな感じになったりします。
http://mixi.jp/view_diary.pl?id=1293999350&owner_id=123578

いろんなこととか

現在は、他の人への @ 付き発言とか RT とかは省いています。純粋に、自分のつぶやきだけをmixiに投稿するようにしてます。これは、twilog側の機能で、例えば僕の8月31日(月)のつぶやきは、
http://twilog.org/lolicsystem/date-090831
なのですが、
http://twilog.org/lolicsystem/date-090831/asc-nomen
としてます(時間軸も逆にしています)。

最初、twilogの「ソース取得」機能を使おうとして、例えば先ほどの8月31日(月)の分でしたら、
http://twilog.org/source.cgi?id=lolicsystem&date=090831&order=asc&filter=nomen
のtextareaの内容をちょいちょいと加工したらいいやー、わーいヽ(´∀`)ノ…とか思ってページのソースみたら、タグの < とか > とかその他諸々が文字実体参照になっててわぁ…い…とかなったので、それは利用するのやめて、素直にふつうのページをWeb::Scraperでスクレイプしました。

RSSフィードも利用しようとしましたが、利用しにくかったので、やめました。

注意点

見て判ると思いますが、mixiにログインするためののe-mailアドレスやらパスワードやらを平文で送ったりしてます。そんなんいやや!!!…という方は、使わない方がいいかも知れません。何事も自己責任ということでひとつー。

参考にさせていただきました。

mixi投稿用APIは、以下を参考にさせていただきました。
http://ido.nu/kuma/2008/07/30/digging-mixi-for-iphone-application-and-new-api-for-posting-a-diary-with-a-photo/
ありがとうございました。

ということで、

似たようなことに対する似たようなアプローチはいろいろあると思いますが、そして、需要は多分全然無いと思いますが(^-^;、自分が便利だからアップしてみましたー。