一応、TikTokは開発者向けにEndpointsの提供はしているんですが、TikTok自体のメインがモバイルなので、Webは完全に二の次という感じです。個人的には、TikTokから提供されているWebアプリと比べるとWeb向けのEndpointsはちょっと物足りないというかえらくシンプルという印象です。
https://developers.tiktok.com/
本国の開発者向けにはもう少し色々あるみたいなんですが、国外向けのTikTokのAPIはあんまり力入れていない印象です。
下記はページに掲載されているサンプルです。
oEmbedを利用したとてもシンプルなものになっています。
Example
https://www.tiktok.com/oembed?url=https://www.tiktok.com/@scout2015/video/6718335390845095173
response
{
"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
{
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. パッケージのインストール
$ 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
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. コードを実行
上記を実行すると下記が結果として返ってきます。
$ 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を使ったようなアプリケーションには向かない気がします。