10行くらいのPythonコードでTikTokから動画情報を取得する方法

一応、TikTokは開発者向けにEndpointsの提供はしているんですが、TikTok自体のメインがモバイルなので、Webは完全に二の次という感じです。個人的には、TikTokから提供されているWebアプリと比べるとWeb向けのEndpointsはちょっと物足りないというかえらくシンプルという印象です。
https://developers.tiktok.com/
本国の開発者向けにはもう少し色々あるみたいなんですが、国外向けのTikTokのAPIはあんまり力入れていない印象です。


下記はページに掲載されているサンプルです。
[oEmbed](https://oembed.com/)を利用したとてもシンプルなものになっています。

Example
`https://www.tiktok.com/oembed?url=https://www.tiktok.com/@scout2015/video/6718335390845095173`

response

```json
{
  "version": "1.0",
  "type": "video",
  "title": "Scramble up ur name & I’ll try to guess it😍❤️ #foryoupage #petsoftiktok #aesthetic",
  "author_url": "https://www.tiktok.com/@scout2015",
  "author_name": "Scout & Suki",
  "width": "100%",
  "height": "100%",
  "html": "<blockquote class=\"tiktok-embed\" cite=\"https://www.tiktok.com/@scout2015/video/6718335390845095173\" data-video-id=\"6718335390845095173\" style=\"max-width: 605px;min-width: 325px;\" > <section> <a target=\"_blank\" title=\"@scout2015\" href=\"https://www.tiktok.com/@scout2015\">@scout2015</a> <p>Scramble up ur name & I’ll try to guess it😍❤️ <a title=\"foryoupage\" target=\"_blank\" href=\"https://www.tiktok.com/tag/foryoupage\">#foryoupage</a> <a title=\"petsoftiktok\" target=\"_blank\" href=\"https://www.tiktok.com/tag/petsoftiktok\">#petsoftiktok</a> <a title=\"aesthetic\" target=\"_blank\" href=\"https://www.tiktok.com/tag/aesthetic\">#aesthetic</a></p> <a target=\"_blank\" title=\"♬ original sound - 𝐇𝐚𝐰𝐚𝐢𝐢𓆉\" href=\"https://www.tiktok.com/music/original-sound-6689804660171082501\">♬ original sound - 𝐇𝐚𝐰𝐚𝐢𝐢𓆉</a> </section> </blockquote> <script async src=\"https://www.tiktok.com/embed.js\"></script>",
  "thumbnail_width": 720,
  "thumbnail_height": 1280,
  "thumbnail_url": "https://p16.muscdn.com/obj/tos-maliva-p-0068/06kv6rfcesljdjr45ukb0000d844090v0200010605",
  "provider_url": "https://www.tiktok.com",
  "provider_name": "TikTok"
}
```

Request URLの中にユーザー名（@scout2015）が含まれていますが、実際これはあってもなくても大丈夫です。おそらくはvideo_idのみをチェックしているのだと思います。

ちなみに、変なRequest URLを叩くと、以下が返ってきます。プロトタイプのようなシンプルなメッセージです。何のエラーなのかも教えてくれませんw

```json
{
status_msg: "Something went wrong"
}
```

Developer向けのページにはその他いくつかの機能についての記述があるんですが、モバイル向けの記述もかなりシンプルな印象です。


なので、今回は非公式のAPIを簡単に使えるライブラリについてご紹介します。
Unofficial TikTok API in Python
https://github.com/davidteather/TikTok-Api

ドキュメント
https://dteather.com/TikTok-Api/docs/TikTokApi.html

### Step1. パッケージのインストール
```zsh
$ pip install TikTokApi
$ python -m playwright install
```

### Step2. custom_verifyFpの取得
非公式なので、所謂Tokenとかがないためこのステップが必要になります。
TikTok にアクセスして、Dev Tool > Application > Storage > Cookies.  `s_v_web_id`をコピーして下記のサンプルコードの`verifyFp`に格納します。

ライブラリ作者による動画もあります。
https://youtu.be/zwLmLfVI-VQ?t=121

このポストでは`by_hashtag`を使って`Messi`というハッシュタグをつけている10件の投稿を取ってくるものになっています。
https://dteather.com/TikTok-Api/docs/TikTokApi/tiktok.html#TikTokApi.by_hashtag


上記のYoutube動画は`by_trending`を使っています。
https://dteather.com/TikTok-Api/docs/TikTokApi/tiktok.html#TikTokApi.by_trending

コード自体はとてもシンプルで、Messiというハッシュタグがつけられている投稿の動画を再生できるリンクを10件（results）返すというものです。ちなみ、2000が取ってこれるMaxのようです。

もし、返ってくるjsonのデータフォーマットが知りたい場合は下記を確認してみてください。
https://gist.github.com/koji/143ea8387403899c069464cbde61efae

`test.py`

```python
from TikTokApi import TikTokApi
verifyFp='xxx'
api = TikTokApi.get_instance(custom_verifyFp=verifyFp, use_test_endpoints=True)
results = 10
hashtag = 'Messi'
search_results = api.by_hashtag(count=results, hashtag=hashtag)
for tiktok in search_results:
    print(tiktok['video']['playAddr'])
```

### Step3. コードを実行
上記を実行すると下記が結果として返ってきます。

```zsh
$ python test.py
https://v16-web.tiktok.com/video/tos/useast2a/tos-useast2a-pve-0068/f6d3605bceb3438d95d3fc15e1c12707/?a=1988&br=3614&bt=1807&cd=0%7C0%7C1&ch=0&cr=0&cs=0&cv=1&dr=0&ds=3&er=&expire=1628935350&ft=Q9BExEXk_4ka&l=202108140401520102450730214E194969&lr=tiktok_m&mime_type=video_mp4&net=0&pl=0&policy=3&qs=0&rc=M2k0ZmY1cGp0MzMzOTczM0ApaDY3Ojw0ODw4N2RoZmkzO2dhbW0xYzFjZG1gLS00MTZzczAxL2AyNDAyMzAuLy8zXzM6Yw%3D%3D&signature=5deb49d12d31945a3dd829845980247c&tk=0&vl=&vr=
---------------
https://v16-web.tiktok.com/video/tos/alisg/tos-alisg-pve-0037c001/8644d857973643ff8338cf94b033261b/?a=1988&br=1604&bt=802&cd=0%7C0%7C0&ch=0&cr=0&cs=0&dr=0&ds=2&er=&expire=1628935342&ft=Q9BExEXk_4ka&l=202108140401520102450730214E194969&lr=tiktok_m&mime_type=video_mp4&net=0&pl=0&policy=3&qs=0&rc=ajdzcmp0bHk7MzMzNTczM0ApZmVmZzU7aDs0Nzw7aDZlM2djLWVybDBjbi9gLS0vMTRzczAyMy8vYDQtNTY1X15eYWA6Yw%3D%3D&signature=ac6a0aebbedf36463efa08062beca5c6&tk=0&vl=&vr=
---------------
https://v16-web.tiktok.com/video/tos/useast2a/tos-useast2a-ve-0068c003/03fdb77bdb7b4cd89feadd3347ea76d2/?a=1988&br=2438&bt=1219&cd=0%7C0%7C1&ch=0&cr=0&cs=0&cv=1&dr=0&ds=3&er=&expire=1628935323&ft=Q9BExEXk_4ka&l=202108140401520102450730214E194969&lr=tiktok_m&mime_type=video_mp4&net=0&pl=0&policy=3&qs=0&rc=MzZvcGhqNmtqNDMzNzczM0ApaGk6ZWU2M2U1NztpOmY5O2dzZmouNF5ybm5gLS1kMTZzczE0NDIwNTM1YTIwLV8yYTQ6Yw%3D%3D&signature=431b0bdedc5acd4a5d365685cc2bae43&tk=0&vl=&vr=
---------------
https://v16-web.tiktok.com/video/tos/alisg/tos-alisg-pve-0037c001/3a3df3e144284842bca193e3c3be4c18/?a=1988&br=2718&bt=1359&cd=0%7C0%7C1&ch=0&cr=0&cs=0&cv=1&dr=0&ds=3&er=&expire=1628935371&ft=Q9BExEXk_4ka&l=202108140401520102450730214E194969&lr=tiktok_m&mime_type=video_mp4&net=0&pl=0&policy=3&qs=0&rc=am45bXF0bzk6dzMzMzczM0ApODk7ZWVpaDw6NzY4NjxmZGc1bl9sc2VwY3JfLS00MTRzcy5hMmJeNWA0NWA2MDY0YGM6Yw%3D%3D&signature=93bde49d5fb650e006c38242ce71d443&tk=0&vl=&vr=
---------------
https://v16-web.tiktok.com/video/tos/useast2a/tos-useast2a-ve-0068c002/8236a7de6b7d45f68534c340ff20704a/?a=1988&br=990&bt=495&cd=0%7C0%7C1&ch=0&cr=0&cs=0&cv=1&dr=0&ds=3&er=&expire=1628935366&ft=Q9BExEXk_4ka&l=202108140401520102450730214E194969&lr=tiktok_m&mime_type=video_mp4&net=0&pl=0&policy=3&qs=0&rc=am1xcTQ6ZnBuNzMzNzczM0ApOWY0aWU0OGRpNzM0ZDZpOWdiMmRscjQwcTNgLS1kMTZzc18vNjAzYl4uXjJhNDBjLTA6Yw%3D%3D&signature=da88c5351234be29a34a06f7fe85dc32&tk=0&vl=&vr=
---------------
https://v16-web.tiktok.com/video/tos/useast2a/tos-useast2a-ve-0068c003/123acb35db624af0ace6c4cc9f08d98f/?a=1988&br=5028&bt=2514&cd=0%7C0%7C1&ch=0&cr=0&cs=0&cv=1&dr=0&ds=3&er=&expire=1628935342&ft=Q9BExEXk_4ka&l=202108140401520102450730214E194969&lr=tiktok_m&mime_type=video_mp4&net=0&pl=0&policy=3&qs=0&rc=M2R5b2tvajp3NDMzZDczM0ApNTs3OGVlOjw8Nzs3OzNmNmdhM2Rzcl9wazVgLS1iMTZzcy8tNC8yLzE0MGE2M2A1MS86Yw%3D%3D&signature=8d0a6ea7e6cd392ec1c1b21a683a3764&tk=0&vl=&vr=
---------------
https://v16-web.tiktok.com/video/tos/alisg/tos-alisg-pve-0037c001/db36a067db27458c9eb975e729951244/?a=1988&br=2436&bt=1218&cd=0%7C0%7C1&ch=0&cr=0&cs=0&cv=1&dr=0&ds=3&er=&expire=1628935335&ft=Q9BExEXk_4ka&l=202108140401520102450730214E194969&lr=tiktok_m&mime_type=video_mp4&net=0&pl=0&policy=3&qs=0&rc=MzRneWc6ZmhtNjMzODczNEApOWQ1NmVlZmRoNzQ6NTk0OWc2NmktcjRfZWtgLS1kMS1zc18zNC82YDRiMDJiMjYtMmE6Yw%3D%3D&signature=b60291c707247f301dd61dd161a1182d&tk=0&vl=&vr=
---------------
https://v16-web.tiktok.com/video/tos/useast2a/tos-useast2a-ve-0068c001/27d1b30e58df44d99e008c1928e9cba9/?a=1988&br=2388&bt=1194&cd=0%7C0%7C1&ch=0&cr=0&cs=0&cv=1&dr=0&ds=3&er=&expire=1628935363&ft=Q9BExEXk_4ka&l=202108140401520102450730214E194969&lr=tiktok_m&mime_type=video_mp4&net=0&pl=0&policy=3&qs=0&rc=M2d4aGR1MzpkMzMzNjczM0ApM2RoaGgzZGQzN2U5Njk4NGdlaC5jbGtyaWFgLS0vMTZzczU1MWJgNDJgMi8uNTFiNWI6Yw%3D%3D&signature=c7df3d189e5e7bd449969f34d50cab3e&tk=0&vl=&vr=
---------------
https://v16-web.tiktok.com/video/tos/useast2a/tos-useast2a-pve-0068/bcb98c935ab443de9658dcd5760f939f/?a=1988&br=1448&bt=724&cd=0%7C0%7C1&ch=0&cr=0&cs=0&cv=1&dr=0&ds=3&er=&expire=1628935330&ft=Q9BExEXk_4ka&l=202108140401520102450730214E194969&lr=tiktok_m&mime_type=video_mp4&net=0&pl=0&policy=3&qs=0&rc=M2V2dTM1cDk1NjMzNzczM0ApOTxnaTkzZDw3N2UzZWk6M2dyMmAwYzE0XmRgLS1kMTZzczZhNDViYTNiNV9eXjNgLzQ6Yw%3D%3D&signature=9c5d5009e266981b310682a2df1d3cdf&tk=0&vl=&vr=
---------------
https://v16-web.tiktok.com/video/tos/useast2a/tos-useast2a-pve-0068/55c9cb8875174673b81a67db4b0c7be1/?a=1988&br=1338&bt=669&cd=0%7C0%7C1&ch=0&cr=0&cs=0&cv=1&dr=0&ds=3&er=&expire=1628935340&ft=Q9BExEXk_4ka&l=202108140401520102450730214E194969&lr=tiktok_m&mime_type=video_mp4&net=0&pl=0&policy=3&qs=0&rc=M3BldTczaWRldTMzMzczM0ApNmQ4Nmc0NWRoNzZmOjkzZWdfMmEyYTY0MmhfLS1iMTZzc2AvNi0uMTEtLTAzY18yMTA6Yw%3D%3D&signature=26cd0d759ece16582dbd0fa3985040b7&tk=0&vl=&vr=
---------------
```

レポのIssueを見ると、そこそこの頻度でTikTok側で更新があった場合、結果が返ってこないみたいなことが起こるようなので、Web、Desktop向けに簡単なツール的なものを作るのにはいいと思いますが、所謂一般的なAPIを使ったようなアプリケーションには向かない気がします。