Twitterのアイコン画像の取得の為に Tweetimag.es を使っていたのですが、どうやら最近調子が悪い…?
まぁ、外部サービス(しかも無償)を使っている場合、こういうのは仕方ない部分だったりするのですが。
で、まぁ、代替えサービス探すのも面倒なので、自前で用意することにしました( ´ ▽ ` )ノ
要はhttp://api.dan.co.jp/twicon/screen_name/sizeが、常に最新のアイコンを指し示すURIとして使えるというわけです。/sizeを端折るとデフォルト、すなわち一 …
とは言え、フルスクラッチで組むのは面倒なので、@dankogai さんのAPIを頂いてきて、自鯖での運用です。
どうせ制限された環境で、取得したいアカウントなどもほぼ固定で決まってるし、公開するつもりも無い(^_^;)
ということで、キャッシュを作る部分を削って、キャッシュから拾ってきた物を取り出すだけの簡易仕様にw
#!/usr/local/bin/perl use strict; use warnings; use HTTP::Date; use Fcntl; use MLDBM qw/DB_File Storable/; my $cache = './.twitter/cache.db'; my $twroot = 'http://twitter.com/'; my ( undef, $screen_name, $flavor ) = split /\//, $ENV{PATH_INFO}; my $obj = fetch( $screen_name, $cache, $twroot ); my ( $location, $checked, $status ) = ( $obj->{uri}, time2str( $obj->{mtime} ), $obj->{code} ); $location =~ s/_[^_]+\.(\w+)\z/_$flavor.$1/ if $flavor; print <<"EOT"; Status: 302 Location: $location X-Cached: $checked X-Original-Status: $status EOT sub fetch { my ( $name, $dbfile, $uriroot ) = @_; $uriroot ||= 'http://twitter.com'; my $ret = {}; if ( -f $dbfile ) { tie my %db, 'MLDBM', $dbfile, O_RDONLY | O_NONBLOCK, 0444 or die "$dbfile:$!"; $ret = $db{$name}; } $ret; }
↑ ソースもかなりすっきりw
キャッシュを作る方もオリジナルのソースを基にして別で作りました。
パラメータなどを渡すのではなくて、スクリプト内部でアカウントのリストを回して拾ってくる様にした感じです( ´ ▽ ` )ノ
# 余りにやっつけが過ぎる状態だったのでソース出さないw
何故こんな事をしたかというと、単純にキャッシュ更新用にファイルのロックが出来なかったというなんともな理由で(^_^;)
その辺を上手く回避しようとすると、面倒な事が多くなるのが嫌だったので分割してしまいました。
キャッシュ生成自体は、そんなに頻繁に更新されるものでもなかろうと、cronで一日一回動作させるだけでいっかなとw
# キャッシュ作成する人が一人ならロックも考えなくて良くなるし…
問題解決そのものについては——まぁこれは適当すぎる対応な訳ですが——こういう風に物事をシンプルにしておくと楽だと思います。
基のコードだと「キャッシュを作る必要があれば作る&URLを返す」という動作だった訳ですが、ここでは「URLを返す」だけの簡単なお仕事。
特に新人にプログラマの方とかは、こういうところでどんどん機能を追加しようとしてぐちゃぐちゃになる事が多いよね〜分割しちゃえば楽なのに〜という愚痴を吐きたいが為のブログ記事であります( ´ ▽ ` )ノ
# ただし、管理対象の「数」が増えるので、それを問題視するならば他の対処法がオススメになることもありますので要注意