「twitter2amebaなう」を作ってみた

2009年12月11日 / Perl

このところカンファレンス展示会ばかりに遊びに勉強しにいって、あまりコードを書かない人だと思われているhiroyukiです(泣)。

---
そんなイメージを払拭すべく(?)、「twitter2amebanow」を書いてみました。

【何ができるの?】
【設置方法は?】
  1. サーバやOSを準備する
  2. 適当にディレクトリを作って、「twitter2amebanow.pl」と、空の「twitter2amebanow.dat」ファイルを配置
  3. Net::TwitterやWeb::Mechanizeなどのモジュールを、cpanからインストール
  4. コンフィグの$twuser、$amuser、$ampassを設定
  5. cronを設定

スクリプトは以下の通り。 「ameba なう」には今のところAPIがないので、WWW::Mechanize で無理やりPOSTしています。また、短時間での連続投稿にも対応したのですが、どうもAmebaなうの方で弾いてしまうようので、最新の一件だけ転送するようにしました(コンフィグの$countで調整可)。
改変、配布はご自由に(ただし自己責任ね)。

twitter2amebanow.pl
#! /usr/local/bin/perl -w

use strict;
use warnings;

use YAML::Tiny;
use FindBin;
use WWW::Mechanize;
use Encode;

######################################
# コンフィグ
######################################
# アカウント
my $twuser	= "";	# twitterのユーザ名
my $amuser	= "";	# amebaのユーザ名
my $ampass	= "";	# amebaのパスワード

# status_id管理ファイル
my $datfile = "$FindBin::Bin/twitter2amebanow.dat";

# 連続投稿数
my $count = 1;

######################################
# メイン
######################################
# 前回のstatus_idの取得
my $yaml = YAML::Tiny::LoadFile($datfile);
my $since_id = $yaml->{since_id} || 1;

# twitterからstatusの取得
my $statuses;
{
	use Net::Twitter;
	my $twit = Net::Twitter->new;
	eval {
		$statuses = $twit->user_timeline({id=>$twuser, since_id => $since_id, count => $count });
		exit unless @$statuses;
	};
	if ( my $err = $@ ) {
		die $@ unless blessed $err && $err->isa('Net::Twitter::Error');
	
		warn "HTTP Response Code: ", $err->code, "\n",
	         "HTTP Message......: ", $err->message, "\n",
	         "Twitter error.....: ", $err->error, "\n";
	}
}

# ameba なうに投稿
{
	my $mech = WWW::Mechanize->new();

	#ログイン
	my $response = $mech->get("http://www.ameba.jp/");
	$response = $mech->submit_form(
		form_name => "srvLoginForm",
		fields => {
			'amebaId' => $amuser,
			'password' => $ampass
		}
	);
	&abort(Dumper($response)) unless ($mech->success);
	
	# なうページに移動	
	$response = $mech->get("http://now.ameba.jp/");
	&abort(Dumper($response)) unless ($mech->success);

	# 投稿
	for my $status (reverse @$statuses ) {
		print encode('utf-8', "$status->{id} $status->{created_at} <$status->{user}{screen_name}> $status->{text}\n");
		$status->{text} =~ s/RT:/RN:/g; # AmebaなうではRN
		$status->{text} =~ s/\@/>>/g;   # Amebaなうでは>>

		$response = $mech->submit_form(
			form_name => "inputForm",
			fields => {
				'entryText' => $status->{text}
			}
		);
	}
}

# status_id 更新
$yaml->{since_id}=@{$statuses}[0]->{id};
YAML::Tiny::DumpFile($datfile, $yaml);

1;

12/11 07:50 追記
RTをRNに置換するようにしました。

@xxx を >>xxxに置換するようにしました


多分、ちゃんとしたperlerの方々には許せないコードになっていると思いますので(汗)、是非コメント頂けばと思います!

ちなみに以前twitter2mixiをインストールしたときには、コードを一部改変して「mx:」という単語が入ったtweetのみ転送するようにしたことで、転送量を調整しました。一方、Amebaなうは、twitterのパクリとも言われてるように、つぶやきまくってなんぼだと思いますので、tweetをそのまま転送するようにしています。

あとパクリとはいえ、@やRT、ハッシュタグは仕様が違う(のかな?Amebaなう自体は全く使っていないので仕様不明、苦笑)と思うので、時間ができたらそのあたりを変換できるようにしたいです。

Catalystを使ってみる(2) - Catalyst::Plugin::Prototype

2006年2月13日 / Perl

ひとまず,CatalystでTinyURLを作ったところで(ほとんどコピーだけど),次はprototype.js/Ajaxとの連携です.

参考にしたのはantipop2.0: Catalyst で作る簡単 Web アプリケーション: Feed2JS 解説.ここには,XMLやAtomといったFeedをJavaScript形式に変換するFeed2JSの実装に関する解説があります.


Catalystを使ってみる(1) - TinyURL

2006年2月11日 / Perl

思いつきで,あるWebアプリケーションを作ってみたいと思って,以前から使ってみたいと思っていたPerlのMVC フレームワークであるCatalystに手を出してみました.