ふくらみ

膨張し続けている

Twitterに投稿可能なURLは最長で何文字か

ツイッターといえば140文字*1しか投稿できないことで有名ですが、その例外として、ツイートに含まれるURLがあります。

通常、ツイート中のURLはhttps://t.co/iXo3yzqwxfのように公式のURL短縮サービスで短縮され、URLが何文字だろうと、23文字としてカウントされます*2

ん? 今「何文字だろうと」って言ったよね?

じゃあその上限はいったい何文字までなんだ、ということを検証しました。

方法

長いURLを作って投稿する

テスト投稿を行ったのは以下の環境。

また、長いURLを生成するために、次のツールを作成した。

fukurami.github.io

文字数を指定すると、全体で指定の文字数になるようなランダムなURLを生成する。生成したURLを開くと文字数が表示され、確かに指定の文字数がツイートできたことが確認できる*4

絞り込み

まずは大まかに絞り込んでいく。

文字数 ブラウザ API
1000文字 成功 成功
4000文字 成功 成功
8000文字 失敗 失敗

さすがにいきなり8000文字は無茶だった模様。一方で4000文字はらくらくクリア。

APIでのリクエストの例。

>twurl /1.1/statuses/update.json -d "テスト 8000文字 https://fukurami.github.io/genurl/urlinfo.htm?52ebb7d1d871ff8b853f9c4fffe2047(略)03d"

失敗した時のレスポンス。bit shorterってレベルじゃない。

{"errors":[{"code":186,"message":"Tweet needs to be a bit shorter."}]}

ブラウザではURLを貼り付けた時点で、NGの場合はツイートができなくなる(通常の文字数オーバーと同じ挙動)

f:id:tfukumachi:20211116225208j:plainf:id:tfukumachi:20211116225206j:plain
ブラウザで長いURLを貼り付けた場合(1枚目が1000文字、2枚目が8000文字)

さらに絞り込み

とりあえず、上限は4000~8000文字の間にあることがわかった。

文字数 ブラウザ API
6000文字 失敗 失敗
5000文字 失敗 失敗

どんどん二分探索してゆく。

文字数 ブラウザ API
4500文字 失敗 失敗
4200文字 失敗 失敗
4100文字 失敗 失敗
4050文字 成功 成功

おっ……!

文字数 ブラウザ API
4070文字 成功 成功
4080文字 成功 成功
4090文字 失敗 成功

4090文字を境にしてブラウザとAPIで結果が別れてしまった

ここまでの検証で、

  • ブラウザでの上限は4080~4090文字の間
  • APIでの上限は4090文字~4100文字の間

ということが分かった。

あとは、刻んでゆくだけである。

そして特定へ

まずはブラウザ

文字数 ブラウザ
4085文字 成功
4087文字 成功
4088文字 成功
4089文字 失敗

来た!境界発見!

結論。ブラウザ(Twitter Web)で投稿できる、最長のURLの文字数は、4088文字である。

これが証拠のツイート。嘘だと思うならリンクをクリックしてほしい。

アホみたいに長かったURLが――https://t.co/Kh8mFWahoF――これだけに!!! きっちり23文字である。

ちなみに次が決定的瞬間を捉えたgifである。4088文字のURLを貼り付けた状態ではOKなのだが、1文字書き加えた瞬間に、短縮できなくなってNGとなる*5

f:id:tfukumachi:20211116231549g:plain
4088文字のURLに一文字加えた瞬間のgif

そしてAPI

それでは、ブラウザよりも上限が大きいはずのAPIによる投稿では、一体何文字なのだろうか。

文字数 API
4095文字 成功
4096文字 成功
4097文字 失敗

キタ━━━━━━(゚∀゚)━━━━━━ !!!!! (死語)

結論(2)。TwiterのAPIを直に叩いて投稿できる、最長のURLの文字数は、4096文字である。

こちらも証拠のツイートを貼っておく。これが理論上、最長のURLを貼り付けたツイートである

ちなみにその際のレスポンス。実はentities.urls[0].expanded_urlに元のURLが格納されているので、リクエストも長ければレスポンスもクソ長い。

f:id:tfukumachi:20211117002237p:plain
4096文字のツイートをしたときのレスポンス

結論

検証の結果、Twitterに投稿可能な最長のURLは、

  • ブラウザ(Twitter Web)による投稿では、4088文字
  • APIを使った投稿では、4096文字

であることがわかった。

なぜブラウザとAPIで違うのか、4096文字なのかについては、色々と検証したものの残念ながらわからなかった

一応URLには規格上、字数制限は存在しないのでサービス側で何らかの事情があるんじゃないですかね(投げやり)*6

なおよく知られているところでは、Internet Expolorer(とかいう化石)は2083文字までのURLしか扱えない。Twitterも満足につかえないブラウザ。

support.microsoft.com

おまけ

日本語URLではどうなのかというと、基本的にはURLと認識されればOKのようだ。

以下の画像が検証結果で、https://テスト.com/...のような日本語ドメインは4088文字まで通ったものの、パス部分に日本語を入れた場合はURLと認識してくれずNG。

f:id:tfukumachi:20211117003312j:plainf:id:tfukumachi:20211117003310j:plain
クソ長い日本語URLを貼ったところ(どちらも4088文字)

なお、日本語ドメインの場合は本文と異なり、日本語でも1文字で1文字カウントとなる*7


……といっても、日本語ドメインだけで4096文字のURLを投稿できるわけではないのが難点。

そのままhttps://あああああ(4074文字)あああああ.comだと当然だめで、まずは数十文字ごとに.を挟んでサブドメインっぽくみせかけないと、URLかどうかのチェックを通らない。

Web画面ではおよそ60文字ごとに.をはさむことでとりあえずURLとして認識されるものの、ツイートボタンを押すと……。

f:id:tfukumachi:20211117013223j:plain
日本語ドメインだけでクソ長いURLを作っても通らない

エラー。当然の結果。

いろいろと試行錯誤した結果、結局ツイートできた最長のものは次のツイート。英数字込で156文字なので、換算すると通常のツイート文字数制限と同じ。この制限はAPIを使っても突破できない。

Twitterのサービス側で、怪しいURLを弾くような処理が行われている模様。適宜英数字をまぜたら通るのかどうかなど*8、検証の余地はあるけれども疲れたのでもう終わり

f:id:tfukumachi:20181223022729p:plain

関連記事↓ fukurami.hatenablog.com

*1:日本語の場合

*2:https://developer.twitter.com/en/docs/counting-characters

*3:両方で試したが結果は一致したので、以下「ブラウザ」とのみ表記する

*4:さらに、念には念を入れて生成時と開いた時にURLのハッシュ値(SHA-256)を表示している。URLが途中で切れていたりURLの文字列が変わっていればハッシュが合わないので判別できる。なお、以下の検証においてツイート可能だった分については、生成時と開いた時のハッシュはすべて一致した。

*5:ちなみに、4089文字のURLだけを貼った時の残り文字数欄は「-1904文字」。削らなければいけないのは1904文字ではなく1文字だし、1904文字削ったところで2185文字もあるのでカウントが謎。

f:id:tfukumachi:20211117182033j:plain
4089文字のURLを貼った時の残り文字数

*6:ちなみにt.co以外の短縮サービスではどうなのかというと、bit.lyは2048文字が上限だった。短縮できた最長のものは→https://bit.ly/3qLwRwz

*7:ここのカウントではpunycode変換等は考慮されていないようだ。

*8:例えば実在しないドメインを弾いているのでは?と思って末尾を「...あああああ.google.com」にしたところ、あえなくNG。