«前の日記(2008.11.30 (Sun)) 最新 次の日記(2009.03.01 (Sun))» 編集

やすみたい


2009.02.28 (Sat) [長年日記]

§ [tool] twitterにメールで投稿する何か

 ※OAuthに対応しました → twitterにメールで投稿する何か OAuth対応版 (2010.5.5)

 携帯から写真付きメールをtwitterに投稿する、というのはWebサービスとしてはあるみたいだけど、色々と情報渡すのがいやだから作ってみた。
  • メールからtwitterに投稿
  • 画像が添付されていたらFlickrにアップロードしてそのURLをメッセージ最後に追加
 車輪の再発明の再発明の……かもしれませんが、自己満足したので公開。 利用にあたってはFlickrのAPIkeyもろもろをあらかじめ取得しておく必要があります。
 (画像を送らないなら、Flickrのアカウント等は不要)
 エラーのチェックもしないし、投稿の成否も自分のtimelineにアクセスするまで分からない。
 色んな所から継ぎ接ぎしたので、要らないモジュールも入ってるのかも。 よくわかりません><
 画像以外でもFlickrにアップロードできるファイルなら何でもOKなはず。proアカウントでないので確かめられてませんけど。ていうか、動画のアップロードするなら、はてなフォトライフ使った方が良かったんじゃね? みたいな。
 メッセージからキーワードを抽出してタグ付けするとかやってみたいですが、気力が無いのでまたいつか。 
#!/usr/local/bin/perl
# Twitter Email gateway with Uploading Images to Flickr
# tmgfl.pl by yasumitai
# ver 2009.2.24

use strict; use warnings; use Net::Twitter; use MIME::Words qw(:all); use MIME::Parser; use Encode; use LWP::Simple; use File::Basename; use WebService::Simple::Flickr; use Data::Dumper; #for debug
### Config use constant TMPDIR => ''; #directory for temporary files ## Twitter my $truncate = 1; #文字数制限チェック my $twuser = ''; #Twitter user name my $twpass = ''; #Tiwtter pass ## Flickr API keys, ## See http://flickr.com/services/api/auth.howto.desktop.html my $flickr_key = ''; my $flickr_secret = ''; my $flickr_token = ''; ## How to get Flickr AUTH token using WebService::Simple::Flickr, SEE ## http://blog.riywo.com/2009/01/21/001939 my $flickr_home = 'http://flickr.com/photos/USERNAME/'; #your photostream
# MIME parse my $mail; while (<>) { $mail .= $_; }
my $parser = new MIME::Parser; $parser->output_dir(TMPDIR); my $entity = $parser->parse_data( $mail ); my ( $charset, $message, $enclosure ) = &parse_mail( $entity );
# ファイルアップロード $enclosure = &tiny_url( $flickr_home . &uploadfile( $enclosure, $flickr_key, $flickr_secret, $flickr_token )) if ($enclosure);
# メッセージを処理 $message = &encode_message( $message, $charset, $enclosure, $truncate); $message = Encode::encode('utf8', $message);
#Twitter POST my $twitter = Net::Twitter->new( username => $twuser, password => $twpass ); my $status = $twitter->update( $message );
sub parse_mail { my $ent = shift; my $body =''; my $charset =''; my $outputfile = ''; unless ( $ent->is_multipart) { $body = $ent->bodyhandle->as_string; $charset = $ent->head->mime_attr( 'Content-Type.charset' ) } else { $body = $ent->parts(0)->bodyhandle->as_string; $charset = $ent->parts(0)->head->mime_attr( 'Content-Type.charset' ); my $image = $ent->parts(1)->bodyhandle->as_string; #添付ファイルを書き出し $outputfile = TMPDIR . (fileparse( $ent->parts(1)->bodyhandle->path ))[0] ; open(FILE, "> $outputfile"); print FILE $image; close(FILE);
} return ( $charset, $body, $outputfile ); }
sub encode_message { my ( $mes, $char, $url, $t ) = @_; $mes =~ s/\s/ /g; my $umes = Encode::decode($char ,$mes); if ( $t ) { if ( length( $umes ) > 140 ) { $umes = substr( $umes, 0, 139 ); } } if ( $url ) { $umes = substr ($umes, 0, 110 ) . " ".$url; } return $umes; }
sub tiny_url { my ($url,) = @_; my $tinyurl = get( "http://tinyurl.com/api-create.php?url=".$url ); return $tinyurl; }
sub uploadfile { my ($file, $api_key, $secret_key, $auth_token) = @_; my $flickr = WebService::Simple::Flickr->new( 'api_key' => $api_key, 'api_secret' => $secret_key, 'auth_token' => $auth_token );
my $ref = $flickr->upload_post({'photo' => $file }); return ( $ref->parse_response->{photoid} ); }
.qmailとか.procmailrcとか.mailfilterに上記スクリプトにパイプで渡すようにすれば動くと思います。自分の場合(さくらのレンタルサーバ)、投稿専用のアドレスを作って.mailfilterに以下のように書いてます:
if ( /^From: .*address@example\.com.*/ && /^Subject: hoge/ )
{
         to "| cat > /home/USER/tmp/newmail ; /home/USER/bin/tmg.sh"
}
 投稿元メールアドレスのチェックはここで。from偽装されるとひとたまりもないので、気休めにsubjectをパスワード代わりにしたり。
 あと、直接スクリプトに渡すと動かなかったので、一度メールの内容をファイルに書き出す、という無駄なことをしてます。で、tmg.shの中身は:
#!/bin/sh
/home/USER/bin/tmgfl.pl /home/USER/tmp/newmail
 ダサくて泣けてきます。
 参考にしたサイト:
本日のツッコミ(全1件) [ツッコミを入れる]
Wavyzrla (2010.03.29 (Mon) 15:56)

この間も俊太郎の詩をお http://www.stlouisbusinesslist.com/business/5021837.htm?info=viagra cheap viagra 袤袶袹袴袤袺袵袢袭