このリポジトリには、リバースエンジニアリングスレッドアプリ中のメモと発見が含まれています。何か新しいものを見つけた場合は、PRをお気軽に、またはこの情報(クレジットOFCを使用)でクライアントを構築してください。
スレッドのWebバージョンは現在読み取られているため、認証や投稿についてはあまり学ぶことはできません。 MetaのリレーGraphQLクライアントを使用して、任意のクエリを許可するように構成されていると思われるバックエンド( threads.net/api/graphql )と通信します。これにより、フロントエンドのソースにある既存のクエリに限定されます。
注GraphQLバックエンドをクエリするときは、ユーザーエージェント(ここでは何でも機能しているように見える)を必ず設定し、
x-ig-app-idヘッダーを238260118697367に設定してください。
ドキュメントID:
23996318473300828変数:
userID(ユーザーのID)
curl --request POST
--url https://www.threads.net/api/graphql
--header ' user-agent: threads-client '
--header ' x-ig-app-id: 238260118697367 '
--header ' content-type: application/x-www-form-urlencoded '
--data ' variables={"userID":"314216"} '
--data doc_id=23996318473300828ドキュメントID:
6232751443445612変数:
userID(ユーザーのID)
curl --request POST
--url https://www.threads.net/api/graphql
--header ' user-agent: threads-client '
--header ' x-ig-app-id: 238260118697367 '
--header ' content-type: application/x-www-form-urlencoded '
--data ' variables={"userID":"314216"} '
--data doc_id=6232751443445612ドキュメントID:
6307072669391286変数:
userID(ユーザーのID)
curl --request POST
--url https://www.threads.net/api/graphql
--header ' user-agent: threads-client '
--header ' x-ig-app-id: 238260118697367 '
--header ' content-type: application/x-www-form-urlencoded '
--data ' variables={"userID":"314216"} '
--data doc_id=6307072669391286ドキュメントID:
5587632691339264変数:
postID(投稿のID)
curl --request POST
--url https://www.threads.net/api/graphql
--header ' user-agent: threads-client '
--header ' x-ig-app-id: 238260118697367 '
--header ' content-type: application/x-www-form-urlencoded '
--data ' variables={"postID":"3138977881796614961"} '
--data doc_id=5587632691339264ドキュメントID:
9360915773983802変数:
mediaID(投稿のID)
curl --request POST
--url https://www.threads.net/api/graphql
--header ' user-agent: threads-client '
--header ' x-ig-app-id: 238260118697367 '
--header ' content-type: application/x-www-form-urlencoded '
--data ' variables={"mediaID":"3138977881796614961"} '
--data doc_id=9360915773983802警告このエンドポイントは現在、2FAが有効になっていないアカウントに対してのみ機能します。
モバイルアプリは、認証のためにMetaのBloksフレームワーク(元々Instagram Lite用に構築された)を使用しています。
スレッドのBloksバージョンIDは00ba6fa565c3c707243ad976fa30a071a625f2a3d158d9412091176fe35027d8です。 Bloksでは、デバイスID(Shape ios-RANDOM | android-RANDOM RANDOMのランダムセットのランダムセット)を提供する必要があります。
curl --request POST
--url ' https://i.instagram.com/api/v1/bloks/apps/com.bloks.www.bloks.caa.login.async.send_login_request/ '
--header ' user-agent: Barcelona 289.0.0.77.109 Android '
--header ' sec-fetch-site: same-origin '
--header ' content-type: application/x-www-form-urlencoded; charset=UTF-8 '
--data ' params={"client_input_params":{"password":"$PASSWORD","contact_point":"$USERNAME","device_id":"$DEVICE_ID"},"server_params":{"credential_type":"password","device_id":"$DEVICE_ID"}} '
--data ' bloks_versioning_id=00ba6fa565c3c707243ad976fa30a071a625f2a3d158d9412091176fe35027d8 'このリクエストは、大きなJSONペイロードを返します。トークンは、弦楽器Bearer IGT:2:直後になり、160文字の長さである必要があります。
curl --request POST
--url ' https://i.instagram.com/api/v1/media/configure_text_only_post/ '
--header ' content-type: application/x-www-form-urlencoded; charset=UTF-8 '
--header ' user-agent: Barcelona 289.0.0.77.109 Android '
--header ' authorization: Bearer IGT:2:$TOKEN '
--header ' sec-fetch-site: same-origin '
--data ' signed_body=SIGNATURE.{"publish_mode":"text_post","text_post_app_info":"{"reply_control":0}","timezone_offset":"0","source_type":"4","_uid":"$USER_ID","device_id":"$DEVICE_ID","caption":"$POST_TEXT","device":{"manufacturer":"OnePlus","model":"ONEPLUS+A3003","android_version":26,"android_release":"8.1.0"}} ' スレッドは、Instagramで使用されている同じIDシステムを使用します。ユーザー名からIDに変換する最良のアプローチは、ユーザーのInstagramページ( instagram.com/:username )を要求し、応答HTMLを手動で解析することです。他の方法については、このstackoverflowの質問を参照してください。