Лайфхаки

Маленькие, полезные хитрости

Телеграм бот на python с использованием только requests. Как насчет создания первого Telegram бота?

06.07.2023 в 04:11

Телеграм бот на python с использованием только requests. Как насчет создания первого Telegram бота?

Прежде всего, зарегистрируйтесь. Рекомендую использовать. Откройте кроссплатформенный мессенджер, найдите @BotFather и запустите чат. Отправьте в сообщении /newbot и следуйте инструкциям. После завершения начальных шагов вы получите:

На момент создания бот 100% пассивен. Вам нужно инициализировать разговор. Для этого откройте поиск и введите имя своего бота, а после начните разговор, нажав /start . Введите что-то вроде «Hello». Это сообщение важно, поскольку это первое обновление, которое получит ваш бот.

Telegram bot отправка файлов python. Отправка файлов ¶

Помимо обычных текстовых сообщений Telegram позволяет обмениваться медиафайлами различных типов: фото, file_idиfile_unique_id. Первый можно использовать для повторной отправки одного и того же файла много раз, причём отправка будет мгновенной, т.к. сам файл уже лежит на серверах Telegram. Это самый предпочтительный способ.
К примеру, следующий код заставит бота моментально ответить пользователю той же гифкой, что была прислана:

Всегда используйте правильные file_id!

Бот должен использовать для отправки только теfile_id, которые получил напрямую сам, например, в личке от пользователя или «увидев» медиафайл в группе/канале. При этом, если попытаться использоватьfile_idот другого бота, то это , но через какое-то время вы получите ошибку . Поэтому — только свои!

В отличие отfile_id, идентификаторfile_unique_idнельзя использовать для повторной отправки или скачивания медиафайла, но зато он одинаковый у всех ботов для конкретного медиа. Нуженfile_unique_idобычно тогда, когда нескольким ботам требуется знать, что их собственныеодносятся к одному и тому же файлу.

Если файл ещё не существует на сервере Telegram, бот может загрузить его тремя различными способами: как файл в файловой системе, по ссылке и напрямую набор байтов. Для ускорения отправки и в целом для более бережного отношения к серверам мессенджера, загрузку (upload) файлов Telegram правильнее производить один раз, а в дальнейшем использоватьfile_id, который будет доступен после первой загрузки медиа.

В aiogram 3.x присутствуют 3 класса для отправки изображений -FSInputFile,,, с ними можно ознакомится в .

Готовый чат-бот на python. Поиск ближайших соседей


В предыдущих разделах мы закачали в python корпус диалогов, векторизовали его, и сократили размерность, а теперь хотим наконец научиться искать в нашем 300-мерном пространстве ближайших соседей и наконец-то осмысленно отвечать на вопросы.Поскольку научились отображать вопросы в Евклидово пространство не очень высокой размерности, поиск соседей в нём можно осуществлять довольно быстро. Мы воспользуемся уже готовым алгоритмом поиска соседей. Но мы напишем свою модель-обёртку, которая выбирала бы одного из k ближайших соседей, причём чем ближе сосед, тем выше вероятность его выбора. Ибо брать всегда одного самого близкого соседа — скучно, но не завязываться на сходство совсем — опасно.Поэтому мы хотим превратить найденные расстояния от запроса до текстов-эталонов в вероятности выбора этих текстов. Для этого можно использовать функцию softmax, которая ещё часто стоит на выходе из нейросетей. Она превращает свои аргументы в набор неотрицательных чисел, сумма которых равна 1 — как раз то, что нам нужно. Дальше полученные «вероятности» мы можем использовать для случайного выбора ответа.Фразы, которые будет вводить пользователь, надо пропускать через все три алгоритма — векторизатор, метод главных компонент, и алгоритм выбора ответа. Чтобы писать меньше кода, можно связать их в единую цепочку (pipeline), применяющую алгоритмы последовательно.В результате мы получили алгоритм, который по вопросу пользователя способен найти похожий на него вопрос и выдать ответ на него. И иногда это ответы даже звучат почти осмысленно.

