Tiktokの通信を解析する

「tiktokユーザプロフィール画面に行っていちいちフォロワーを取得してスプレッドシートを更新する」という業務をしている人が社内にいるということを聞いて戦慄した。

絶対クローリングできるやろ!と思ったので今回は色々試してみた。

公式ドキュメント

url: https://developers.tiktok.com/

2020年2月現在、以下の2つを提供してくれている。

  • Share to TikTok
  • Embed videos

僕が欲しかったのは「ユーザ情報」なので取れなくて残念だった。Instagramに似ている。

スマホアプリ通信の解読

ネットに転がってないかなーって思って調べたらあった。

Reverse engineering the musical.ly API

mitmproxy/mitmproxy というproxyを噛ませてアプリの通信を見たらこうなったよー的な事が書いてある。Charlesと仲良くなったので今回はCharlesを使っていく。

tiktok-chls

一応自分の情報やユーザ情報を取ることはできた。

curlでも叩けるようにしたが、cookieやquery parameterが意味不明すぎて無理という判断をした。

DOMを読む

Instagramと同じ仕組みならばDOMを読めばjsonを得られるだろうという推測のもの、ひたすらDOMを読んだ。

tiktok-dom

やっぱりありました。ここからjsonを引っ張って来るようなスクリプトを書けば良し。

javascriptだとこんな感じでデータを取得することが出来る。

const axios = require('axios');

const fetchTiktokData = async unique_id => {
    const url = `https://www.tiktok.com/@${unique_id}?lang=ja`;
    const user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.<OS build number>";
    const res = await axios.get(url, { headers: { 'User-Agent': user_agent } });
    const raw = await res.data.split('<script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">')[1].split('</script>')[0];
    const user_data = await JSON.parse(raw).props.pageProps.userData;
    const message = `\`\`\`
${user_data.nickName} @${user_data.uniqueId}
フォロー: ${user_data.following}
フォロワー: ${user_data.fans}
いいね: ${user_data.heart}\`\`\``;
    return await message;
};

ついでにslackのslash commandを作った。

tiktok-slack.png

終わりに

Developer FriendlyなSNS増えてほしい。