ってのを、自分が管理しているいくつかのウェブアプリでやった。2014年1月のこと。
condition = "icon_url LIKE '%twimg%' AND icon_url NOT LIKE '%pbs%'"
User.where(condition).order(:id).each do |user|
puts "(id:%d) @%s" % [user.id, user.name]
url = user.icon_url
begin
open(url)
rescue => error1
if error1.class == OpenURI::HTTPError
begin
new_url = Twitter.user(user.twitter_id.to_i).profile_image_url
new_url_replaced = new_url.sub(/_normal(\.[^.]+)$/) { |e| $1 }
puts "\t#{url}\n\t=> #{new_url_replaced}"
open(new_url_replaced)
user.update_attribute(:icon_url, new_url_replaced)
rescue => error2
p error2
end
end
else
p error1
end
sleep 10
end
ActiveRecord の User ってモデルがあって icon_url っていうカラムにプロフィール画像の URL を格納してある場合の処理例。
こういうことがあったので、今後は Twitter の画像の URL をそのまま参照せずに、Amazon S3 の bucket 等を自分で用意してそこに画像をコピーして配置して参照する方法を取っていきたいな、という気持ち。
Qiita さんも、アイコンが死んでいる例をちょいちょい見かけて、のぞいてみたらやっぱり Twitter の URL っぽいやつがあったので、大変ですよね、お疲れさまです。アイコンの死骸があると表示も崩れて悲しいから、うまいこと対応できるといいですね。