我正在尝试编写一个与 TikTok 的 API 交互的 Python 脚本(错误)。我有一些代码似乎几乎可以工作,但 API 正在响应我的 access_token 请求,授权代码在生成代码后不久就已过期,因此我根本无法获取令牌。
我有以下代码用于获取授权 URL、从中获取身份验证代码并将其发送以交换访问令牌:
# API key details
token_url = "https://open.tiktokapis.com/v2/oauth/token/"
auth_url = "https://business-api.tiktok.com/portal/auth"
redirect_uri = "https://my_company_website/"
app_id = "xxxxxxxxxx"
secret_key = "yyyyyyyyyy"
def generate_auth_url():
csrf_state = secrets.token_hex(16)
params = {
'app_id': app_id,
'scope': 'user.info.basic',
'redirect_uri': redirect_uri,
'state': csrf_state,
}
url = auth_url + '?' + urllib.parse.urlencode(params)
return url, csrf_state
# Function to get the access token
def get_access_token(authorization_code):
data = {
'client_key': app_id,
'client_secret': secret_key,
'code': authorization_code,
'grant_type': 'authorization_code',
'redirect_uri': redirect_uri
}
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
response = requests.post(token_url, headers=headers, data=urllib.parse.urlencode(data))
if response.status_code == 200:
return response.json()
else:
print(f"Error: Received status code {response.status_code}")
print(f"Response content: {response.content.decode()}")
return None
def manual_test():
# Generate authorization URL
print("Generating authorization URL...")
url, state = generate_auth_url()
print("URL:", url)
print("State:", state)
# Prompt user for the redirect URL
input_ = input("Paste the URL you were redirected to: ")
# Extract authorization code from redirect URL
code = input_.split("code=")[1].split("&")[0]
# Decode the code (THAT'S THE EDITING PART)
decoded_code = urllib.parse.unquote(code)
print("Code:", code)
print("Decoded Code:", decoded_code)
# Fetch access token without delay
print("Fetching access token...")
token_info = get_access_token(decoded_code)
print(token_info)
但是发送令牌请求会导致错误代码:
{'error': 'invalid_grant', 'error_description': 'Authorization code is expired.', 'log_id': '202312191447256251E59DA270380F9108'}
这完全是无稽之谈,因为根据其文档,授权代码应该持续 24 小时。
我知道两个请求中的参数不同(app_id 在访问令牌请求中变为 client_key,而在我的应用程序详细信息中,参数被称为 app_id 和 Secret,而不是 cleint_key 和 client_secret),但它需要在第一部分中引用 app_id 来获取授权 URL,在第二部分中使用除 client_key 和 client_secret 之外的任何参数名称会导致无效参数错误。这让我担心我使用了错误的 access_token URL,但根据 TikTok 的文档,不存在任何其他令牌 URL。
有谁知道这里出了什么问题吗?
我在使用 NodeJS 和 Axios 时遇到了同样的问题。试试这个:
token_url = "https://business-api.tiktok.com/open_api/v1.3/oauth2/access_token/"
data = {
'app_id': app_id,
'secret': secret_key,
'auth_code': authorization_code,
'grant_type': 'authorization_code', // you can remove this
'redirect_uri': redirect_uri // you can remove this
}
headers = {
'Content-Type': 'application/application/json'
}
response = requests.post(token_url, headers=headers, data=urllib.parse.urlencode(data))