Skip to main content

Twitter/X API wrapper with no API key required.

Project description

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 twikit internals

Install

pip install twitscraper

Getting your cookies

  1. Open x.com and log in
  2. Open DevTools → Application → Cookies → https://x.com
  3. Copy auth_token and ct0 (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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

twitscraper-1.0.1.tar.gz (47.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

twitscraper-1.0.1-py3-none-any.whl (54.3 kB view details)

Uploaded Python 3

File details

Details for the file twitscraper-1.0.1.tar.gz.

File metadata

  • Download URL: twitscraper-1.0.1.tar.gz
  • Upload date:
  • Size: 47.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.2

File hashes

Hashes for twitscraper-1.0.1.tar.gz
Algorithm Hash digest
SHA256 bd04c86d47436de72d2126a9733f4c7cead80d25e06ddde5459adc630bc46f85
MD5 857e18f5f988f5ab640bf79705f3e4d4
BLAKE2b-256 adf523b037362ca0c6566dc2c8b7ee99decda98ac7e88fe4136f3567f2a457dc

See more details on using hashes here.

File details

Details for the file twitscraper-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: twitscraper-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 54.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.2

File hashes

Hashes for twitscraper-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 7c372cc538b9a7de842e0713e627d55e1034ab8b7181665f3f72d7a7c3d5bdac
MD5 2331e429af75e6ce2d18a2ad08c6231c
BLAKE2b-256 ca2a85f7379555331cc7f15c9c4f46f02e9902b05d4fbf2f56f227372d25bbe7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page