ふとTikTokの動画共有URLの仕組みが気になったので推理してみたときの記録
この記事の雰囲気
友人と Discord でチャットをしている中で起こった1時間くらいの出来事がなんとなく面白かったので、
基本的にはそのまま時系列順に書き出してみたものです。
自分はこういった部分の設計だとか、手法には全く詳しくないので、あくまで推理した記録であって看破したとかそういう話ではないです。
今回の話はチャットの内容ベースで時間を進める形式が一番書きやすかったので、技術記事というよりは、まとめブログとか日記に近いものになるかもしれません。
TL;DR
- 友人からオススメとして送られてきた TikTok のURLを開いてみたら、「〇〇さん(友人)がこの動画をシェアしました」が表示された
- "URLもらって観たあと、そのままアプリ内でその動画についてやり取りできるのは面白いな~"と思った
- コンテンツとユーザーのIDを可逆で圧縮してるにしてはURL短くないか!?と気になった
- シンプルに短縮URLサービスと同じ理屈では?と結論した
- だから別になにかとかではない。「こういうふうになってるんだな~」というのがいくつかわかった。
導入
タイトルに「ふと」と書いた通り、事の発端は非常に小さな出来事でした。
あるとき、友人から TikTok のおすすめ動画のリンクが送られてきました。
友人 - 19:58
最近めっちゃハマってるこの人
vt.tiktok.com /HogeAAAA1/
ひかマヨ - 20:45
わらたww
友人 - 20:46
シンプルにおもしろくて好きw
そして、アプリで観たときに「〇〇(友人)さんがこの動画をシェアしました。チャットを開始しますか?」といった文言が出ていることに気が付きました。
ひかマヨ - 20:47
そしてtiktokすごいね
他にはなかなかない動画シェアの価値がここにはある
シェアされた動画についてチャット?がそのままアプリ内でできるぽい
友人 - 20:52
俺のアカウントについて出てくるんだ!
さすが
これがすべての始まりでした。
推理パート
前提
- 前述した
vt.tiktok.com /HogeAAAA1/
が最初にもらったURLである - HogeAAAA1部分は、実際にはランダムな 9文字 の a-z, A-Z, 0-9 だった
Phase 1: トークン発行して、そこからユーザー情報とコンテンツ情報を引けるようにしてるだけじゃね?
当然、これが真っ先に思いつきます。
検証方法
単なるランダム文字列(トークン) ←→ コンテンツ+その共有URLを発行したユーザー
を紐づける役割がある DB か何かあるのであれば、同じ動画をひかマヨが共有したときにでたらめなURLが発行されるはず。
結果
ひかマヨ - 20:54
動画のコンテンツIDだけをエンコードしてるとかじゃなくて、トークンみたいなもんかな?
vt.tiktok.com /HogeBBBB2/
(※紹介されたものと同じ動画のリンク)
友人 - 20:54
ほんとだ違うww
ひかマヨ - 20:55
とはいえ DB とかに永続的に値残しておくの辛そうだから、4+5文字とかで動画情報+ユーザー情報をくっつけてよしなにエンコードしてるのかな
違う動画の URL はどうなってるんだろう
vt.tiktok.com /HogeCCCC3/
(※別な動画のリンク)
あれ?
友人 - 20:56
あーーそれぞれのハッシュを結合してる的な?
考察
上記のURLはもちろん編集したものではありますが、先頭の数文字(ここでは Hoge
)が変わっていないこと に違和感を覚えました。
つまり、デタラメに生成されたものではないはずだと。
とすると…
4+5文字とかで動画情報+ユーザー情報をよしなにエンコードしてるのかな
ここを確かめたくなります。
Phase 2: 「コンテンツのID+その共有URLを発行したユーザーのID」をbase64エンコードしてるみたいな話じゃね?
検証方法
コンテンツとユーザーは増える一方なはずなので、過去の共有URLは短く、時を経るごとに長くなっていればこの説の信憑性は高まるはずです。
ただし今、共有URLが9文字のa-z,A-Z,0-9で表現できていることを踏まえると、最も単純に考えれば ユーザー数を表現しきれるbit数 + コンテンツ数を表現しきれるbit数
が 54 に収まる必要があります。
(厳密にいえば、どこまでがユーザーIDを示して、どこからがコンテンツのIDを示すかみたいな、浮動小数点的な(?)考え方は必要そうですが)
結果
ひかマヨ - 21:13
4年くらい前の共有URLくそ短い
(Twitterでvt.tiktok.com until:2019-01-01
を検索したURL)
友人 - 21:14
このときはデータとってないみたいな歴史的背景もありそう
ひかマヨ - 21:15
たしかにいつからシェアしたユーザーの情報くっつけてるかは不明だw
とはいえ、2019年開始時点では5文字で表現できてるのに今や9文字って、すごい伸びだな
友人 - 21:21
ユーザーもコンテンツもそれぞれIDをインクリメントしてるとしたらそうなるよねー
でもインクリメントだとこれだけ流行しちゃうとオーバーフロー起こさないのかな?
世界ユーザ億人は普通に超えてるだろうからすぐ超えそうだなーとは思って
ひかマヨ - 21:25
あ~、確かに
考察
このタイミングで、TikTok のアカウント数を検索してみたところ、(信頼できるソースは確認してませんが)やはりどうやら10億を超えているようです。
プチフェルミ推定ですが、log_2^{1000000000}
の時点で 30 なので、少なくとも一人一本動画出しただけで 54bit じゃ表現しきれないですね。
ちなみに今これを書きながら考えてみると、リクエストされたパスから、「とあるときまでのURLなら動画情報のみ、とあるときからはユーザー情報も乗せる」 みたいなことってあまりないんじゃないかと思ってきました。
たしかにいつからシェアしたユーザーの情報くっつけてるかは不明だw
このあたりで違和感を覚えてもよかったかもしれません。
Phase 3: とりあえず情報集めたら色々わかるんじゃね?
検証方法
スマートフォンより、PCを使うと様々な情報を得られることが広く知られています。
結果
友人 - 21:33
networkとかでリソースみれば動画idとか取れないかなって思ってpcでサイトみたら爆音なって焦った
ひかマヨ - 21:34
わかるw最新動画のID見に行くために俺もちょうど開いた
これあれかもしれん
短縮URL的な・・・
vt.tiktok.com
がそれ専用の受け口なんだなこれ
ひかマヨ - 21:40
とりあえず動画IDはとんでもないことになってることがわかったw
item_id=1234567890123456789(※編集済)
考察
このIDが連番なのかは確証がないですが、少なくともTikTokにはとんでもない数の動画があるであろうことはなんとなく間違いなさそうです。
つまり、前述の仮説 "「コンテンツのID+その共有URLを発行したユーザーのID」をbase64エンコードしてるみたいな話じゃね?" が間違えているという話がより補強されました。
そして、こうなってくるとやはり、よしなに可逆圧縮された文字列がURLに乗って9文字になっているわけではなく、9文字で参照できる何かしらのレコードを引いてきているだろうという説がぶり返してきます。
Phase 4: 雑談
検証方法
検証とかではない
結果
友人 - 21:44
item_idが1の動画めっちゃ価値ありそうw
ひかマヨ - 21:45
でもこれどうやらtiktok.com /ユーザー名/コンテンツタイプ/ID
になってるから
簡単には見つけられんw
考察
簡単には見つけられんw
逆に、簡単に見つけられるもので有名なものに以下があります。
Phase 5: 短縮URLサービスってそんな簡単に内製できるの?
検証方法
できるかどうかを調べてみる。
結果
あまりよく知らなかったですが、案外できそうな雰囲気の記事をちらほら見かけました。
できそうなもんですね。
考察
一度発行したURLに、永続的にアクセスできるようにするのは難しそうだという印象がありましたが、不可能ではないことがわかりました。
であれば、むしろ一番最初に検討した "トークン発行して、そこからユーザー情報とコンテンツ情報を引けるようにしてるだけじゃね?" が正しかったのでは?という気持ちになってきます。
つまり、トークンはデタラメな文字列である と勝手に仮定したせいで一度見逃してしまいましたが、特定のキーが何かしらのロジックで生成されていると考えてみれば、納得いく答えが出る気がしてきました。
Phase 6: 着地
とりあえず、「特定のキーが何かしらのロジックで生成されていて、それを元にユーザー情報と動画情報を引いてきている」が今日の僕のアイデアで一番現実味があるところになってきました。
これで納得できる内容を得られたら、一旦このくだりを自分の中で消化できそうです。
検証方法
Twitter で vt.tiktok.com until:20xx-xx-xx
を検索し、ある日付以前のリンクが死んでいれば、共有URLの文字列には有効期限があることがわかります。
であれば、やはり常に可逆変換できるものではなく、どこかに保持してある、共有リンクを発行したユーザー情報+共有されたコンテンツ情報を引いてくるためのキーになっていることが半ば確定すると考えられます。
結果
やりました!
TTLは360日である可能性が非常に高い結果を得ました。
2022/11/08 現在、 2021/11/12以前のリンクを踏むと動画は表示されず、2021/11/13以降のリンクは表示されます。
ちょうど360日です!
ちなみに、2022/11/08 現在、 2021/11/12以前のリンクは 302
でリダイレクトされ、2021/11/13以降のリンクは 301
でリダイレクトされます。
考察
常に可逆変換が可能な文字列をURLに埋め込んでいるのであれば、360日でリンクを切る理由がない(はず)と思いました。
であれば、この説は真相とそこまで遠くないところにいるんじゃないでしょうか?
振り返り
すべてのユーザー・動画の組み合わせを9文字で表現できる魔術が使われているわけじゃなさそうで、安心しました。
今9文字で表現できていることから雑に推察すると、これまで発行された共有URLは数百億くらいなのかもしれませんね。すごい。
「じゃあどんなアルゴリズムで生成した文字列だろう?」
は、そこまで面白い発見もなさそうなので今回はここまでにします。
「使いまわさないURLなら、時を経るごとに長くならないんじゃ?」
は、まぁSNSに共有されてるリンクが数年後に別なものに変わってたら気持ち悪いですし、リンク自体は失効するとはいえ全体でユニークにしてるんだろうと思いました。
で、SNSに共有されるURLであることを考えると、短いURLであることは利点だらけですね。
Twitter のように文字数制限があるときにも邪魔しないし、何より見やすい
(チャットでURL貼ったら1画面分専有されたりするのあるあるですしね)
逆に言うとそれによってリンクが永続的に有効にはなっていないとも考えられるわけですが、数年後まで踏まれるリンクもそうないでしょうし、メリットのほうが大きそうだなと思いました。
おわりに
考える過程を楽しみすぎて、いざ結論を出してみると「そりゃそうだよな」な結果でした。
でもパズルを解いているみたいで楽しかったです。
なんか自分でも結構早い段階でそれについて言及してました。
ひかマヨ - 21:31
これ面白いパズルだなぁwしばらく考えてそう俺
でこういうときって答えは多分めっちゃ簡単なんだよね
何はともあれ、TikTok、流行していることは知っていましたが、色々数字を出してみると僕の想像以上に流行しているんですね。
ここまでアツく考察した相手なだけに、ちょっと明日から積極的に見ちゃいそうな気がします。
Discussion