Skip to main content

Twitter (selfbot) for Python!

Project description

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}")

Так как мне почти не приходилось работать с голосованиями, я еще не сделал для этого удобных моделей. Поэтому приходится работать со словарем.

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

tweepy_self2-1.11.6.tar.gz (36.5 kB view details)

Uploaded Source

Built Distribution

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

tweepy_self2-1.11.6-py3-none-any.whl (37.5 kB view details)

Uploaded Python 3

File details

Details for the file tweepy_self2-1.11.6.tar.gz.

File metadata

  • Download URL: tweepy_self2-1.11.6.tar.gz
  • Upload date:
  • Size: 36.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.9.12 Darwin/24.0.0

File hashes

Hashes for tweepy_self2-1.11.6.tar.gz
Algorithm Hash digest
SHA256 051b7214507a4794ce34c504562e9cdc00694571bbfd75f921b2429870b5e928
MD5 6ae0db4e193b80de1e30931ed1fa492a
BLAKE2b-256 9963dd71a1a768faeb220aba252c19f8c48f376c0594fec245ce41ad078e29c7

See more details on using hashes here.

File details

Details for the file tweepy_self2-1.11.6-py3-none-any.whl.

File metadata

  • Download URL: tweepy_self2-1.11.6-py3-none-any.whl
  • Upload date:
  • Size: 37.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.9.12 Darwin/24.0.0

File hashes

Hashes for tweepy_self2-1.11.6-py3-none-any.whl
Algorithm Hash digest
SHA256 5cf6d5904a18796153eff9dec7f8ca675ceff908ad922bbd7aebd5601f61c94b
MD5 6ff72e79beffc664b422277bf04461d7
BLAKE2b-256 f6ea2c4a0a29ac5b0effadf4c45ac43953149e08825f824a1f92fd045f4c6ed0

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