【Python】TikTokApi でセッション作成エラーが出るときの対処法

Python

症状

Pythonの TikTokApi ライブラリを使ったスクリプトを動かすと、セッション作成時に以下のいずれかのエラーが発生する。

パターン①

ERROR - Failed to create session: Timeout 30000ms exceeded.
=========================== logs ===========================
"commit" event fired
"domcontentloaded" event fired
"load" event fired
============================================================
playwright._impl._errors.TimeoutError: Timeout 30000ms exceeded.

パターン②

ERROR - Failed to create session: Page.evaluate: Execution context was destroyed, most likely because of a navigation

原因

どちらもエラーの本質は TikTokApi ライブラリのソースコード側 にある。

tiktok.py の内部でセッション作成時に以下の2つの問題がある。

  1. Playwright の wait_for_load_state("networkidle") がハードコードされており、TikTokページの広告・分析系通信が止まらないため30秒でタイムアウトする
  2. wait_for_load_state 完了直後にページのナビゲーション(リダイレクト等)が走り、その最中に page.evaluate が実行されてコンテキストが破壊される

解決方法:ライブラリのソースを2箇所修正する

1. 対象ファイルを開く

以下のパスにある tiktok.py をメモ帳やエディタで開く。

C:\Users\<ユーザー名>\AppData\Local\Programs\Python\Python311\Lib\site-packages\TikTokApi\tiktok.py

※ Pythonのバージョンや環境によってパスが異なる場合がある。仮想環境を使っている場合は venv\Lib\site-packages\TikTokApi\tiktok.py など。

2. wait_for_load_state を変更する(393行付近)

エディタの検索・置換(Ctrl+H)で以下のように変更する。

# 変更前
await page.wait_for_load_state("networkidle")

# 変更後
await page.wait_for_load_state("domcontentloaded")
await asyncio.sleep(3)

networkidle はTikTokページでは永遠に解決しないため domcontentloaded に変更する。さらに直後に3秒の待機を入れることで、ページのナビゲーション(リダイレクト等)が完全に落ち着いてから次の処理が走るようにする。

asyncio はライブラリ内でインポート済みのため追記不要。

3. 保存して再実行

ファイルを保存し、スクリプトを再実行する。セッションが正常に作成されるようになる。


注意点

  • ライブラリをアップデート(pip install --upgrade tiktok-api)すると、この変更は上書きされてリセットされる。アップデート後は再度同じ修正が必要。
  • セッションを繰り返し作成するような処理では、バッチ間に十分な待機時間(15秒以上)を設けるとより安定する。

まとめ

項目 内容
エラー原因① networkidle 待機がTikTokページで永遠に解決しない
エラー原因② ナビゲーション中に page.evaluate が実行されコンテキストが破壊される
修正箇所 TikTokApi/tiktok.py 393行付近の wait_for_load_state
修正内容 "networkidle""domcontentloaded" に変更し、直後に await asyncio.sleep(3) を追加
注意 ライブラリ更新時は再修正が必要

関連ソース

GitHub - davidteather/TikTok-Api: The Unofficial TikTok API Wrapper In Python
The Unofficial TikTok API Wrapper In Python. Contribute to davidteather/TikTok-Api development by creating an account on...

コメント

タイトルとURLをコピーしました