空談録

http://artfulplace.net/blogs/ からひっこしつつ

pbs.twimgの画像のファイル名の規則が分からなかった

わからなかった(断定
26bitの用途がわからない…

というわけで今日はpbs.twimgの画像のファイル名からステータスURLのIDが取れたら個人的にうれしいよねって話です
結果はタイトルの通りです。もう無理

わかったことだけ書いときます

ファイル名にもSnowflakeが使われている

これはまあ保存しまくってればわかりますが、画像は何らかの規則にのっとって順番につけられていることがわかります
あとファイル名を見ているとA-Za-z0-9と"-","_"しか使われていないこともわかります。ということで大体予想が付きますがBASE64を用いてエンコードされた文字列がファイル名だと推測できます

ということでとりあえずBASE64でデコードしてみましょう

  • と_の位置がわからないので先に含まれていない画像で実験します

都合よく https://twitter.com/f_swallow/status/608576484588945408 の画像が-も_も含まないのでこれでやりましょう

まずstatuses/showの結果を取ります。結果がこちら

{"created_at":"Wed Jun 10 10:08:35 +0000 2015",
"id":608576484588945408,
"id_str":"608576484588945408",
"text":"\u306a\u3093\u304b\u96fb\u5353\u3070\u3063\u304b\u308a\u5927\u91cf\u306b\u8868\u793a\u3055\u308c\u3066\u3044\u308b\u2026 http:\/\/t.co\/zl50Uffse4", ... ,
"user":{"id":99262813, ...}, ... ,
"entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[],"media":[{"id":608576483511029760,"id_str":"608576483511029760","indices":[21,43],"media_url":"http:\/\/pbs.twimg.com\/media\/CHIZFl5U0AAENRU.png","media_url_https":"https:\/\/pbs.twimg.com\/media\/CHIZFl5U0AAENRU.png","url":"http:\/\/t.co\/zl50Uffse4","display_url":"pic.twitter.com\/zl50Uffse4","expanded_url":"http:\/\/twitter.com\/f_swallow\/status\/608576484588945408\/photo\/1","type":"photo","sizes":{"medium":{"w":600,"h":312,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"large":{"w":1024,"h":533,"resize":"fit"},"small":{"w":340,"h":177,"resize":"fit"}}}]},
"extended_entities":{"media":[{"id":608576483511029760,"id_str":"608576483511029760","indices":[21,43],"media_url":"http:\/\/pbs.twimg.com\/media\/CHIZFl5U0AAENRU.png","media_url_https":"https:\/\/pbs.twimg.com\/media\/CHIZFl5U0AAENRU.png","url":"http:\/\/t.co\/zl50Uffse4","display_url":"pic.twitter.com\/zl50Uffse4","expanded_url":"http:\/\/twitter.com\/f_swallow\/status\/608576484588945408\/photo\/1","type":"photo","sizes":{"medium":{"w":600,"h":312,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"large":{"w":1024,"h":533,"resize":"fit"},"small":{"w":340,"h":177,"resize":"fit"}}}]}, ...}

見づらい…
まあほしいのはIDなのでそこだけ引用すると

"id":608576484588945408,
"media_id":608576483511029760,"
"media_url":"http:\/\/pbs.twimg.com\/media\/CHIZFl5U0AAENRU.png"

よく見るとEntitiesのmediaのそれぞれにもIDが割り振られていることに気が付きます。しかも個別に
何に使うのかは知りません

何にせよCHIZFl5U0AAENRUであることがわかったのでこれをBASE64でデコードします
結果は"087219165e54d000043515"となります
(このとき88bitしか変換できていませんがどっちにしろ後半はよくわかりません)

なんだか桁が多いので前方16桁のみを扱います
これを電卓か何かでビットで表示して比較してみます
f:id:fantasticswallow:20150610220000p:plain

こうしてみると前方32bitについては一致していることがわかります
しかしよく見てみるとあることに気が付きます
これを10進表記にすると"608576483511029760"となり上のmedia_idと一致します

というわけでファイル名には"画像のIDのsnowflake"が含まれていたことがわかりました

しかしここで疑問が起こります。現在90bit中64bitしか使っていないので26bit余る計算となります
10進表記だと1102932となります。よくわからないので何かよくわからない数字ということであきらめます

追記:よく見直したら書いてなかったですが、BASE64でデコードするときの並び順はA-Za-z0-9-_だった気がします。Aが0です


というわけでまた無駄な時間を過ごしてしまった…

この辺で