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.3.tar.gz (78.3 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.3-py3-none-any.whl (86.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: twitscraper-1.0.3.tar.gz
  • Upload date:
  • Size: 78.3 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.3.tar.gz
Algorithm Hash digest
SHA256 503fb38102cda5e466c6d3c1acfda1ac2ce5dd1c5de1071cdfe2fcf9094b4f68
MD5 184646476a31a10bbae658942d2837df
BLAKE2b-256 6b2e78cb9f0a98361d8a7216c4c7321d879a43c9e858805a9b53cfc8806472cd

See more details on using hashes here.

File details

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

File metadata

  • Download URL: twitscraper-1.0.3-py3-none-any.whl
  • Upload date:
  • Size: 86.7 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.3-py3-none-any.whl
Algorithm Hash digest
SHA256 50677946760851361730037ed6a5d915720baabd8dd8cc43734a131bae7a20ef
MD5 ac803b5a7dfa850cc2652656e7a7414a
BLAKE2b-256 97d816c17ce18bd1e0adf04bb9dbbe82feaf81baad42e0c77529afb7adef990b

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