Saved searches
Use saved searches to filter your results more quickly
Cancel Create saved search
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
bot infinity polling can’t handle errors or at least some of them #1730
ghost opened this issue Sep 20, 2022 · 5 comments
bot infinity polling can’t handle errors or at least some of them #1730
ghost opened this issue Sep 20, 2022 · 5 comments
Comments
ghost commented Sep 20, 2022
Please answer these questions before submitting your issue. Thanks!
- What version of pyTelegramBotAPI are you using? last one
- What OS are you using? Windows
- What version of python are you using? 3.8.5
I was using bot infinity polling but it stops my script when an error come
«telebot.apihelper.ApiTelegramException: A request to the Telegram API was unsuccessful. Error code: 400 Description: Bad Request: can’t restrict self
»
2022-09-20 19:22:49,671 (init.py:455 MainThread) ERROR — TeleBot: «A request to the Telegram API was unsuccessful. Error code: 400 Description: Bad Request: can’t restrict self»»
(I tried to mute myself while being the chat owner)
Now I’m using this code and it doesnt give me any problems
«try:
bot.polling(none_stop=True)
except Exception as e:
time.sleep(15)»
The text was updated successfully, but these errors were encountered:
Создаем бота Kaspa price telegram bot на Python3
Kaspa это молодая перспективная монета в криптотематике.
apt install python3
apt install python3-pip
pyTelegramBotAPI и telebot:
pip3 install pyTelegramBotAPI telebot requests
Нам нужна директория для бота:
mkdir /opt/kaspabot
Создадим файл с кодом бота:
nano /opt/kaspabot/kaspaprice.py
Добавим в него следующий код:
#!/usr/bin/env python3 import requests import json import telebot import time TOKEN = 'Тут ваш токен вашего созданного бота в Telegram' bot = telebot.TeleBot(TOKEN) @bot.message_handler(commands=['price']) def send_price(message): url = 'https://api.kaspa.org/info/price' response = requests.get(url) data = json.loads(response.text) price = data['price'] bot.send_message(message.chat.id, 'Цена Kaspa: <> USD'.format(price)) pass @bot.message_handler(commands=['help']) def send_welcome(message): bot.reply_to(message, "Привет! Я бот, который покажет тебе стоимость монеты Kaspa. Напиши /price, чтобы узнать текущую стоимость.") @bot.message_handler(func=lambda message: True) def echo_all(message): bot.reply_to(message, message.text) bot.polling() # Use none_stop flag let polling will not stop when get new message occur error. bot.polling(none_stop=True) # Interval setup. Sleep 3 secs between request new message. # bot.polling(interval=3) while True: # Don't let the main Thread end. pass
Дадим файлу бота права:
chmod 777 /opt/kaspabot/kaspaprice.py
После чего нужно создать пользователя от которого будет запускаться бот:
useradd --no-create-home -s /usr/sbin/nologin kaspabot
Создадим файл юнита:
nano /etc/systemd/system/kaspabot.service
Внесем в него следующий код:
[Unit] Description=Async Kaspa price for Telegram After=network-online.target Wants=network-online.target [Service] ExecStart=/opt/kaspabot/kaspaprice.py AmbientCapabilities=CAP_NET_BIND_SERVICE LimitNOFILE=infinity User=kaspabot Group=kaspabot Restart=on-failure [Install] WantedBy=multi-user.target
Теперь скажем нашей системе что kaspabot должен выполняться при старте:
systemctl enable kaspabot
Запустим нашего бота:
systemctl start kaspabot
Vps сервер для бота можно купить пройдя по ссылке, всего за 0.99$ https://bloguser.ru/link/prosody_vds
Api Kaspa находится по ссылке https://api.kaspa.org/docs
P.S Если код по вашему мнению не идеален, или метод реализации в целом, об этом можно написать в комментариях к записи.
Благодарность, если есть такое желание, можно отправить в монете KAS на адрес:
kaspa:qzmthphe9r4wxgaldmz4t82hgaw5ftlra6saywrtthqnk02en4f65cf80j9u2
Создаем Telegram бота
Телеграм боты — это крутой способ взаимодействия с пользователем прямо в привычном ему мессенджере. Это гораздо быстрее и чаще удобнее, чем писать полноценное мобильное приложение. Сегодня мы с вами разберемся, как они работают, и создадим несколько собственных ботов.
Вспоминая функции
Функция — это часть кода программы, которую можно повторно использовать. У функции есть имя, список параметров и возвращаемое значение.
Возвращаемое значение — это результат работы функции. Рассмотрим простой пример:
def getTwo(): return 2 a = getTwo() print(a)
В данном примере мы определили функцию getTwo , она не принимает параметров и всегда возвращает ( return ) число 2. Написав a = getTwo() , мы вызвали функцию и результат ее работы попал в переменную a . На следующей строчке программа выведет 2 .
Список параметров (или аргументов) — это значения, которые необходимы функции для выполнения задачи. Рассмотрим второй пример:
def sum(a, b): return a + b print(sum(23, 5)) # выведет 28 print(sum(-3, 6)) # выведет 3
Здесь функция принимает два параметра и возвращает их сумму.
Внутри функций мы можем использовать любые переменные и операции с единственным ограничением:
- переменные внутри функции недоступны вне этой функции;
- переменные извне функции доступны только для чтения (если не испольуется ключевое слово global ).
Телеграм боты
Телеграм бот — это программа, которая запущена на вашем компьютере и общается с серверами телеграма через интернет. Можно представить, что при регистрации бота, телеграм выделяет нам почтовый ящик, через который мы можем получать сообщения от пользователей и отправлять их им.
Чтобы создать собственного бота, сперва его надо зарегистрировать. Для этого в телеграме нужно добавить бота @BotFather и следовать инструкциям.
После того, как мы введем название бота, @BotFather сообщит нам токен — пароль к нашему почтовому ящику.
Далее мы с вами научимся писать программы на питоне, которые, используя этот токен, смогут общаться с пользователями.

