GIFアニメをTwitterアイコンとして利用可能な形式に変換するためのRubyスクリプト

(追記 2010/08/10)
どうやら以下の方法でもGIFアニメのアイコンが投稿できなくなったようです.残念….

                                                                                                  • -

いつの間にかTwitterの仕様が変わってアイコンにアニメーションGIFが使えなくなっていた(拡張子をpngに詐称してもダメ).使おうとすると"There were problems with the following fields: Your image can not be animated."と怒られてしまう.

回避策を調べてみたところ,GIFアニメのバイナリをちょっといじればアップロードできるようになることが分かった.

1.まず、セットしたいアニメGIFを用意します (自分はGiamで作成)

2.用意したアイコンを適当なバイナリエディタで開きます (自分はStirlingを使用)

3.バイナリ末尾を変更&追加
一番後ろを 3B → 3C
更にその後ろに2Cを追加

4.保存する

? - FC2 BLOG パスワード認証

この方法を使えば拡張子を偽装しなくてもGIFアニメをアイコンに設定できる上に,20KB以上のGIFアニメも利用できる(ただしあまり大きいサイズのGIFアニメを使うと他のユーザに迷惑がかかるので注意).


しかし,アニメーションGIFアイコンを用意するたびにバイナリエディタで編集するのも面倒なので,変換用のRubyスクリプトを書いてみた.結構適当.

twit_anime_icon.rb

#!/usr/bin/env ruby

# twit_anime_icon.rb
# convert an animated gif file to an uploadable format for Twitter.

infile = ARGV[0] || ""
outfile = ARGV[1] || "output.gif"

if infile.empty?
  puts "usage: #{$0} input.gif [output.gif]"
  exit 1
elsif !File.file?(infile)
  puts "#{infile}: file not found"
  exit 1
elsif File.exist?(outfile)
  puts "#{outfile}: file exists"
  exit 1
end

size = File.size(infile)
open(infile, "rb") {|fi|
  data = fi.read(size - 1)

  if fi.read != 0x3b.chr
    puts "#{infile}: invalid input file"
    exit 1
  end 

  open(outfile, "wb") {|fo|
    fo.write data
    fo.write 0x3c.chr
    fo.write 0x2c.chr
  }
  puts "success"
}


これを twit_anime_icon.rb などの名前で保存して,

$ ruby twit_anime_icon.rb input.gif output.gif

を実行すれば一発でinput.gifをアイコン利用可能なGIFアニメに変換することができる.

Gist

Gistにもソースをアップしてみた.
http://gist.github.com/351230