Twitter (selfbot) for Python!
Project description
Tweepy-self
A modern, easy to use, feature-rich, and async ready API wrapper for Twitter's user API written in Python.
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 устанавливается статус аккаунта:
UNKNOWN
- Статус аккаунта не установлен. Это статус по умолчанию.BAD_TOKEN
- Неверный или мертвый токен.SUSPENDED
- Действие учетной записи приостановлено. Тем не менее возможен запрос данных, а также авторизация через OAuth и OAuth2.LOCKED
- Учетная запись заморожена (лок). Для разморозки (анлок) требуется прохождение капчи (funcaptcha).CONSENT_LOCKED
- Учетная запись заморожена (лок). Условия для разморозки неизвестны.GOOD
- Аккаунт в порядке.
Не каждое взаимодействие с Twitter достоверно определяет статус аккаунта. Например, простой запрос данных об аккаунте честно вернет данные, даже если действие вашей учетной записи приостановлено.
Для достоверной установки статуса аккаунта используйте метод Client.establish_status()
Настройка клиента
Класс 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for tweepy_self-1.10.0b8-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4197c225e7cda99cf07ccca94b86dd5eb33d3440864dd653f210dddad733fb44 |
|
MD5 | a00e9caeaff6ec1857df48315a0c1377 |
|
BLAKE2b-256 | 9bf5c4cc641deb6ec56434aa7a3cbb955079c6167885fb545322de0fccb53cc0 |