Устанавливаем библиотеки
Одно из ключевых преимуществ питона — наличие огромного количества встроенных и сторонних библиотек. Для того, чтобы сделать телеграм-бота, который будет присылать нам статьи из википедии по нашему запросу, нам потребуется установить сразу три библиотеки.
- pyTelegramBotApi — для создания бота.
Для установки сторонних библиотек вместе с питоном на компьютер устанавливается программа pip.exe , которая умеет автоматически находить и скачивать библиотеки по их названию. Единственный нюанс — она работает только через командную строку (терминал).
Чтобы установить библиотеки нам потребуется открыть командную строку и последовательно ввести три команды.
pip install pytelegrambotapi
PS. Если у вас установлен питон, но компьютер все равно не находит pip, путь к нему нужно добавить в системную переменную PATH.
PS. Если у вас потребуют права администратора, можно поставить библиотеки только для текущего пользователя.
pip install --user pytelegrambotapi
Бот-попугай
Давайте сделаем нашего первого бота — бота-попугая. На все сообщения он будет отвечать повторением.
import telebot token = "ВСТАВЬТЕ СЮДА ТОКЕН" # подключаемся к телеграму bot = telebot.TeleBot(token=token) # content_types=['text'] - сработает, если нам прислали текстовое сообщение @bot.message_handler(content_types=['text']) def echo(message): # message - входящее сообщение # message.text - это его текст # message.chat.id - это номер его автора text = message.text user = message.chat.id #отправляем картинку с попугаем bot.send_photo(user, "https://i.ytimg.com/vi/R-RbmqzRC9c/maxresdefault.jpg") #отправляем сообщение тому же пользователю с тем же текстом bot.send_message(user, text) # поллинг - вечный цикл с обновлением входящих сообщений bot.polling(none_stop=True)

