Twitter (selfbot) for Python!


Install
pip install tweepy-self==1.11.1

Documentation

Tweepy-self

Telegram channel PyPI version info PyPI supported Python versions PyPI downloads per month

A modern, easy to use, feature-rich, and async ready API wrapper for Twitter's user API written in Python.

NEW! ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠ² с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…:

More libraries of the family:

ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ спасибо ΠšΡƒΠ·Π½ΠΈΡ†Π΅ Π‘ΠΎΡ‚ΠΎΠ² Π·Π° ΠΊΠΎΠ΄ для Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Ρ€Π°Π·ΠΌΠΎΡ€ΠΎΠ·ΠΊΠΈ! ΠŸΠΎΠ΄ΠΏΠΈΡΡ‹Π²Π°ΠΉΡ‚Π΅ΡΡŒ Π½Π° ΠΈΡ… Telegram :)

ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ:

Key Features

  • Modern Pythonic API using async and await.
  • Prevents user account automation detection.

Installing

pip install tweepy-self

Example

import asyncio
import twitter

twitter_account = twitter.Account(auth_token="auth_token")

async def main():
    async with twitter.Client(twitter_account) as twitter_client:
        print(f"Logged in as @{twitter_account.username} (id={twitter_account.id})")
        tweet = await twitter_client.tweet("Hello tweepy-self! <3")
        print(tweet)

if __name__ == "__main__":
    asyncio.run(main())

ДокумСнтация

НСкоторыС истины

ИмСна ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π‘Π•Π— Π·Π½Π°ΠΊΠ° @. Π§Ρ‚ΠΎΠ±Ρ‹ навСрняка ΡƒΠ±Ρ€Π°Ρ‚ΡŒ этот Π·Π½Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ twitter.utils.remove_at_sign()

Automating user accounts is against the Twitter ToS. This library is a proof of concept and I cannot recommend using it. Do so at your own risk

Как Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

import sys
from loguru import logger

logger.remove()
logger.add(sys.stdout, level="INFO")
logger.enable("twitter")

level="DEBUG" позволяСт ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ±ΠΎ всСх запросах.

Аккаунт

twitter.Account

Бтатусы Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π°

  • UNKNOWN - Бтатус Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° Π½Π΅ установлСн. Π­Ρ‚ΠΎ статус ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.
  • BAD_TOKEN - НСвСрный ΠΈΠ»ΠΈ ΠΌΠ΅Ρ€Ρ‚Π²Ρ‹ΠΉ Ρ‚ΠΎΠΊΠ΅Π½.
  • SUSPENDED - ДСйствиС ΡƒΡ‡Π΅Ρ‚Π½ΠΎΠΉ записи приостановлСно. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ запрос Π΄Π°Π½Π½Ρ‹Ρ…, Π° Ρ‚Π°ΠΊΠΆΠ΅ авторизация Ρ‡Π΅Ρ€Π΅Π· OAuth ΠΈ OAuth2.
  • LOCKED - УчСтная запись Π·Π°ΠΌΠΎΡ€ΠΎΠΆΠ΅Π½Π° (Π»ΠΎΠΊ). Для Ρ€Π°Π·ΠΌΠΎΡ€ΠΎΠ·ΠΊΠΈ (Π°Π½Π»ΠΎΠΊ) трСбуСтся ΠΏΡ€ΠΎΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΏΡ‡ΠΈ (funcaptcha).
  • CONSENT_LOCKED - УчСтная запись Π·Π°ΠΌΠΎΡ€ΠΎΠΆΠ΅Π½Π° (Π»ΠΎΠΊ). Условия для Ρ€Π°Π·ΠΌΠΎΡ€ΠΎΠ·ΠΊΠΈ нСизвСстны.
  • GOOD - Аккаунт Π² порядкС.

ΠœΠ΅Ρ‚ΠΎΠ΄ Client.establish_status() устанавливаСт статус Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π°. Π’Π°ΠΊΠΆΠ΅ статус Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ любоС взаимодСйствиС с Twitter. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ сСмСйства twitter.errors.BadAccount.

НС ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ взаимодСйствиС с Twitter достовСрно опрСдСляСт статус Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π°. НапримСр, простой запрос Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ± Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π΅ чСстно Π²Π΅Ρ€Π½Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ статус, Π΄Π°ΠΆΠ΅ Ссли дСйствиС вашСй ΡƒΡ‡Π΅Ρ‚Π½ΠΎΠΉ записи приостановлСно (SUSPENDED).

ΠšΠ»ΠΈΠ΅Π½Ρ‚

twitter.Client

Настройка

