Telegram python bot блокировка

Bot API v3. Автоматизируем работу в группах

⁠⁠ С момента публикации предыдущего урока и по состоянию на момент написания этого, Telegram выпустил одно крупное обновление Bot API (3.0), а также несколько мелких (3.1-3.3). Сразу отмечу, ни отправка видеосообщений, ни платежи (по ним есть отличный пример в репозитории pyTelegramBotAPI), ни работа со стикерами рассмотрены не будут.

Удаляем сообщения

Начнём с того, что научим нашего бота в группе удалять сообщения, в которых есть ссылки. Добавим бота в группу и назначим его администратором с правом удаления и блокировки (пригодится позже).

Дабы избежать неприятных ситуаций, нам необходимо определить две вещи: в какой именно группе он будет удалять сообщения и как отличить сообщения с ссылками от всех остальных? Для начала узнаем и запишем куда-нибудь ID нашей группы. А что делать с ссылками? Неужели нам придётся использовать регулярные выражения, создавая себе ещё одну проблему? Конечно, нет! Все «особые» элементы, будь то ссылки, @юзернеймы, команды ботов и т.д. складываются в массив entities в объекте Message , нам остаётся лишь проверить тип объекта и решить, удалять конкретное сообщение или нет. За последнее отвечает метод delete_message , принимающий на вход два аргумента: ID чата и ID сообщения.

Перейдём непосредственно к коду. Дабы упростить себе жизнь, зададим нужные условия срабатывания (нужный ID чата и непустой массив entities) сразу в хэндлер, это сэкономит нам несколько лишних проверок.

GROUP_ID = -10012345 # Ваш ID группы @bot.message_handler(func=lambda message: message.entities is not None and message.chat.id == GROUP_ID) def delete_links(message): for entity in message.entities: # Пройдёмся по всем entities в поисках ссылок # url - обычная ссылка, text_link - ссылка, скрытая под текстом if entity.type in ["url", "text_link"]: # Мы можем не проверять chat.id, он проверяется ещё в хэндлере bot.delete_message(message.chat.id, message.message_id) else: return 

Запустим бота и попробуем отправить сообщение с ссылкой. Если вы всё сделали правильно, оно мгновенно исчезнет и в разделе «Недавние действия» (Recent Actions) появится запись об удалённом сообщении.

Читайте также:  Php session error log

Точно так же можно сделать удаление чего угодно: стикеров, репостов из неугодных каналов, матерных сообщений и т.д. Возможности (почти) безграничны!

Read-Only и прочие «мягкие» наказания

Представьте, что у вас есть группа, например, “Международный клуб любителей мяса”, в котором люди на разных языках делятся своими впечатлениями от поедания свинины, говядины, баранины и т.д.
Конечно, время от времени в чатик будут приходить вегетарианцы и высказывать недовольство, но так как мы терпеливые люди, не будем банить веганов, а просто запретим им писать сообщения некоторое время, дабы они успокоились и вели дискуссию в рамках тематики чата. Усложним себе задачу и будем оповещать пользователей о временном ограничении прав, исходя из их языковой принадлежности.

Начиная с Telegram 4.1, у администраторов групп появилась возможность точечно настраивать права и ограничения пользователей. В Bot API за операцию ограничения ответственен метод restrict_chat_member , принимающий на вход ID чата, ID юзера, список ограничений, а также параметр until_date со значением времени (Unix Time), до которого эти ограничения действуют, причём если указать время с разницей меньше 30 секунд или больше 366 дней от текущего, Telegram воспринимает это, как «навсегда». В нашем случае Read-Only режим будет выдаваться на 10 минут, т.е. 600 секунд.