Python-telegram bot get photo. Как получить фото от пользователя через pyTelegramBotAPI?

Здравствуйте.
Пытаюсь добиться такой логики от бота Телеграм (использую десктоп версию клиента):

  1. Бот пишет просьбу отправить фото
  2. Пользователь отправляет фото (как с группировкой, так и без группировки)
  3. Бот получает все фото, отправленные пользователем
  4. Только после принятия всех фото, бот отправляет сообщение об успешной операции и передаёт управление следующей функции.
Мой код:

import telebot bot_token = '1279****77:AAHJDPFJ************KJfLbiI' bot = telebot.TeleBot(bot_token, parse_mode='html') photo_list = @bot.message_handler(commands=) def send_welcome(message): send = bot.send_message(message.from_user.id, 'Send your pics…') bot.register_next_step_handler(send, get_user_pics) return @bot.message_handler(content_types=) def get_user_pics(message): if message.photo.file_id not in photo_list: photo_list.append(message.photo.file_id) if len(photo_list) == 1: send = bot.send_message(message.from_user.id, "Photos received…") bot.register_next_step_handler(send, process_messages()) return def process_messages(): print(photo_list) return bot.polling()

Сейчас, логика работает только если юзер отравляет картинки с группировкой.

Python-telegram bot примеры. Самый простой бот


Сперва глянем внашего базового пакета, чтобы понять, с чего начинается простенький бот. Следующий код

# -*- coding: utf-8 -*- from telegram.ext import Updater # пакет называется python-telegram-bot, но Python- from telegram.ext import CommandHandler # модуль почему-то просто telegram ¯\_(ツ)_/¯ def start(bot, update): # подробнее об объекте update: https://core.telegram.org/bots/api#update bot.sendMessage(chat_id=update.message.chat_id, text="Здравствуйте.") updater = Updater(token='TOKEN') # тут токен, который выдал вам Ботский Отец! start_handler = CommandHandler('start', start) # этот обработчик реагирует # только на команду /start updater.dispatcher.add_handler(start_handler) # регистрируем в госреестре обработчиков updater.start_polling() # поехали!

создаёт бота, который сухо отвечает «Здравствуйте.» при нажатии на кнопку Start (или ручном вводе команды/start) и многозначительно молчит при любых последующих действиях с вашей стороны.Соответственно, если мы захотим повесить обработчики любых текстовых сообщений или любых команд, нам нужно будет написать

from telegram.ext import Filters, MessageHandler def handle_text(bot, update): # … def handle_command(bot, update): # … # MessageHandler -- более универсальный обработчик, который берёт на вход фильтр text_handler = MessageHandler(Filters.text, self.handle_text) command_handler = MessageHandler(Filters.command, self.handle_command) # регистрируем свеженькие обработчики в диспетчере updater.dispatcher.add_handler(text_handler) # без регистрации будет работать, updater.dispatcher.add_handler(command_handler) # но не больше трёх месяцев (шутка)

(За дальнейшими подробностями с чистой совестью отсылаю к.)Нагруженные этим теоретическим минимумом, мы можем наконец подумать, как нам писать своего нетривиального бота. Для начала давайте вернёмся к постановке задачи. Под диалоговым ботом я подразумеваю бота, который главным образом ведёт обычный текстовый диалог с пользователем — с вопросами, ответами, нелинейным сюжетом, разочаровывающими концовками и всем в таком духе (играли в «»?) Напротив, не попадают в сферу наших текущих интересов боты, разным образом расширяющие функционал Telegram (вроде); соответственно, мы опустим добавление всяких плюшек вроде,,и всего такого прочего.Проблема сложных диалоговых ботов в том, что нетривиальный диалог требует хранения состояния. Работа асинхронных диалогов требует постоянных прерываний на ожидание сообщения от пользователя; состояние нужно сохранять, потом восстанавливать, прыгать к коду, ответственному за обработку очередного сообщения, и так далее; в общем, организация кода становится проблемой довольно угнетающей. Прервать, продолжить… ничего не напоминает? Что ж, посмотрим, как обозначенную проблему можно изящнейше обойти с помощью магииyield.