ΠšΠ»ΠΈΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сконфигурирован ΠΏΠ΅Ρ€Π΅Π΄ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ. Он ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² сСбя ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • wait_on_rate_limit Если Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ, Ρ‚ΠΎ ΠΏΡ€ΠΈ достиТСнии Rate Limit Π±ΡƒΠ΄Π΅Ρ‚ ΠΆΠ΄Π°Ρ‚ΡŒ, вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.
  • capsolver_api_key API ΠΊΠ»ΡŽΡ‡ сСрвиса CapSolver. НуТСн для автоматичСской Ρ€Π°Π·ΠΌΠΎΡ€ΠΎΠ·ΠΊΠΈ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π°.
  • max_unlock_attempts МаксимальноС количСство ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ Ρ€Π°Π·ΠΌΠΎΡ€ΠΎΠ·ΠΊΠΈ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π°. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: 5.
  • auto_relogin Если Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ, Ρ‚ΠΎ ΠΏΡ€ΠΈ Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΠΎΠΌ Ρ‚ΠΎΠΊΠ΅Π½Π΅ (BAD_TOKEN) ΠΈ прСдоставлСнных Π΄Π°Π½Π½Ρ‹Ρ… для Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ (имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΈ totp_secret) Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ автоматичСский Ρ€Π΅Π»ΠΎΠ³ΠΈΠ½ (Π·Π°ΠΌΠ΅Π½Π° Ρ‚ΠΎΠΊΠ΅Π½Π°). Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.
  • update_account_info_on_startup Если Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ, Ρ‚ΠΎ Π½Π° стартС Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π° информация ΠΎΠ± Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ установлСн Π΅Π³ΠΎ статус. Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.
  • **session_kwargs Π›ΡŽΠ±Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ сСссия curl_cffi.requests.AsyncSession. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ proxy.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ настройки ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°:

async with twitter.Client(
    twitter_account,
    capsolver_api_key="CAP-00000000000000000000000000000000",
    proxy="http://login:password@ip:port",  # МоТно ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² любом Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° better_proxy
) as twitter_client:
    ...

ДоступныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹

Бписок всСх ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².

Запрос ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ собствСнном Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π΅

twitter_client.update_account_info()
print(twitter_client.account)

Запрос ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΠΎ username ΠΈΠ»ΠΈ ΠΏΠΎ ID

bro = twitter_client.request_user_by_username(bro_username)
bro = twitter_client.request_user_by_id(bro_id)
bros = twitter_client.request_users_by_ids([bro1_id, bro2_id, ...])

Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° изобраТСния Π½Π° сСрвСр, смСна Π°Π²Π°Ρ‚Π°Ρ€ΠΊΠΈ ΠΈ Π±Π°Π½Π½Π΅Ρ€Π°

image = open("image.png", "rb").read()
media = await twitter_client.upload_image(image)
avatar_image_url = await twitter_client.update_profile_avatar(media.id)
banner_image_url = await twitter_client.update_profile_banner(media.id)

ИзмСнСния Π΄Π°Π½Π½Ρ‹Ρ… профиля

await twitter_client.update_birthdate(day=1, month=12, year=2000)
await twitter_client.update_profile(  # Locks account!
    name="New Name",
    description="New description",
    location="New York",
    website="https://github.com/alenkimov/tweepy-self",
)

Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ TOTP (2FA)

if await twitter_client.totp_is_enabled():
    print(f"TOTP ΡƒΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½.")
    return

await twitter_client.enable_totp()

Π›ΠΎΠ³ΠΈΠ½, Ссли Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ TOTP (2FA)

import twitter

twitter_account = twitter.Account(auth_token="...", username="...", password="...", totp_secret="...")
await twitter_client.login()
print(f"Logged in! New auth_token: {twitter_account.auth_token}")

Π‘ΠΌΠ΅Π½Π° ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ пароля

twitter_account = twitter.Account("auth_token", password="password")
...
await twitter_client.change_username("new_username")
await twitter_client.request_user()
print(f"New username: {twitter_account.username}")

await twitter_client.change_password("new_password")
print(f"New password: {twitter_account.password}")
print(f"New auth_token: {twitter_account.auth_token}")

Авторизация с OAuth

auth_code = await twitter_client.oauth(oauth_token, **oauth_params)

Авторизация с OAuth2

# Π˜Π·ΡƒΡ‡ΠΈΡ‚Π΅ запросы сСрвиса ΠΈ Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ для Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ (привязки):
oauth2_data = {
    'response_type': 'code',
    'client_id': 'TjFVQm52ZDFGWEtNT0tKaktaSWU6MTpjaQ',
    'redirect_uri': 'https://waitlist.lens.xyz/tw/',
    'scope': 'users.read tweet.read offline.access',
    'state': 'state',  # ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ статичным, Ρ‚Π°ΠΊ ΠΈ динамичСским.
    'code_challenge': 'challenge',
    'code_challenge_method': 'plain'
}