Давайте теперь разберёмся, на каком языке отвечать пользователю. В объекте User есть поле language_code , содержащее языковую метку пользователя. Не всё так просто, ведь в зависимости от настроек системы и местоположения пользователя, его языковая метка может быть ru , en-GB , en-US или вообще какой-нибудь nan-Hant-TW . Подробно о строении таких меток можно прочесть здесь. В нашем случае задача немного упрощается, т.к. нам нужен только первый элемент (сам язык), независимо от региона (будем считать, к примеру, что «английский» английский и американский английский для нас одинаковы). Напишем наипростейшую определялку языка, которая будет возвращать ru для русского языка и en для всех остальных. В реальной жизни, конечно, стоит сделать поддержку большего числа языков.

def get_language(lang_code): # Иногда language_code может быть None if not lang_code: return "en" if "-" in lang_code: lang_code = lang_code.split("-")[0] if lang_code == "ru": return "ru" else: return "en" 

И подготовим небольшой JSON со строками:

strings = < "ru": < "ro_msg": "Вам запрещено отправлять сюда сообщения в течение 10 минут." >, "en": < "ro_msg": "You're not allowed to send messages here for 10 minutes." > 

Теперь напишем обработчик, который будет реагировать на набор фраз, выдавать режим Read-Only пользователю на 10 минут и уведомлять его на родном языке. Не забудьте импортировать метод time из одноимённого модуля!

restricted_messages = ["я веган", "i am vegan"] # Выдаём Read-only за определённые фразы @bot.message_handler(func=lambda message: message.text and message.text.lower() in restricted_messages and message.chat.id == GROUP_ID) def set_ro(message): bot.restrict_chat_member(message.chat.id, message.from_user.id, until_date=time()+600) bot.send_message(message.chat.id, strings.get(get_language(message.from_user.language_code)).get("ro_msg"), reply_to_message_id=message.message_id) 

Запустим бота и попросим людей с разными language_code выступить в роли противников мяса:

Заключение

В этом уроке мы кратко ознакомились с новыми фишками третьей версии Telegram Bot API, научились удалять сообщения, если они соответствуют одному из заданных критериев и научились «мягко» ограничивать пользователей, не удаляя их из группы. Помимо restrict_chat_member существует метод promote_chat_member для наделения пользователя определёнными администраторскими правами, он остаётся для самостоятельного изучения.

Исходный код бота этого урока, как обычно, расположен на Github.

Источник

Помогите команда пайтон /ban тг бот

бот на пайтоне библиотеке telebot.Вот я начал с unban но как дальше я хз.Хочу чтоб банил участников чата и разбанивал

Для создания команд бана и разбана в Телеграм-боте на Python с использованием библиотеки pyTelegramBotAPI (telebot), вам потребуется сначала убедиться, что у пользователя, вызывающего команду, есть соответствующие права на модерацию. Затем вы должны написать обработчики сообщений для каждой команды. Вот пример кода, который вы можете использовать:

import telebot

TOKEN = «YOUR_BOT_TOKEN»
bot = telebot.TeleBot(TOKEN)

@bot.message_handler(commands=[‘ban’])
def ban_user(message):
chat_id = message.chat.id
user_id = message.from_user.id

# Проверяем, является ли пользователь администратором чата
if is_user_admin(chat_id, user_id):
try:
user_to_ban = message.reply_to_message.from_user.id
bot.kick_chat_member(chat_id, user_to_ban)
bot.reply_to(message, «Пользователь забанен.»)
except Exception as e:
bot.reply_to(message, «Не удалось забанить пользователя.»)
else:
bot.reply_to(message, «У вас нет прав для этой команды.»)

@bot.message_handler(commands=[‘unban’])
def unban_user(message):
chat_id = message.chat.id
user_id = message.from_user.id

# Проверяем, является ли пользователь администратором чата
if is_user_admin(chat_id, user_id):
try:
user_to_unban = message.reply_to_message.from_user.id
bot.unban_chat_member(chat_id, user_to_unban)
bot.reply_to(message, «Пользователь разбанен.»)
except Exception as e:
bot.reply_to(message, «Не удалось разбанить пользователя.»)
else:
bot.reply_to(message, «У вас нет прав для этой команды.»)

