As of October 1st 2023 this repository is archived, and no longer be maintained.
Unofficial, Reverse-Engineered Python client for Meta's Threads.
Inspired by NPM Threads-API
Threads API is an unofficial Python client for Meta's Threads API. It allows you to interact with the API to login, read and publish posts, view who liked a post, retrieve user profile information, follow/unfollow and much more.
β
Configurable underlying HTTP Client (aiohttp / requests / instagrapi's client / implement your own)
β
Authentication Methods supported via instagrapi
β Stores token and settings locally, to reduce login-attempts (uses the same token for all authenticated requests for up to 24 hrs)
β Pydantic structures for API responses (for IDE auto-completion) (at types.py)
β Actively Maintained since Threads.net Release (responsive in Github Issues, try it out!)
Important Tip Use the same
cached_token_pathfor connections, to reduce the number of actual login attempts. When needed, threads-api will reconnect and update the file incached_token_path.
Table of content:
pip install threads-apior
poetry add threads-apiExample using threads-api to post to Threads.net:
from threads_api.src.threads_api import ThreadsAPI import asyncio import os from dotenv import load_dotenv load_dotenv() async def post(): api = ThreadsAPI() await api.login(os.environ.get('INSTAGRAM_USERNAME'), os.environ.get('INSTAGRAM_PASSWORD'), cached_token_path=".token") result = await api.post(caption="Posting this from the Danie1/threads-api!", image_path=".github/logo.jpg") if result: print("Post has been successfully posted") else: print("Unable to post.") await api.close_gracefully() async def main(): await post() # Run the main function asyncio.run(main())Each HTTP client brings to the table different functionality. Use whichever you like, or implement your own wrapper.
Usage:
api = ThreadsAPI(http_session_class=AioHTTPSession) # default # or api = ThreadsAPI(http_session_class=RequestsSession) # or api = ThreadsAPI(http_session_class=InstagrapiSession)Threads-API reads the environment variable LOG_LEVEL and sets the log-level according to its value.
Possible values include: DEBUG, INFO, WARNING, ERROR, CRITICAL
Log Level defaults to WARNING when not set.
Useful to know:
# Set Info (Prints general flow) export LOG_LEVEL=INFO# Set Debug (Prints HTTP Requests + HTTP Responses) export LOG_LEVEL=DEBUGExample of Request when LOG_LEVEL=DEBUG
<---- START ----> Keyword arguments: [title]: ["PUBLIC REQUEST"] [type]: ["GET"] [url]: ["https://www.instagram.com/instagram"] [headers]: [{ "Authority": "www.threads.net", "Accept": "*/*", "Accept-Language": "en-US,en;q=0.9", "Cache-Control": "no-cache", "Content-Type": "application/x-www-form-urlencoded", "Origin": "https://www.threads.net", "Pragma": "no-cache", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "cross-site", "Sec-Fetch-User": "?1", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15", "X-ASBD-ID": "129477", "X-IG-App-ID": "238260118697367" }] <---- END ----> Upon unexpected error, or upon receiving an exception with: Oops, this is an error that hasn't yet been properly handled.\nPlease open an issue on Github at https://github.com/Danie1/threads-api.
Please open a Github Issue with all of the information you can provide, which includes the last Request and Response (Set LOG_LEVEL=DEBUG)
- β Pydantic typing API responses at types.py
- β
Login functionality, including 2FA π
- β Cache login token securely (reduce login requests / due to restrictive limits)
- β Saves settings locally, such as device information and timezone to use along your sessions
- β Read recommended posts from timeline (Requires Login π)
- β
Write Posts (Requires Login π)
- β Posts with just text
- β Posts and quote another post
- β Posts with text and an image
- β Posts with text and multiple images
- β Posts with text that shares a url
- β Repost a post
- β Reply to Posts
- β
Perform Actions (Requires Login π)
- β Like Posts
- β Unlike Posts
- β Delete post
- β Delete repost
- β Follow User
- β Unfollow User
- β Block User
- β Unblock User
- β Restrict User
- β Unrestrict User
- β Mute User
- β Unmute User
- β Search for users
- β Get Recommended Users
- β
Get Notifications (
replies/mentions/verified) - β Read a user's followers list
- β Read a user's following list
- β
Read Public Data
- β
Read a user_id (eg.
314216) via username(eg.zuck) - β Read a user's profile info
- β Read list of a user's Threads
- β Read list of a user's Replies
- β Read Post and a list of its Replies
- β View who liked a post
- β
Read a user_id (eg.
- β
CI/CD
- β GitHub Actions Pipeline
- β
HTTP Clients
- β AioHTTP
- β Requests
- β Instagrapi
View examples/public_api_examples.py for Public API code examples.
Run as:
python3 examples/public_api_examples.pyView examples/private_api_examples.py for Private API code examples. (π Requires Authentication π)
Run as:
USERNAME=<Instagram Username> PASSWORD=<Instagram Password> python3 examples/private_api_examples.py Note: At the end of the file you will be able to uncomment and run the individual examples with ease.
- π§ Share a video
- π§ Documentation Improvements
- π§ Add coverage Pytest + Coverage Widget to README
With Poetry (Recommended)
# Step 1: Clone the project git clone git@github.com:Danie1/threads-api.git # Step 2: Install dependencies to virtual environment poetry install # Step 3: Activate virtual environment poetry shellor
Without Poetry
# Step 1: Clone the project git clone git@github.com:Danie1/threads-api.git # Step 2: Create virtual environment python3 -m venv env # Step 3 (Unix/MacOS): Activate virtual environment source env/bin/activate # Unix/MacOS # Step 3 (Windows): Activate virtual environment .\env\Scripts\activate # Windows # Step 4: Install dependencies pip install -r requirements.txtThis project is licensed under the MIT license.
