CPANのFlickr::Uploadをインストールすると
1.flickr_upload というコマンドラインからFlickrに写真をアップロードするソフトがインストールされる
2.Flickr::Upload というPerlモジュールがインストールされる
という事で色々やって、「ディレクトリの中身を監視して、画像ファイルがあったらFlickrにアップロードする」Perlスクリプトを書いてみた。まあ色々な実装の副産物的に出来てしまったのでここに公開。
coLinuxのDebian sarge 3.1と、VineLinux3.2で確認しました。
■cpanでモジュールインストール
$ cpan
install Flickr::API
install Flickr::Upload
場合によっては依存モジュールも
install XML::Parser::Lite::Tree
install LWP
install LWP::UserAgent
■API keyとsecretを手に入れる
FlickrからAPI keyとsecretをもらう とりあえず用途はphoto albumとか書いておいた。
詳しくは→CPANモジュール「Flickr::Upload」を使う を参照
■auth_token作る
参考:まちゅダイアリー – Flickr API の認証
tokenの発行は、webserviceがユーザからパスワードを聞くことなく、read/write権限を委譲してもらう時に使う。
CPANモジュール「Flickr::Upload」を使う にも具体的に書いてある。
コマンドラインから実行
$ flickr_upload –auth –key “API key” –secret “Shared Secret”
すると「下記URLにアクセスして認証し、それからEnter押せ」と指示が出る
(こんなURL)http://flickr.com/services/auth?api_sig=hogehogehoge&frob=asdfasdfasdf&perms=write&api_key=hujikohujiko
webブラウザでURLにアクセスして、OK I’ll allow it押して認証する。
それからコンソールでEnter押すとauth_tokenが発行される
You authentication token for this application is
(こんなtoken)132451234-z4a41n5m7a99i5
■コマンドラインからアップロードする準備
homeディレクトリに .flickrrc という設定ファイルを作る
/home/sho/.flickrrc
auth_token=132451234-z4a41n5m7a99i5
key=自分のapi key
secret=自分のapi secret
パーミッションは600にする
$chmod 600 .flickrrc
■コマンドラインからアップロード
$ flickr_upload *.jpg
みたいな感じで、jpg全部まとめてアップ出来る。
また
$ flickr_upload *.jpg –tag oklab,sfc
とするとoklab sfc とタグを付けてアップロードできる。カンマ区切りで複数指定。日本語は化ける。
■Flickr::UploadでFlickrに認証する
#!usr/bin/perl-w
useFlickr::Upload;
my$ua=Flickr::Upload->new(
{‘key’=>’your-api-key’,’secret’=>’your-api-secret’}
);
PODの説明だと引数だけど、コード見たらhashで渡すのが正解だった。
■Flickr::Uploadでアップロードする
#uploadtoflickr
my$photo_id=
$ua->upload(
‘photo’=>’./rasuta.jpg’,
‘auth_token’=>$auth_token,
‘tags’=>’testrasutahiyoshi日吉flickrapiラーメンfood’,
‘is_public’=>1,
‘is_friend’=>1,
‘is_family’=>1,
‘async’=>0,
)ordie”Failedtoupload$photo_path¥n”;#result
print”photoid:$photo_id¥n”;
同じディレクトリにあるrasuta.jpgをアップロードして、そのphoto idを教えてもらったところ。
http://flickr.com/photos/shokai/photo id/
でアクセスできる。
■dir2flickr
ディレクトリを監視して、画像ファイルがあったらFlickrにアップロードするのを作ってみた。
最近Windows用のアップロードツールのFlickrUploadr.exeが起動しない事があるので。
ディレクトリ構成は
-dir2flickr.pl(このスクリプト)
–up(directory)
–tmp(directory)
dir2flickr.pl直下のupディレクトリを監視して、もし画像ファイルがあったらtmpディレクトリに移動させ、flickrにログイン、そして順にアップロードし、upが終わったファイルは削除。
cronで2分毎に回してます。daemonとして起動させる方法がよくわからない。Net::Daemon使うのが良いの?
dir2flickr.pl
#!usr/bin/perl-w
usestrict;
useFile::Copy;
useFlickr::Upload;#config
my$auth_token=’your-token’;
my$api_key=’your-api-key’;
my$api_secret=’your-api-secret’;
my$dir=’./up/’;#最後は/print”—flickruploader—¥n”;
print”path:$dir¥n”;my@tmp_files;#tmpディレクトリに移動させたファイルリスト
opendirDH,$dirordie”$dir:$!”;#ディレクトリハンドラ開く
while(my$file=readdirDH){
if($file!~/^¥.{1,2}$/){#’.’や’..’は無視
if(-d”$dir$file”){#ディレクトリの時
print”(dir)$file¥n”;
}
elsif(-f”$dir$file”){#ファイルの時
if($file=~/~*¥.jpg|~*¥.jpeg|~*¥.bmp|~*¥.gif/i){#画像ファイルのみ
move”$dir$file”,”./tmp/$file”;#移動
push(@tmp_files,”./tmp/$file”);
print”$file¥n”;
}
}
}
}
closedirDH;#ディレクトリハンドラ閉じるif(@tmp_files){#uploadするファイルがあるなら、ログイン
print”logintoflickr¥n”;
my$ua=Flickr::Upload->new(
{‘key’=>$api_key,’secret’=>$api_secret}
);
foreach(@tmp_files){
my$photo_path=$_;
print”uploadstart:$photo_path¥n”;
my$photo_id=
$ua->upload(
‘photo’=>$photo_path,
‘auth_token’=>$auth_token,
‘tags’=>’flickrapitest’,
‘is_public’=>1,
‘is_friend’=>1,
‘is_family’=>1,
‘async’=>1,#非同期たくさんupする時は1
)ordie”Failedtoupload$photo_path¥n”;
print”uploaded:$photo_path->id:$photo_id¥n”;if(unlink$photo_path){#ファイル削除
print”delete:$photo_path¥n”;
}
}
}
else{#ファイルが無い時
print”filesnotexist¥n”;
}print”—end—¥n”;