Сейчас я работаю над ботом для Твиттера, используя Python и пакет Twikit. Цель состоит в том, чтобы нацелиться на конкретных пользователей и отправить им прямое сообщение (DM) только в том случае, если у них нет предыдущей истории DM.
Вот основная проблема: иногда я получаю следующую ошибку, когда пытаюсь отправить DM:
Код: Выделить всё
Error sending DM to : status: 403, message: "{"errors":[{"code":226,"message":"This request looks like it might be automated. To protect our users from spam and other malicious activity, we can't complete this action right now. Please try again later."}]}"
Контекст кода
Ниже приведен основной сегмент кода моего бота (упрощенный для удобства чтения):
Код: Выделить всё
import asyncio
import random
import string
async def main():
# Code to initialize and authenticate client
messages_sent = 0
for user_id in users_target:
print("********************************")
print("Message sent so far:", messages_sent)
# Generate a message with random characters at the end
textmessage = f"{base_message}{random.choice(string.ascii_lowercase)}.{random.choice(string.ascii_uppercase)}"
# Random delay between 10 and 15 seconds
random_delay = random.randint(10, 15)
print(f"Delay before checking DM history: {random_delay} seconds")
await asyncio.sleep(random_delay)
# Check DM history
print("User screen name:", user_id.screen_name, "User ID:", user_id.id)
has_dm = await has_dm_history(client, user_id)
print("Has DM history:", has_dm)
if not has_dm:
try:
# Delay before sending DM
random_delay_before_dm = random.randint(7, 15)
print(f"Delay before sending DM: {random_delay_before_dm} seconds")
await asyncio.sleep(random_delay_before_dm)
# Send the DM
await client.send_dm(user_id.id, textmessage)
messages_sent += 1
print(f"DM sent to user: {user_id}")
# Delay after each message
random_delay_afrmsg = random.randint(35, 40)
print(f"Delay after sending message: {random_delay_afrmsg} seconds")
await asyncio.sleep(random_delay_afrmsg)
# Longer delay after every 12 messages
if messages_sent % 12 == 0:
print("Sent 12 messages, waiting for 10 minutes.")
await countdown_sleep(DELAY_BETWEEN_12_MSGS)
except Exception as e:
print(f"Error sending DM to {user_id}: {e}")
# Delay after error
random_delay_on_error = random.randint(7, 10)
print(f"Delay after error: {random_delay_on_error} seconds")
await asyncio.sleep(random_delay_on_error)
print("********************************")
Несмотря на эти усилия, я все еще получаю ошибку 403 с кодом 226, что позволяет предположить, что механизм защиты от спама Twitter обнаруживает эти запросы как автоматизировано.
Вопросы к сообществу
- Существуют ли другие эффективные способы обхода этой ошибки?
- Есть ли у кого-нибудь опыт работы с Twikit и может ли он предложить дополнительные стратегии?
- Есть ли способ дальнейшей рандомизации процесса DM (возможно, другой подход к рандомизации сообщений)?
Стратегии, которые я уже пробовал
- Случайные задержки: добавление случайных задержек между различными этапами рабочего процесса DM, а также более длительная задержка после каждых 12 сообщений, чтобы избежать проблем с ограничением скорости.
- Рандомизация сообщений: добавление случайный символ (как в верхнем, так и в нижнем регистре) в конце каждого сообщения, чтобы оно выглядело менее предсказуемым.
Подробнее здесь: https://stackoverflow.com/questions/791 ... -the-looks