auth_code = await twitter_client.oauth2(**oauth2_data)
# ΠŸΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ ΠΊΠΎΠ΄ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ (привязки) сСрвису.
# БСрвис Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ state, Ссли ΠΎΠ½ динамичСский.

ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСния:

bro = await twitter_client.request_user("bro_username")
await twitter_client.send_message(bro.id, "I love you!")

Запрос входящих сообщСний:

messages = await twitter_client.request_messages()
for message in messages:
    message_data = message["message_data"]
    recipient_id = message_data["recipient_id"]
    sender_id = message_data["sender_id"]
    text = message_data["text"]
    print(f"[id  {sender_id}] -> [id {recipient_id}]: {text}")

Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΠ½Π΅ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с сообщСниями, я Π΅Ρ‰Π΅ Π½Π΅ сдСлал для этого ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ приходится Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со словарСм.

ΠŸΠΎΡΡ‚ (Ρ‚Π²ΠΈΡ‚)

tweet = await twitter_client.tweet("I love you tweepy-self! <3")
print(f"Π›ΡŽΠ±ΠΎΠ²ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½Π°! Tweet id: {tweet.id}")

Π›Π°ΠΉΠΊ, рСпост (Ρ€Π΅Ρ‚Π²ΠΈΡ‚), ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ (Ρ€Π΅ΠΏΠ»Π°ΠΉ)

# Π›Π°ΠΉΠΊ
print(f"Tweet {tweet_id} is liked: {await twitter_client.like(tweet_id)}")

# РСпост (Ρ€Π΅Ρ‚Π²ΠΈΡ‚)
print(f"Tweet {tweet_id} is retweeted. Tweet id: {await twitter_client.repost(tweet_id)}")

# ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚ (Ρ€Π΅ΠΏΠ»Π°ΠΉ)
print(f"Tweet {tweet_id} is replied. Reply id: {await twitter_client.reply(tweet_id, 'tem razΓ£o')}")

Π¦ΠΈΡ‚Π°Ρ‚Π°

tweet_url = 'https://twitter.com/CreamIce_Cone/status/1691735090529976489'
# Π¦ΠΈΡ‚Π°Ρ‚Π° (Quote tweet)
quote_tweet_id = await twitter_client.quote(tweet_url, 'oh....')
print(f"Quoted! Tweet id: {quote_tweet_id}")

Подписка ΠΈ отписка

# ΠŸΠΎΠ΄ΠΏΠΈΡΡ‹Π²Π°Π΅ΠΌΡΡ Π½Π° Илона Маска
print(f"@{elonmusk.username} is followed: {await twitter_client.follow(elonmusk.id)}")

# ΠžΡ‚ΠΏΠΈΡΡ‹Π²Π°Π΅ΠΌΡΡ ΠΎΡ‚ Илона Маска
print(f"@{elonmusk.username} is unfollowed: {await twitter_client.unfollow(elonmusk.id)}")

Π—Π°ΠΊΡ€Π΅ΠΏΠ»Π΅Π½ΠΈΠ΅ Ρ‚Π²ΠΈΡ‚Π°

pinned = await twitter_client.pin_tweet(tweet_id)
print(f"Tweet is pined: {pinned}")

Запрос своих ΠΈ Ρ‡ΡƒΠΆΠΈΡ… подписчиков

followers = await twitter_client.request_followers()
print("Π’Π²ΠΎΠΈ подписчики:")
for user in followers:
    print(user)
    
followings = await twitter_client.request_followings()
print(f"Π’Ρ‹ подписан Π½Π°:")
for user in followings:
    print(user)

bro_followers = await twitter_client.request_followers(bro_id)
print(f"ΠŸΠΎΠ΄ΠΏΠΈΡΡ‡ΠΈΠΊΠΈ Ρ‚Π²ΠΎΠ΅Π³ΠΎ Π±Ρ€ΠΎ (id={bro_id}):")
for user in bro_followers:
    print(user)

bro_followings = await twitter_client.request_followings(bro_id)
print(f"На Ρ‚Π²ΠΎΠ΅Π³ΠΎ Π±Ρ€ΠΎ (id={bro_id}) подписаны:")
for user in bro_followings:
    print(user)

ГолосованиС

vote_data = await twitter_client.vote(tweet_id, card_id, choice_number)
votes_count = vote_data["card"]["binding_values"]["choice1_count"]["string_value"]
print(f"Votes: {votes_count}")

Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΠ½Π΅ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с голосованиями, я Π΅Ρ‰Π΅ Π½Π΅ сдСлал для этого ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ приходится Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со словарСм.