def is_user_admin(chat_id, user_id):
chat_member = bot.get_chat_member(chat_id, user_id)
return chat_member.status == «administrator» or chat_member.status == «creator»

if __name__ == ‘__main__’:
bot.polling(none_stop=True)

Не забудьте заменить YOUR_BOT_TOKEN на токен вашего бота.
Этот код определяет две команды: /ban и /unban. В обоих случаях сначала проверяется, является ли пользователь администратором чата. Если пользователь является администратором, то выполняется соответствующее действие (бан или разбан).
Обратите внимание, что пользователей можно банить и разбанивать, отвечая на их сообщения командами /ban и /unban. Таким образом, бот знает, на какого пользователя применить команду.

Источник

Telegram Bot в России. Блокировка. Пути решения.

Ребятушки всем Привет. Еще до блокировки Telegram в РФ, я написал цикл статей по разработке Telegram Bot и Telegram Bot на Python. Основной идей для написания статей стала необходимость разобраться в тематике ботов и поделиться своими наработками с подписчиками.

Недавно ко мне обратился мой подписчик. Утверждая что сделал все один в один как в статье, но у него ничего не работает.

Ищем проблему?

Начал разбираться в логах PyCharm. Все сводилось к тому, что скрипт бота не может подключиться к серверу Telegram. Конечно первым делом я предположил, что по невнимательности допущена ошибка в настройках или подключении библиотек в PyCharm. Просмотрев еще раз логи убедился в том, что бот не может подключится к серверу Telegram. Тогда возник вопрос о правильности ввода данных выданных BotFather. Этот момент тоже перепроверил. Все было в норме.

В какой-то момент я вспомнил, что по сути самым простым способом для проверки бота на работоспособность, является простой http запрос в браузере. Результатом запроса будет ответ от сервера Telegram в json формате. По итогу сервер Telegram отвечает на запросы. Однако если делать это с Российского ip, тогда появляються проблемы.

Причины?

  • 13 апреля 2018 года (символично, пятница 13-ое). Таганский суд Москвы принимает решение о блокировке мессенджера. Хорошо или плохо это не мое дело, но в итоге мессенджер и все боты начинаю работать с большими проблемами.
  • Роскомнадзор обязал провайдеров заблокировать доступ к Telegram.
  • Все боты размещенные на серверах в РФ перестают работать.

Пути решения.

В итоге в первые часы после блокировки было найдено два пути:

— Воспользоваться встроенным протоколом SOCKS5 (встроен в Telegram)
— Установить VPN-сервис

Я думаю об этом вы уже знаете. И все отрабатывает на ура. Есть огромное количество прокси-серверов и vpn сервисов, как бесплатных, так и платных. Многие даже встроены в браузер.

Но нашу проблему это не решает, т.к. при использование SOCKS5 именно приложение Telegram подключается к прокси-серверу и VPN в браузерной сессии имеет такой же эффект. В итоге в браузере и десктопной версии Telegram работает, а PyCharm и наш бот не может подключится к серверам Telegram из-за блокировки ip.

У данной проблемы есть несколько решений:

  • Работать через прокси-сервер (желательно из США или Европы) Т.е. настроить свой доступ в интернет таким образом чтобы весь сетевой трафик шел через прокси-сервер.
  • Работать через VPN. Опять же весь сетевой трафик должен идти через VPN туннель.
  • Разместить код бота на VDS сервере.

Естественно что все эти сервисы должны быть за пределами РФ, потому что все наши усилия сведутся к нулю, если к примеру у VDS сервера будет ip из РФ.

Эпилог.

Более подробное изложение по каждому из пунктов выходит за рамки этой статьи. И по сути избыточен, т.к. сервисы блокируют постоянно, а решения на сегодняшний момент одни и те же. Надеюсь я помог вам или натолкнул на решение. Не забудьте поддержать проект лайком и репостом в социальных сетях. Монетка также будет не лишней.

Источник

Оцените статью