Помимо текстовых сообщений, в телеграме есть команды, они начинаются со слэша, например, /start или /help . Их тоже можно обрабатывать.
Давайте добавим пояснение к нашему боту, которое объяснит пользователю, что он делает.
import telebot token = "ВСТАВЬ СЮДА ТОКЕН" # подключаемся к телеграму bot = telebot.TeleBot(token=token) # реагируем на команды /start и /help @bot.message_handler(commands=['start', 'help']) def help(message): user = message.chat.id bot.send_message(user, "Это бот попугай! Просто пришли и я повторю.") # content_types=['text'] - сработает, если нам прислали текстовое сообщение @bot.message_handler(content_types=['text']) def echo(message): # message - входящее сообщение # message.text - это его текст # message.chat.id - это номер его автора text = message.text user = message.chat.id #отправляем картинку с попугаем bot.send_photo(user, "https://i.ytimg.com/vi/R-RbmqzRC9c/maxresdefault.jpg") #отправляем сообщение тому же пользователю с тем же текстом bot.send_message(user, text) # поллинг - вечный цикл с обновлением входящих сообщений bot.polling(none_stop=True)
Стикеры
Еще пример: бот, которому можно прислать стикер и получить стикер в ответ (он запоминает ранее присланные стикеры от всех пользователей).
import telebot import random token = "ТОКЕН" bot = telebot.TeleBot(token=token) stickers = [] @bot.message_handler(content_types=['sticker']) def echo(message): user = message.chat.id sticker = message.sticker.file_id stickers.append(sticker) bot.send_sticker(user,random.choice(stickers)) bot.polling(none_stop=True)
Что такое словарь?
Списки — это очень круто! Можно хранить много данных и не придумывать имя каждому элементу. Но.
Рассмотрим другую задачу: нам нужно сделать базу клиентов для магазина комиксов. Магазин хочет помнить имя, возраст и любимые комиксы каждого клиента. Мы можем попробовать складывать это в список, но получится примерно так:
clients = ["Петька", 23, ["Майор гром", "Супермен"], "Чапаев", 43, ["Бэтмен"]]
Получаются тройки элементов, где первый элемент это имя, второй — возраст, а дальше список любимых комиксов. Жить, конечно, можно. Но ведь явно должен быть способ лучше. Да, и это — словари.

Вспомним коридор отеля, в котором на дверях написаны номера. Можно провести модернизацию и повесить на двери имя жильца вместо номера. Такой номер будет называться ключем, а сам жилец — значением.
Более естественный пример — это обычный бумажный словарь. Это книга, в которой перечислены слова и их определения. Слова — это ключи, а определения — значения.
Словарь — множество пар ключ-значение.
В примере выше весь список клиентов — это и правда список, а вот отдельный клиент тянет на словарь.
Один клиент будет выглядеть так:
client = # это словарь
А весь список клиентов:
clients = [ , ] # это список словарей
Как работать со словарями?
Работа со словарями очень похожа на работу со списками, только вместо номера элемента используется его ключ (имя).
client = print("Как зовут клиента?") print(client["name"]) print('-' * 15) print("Сколько ему лет?") print(client["age"]) print('-' * 15) print("А можно вывести всю информацию о нем?") print(client) # print('-' * 15) print("А в столбик?") for key in client: print("<> - <>".format(key, client[key])) # словарь это много пар ключ-значение. Чтобы посмотреть на все элементы надо перебрать все ключи print('-' * 15) print("Он любит кошек или собак?") if "pet" in client: print(client["pet"]) else: print("Мы не знаем") # так можно проверить, есть ли ключ в словаре print('-' * 15) print("Он любит кошек, запишите это!") client["pets"] = "кошка" print(client) # так можно добавить в словарь новый элемент # print('-' * 15) print("Возраст не нужен, удалите!") del client["age"] print(client) # удаляем элемент и словаря # print('-' * 15) # кстати, можно вывести все ключи: print(list(client.keys())) # ['name', 'favorites', 'pets'] print('-' * 15) # и отдельно все значения print(list(client.values())) # ['Петька', ['Майор гром', 'Супермен'], 'кошка'] print('-' * 15) # а еще из словаря можно сделать список пар, вот так: print(list(client.items())) # [('name', 'Петька'), ('favorites', ['Майор гром', 'Супермен']), ('pets', 'кошка')] print('-' * 15) print("Ксати, он говорил, что бэтмен тоже ничего.") client["favorites"].append("Бэтмен") print(client) #
Привязка данных к пользователю
Предположим мы хотим сделать бота, которы будет запоминать какую-то фразу, а затем по просьбе пользователя напоминать ее ему. Чтобы решить эту задачу, нам понадобится где-то хранить последнее сообщение пользователя.
Если мы будем использовать переменную, то сможем сохранить сообщение только одного пользователя. Например, Вася попросил запомнить слово kitten . Мы положим эту строку в переменную note . А затем Петя, попросить запомнить слово puppy , и мы снова положим это переменную note . Когда Вася попросит нам напомнить его последнее сообщение, мы напишем ему puppy вместо kitten . Совершенно не годится!

Удобнее всего хранить все данные, которые привязаны к конкретному пользователю в словаре. Ключем в этом словаре будет id пользователя, а значением — произвольные данные.

