はじめに
TikTok APIについて調べていたところ、
公式じゃない方のリポジトリやその使い方がたくさん出てきたので、
公式である方をまとめちゃいました〜!
ついでにdevelopersアカウントも取得できちゃったので、
方法とか紹介していきます。
取得できるデータは思ったよりも多く、一見の価値はあると思います!
目次
- 公式ドキュメント
- 取得できるデータ
- developers登録手順
- アクセストークン取得方法
公式ドキュメント
こちらをメインにまとめていきます。
マーケティングAPIというのもあります。
※今回はこちらの紹介はしません。
取得できるデータ
大きく分けて5種類
- Login Kit
- Sound Kit(この記事では紹介しません)
- Video Kit(この記事では紹介しません)
- Embed Videos
- WebHooks
Login Kit
分岐して以下のデータが取れる
- User Info
- Video List
- Video Query
- Manage User Access Tokens(get&refresh&revoke access token)
- Login Kit with QR Code(この記事では紹介しません)
User Info
ユーザーに関する情報を取得できる。詳細はコチラから
取得できるデータ
key | 型 | 詳細 |
---|---|---|
open_id | string | 現在のアプリケーションにおけるユーザーの固有ID |
union_id | string | 同じ開発者の異なるアプリ間で、ユーザーを一意に識別するためのID |
avatar_url | string | ユーザーのプロフィール画像のURL |
avatar_url_100 | string | ユーザーのプロフィール画像(100×100サイズ)のURL |
avatar_url_200 | string | ユーザーのプロフィール画像(200×200サイズ)のURL |
avatar_large_url | string | ユーザーのプロフィール画像を高解像度で表示できるURL |
display_name | string | ユーザーのプロフィール名 |
リクエストパラメータ
key | 型 | 詳細 |
---|---|---|
open_id | string | TikTokユーザの一意な識別子で、/oauth/access_token/で取得 |
access_token | string | TikTokユーザの認可を表すトークンで、/oauth/access_token/を通じて取得 |
fields | string | user/info/で取得できるフィールドのセット。上記の取得できるデータのkeyを埋め込む |
エラー
key | 型 | 詳細 |
---|---|---|
code | int32 | エラーコード |
message | string | 原因を説明するエラーメッセージ |
sample request
curl -L -X POST 'https://open-api.tiktok.com/user/info/' \
-H 'Content-Type: application/json' \
--data-raw '{
"access_token": "act.1a4b9d05d9ad1a56294b93b5609cdfbdNzQgbpbUWyFNvhC9QqIvKEjuuPHn",
"open_id": "723f24d7-e717-40f8-a2b6-cb8464cd23b4",
"fields": ["open_id", "union_id", "avatar_url", "display_name"]
}'
(success)sample response
{
"data": {
"user": {
"open_id": "723f24d7-e717-40f8-a2b6-cb8464cd23b4",
"union_id": "12345678-e717-40f8-a2b6-abcdefghijkl",
"avatar_url": "https://hoge.com/hoge/hogehoge.webp?hogehoge",
"display_name": "sample_user",
}
},
"error": {
"code": 0,
"message": ""
}
}
Video List
対象のユーザーが投稿した動画を取得できる。詳細はコチラから
POST+bodyでリクエストするパターンと、GET+クエリストリングでリクエストするパターンがあります。
取得できるデータとしてはPOST+bodyの方が多かったので、今回はそちらを使います。
取得できるデータ
key | 型 | 詳細 |
---|---|---|
create_time | int64 | TikTok動画が投稿された時刻のUTC UnixTime(秒単位) |
cover_image_url | string | 動画のカバー画像のCDNリンク。画像は静止。信頼と安全に関するポリシーにより、このリンクのTTLは6時間 |
share_url | string | TikTok動画のシェア可能なリンク。モバイル端末とデスクトップ端末では挙動が異なるので注意 |
video_description | string | クリエイターがTikTok動画に設定した説明文 |
duration | int32 | TikTok動画の再生時間(秒) |
height | int32 | TikTok動画の高さ |
width | int32 | TikTok動画の横幅 |
id | string | TikTok動画の一意な識別子 |
title | string | 動画のタイトル |
embed_html | string | 動画の埋め込み用html |
embed_link | string | 動画の埋め込みリンク |
like_count | int32 | 動画の「いいね!」数 |
comment_count | int32 | 動画のコメント数 |
share_count | int32 | 動画のシェア数 |
view_count | int64 | 動画の再生回数 |
リクエストパラメータ
key | 型 | 詳細 |
---|---|---|
open_id | string | TikTokユーザの一意な識別子で、/oauth/access_token/で取得 |
access_token | string | TikTokユーザの認可を表すトークンで、/oauth/access_token/を通じて取得 |
cursor | int64 | ページネーション用のカーソル。has_moreがtrueの場合、次のリクエストにcursorを渡すと、次のページの結果が得られる |
max_count | int32 | 各ページから返されるビデオの最大数。デフォルトは10。最大値は20 |
fields | string | video/list/ で取得できるフィールドのセット。上記の取得できるデータのkeyを埋め込む |
エラー
key | 型 | 詳細 |
---|---|---|
code | int32 | エラーコード |
message | string | 原因を説明するエラーメッセージ |
log_id | string | ログデータをトレースするためのログID |
sample request
curl -L -X POST 'https://open-api.tiktok.com/video/list/' \
-H 'Content-Type: application/json' \
--data-raw '{
"access_token": "act.1a4b9d05d9ad1a56294b93b5609cdfbdNzQgbpbUWyFNvhC9QqIvKEjuuPHn",
"open_id": "723f24d7-e717-40f8-a2b6-cb8464cd23b4",
"cursor": 0,
"max_count": 10,
"fields": ["embed_html", "embed_link", "share_count"]
}'
(success)sample response
{
"data": {
"videos": [
{
"embed_html": "<blockquote class=\"tiktok-embed\" cite=\"https://www.tiktok.com/@hogehoge/video/hogehoge?hogehoge" data-video-id=\"hoge\" style=\"hoge" > <section> <a target=\"_blank\" title=\"@hogehoge\" href=\"https://www.tiktok.com/@hoge\">@hoge</a> <p><a title=\"hoeeee\" target=\"_blank\" href=\"https://www.tiktok.com/tag/hogehoge\">#hogeee</a> <a title=\"pogee\" target=\"_blank\" href=\"https://www.tiktok.com/tag/hogehoge\">#poeee</a></p> <a target=\"_blank\" title=\"hoeeee\" href=\"https://www.tiktok.com/music/poeeee\">poeeee</a> </section> </blockquote> <script async src=\"https://www.tiktok.com/embed.js\"></script>",
"embed_link": "https://www.tiktok.com/embed/v2/ueeeee",
"share_count": 20
}
],
"cursor": 1633013437000,
"has_more": false
},
"error": {
"code": 0,
"message": ""
}
}
Video Query
対象のユーザーが投稿した動画のIDを指定することで動画情報を取得できる。詳細はコチラから
Video Listと取得できるデータは同じですが、取得方法として video_ids を指定しています。
取得できるデータ
key | 型 | 詳細 |
---|---|---|
create_time | int64 | TikTok動画が投稿された時刻のUTC UnixTime(秒単位) |
cover_image_url | string | 動画のカバー画像のCDNリンク。画像は静止。信頼と安全に関するポリシーにより、このリンクのTTLは6時間 |
share_url | string | TikTok動画のシェア可能なリンク。モバイル端末とデスクトップ端末では挙動が異なるので注意 |
video_description | string | クリエイターがTikTok動画に設定した説明文 |
duration | int32 | TikTok動画の再生時間(秒) |
height | int32 | TikTok動画の高さ |
width | int32 | TikTok動画の横幅 |
id | string | TikTok動画の一意な識別子 |
title | string | 動画のタイトル |
embed_html | string | 動画の埋め込み用html |
embed_link | string | 動画の埋め込みリンク |
like_count | int32 | 動画の「いいね!」数 |
comment_count | int32 | 動画のコメント数 |
share_count | int32 | 動画のシェア数 |
view_count | int64 | 動画の再生回数 |
リクエストパラメータ
key | 型 | 詳細 |
---|---|---|
open_id | string | TikTokユーザの一意な識別子で、/oauth/access_token/で取得 |
access_token | string | TikTokユーザの認可を表すトークンで、/oauth/access_token/を通じて取得 |
filter | object | フィールド指定。未来系で指定できるfield増えるんかな。今は一つ。 video_ids: set<string> 一度に最大 20 個のビデオ ID を指定できる |
fields | string | video/query/ で取得できるフィールドのセット。上記の取得できるデータのkeyを埋め込む |
エラー
key | 型 | 詳細 |
---|---|---|
code | int32 | エラーコード |
message | string | 原因を説明するエラーメッセージ |
log_id | string | ログデータをトレースするためのログID |
sample request
curl -L -X POST 'https://open-api.tiktok.com/video/query/' \
-H 'Content-Type: application/json' \
--data-raw '{
"access_token": "act.1a4b9d05d9ad1a56294b93b5609cdfbdNzQgbpbUWyFNvhC9QqIvKEjuuPHn",
"open_id": "723f24d7-e717-40f8-a2b6-cb8464cd23b4",
"filters": {
"video_ids": ["6948568030997662982"]
},
"fields": ["embed_html", "embed_link"]
}'
sample response
{
"data": {
"videos": [
{
"embed_html": "<blockquote class=\"tiktok-embed\" cite=\"https://www.tiktok.com/@hogehoge/video/hogehoge?hogehoge" data-video-id=\"hoge\" style=\"hoge" > <section> <a target=\"_blank\" title=\"@hogehoge\" href=\"https://www.tiktok.com/@hoge\">@hoge</a> <p><a title=\"hoeeee\" target=\"_blank\" href=\"https://www.tiktok.com/tag/hogehoge\">#hogeee</a> <a title=\"pogee\" target=\"_blank\" href=\"https://www.tiktok.com/tag/hogehoge\">#poeee</a></p> <a target=\"_blank\" title=\"hoeeee\" href=\"https://www.tiktok.com/music/poeeee\">poeeee</a> </section> </blockquote> <script async src=\"https://www.tiktok.com/embed.js\"></script>",
"embed_link": "https://www.tiktok.com/embed/v2/ueeeee"
}
],
"cursor": 0,
"has_more": false
},
"error": {
"code": 0,
"message": ""
}
}
Access Token
認可コードのコールバックが処理されると、そのコードを使用してユーザーのアクセストークンを取得できる。詳細はコチラから
取得できるデータ
key | 型 | 詳細 |
---|---|---|
open_id | int64 | TikTokのユーザー固有の識別子 |
scope | string | ユーザーが認可することに同意したスコープをカンマ(,)区切りで指定 |
access_token | string | 今後、ユーザーの代わりに呼び出すためのアクセストークン |
expires_in | string | access_tokenの有効期限(秒)。最初の付与から24時間有効 |
refresh_token | int32 | access_tokenをリフレッシュするためのトークン。有効期限は初期付与から365日間 |
refresh_expires_in | int32 | refresh_tokenの有効期限(秒) |
〈〈 クエリストリング 〉〉 のリクエストパラメータ
key | 型 | 詳細 |
---|---|---|
client_key | string | パートナーに提供される固有の識別キー |
client_secret | string | パートナーに提供されるユニークなIDシークレット |
code | string | Web/iOS/Android 認証コールバックから取得した認証コード |
grant_type | string | この値は常にauthorization_codeとして設定 |
sample request
curl -L -X GET 'https://open-api.tiktok.com/oauth/access_token/?client_key=abcdefghijklmnop&client_secret=abcdefghijklmnopqrstu&code=abcdefghijklmnopqrstuvwxyz&grant_type=authorization_code'
sample response
{
"data": {
"access_token": "act.1a4b9d05d9ad1a56294b93b5609cdfbdNzQgbpbUWyFNvhC9QqIvKEjuuPHn",
"captcha": "",
"desc_url": "",
"description": "",
"error_code": 0,
"expires_in": 86400,
"log_id": "20220207AAAAAAAAAABBBBBBBBBBCCCCCC",
"open_id": "723f24d7-e717-40f8-a2b6-cb8464cd23b4",
"refresh_expires_in": 31536000,
"refresh_token": "rft.2b138a0dca4d8cdf0e2413d789347cedD4KibQjWrbWEM3imrgqpZnu3GKsy",
"scope": "user.info.basic,video.list"
},
"message": "success"
}
Refresh Access Token
取得したaccess_tokenは24時間以内に失効するが、ユーザーの同意なしにリフレッシュ可能。詳細はコチラから
取得できるデータ
key | 型 | 詳細 |
---|---|---|
open_id | string | パートナー向けのユーザーID |
scope | string | ユーザーが認可することに同意したスコープをカンマ(,)区切りで指定 |
access_token | string | 今後、ユーザーの代わりに呼び出すための新しいトークン |
expires_in | string | アクセストークンの有効期限(秒) |
refresh_token | string | access_tokenをリフレッシュするためのトークン |
refresh_expires_in | string | refresh_tokenの有効期限(秒) |
〈〈 クエリストリング 〉〉 のリクエストパラメータ
key | 型 | 詳細 |
---|---|---|
client_key | string | パートナーに提供される固有の識別キー |
grant_type | string | この値は常にauthorization_codeとして設定 |
refresh_token | string | oauth/access_token/エンドポイントから受け取ったユーザーのrefresh_token |
sample request
curl -L -X GET 'https://open-api.tiktok.com/oauth/refresh_token/?client_key=abcdefghijklmnop&grant_type=refresh_token&refresh_token=rft.2b138a0dca4d8cdf0e2413d789347cedD4KibQjWrbWEM3imrgqpZnu3GKsy'
sample response
{
"data": {
"access_token": "act.1a4b9d05d9ad1a56294b93b5609cdfbdNzQgbpbUWyFNvhC9QqIvKEjuuPHn",
"captcha": "",
"desc_url": "",
"description": "",
"error_code": 0,
"expires_in": 86400,
"log_id": "20220207AAAAAAAAAABBBBBBBBBBCCCCCC",
"open_id": "723f24d7-e717-40f8-a2b6-cb8464cd23b4",
"refresh_expires_in": 31536000,
"refresh_token": "rft.2b138a0dca4d8cdf0e2413d789347cedD4KibQjWrbWEM3imrgqpZnu3GKsy",
"scope": "user.info.basic,video.list"
},
"message": "success"
}
Revoke Access Token
ユーザーが対象のアプリケーションとTikTok連携を解除したい場合、access_tokenを取り消すことで、TikTok内の「アプリの権限を管理」ページで対象のアプリケーションが非表示になる。詳細はコチラから
取得できるデータ
key | 型 | 詳細 |
---|---|---|
error_code | string | エラーコード |
description | string | エラーコードの詳細 |
〈〈 クエリストリング 〉〉 のリクエストパラメータ
key | 型 | 詳細 |
---|---|---|
open_id | string | TikTokユーザーの一意な識別子。/oauth/access_token/ユーザーの一意なトークンを介して取得 |
access_token | string | TikTokユーザーの認証を担うトークン。/oauth/access_token/ このトークンにはユーザーの認証が必要 |
sample request
curl -L -X GET 'https://open-api.tiktok.com/oauth/revoke/?open_id=723f24d7-e717-40f8-a2b6-cb8464cd23b4&access_token=act.1a4b9d05d9ad1a56294b93b5609cdfbdNzQgbpbUWyFNvhC9QqIvKEjuuPHn'
sample response
{
"data": {
"captcha": "",
"desc_url": "",
"description": "",
"error_code": 0,
"log_id": "20220207AAAAAAAAAABBBBBBBBBBCCCCCC"
},
"message": "success"
}
Embbed URL
Embedded Videosは、TikTokのビデオを記事やウェブサイトに埋め込むことができる。※承認系は不必要。
Embedded for developers
プログラム上では、oEmbed API を使用して、TikTok のビデオ URL を埋め込みビデオ マークアップに変換することができる。これにより、提供されたウェブページのリンクに関連付けられたビデオの埋め込みコードと追加情報を取得できる詳細はコチラから
sample request
https://www.tiktok.com/oembed?url=https://www.tiktok.com/@scout2015/video/6718335390845095173
sample 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"
}
Webhooks
Webhookは、TikTokでイベントが発生したときに、コールバックURL経由でアプリケーションに通知するサブスクリプション。API経由で情報を引き出す必要があるのではなく、Webhookを使うことで発生したイベントの情報を取得することができる。通知は、Developer Portal でアプリに設定したコールバック URL に JSON 形式で HTTPS POST で配信される。この情報は、システムの更新やビジネスプロセスのトリガーに利用できる。
Webhook events
Webhookを使うと、イベントを購読して、イベントが発生したときに通知を受け取ることができる。詳細はコチラから
取得できるデータ
key | 型 | 詳細 |
---|---|---|
client_key | string | パートナーに提供される固有の識別キー |
event | string | イベント名 |
create_time | string | イベントが発生した時刻。UTCエポックタイムが秒単位で表示 |
user_openid | string | TikTokユーザーの一意な識別子。/oauth/access_token/を通じて取得 |
content | string | イベント情報(以下のreason keyも含まれる)のJSON文字列をシリアライズしたもの |
reason | string | 0 = 不明 1 = ユーザーがTikTokアプリから切断された場合 2 = ユーザーアカウントが削除された 3 = ユーザーの年齢が変わった 4 = ユーザーアカウントが使用禁止になった 5 = デベロッパーの権限剥奪 |
sample request①
{
"client_key": "bwo2m45353a6k85",
"event": "authorization.removed",
"create_time": 1615338610,
"user_openid": "act.acv4fasd234asd1c123124asda",
"content": "{\"reason\": 1 }"
}
sample request②
{
"client_key": "bwo2m45353a6k85",
"event": "video.upload.failed",
"create_time": 1615338610,
"user_openid": "act.acv4fasd234asd1c123124asda",
"content":"{\"share_id\":\"video.6974245311675353080.VDCxrcMJ\"}"
}
sample request③
{
"client_key": "bwo2m45353a6k85",
"event": "video.publish.completed",
"create_time": 1615338610,
"user_openid": "act.acv4fasd234asd1c123124asda",
"content":"{\"share_id\":\"video.6974245311675353080.VDCxrcMJ\"}"
}
Check the signature
これは実際に試していないので、読んだ解釈を載せております。誤認であればご教授いただきたいです。
TikTokのWebhookは、送信先のサーバーが、そのベントが第三者や悪意のあるシステムではなく、TikTokから来たものであることを確認するための署名付きで送信される。各ウェブフックイベントを処理する前に、ウェブフック消費者がこれらの署名を検証することは強くお勧め。
中間者攻撃やリプレイ攻撃からアプリケーションを保護するために、アプリケーションに送信されるメッセージの署名を検証する必要がある。このタイムスタンプは署名されたペイロードの一部であるため、攻撃者は署名を無効化せずにタイムスタンプを変更することはできない。署名は有効だがタイムスタンプが古すぎる場合、アプリケーションにペイロードを拒否させることができる。
署名はTikTok-Signatureとしてヘッダに含まれる。
Example of TikTok-Signature
"Tiktok-Signature": "t=1633174587,s=18494715036ac4416a1d0a673871a2edbcfc94d94bd88ccd2c5ec9b3425afe66"
Signature Verification
step1. ヘッダーからタイムスタンプと署名を抽出
ヘッダを文字を区切り文字として分割し、要素のリストを取得し。次に、各要素を = 文字をセパレータとして分割し、接頭辞と値のペアを取得。
プレフィックスの値tはタイムスタンプに、sはシグネチャに対応する。
上記の例で言う以下の部分
1. t=1633174587,s=18494715036ac4416a1d0a673871a2edbcfc94d94bd88ccd2c5ec9b3425afe66
2. {"t": 1633174587, "s": "18494715036ac4416a1d0a673871a2edbcfc94d94bd88ccd2c5ec9b3425afe66"}
step2. 署名生成
signed_payload
は、連結して作成することができる。
- 文字列としてのタイムスタンプ
.
- 実際のJSONペイロード(リクエストボディ)
client_secret
をkey、signed_payload
をメッセージとして、SHA256ハッシュ関数によるHMACが計算されます。
説明で言っていることは多分こうゆうこと
1. 取得できたデータのペイロードに含まれるcreate_time(?) → "1633174587"
2. 文字列の.を生成 → "."
3. 取得できたデータのペイロード → {"hoge":"hoge"}
4. 上記3つの文字列を連結 → "1633174587.{"hoge":"hoge"}" → "signed_payload"
5. パートナーに提供されるユニークなIDシークレット(client_secret)をkey、signed_payloadをmessageとしてHMAC-SHA256でhash化
step3. 署名生成
ヘッダ中の署名と生成された署名を比較。両者が等しい場合、現在のタイムスタンプとヘッダーの受信タイムスタンプの差を計算。この差分が許容範囲内かどうかを判断するために使用。
説明で言っていることは多分こうゆうこと
1. HMAC-SHA256でhash化したものと、リクエストのヘッダーに載ってる`Tiktok-Signature`を比較
2. 自分のサーバーでタイムスタンプを生成 & ペイロードに存在するタイムスタンプと比較して許容範囲なら
3. それは正しいwebhookと判定する
developers登録手順
公式のTikTok APIを使うにはメールアドレス登録とアプリの認証が必要となります。
メールアドレス登録
- https://developers.tiktok.com/ へアクセス
- 右上のLog inをクリック
- Log inモーダルが表示されるので、Sign upへ移動
- メールアドレスを入力して、メールを送信する
- メールに書かれているpin codeを入力して本人確認を行う
- 完了!
アプリの認証
アプリの認証ありきのAPIになるので、申請が必要になります。
アプリの画像と名前を登録
右上の My appsから [Connect a new app]を押します。
すると、画像と名前を登録する欄が出てくるので、これを登録します。
アプリの詳細情報を入力
- Platformを選択(必須): Web or Mobile
- App Name(必須): アプリの名前
- Description(必須): アプリの詳細(例: 色々なことを発信・実践していくサイトで僕は通った)
- Category(必須): サービスのカテゴリ
- Official website(必須): アプリのオフィシャルウェブサイト
- Privacy Policy(必須): アプリのプライバシーポリシーが載っているリンク
- Term of Service(必須): 利用規約が載っているリンク
- Callback URL: Webhookを飛ばす先
- Redirect Domain(必須): localhostでは通らない。〜.comを書いてください。
- Permission: user.info.basic(必須), share.sound.create, video.list, video.upload
- Reason for using(必須): 使う理由。「このAPIを試したかったから」的なニュアンスで英語書いたら通った。
- これで後日、申請が通ったら、晴れて「Client Key」と「Client Secret」が手に入る!
アクセストークン取得方法
ユーザーのアクセストークンを取得しない限り、ユーザーに関する情報を取得できません。詳細はコチラ
リダイレクトURLでユーザーに対象のアプリを承認してもらう
- client key: hoge
- client secret: hoge_secret
- scope: user.info.basic,video.list
- redirect_uri: https://sample.com
例えば上記の条件だとすると、
https://open-api.tiktok.com/platform/oauth/connect/?client_key=hoge8&scope=user.info.basic,video.list&response_type=code&redirect_uri=https://sample.com&state=random_namoziretsu
response_type=code
は必須。
state=random_namoziretsu
はcsrfのために使うので各々で定義してください。
そして上記のリンクにアクセスしてもらえるように、ボタンを作ってあげます。
すると以下の画面へ遷移します!
そしてアクセスを許可してもらえると、以下のようなリンクにユーザーがリダイレクトされます。
https://sample.com/?code=hugahugahuga&scopes=user.info.basic%2Cvideo.list&state=random_namoziretsu
そして、リダイレクトでリクエストが来るクエリパラメータのcode
を使って、
アクセストークンを取得します。
先程のAccess Tokenの章で話した通り、以下のようにGETを叩きます。詳細はAccess Tokenの章をご参照ください。
https://open-api.tiktok.com/oauth/access_token/?client_key=hoge&client_secret=hoge_secret&code=hugahugahuga&grant_type=authorization_code
すると以下のようにaccess_tokenが得られるはずです!
{
"data": {
"access_token": "act.1a4b9d05d9ad1a56294b93b5609cdfbdNzQgbpbUWyFNvhC9QqIvKEjuuPHn",
"captcha": "",
"desc_url": "",
"description": "",
"error_code": 0,
"expires_in": 86400,
"log_id": "20220207AAAAAAAAAABBBBBBBBBBCCCCCC",
"open_id": "723f24d7-e717-40f8-a2b6-cb8464cd23b4",
"refresh_expires_in": 31536000,
"refresh_token": "rft.2b138a0dca4d8cdf0e2413d789347cedD4KibQjWrbWEM3imrgqpZnu3GKsy",
"scope": "user.info.basic,video.list"
},
"message": "success"
}
さいごに
楽しいTikTok Lifeをお過ごしください!