twitscrape
A Python library for interacting with Twitter/X — no API key required.
Uses cookie-based authentication and browser-level HTTP fingerprinting (curl_cffi) to bypass connection issues that affect standard httpx clients.
Features
- No API key required
- Cookie-based auth — paste cookies from your browser, no login flow needed
- Supports 4 cookie input formats
- Async API built on
twikitinternals
Install
pip install twitscraper
Getting your cookies
- Open x.com and log in
- Open DevTools → Application → Cookies →
https://x.com - Copy
auth_tokenandct0(minimum required)
Or use a browser extension like EditThisCookie or Cookie-Editor to export all cookies at once.
Quick start
From a dict
import asyncio
from twitscrape import create_client
async def main():
client = await create_client({
"auth_token": "your_auth_token",
"ct0": "your_ct0",
"twid": "u%3D123456789",
})
me = await client.user()
print(me.screen_name)
asyncio.run(main())
From a JSON file
from twitscrape import create_client_from_file
client = await create_client_from_file("cookies.json")
cookies.json:
{
"auth_token": "...",
"ct0": "...",
"twid": "u%3D123456789"
}
From a raw cookie string (Network tab)
from twitscrape import create_client_from_string
raw = "auth_token=abc123; ct0=xyz789; twid=u%3D123456789"
client = await create_client_from_string(raw)
From a browser extension export
from twitscrape import create_client_from_browser_export
# Paste the JSON array copied from EditThisCookie / Cookie-Editor
raw_json = '[{"name": "auth_token", "value": "...", "domain": ".x.com"}, ...]'
client = await create_client_from_browser_export(raw_json)
Examples
Search tweets
tweets = await client.search_tweet("python", "Latest")
for tweet in tweets:
print(tweet.user.screen_name, tweet.text)
Create a tweet
tweet = await client.create_tweet("Hello from twitscrape!")
Upload media
media_id = await client.upload_media("image.jpg")
await client.create_tweet("Tweet with image", media_ids=[media_id])
Send a DM
await client.send_dm("123456789", "Hello!")
Get trends
trends = await client.get_trends("trending")
for t in trends:
print(t.name)
Download tweet media
tweet = await client.get_tweet_by_id("tweet_id")
for i, media in enumerate(tweet.media):
if media.type == "photo":
await media.download(f"photo_{i}.jpg")
elif media.type == "video":
await media.streams[-1].download(f"video_{i}.mp4")
Listen for new tweets
import asyncio
from twitscrape import Tweet
async def on_new_tweet(tweet: Tweet):
print(f"New tweet: {tweet.text}")
USER_ID = "44196397"
before = (await client.get_user_tweets(USER_ID, "Tweets", count=1))[0]
while True:
await asyncio.sleep(60)
latest = (await client.get_user_tweets(USER_ID, "Tweets", count=1))[0]
if latest.id != before.id:
await on_new_tweet(latest)
before = latest
Rate limits
See ratelimits.md for per-endpoint limits (reset every 15 minutes).
License
MIT
Metadata
Release files for twitscraper 1.0.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| twitscraper-1.0.3.tar.gz | 78.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| twitscraper-1.0.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 165.0 kB
Release files / twitscraper-1.0.3.tar.gz
| Download URL | twitscraper-1.0.3.tar.gz |
|---|---|
| Size | 78.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
503fb38102cda5e466c6d3c1acfda1ac2ce5dd1c5de1071cdfe2fcf9094b4f68
|
|
BLAKE2b-256 checksum How to use checksums |
6b2e78cb9f0a98361d8a7216c4c7321d879a43c9e858805a9b53cfc8806472cd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.2
|
Release files / twitscraper-1.0.3-py3-none-any.whl
| Download URL | twitscraper-1.0.3-py3-none-any.whl |
|---|---|
| Size | 86.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
50677946760851361730037ed6a5d915720baabd8dd8cc43734a131bae7a20ef
|
|
BLAKE2b-256 checksum How to use checksums |
97d816c17ce18bd1e0adf04bb9dbbe82feaf81baad42e0c77529afb7adef990b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.2
|