Предположим, что наш словарь называется notes — заметки. Теперь, когда Вася (id88000) пришлет слово kitten мы положим его в notes[88000] , а слово puppy от Пети (id5300) — в notes[5300] . Посколько теперь мы используем разные переменные для хранения слова, сообщения от разных пользователей не будут путаться.
Реализация:
import telebot # Обходим блокировку с помощью прокси telebot.apihelper.proxy = token = "ВАШ ТОКЕН" bot = telebot.TeleBot(token=token) notes = <> @bot.message_handler(commands=['remind']) def remind(message): user_id = message.chat.id if user_id not in notes: bot.send_message(user_id, "Вы мне еще не писали.") else: bot.send_message(user_id, notes[user_id]) @bot.message_handler(content_types=['text']) def remember(message): user_id = message.chat.id notes[user_id] = message.text bot.send_message(user_id, "Я запомнил") bot.polling(none_stop=True)
Запланированный ответ на конкретное сообщение
Иногда нам приходиться проводить пользователя через конкретную цепочку вопросов, и проще всего сделать это с помощью функции bot.register_next_step_handler . Она позволит нам создать сразу много функций (как и в обычном квесте) и в ответ на сообщения от пользователя последовательно вызывать нужную.
Попробуем с ее помощью провексти квест.
import telebot bot = telebot.TeleBot(token="ВСТАВЬ СЮДА ТОКЕН") @bot.message_handler(commands=['start']) def start(message): # кто нам написал? узнаем id чата! chat_id = message.chat.id # отправляем приветствие answer = bot.send_message(chat_id, "Добро пожаловать в квест. Первое задание. ") # в ответ на приветствие просим вызвать функцию point1 bot.register_next_step_handler(answer, point1) # название функции мы придумали сами, но параметр message обязателен def point1(message): # кто нам написал? узнаем id чата! chat_id = message.chat.id # что написали? узнаем текст входящего сообщения # по сути это замена input text = message.text # если ответ верен if text == "Ответ 1": # пишем об этом пользвоателю и задаем следующие вопрос answer = bot.send_message(chat_id, "Правильный ответ. Второе задание. ") # в ответ на сообщение просим вызвать функцию point2 bot.register_next_step_handler(answer, point2) else: # пишем, что ответ неверен answer = bot.send_message(chat_id, "Нет, попробуйте еще раз. ") # в ответ на сообщение просим вызвать функцию point1 bot.register_next_step_handler(answer, point1) # все по аналогии с point1 def point2(message): chat_id = message.chat.id text = message.text if text == "Ответ 2": answer = bot.send_message(chat_id, "Правильный ответ. Вы прошли квест!\nЧтобы повторить напишите /start.") else: answer = bot.send_message(chat_id, "Нет, попробуйте еще раз. ") bot.register_next_step_handler(answer, point2) bot.polling(none_stop=True)
Получение фотографий
Следующий пример показывает, как скачать и сохранить картинку, которую прислал пользователь. Не забудьте создать папку images, в которую мы будем сохранять полученные картинки.
import uuid import telebot from PIL import Image token = "ВАШ ТОКЕН" bot = telebot.TeleBot(token=token) def process(filename): # обработка фотографии pass @bot.message_handler(content_types=['photo']) def photo(message): # скачивание файла file_id = message.photo[-1].file_id path = bot.get_file(file_id) downloaded_file = bot.download_file(path.file_path) # узнаем расширение и случайное придумываем имя extn = '.' + str(path.file_path).split('.')[-1] name = 'images/' + str(uuid.uuid4()) + extn # создаем файл и записываем туда данные with open(name, 'wb') as new_file: new_file.write(downloaded_file) # обрабатываем картинку фильтром process(name) # открываем файл и отправляем его пользователю with open(name, 'rb') as new_file: bot.send_photo(message.chat.id, new_file.read()) bot.polling(none_stop=True)
Отправка сообщений в произвольное время
Ваш телеграм бот может писать пользователю в произвольное время, если пользователь хоть раз с ним контактировал и вы запомнили id чата с ним.
В примере ниже после команды /spam бот будет отправлять пользователю сообщение каждые несколько секунд. Для этого используется многопоточность — в одном потоке осуществляется обновление сообщений с сервера телеграма, а во втором — отправка сообщений всем пользователям каждые несколько секунд.
import telebot import time from threading import Thread token = "ТОКЕН" bot = telebot.TeleBot(token=token) users = [] @bot.message_handler(commands=['start', 'help']) def start(message): user = message.chat.id bot.send_message(user, "https://www.youtube.com/watch?v=rdg4lkgsQ04") @bot.message_handler(commands=['spam']) def add_user(message): global user user = message.chat.id if user not in users: users.append(user) bot.send_message(user, "Берем сироп вишневый!") @bot.message_handler(commands=['stop']) def remove_user(message): user = message.chat.id users.remove(user) bot.send_message(user, "Все, все.") def spam(): global users while True: for user in users: bot.send_message(user, "Затем сироп вишневый!") time.sleep(2) # запускаем цикл спама в отдельном потоке spam_thread = Thread(target=spam) spam_thread.start() bot.polling(none_stop=True)
Получаем аудиосообщения
import struct import telebot import uuid bot = telebot.TeleBot("ВСТАВЬ ТОКЕН СЮДА") def download_audio(message): voice_id = message.voice.file_id file_description = bot.get_file(voice_id) downloaded_file = bot.download_file(file_description.file_path) filename = 'audio/' + str(uuid.uuid4()) + '.oga' with open(filename, 'wb') as file: file.write(downloaded_file) return filename def convert_audio(path): import subprocess src_filename = path dest_filename = path + '.wav' subprocess.run(['ffmpeg', '-i', src_filename, dest_filename]) return dest_filename def speed_up(path): import wave audio = wave.open(path) data = audio.readframes(audio.getnframes()) values = struct.unpack(f'h', data) values2 = [] for i in range(0, len(values), 2): values2.append(values[i]) data = struct.pack(f'h', *values2) audio2 = wave.open(path + '.2.wav', 'wb') audio2.setnchannels(audio.getnchannels()) audio2.setframerate(audio.getframerate()) audio2.setsampwidth(audio.getsampwidth()) audio2.writeframes(data) return path + '.2.wav' @bot.message_handler(content_types=['voice']) def voice(message): path = download_audio(message) path = convert_audio(path) path = speed_up(path) bot.send_audio(message.chat.id, open(path, 'rb').read()) print(path) bot.polling(none_stop=True)
[СЛИВ] Telegram sms bomber
Бот написан на: Telebot (pytelegrambotapi)
Использует базу: SQlite
Есть фри и приват режим, с автооплатой. Пара рабочих сервисов.
Спойлер: Диск
Войдите или Зарегистрируйтесь для просмотра ссылок.
В коде имеется ошибка. Замените строку на это:
Вы в V.I.P. версии бомбера. Максимальное время спама 2500 минут\n\n
Спойлер: Tags
Бомбер, бомбер смс, Bomber, Sms bomber, phone killer, flooder, flood, phone attack, sms call, spam, spammer, spam mode
Последнее редактирование: 26 Окт 2022
Блин, новым юзерам не чекнуть вложение
Показать предыдущие комментарии.
Дополнительно
Скрытое содержимое для пользователя(ей):
9 Окт 2022
Дополнительно
Скрытое содержимое для пользователя(ей): merpich
9 Окт 2022
Дополнительно
Благодарочка))
9 Окт 2022
Удалён хайд
Когда выдаёшь премиум юзеру.
С премиума не получается запустить спам. Ошибки выдаёт:
bot.edit_message_text(‘Вы в V.I.P. версии бомбера. Максимальное время спама 2500 минут\n\n’
File «/usr/local/lib/python3.9/dist-packages/telebot/__init__.py», line 3567, in edit_message_text
result = apihelper.edit_message_text(self.token, text, chat_id, message_id, inline_message_id, parse_mode,
File «/usr/local/lib/python3.9/dist-packages/telebot/apihelper.py», line 1253, in edit_message_text
return _make_request(token, method_url, params=payload, method=’post’)
File «/usr/local/lib/python3.9/dist-packages/telebot/apihelper.py», line 162, in _make_request
json_result = _check_result(method_name, result)
File «/usr/local/lib/python3.9/dist-packages/telebot/apihelper.py», line 189, in _check_result
raise ApiTelegramException(method_name, result, result_json)
telebot.apihelper.ApiTelegramException: A request to the Telegram API was unsuccessful. Error code: 400. Description: Bad Request: can’t parse entities: Can’t find end tag corresponding to start tag b
»
^C2022-10-26 01:38:11,181 (__init__.py:970 MainThread) ERROR — TeleBot: «Infinity polling: polling exited»
2022-10-26 01:38:11,182 (__init__.py:972 MainThread) ERROR — TeleBot: «Break infinity polling»
Показать предыдущие комментарии.
Дополнительно
а, я на самом деле даже не прочел ошибку. Смотри там все написано и моя теория была верна. Ошибка в html разметке. Найди и замени строчку на:
Вы в V.I.P. версии бомбера. Максимальное время спама 2500 минут\n\n'