トップ画像
TwitterにDeflate圧縮されたバイナリをアップロードして利用する 🤔

執筆者: 終に鮭

最終更新: 2023/02/28

まずはこれらのツイートを見てほしい。






シェル芸bot(@minyoruminyon)とは、それがフォローしているユーザが #シェル芸 等のハッシュタグをつけてシェルコマンドをツイートしたとき、引用RTでその出力をつぶやくbot [注1] 。
つまり、上記のツイートはシェル芸botにjavaコマンドを実行させてオセロをしているということになる。しかしオセロのソースコードは含まれていないように見えるが……?

/media/0

シェル芸botには、ツイートに添付された画像を /media ディレクトリ下にあるものとして実行する機能がある。1枚ならその画像は /media/0
つまり最初のツイートは、画像を読み込んで java.awt.image.BufferedImage.getRGB(int startX, int startY, int w, int h, int[] rgbArray, int offset, int scansize) によって埋め込まれたバイナリを取り出しているということになる。
記事タイトルが物々しかったが、「Deflate圧縮されたバイナリ」とは、ただ単に「バイナリを埋め込んだPNG画像」のこと。
ちなみにDeflateはおなじみZIPやgzipにも使われる可逆圧縮アルゴリズム。
ちなみに元ツイートを書いた人によると、埋め込まれているのはJavaのソースらしい [2]。手元で実行してみたらわかる。

扱える画像

今どうなっているかは知らないが、どうも数年前時点でのTwitterの画像の仕様はこうらしい [3](読み間違いがあれば申し訳ない)。

  • JPEGは原則、quality85の4:2:0クロマサブサンプリングされたJPEGとして再エンコードされる。
    • ただし次の条件をすべて満たすならば再エンコードしない。
    • 画像サイズが4096x4096以下である。
    • 5MB以下である。
    • 画像の回転が必要であるような情報を持っていない。
    • 1ピクセルあたり1バイト未満である。
  • WebPもquality85のJPEGに変換される。
  • PNGは色深度や画像サイズによって異なる。
    • PNG-8は保持される。
    • PNG-24,PNG-32のうち、実際の色数が256色以下であるならばPNG-8に変換される。
    • 上記を満たさないPNG-24,PNG-32のうち、画像サイズが900x900以下ならば保持される。
    • 上記を満たさないPNG画像は、JPEGに変換される。
  • 扱える最大の画像サイズは4096x4096である。


つまり、900x900のPNG-32を使えば約3MBもの情報を使うことができる。4枚使えば4倍(要検証)。
……4096x4096のPNG-8でも16MBの情報を使えるのでは?などと思ったが多分JPEGに変換されるんだろう。知らんけど。

あとはプロトコルを交換しておけばメモ帳アプリのスクショをツイートするよりも大量の情報を一気に投稿できる(誰にわかるねん)。

おまけ

失敗とるい!
Lorem ipsumが出る予定だったのに


ツイート1: 本当なら 8-bit/color RGB になってもらう予定だったが、256色以下だったので colormap に変換されてしまった例


ツイート2: WebPに変換される(多分?)とかいう知らない仕様によってASCIIコード表から順番に持ってきたみたいな謎文字列が出ている例


参考文献

[1] 社畜ちゃん(@Shachiku_nyan)「echo 'class ${public static void …https://twitter.com/Shachiku_nyan/status/1628601778345500674 (2023年2月27日アクセス)
[2] 社畜ちゃん(@Shachiku_nyan)「@AAAR_Salmon javaのソースそのまま押し込めてますw」 https://twitter.com/Shachiku_nyan/status/1628699291454963712 (2023年2月28日アクセス)
[3] NolanOBrien「Upcoming changes to PNG image supporthttps://twittercommunity.com/t/upcoming-changes-to-png-image-support/118695 (2023年2月28日アクセス)
[注1] ふるつき「今の所判明しているシェル芸botの仕様」 https://furutsuki.hatenablog.com/entry/2018/07/13/221806 (2023年2月28日アクセス)

取得に失敗しました

2020年度 入部

Twitter GitHub YouTube