Содержание

Создание и хостинг телеграм бота. От А до Я / Хабр

Привет, хабрчане! Какой бы заезженной не была тема создания телеграм бота на python3, я не нашёл инструкций, где показан путь от первой строчки кода до деплоинга бота (по крайней мере все методы, что я видел, немного устарели). В этой статье я хочу показать процесс создания бота от написания BotFather-у до деплоинга бота на Heroku.

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

P.S. Пишите если нужна статья по созданию более сложного бота, т.е. с вебхуками, БД с настройками юзеров и т.д.


Для начала стоит определиться, что же будет делать наш бот. Я решил написать банального простого бота, кторый будет парсить и выдавать нам заголовки с Хабра.
И так, начнём же.

BotFather


Для начала нам надо зарегистрировать нашего бота в Telegram. Для этого:

В поиске вбиваем @BotFather и переходим в диалог с Отцом Ботов.

Пишем /newbot.

Указываем имя бота (то, что отображается в диалогах). Указываем его логин, по которому его можно булет найти.

P.S. Оно должно заканчиваться на Bot/bot

Вот. Нам дали API ключ и ссылку на бота. Желательно сохранить API ключ и перейти в диалог с ботом, чтобы потом не копаться в переписке с BotFather

Дальше добавим ему пару команд: пропишем /setcommands и одним сообщением, т.к. /setcommands не добавляет команды, а задаёт их с нуля, пошлём ему команды.

all - спарсить заголовки с вкладки "ВСЁ ПОДРЯД"
top - спарсить заголовки с вкладки "ЛУЧШЕЕ"

На этом работа с BotFather закончилась, перейдём к следующей части.

Установка и настройка pipenv. Первый запуск.


Для начала создадим файл, в котором будет основной код бота bot.py. Если бот большой, то сразу создавайте файлы, куда вы вынесете функции, классы и т.д, иначе читаемость кода стремится к нулю. Я добавлю parser.py

Установим pipenv, если его конечно ещё нет.

Для Windows:

pip install pipenv

Для Linux:
sudo pip3 install pipenv

Установим pipenv в папку проекта.
pipenv install

Установим интересующие нас библиотеки. Я буду работать с PyTelegramBotAPI. Также для парсинга добавим BeautifulSoup4.
pipenv install PyTelegramBotAPI
pipenv install beautifulsoup4

Начинаем писать код!

Открываем bot.py, импортируем библиотеки и создаём главные переменные.

import telebot
import parser

#main variables
TOKEN = "555555555:AAAAaaaAaaA1a1aA1AAAAAAaaAAaa4AA"
bot = telebot.TeleBot(TOKEN)

Запустим бота. Посмотри наличие ошибок.Как запустить?Для Windows:
python bot.py

Для Linux:
python3 bot.py


Если ошибок не появилось, то продолжим.

Хэндлеры. Отвечаем на команды и сообщения


Пришло время научить бота отвечать нам. Возможно даже сделать его ответы полезными.
Основы взаимодействия. Ответ на команды

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

Начнём с самого простого: ответим на команды /start и /go

@bot.message_handler(commands=['start', 'go'])
def start_handler(message):
    bot.send_message(message.chat.id, 'Привет, когда я вырасту, я буду парсить заголовки с Хабра')
bot.polling()

Сейчас разберёмся что это и как это работает. Передаём в message_handler параметр commands равный массиву со строками — командами, на которые он будет отвечать описанным ниже образом. (На все эти команды он ответит одинаково). Далее используем send_message, в него записываем id чата (его можно достать из message.chat.id), в который отправить сообщение и, собственно, само сообщение. Нельзя забыть написать bot.polling() в конце кода, иначе бот сразу же выключиться. Почему так мы узнаем позже.

Теперь можно запустить бота и написать ему /start или /go и он ответит.

P.S. Сообщение может быть не только строкой, а, в принципе, чем угодно.

P.S.S. Что за message?Это json объект, хранящий информацию об отправителе, чате, и самом сообщении.
{
  'content_type': 'text',
  'message_id': 5,
  'from_user':
    {
      'id': 333960329,
      'first_name': 'Nybkox',
      'username': 'nybkox',
      'last_name': None
    },
  'date': 1520186598,
  'chat':
    {
      'type': 'private',
      'last_name': None,
      'first_name': 'Nybkox',
      'username': 'nybkox',
      'id': 333960329,
      'title': None,
      'all_members_are_administrators': None
    },
    'forward_from_chat': None,
    'forward_from': None,
    'forward_date': None,
    'reply_to_message': None,
    'edit_date': None,
    'text': '/start',
    'entities': [<telebot.types.MessageEntity object at 0x7f3061f42710>],
    'audio': None,
    'document': None,
    'photo': None,
    'sticker': None,
    'video': None,
    'voice': None,
    'caption': None,
    'contact': None,
    'location': None,
    'venue': None,
    'new_chat_member': None,
    'left_chat_member': None,
    'new_chat_title': None,
    'new_chat_photo': None,
    'delete_chat_photo': None,
    'group_chat_created': None,
    'supergroup_chat_created': None,
    'channel_chat_created': None,
    'migrate_to_chat_id': None,
    'migrate_from_chat_id': None,
    'pinned_message': None
}


Основы взаимодействия. Ответ на текстовые сообщения.

Теперь обработаем текстовые сообщения бота. Самое важное что нам нужно знать это то, что текст сообщения храниться в message.text и то, что, чтобы обрабатывать текст в message_handler нужно передавать content_types=[‘text’].

Добавим вот такой код.

@bot.message_handler(content_types=['text'])
def text_handler(message):
    text = message.text.lower()
    chat_id = message.chat.id
    if text == "привет":
        bot.send_message(chat_id, 'Привет, я бот - парсер хабра.')
    elif text == "как дела?":
        bot.send_message(chat_id, 'Хорошо, а у тебя?')
    else:
        bot.send_message(chat_id, 'Простите, я вам не понял :(')

Тут мы довабили пару переменных: вынесли текст сообщения (в нижнем регистре, чтобы не было лишних проблем с теми кто пишет капсом, заборчиком и т.д.) в переменную text, вынесли message.chat.id в отдельную переменную, чтобы каждый раз не обращаться к message. Также мы построили небольшое ветвление, для ответа на определённые сообщения, а также ответ на случай непонятного боту сообщения.
Итоговый код
import bs4
import parser

#main variables
TOKEN = "555555555:AAAAaaaAaaA1a1aA1AAAAAAaaAAaa4AA"
bot = telebot.TeleBot(TOKEN)

#handlers
@bot.message_handler(commands=['start', 'go'])
def start_handler(message):
    bot.send_message(message.chat.id, 'Привет, когда я вырасту, я буду парсить заголовки с хабра')

@bot.message_handler(content_types=['text'])
def text_handler(message):
    text = message.text.lower()
    chat_id = message.chat.id
    if text == "привет":
        bot.send_message(chat_id, 'Привет, я бот - парсер хабра.')
    elif text == "как дела?":
        bot.send_message(chat_id, 'Хорошо, а у тебя?')
    else:
        bot.send_message(chat_id, 'Простите, я вас не понял :(')

bot.polling()


Основы взаимодействия. Ответ на картинки, документы, аудио и прочие.

Для ответа на картинки, стикеры, документы, аудио и т.д. нужно всего лишь поменять content_types=[‘text’].

Рассмотрим пример с картинкой, добавив этот код.

@bot.message_handler(content_types=['photo'])
def text_handler(message):
    chat_id = message.chat.id
    bot.send_message(chat_id, 'Красиво.')

Все типы контента:

text, audio, document, photo, sticker, video, video_note, voice, location, contact, new_chat_members, left_chat_member, new_chat_title, new_chat_photo, delete_chat_photo, group_chat_created, supergroup_chat_created, channel_chat_created, migrate_to_chat_id, migrate_from_chat_id, pinned_message

Строим цепочку ответов.

Пришло время закончить с элементарными действиями и начать что-то серьёзное. Попробуем построить цепочку ответов. Для этого нам понадобиться register_next_step_handler(). Создадим простой пример, на котором и разберёмся как работает register_next_step_handler().
@bot.message_handler(commands=['start', 'go'])
def start_handler(message):
    chat_id = message.chat.id
    text = message.text
    msg = bot.send_message(chat_id, 'Сколько вам лет?')
    bot.
register_next_step_handler(msg, askAge) def askAge(message): chat_id = message.chat.id text = message.text if not text.isdigit(): msg = bot.send_message(chat_id, 'Возраст должен быть числом, введите ещё раз.') bot.register_next_step_handler(msg, askAge) #askSource return msg = bot.send_message(chat_id, 'Спасибо, я запомнил что вам ' + text + ' лет.')

И так, в первой функции добавился bot.register_next_step_handler(msg, askAge), в него мы передаём сообщение, которые хотим послать, и следующий щаг, к которому перейти после ответа пользователя.

Во второй функции всё поинтересней, здесь идёт проверка ввёл ли пользователь число, и, если нет, то функция рекурсивно вызывает сама себя, с сообщением «Возраст должен быть числом, введите ещё раз.». Если пользователь ввёл всё верно, то он получает ответ.

Но, есть тут проблема. Можно повторно вызвать команду /go или /start, и начнётся бардак.


Пофиксить это несложно, добавим переменную для проверки состояния выполнения скрипта.

@bot.message_handler(commands=['start', 'go'])
def start_handler(message):
    global isRunning
    if not isRunning:
        chat_id = message.chat.id
        text = message.text
        msg = bot.send_message(chat_id, 'Сколько вам лет?')
        bot.register_next_step_handler(msg, askAge) #askSource
        isRunning = True

def askAge(message):
    chat_id = message.chat.id
    text = message.text
    if not text.isdigit():
        msg = bot.send_message(chat_id, 'Возраст должен быть числом, введите ещё раз.')
        bot.register_next_step_handler(msg, askAge) #askSource
        return
    msg = bot.send_message(chat_id, 'Спасибо, я запомнил что вам ' + text + ' лет.')
    isRunning = False

С построением простых цепочек мы разобрались, пойдём дальше.
Добавляем парсер в цепочку.

Для начала нужен сам парсер. Обратим внимание на то, что во вкладках «Лучшее» и «Всё подряд» есть дополнительные фильтры: сутки, неделя, месяц и ≥10, ≥25, ≥50, ≥100 соответственно.
Парсер конечно можно написать и в 1 функцию, но я разобью на 2, так будет проще читать код.Парсер.
import urllib.request
from bs4 import BeautifulSoup

def getTitlesFromAll(amount, rating='all'):
    output = ''
    for i in range(1, amount+1):
        try:
            if rating == 'all':
                html = urllib.request.urlopen('https://habrahabr.ru/all/page'+ str(i) +'/').read()
            else:
                html = urllib.request.urlopen('https://habrahabr.ru/all/'+ rating +'/page'+ str(i) +'/').read()
        except urllib.error.HTTPError:
            print('Error 404 Not Found')
            break
        soup = BeautifulSoup(html, 'html.parser')
        title = soup.find_all('a', class_ = 'post__title_link')
        for i in title:
            i = i.get_text()
            output += ('- "'+i+'",\n')
    return output

def getTitlesFromTop(amount, age='daily'):
    output = ''
    for i in range(1, amount+1):
        try:
            html = urllib.request. urlopen('https://habrahabr.ru/top/'+ age +'/page'+ str(i) +'/').read()
        except urllib.error.HTTPError:
            print('Error 404 Not Found')
            break
        soup = BeautifulSoup(html, 'html.parser')
        title = soup.find_all('a', class_ = 'post__title_link')
        for i in title:
            i = i.get_text()
            output += ('- "'+i+'",\n')
    return output


По итогу парсер возвращает нам строку с заголовками статей, основываясь на наших запросах.
Пробуем, используя полученные знания, написать бота связанного с парсером. Я решил создать отдельный класс (это скорее всего неправильный метод, но это уже относится к питону, а не к основной теме статьи), и в объекте этого класса хранить изменяемые данные.

Итоговый код:

bot.py
import telebot
import bs4
from Task import Task
import parser

#main variables
TOKEN = '509706011:AAF7ghlYpqS5n7uF8kN0VGDCaaHnxfZxofg'
bot = telebot.TeleBot(TOKEN)
task = Task()

#handlers
@bot. message_handler(commands=['start', 'go'])
def start_handler(message):
    if not task.isRunning:
        chat_id = message.chat.id
        msg = bot.send_message(chat_id, 'Откуда парсить?')
        bot.register_next_step_handler(msg, askSource)
        task.isRunning = True

def askSource(message):
    chat_id = message.chat.id
    text = message.text.lower()
    if text in task.names[0]:
        task.mySource = 'top'
        msg = bot.send_message(chat_id, 'За какой временной промежуток?')
        bot.register_next_step_handler(msg, askAge)
    elif text in task.names[1]:
        task.mySource = 'all'
        msg = bot.send_message(chat_id, 'Какой минимальный порог рейтинга?')
        bot.register_next_step_handler(msg, askRating)
    else:
        msg = bot.send_message(chat_id, 'Такого раздела нет. Введите раздел корректно.')
        bot.register_next_step_handler(msg, askSource)
        return

def askAge(message):
    chat_id = message.chat.id
    text = message.text.lower()
    filters = task. filters[0]
    if text not in filters:
        msg = bot.send_message(chat_id, 'Такого временного промежутка нет. Введите порог корректно.')
        bot.register_next_step_handler(msg, askAge)
        return
    task.myFilter = task.filters_code_names[0][filters.index(text)]
    msg = bot.send_message(chat_id, 'Сколько страниц парсить?')
    bot.register_next_step_handler(msg, askAmount)

def askRating(message):
    chat_id = message.chat.id
    text = message.text.lower()
    filters = task.filters[1]
    if text not in filters:
        msg = bot.send_message(chat_id, 'Такого порога нет. Введите порог корректно.')
        bot.register_next_step_handler(msg, askRating)
        return
    task.myFilter = task.filters_code_names[1][filters.index(text)]
    msg = bot.send_message(chat_id, 'Сколько страниц парсить?')
    bot.register_next_step_handler(msg, askAmount)

def askAmount(message):
    chat_id = message.chat.id
    text = message.text.lower()
    if not text.isdigit():
        msg = bot. send_message(chat_id, 'Количество страниц должно быть числом. Введите корректно.')
        bot.register_next_step_handler(msg, askAmount)
        return
    if int(text) < 1 or int(text) > 11:
        msg = bot.send_message(chat_id, 'Количество страниц должно быть >0 и <11. Введите корректно.')
        bot.register_next_step_handler(msg, askAmount)
        return
    task.isRunning = False
    output = ''
    if task.mySource == 'top':
        output = parser.getTitlesFromTop(int(text), task.myFilter)
    else:
        output = parser.getTitlesFromAll(int(text), task.myFilter)
    msg = bot.send_message(chat_id, output)

bot.polling(none_stop=True)

Тут добавился none_stop=True) к bot.polling, из-за этого бот не будет падать при каждой ошибке.
Task.py
class Task():
    isRunning = False
    names = [
        ['лучшие', 'лучшее', 'топ'],
        ['всё', 'всё подряд', 'all']
    ]
    filters = [
        ['сутки', 'неделя', 'месяц'],
        ['без порога', '10', '25', '50', '100']
    ]
    filters_code_names = [
        ['daily', 'weekly', 'monthly'],
        ['all', 'top10', 'top25', 'top50', 'top100']
    ]
    mySource = ''
    myFilter = ''
    def __init__(self):
        return

parser. py
import urllib.request
from bs4 import BeautifulSoup

def getTitlesFromAll(amount, rating='all'):
    output = ''
    for i in range(1, amount+1):
        try:
            if rating == 'all':
                html = urllib.request.urlopen('https://habrahabr.ru/all/page'+ str(i) +'/').read()
            else:
                html = urllib.request.urlopen('https://habrahabr.ru/all/'+ rating +'/page'+ str(i) +'/').read()
        except urllib.error.HTTPError:
            print('Error 404 Not Found')
            break
        soup = BeautifulSoup(html, 'html.parser')
        title = soup.find_all('a', class_ = 'post__title_link')
        for i in title:
            i = i.get_text()
            output += ('- "'+i+'",\n')
    return output

def getTitlesFromTop(amount, age='daily'):
    output = ''
    for i in range(1, amount+1):
        try:
            html = urllib.request.urlopen('https://habrahabr.ru/top/'+ age +'/page'+ str(i) +'/').read()
        except urllib.error.HTTPError:
            print('Error 404 Not Found')
            break
        soup = BeautifulSoup(html, 'html. parser')
        title = soup.find_all('a', class_ = 'post__title_link')
        for i in title:
            i = i.get_text()
            output += ('- "'+i+'",\n')
    return output


Теория. Методы взаимодействия с ботом.

Мы используем long polling для получения данных о сообщениях от бота.

bot.polling(none_stop=True)

Есть же вариант использовать в корне другой метод — вебхуки. Так бот сам будет отправлять нам данные о получении сообщения и т.д. Но этот метод сложнее в настройке, и, для простого показательного бота я решил его не использовать.

Также в дополнительных материалах будут ссылки на всё, что использовалось и о чём говорилось.

Маркапы. Добавляем клавиатуры для быстрого ответа.


Наконец основной код дописан. Теперь можно передохнуть и написать маркапы. Я думаю вы неоднократно видели их, но всё же, приложу скриншот. [SCREENSHOT]

Я выведу маркапы в отдельный файл — markups.py.

В написании маркапов нет ничего сложного. Нужно лишь создать маркап, указать пару параметров, создать пару кнопок и добавить их в маркап, далее просто указываем reply_markup=markup в send_message.

Примерmarkups.py
from telebot import types
source_markup = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True)
source_markup_btn1 = types.KeyboardButton('Лучшие')
source_markup_btn2 = types.KeyboardButton('Всё подряд')
source_markup.add(source_markup_btn1, source_markup_btn2)

В параметры маркапа указываем ширину строки и изменение размеров кнопок, иначе они огромны.Можно конечно заполнять отдельно каждую строк.
markup = types.ReplyKeyboardMarkup()
itembtna = types.KeyboardButton('a')
itembtnv = types.KeyboardButton('v')
itembtnc = types.KeyboardButton('c')
itembtnd = types.KeyboardButton('d')
itembtne = types.KeyboardButton('e')
markup.row(itembtna, itembtnv)
markup.row(itembtnc, itembtnd, itembtne)


bot.py
def start_handler(message):
    if not task. isRunning:
        chat_id = message.chat.id
        msg = bot.send_message(chat_id, 'Откуда парсить?', reply_markup=m.source_markup)
        bot.register_next_step_handler(msg, askSource)
        task.isRunning = True


Применим полученные знания к нашему боту.Итоговый кодmarkups.py
from telebot import types

start_markup = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=True)
start_markup_btn1 = types.KeyboardButton('/start')
start_markup.add(start_markup_btn1)

source_markup = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True)
source_markup_btn1 = types.KeyboardButton('Лучшие')
source_markup_btn2 = types.KeyboardButton('Всё подряд')
source_markup.add(source_markup_btn1, source_markup_btn2)

age_markup = types.ReplyKeyboardMarkup(row_width=3, resize_keyboard=True)
age_markup_btn1 =  types.KeyboardButton('Сутки')
age_markup_btn2 =  types.KeyboardButton('неделя')
age_markup_btn3 =  types.KeyboardButton('Месяц')
age_markup.add(age_markup_btn1, age_markup_btn2, age_markup_btn3)

rating_markup = types. ReplyKeyboardMarkup(row_width=3, resize_keyboard=True)
rating_markup_btn1 =  types.KeyboardButton('Без порога')
rating_markup_btn2 =  types.KeyboardButton('10')
rating_markup_btn3 =  types.KeyboardButton('25')
rating_markup_btn4 =  types.KeyboardButton('50')
rating_markup_btn5 =  types.KeyboardButton('100')
rating_markup.row(rating_markup_btn1, rating_markup_btn2)
rating_markup.row(rating_markup_btn3, rating_markup_btn4, rating_markup_btn5)

amount_markup = types.ReplyKeyboardMarkup(row_width=3, resize_keyboard=True)
amount_markup_btn1 =  types.KeyboardButton('1')
amount_markup_btn2 =  types.KeyboardButton('3')
amount_markup_btn3 =  types.KeyboardButton('5')
amount_markup.add(amount_markup_btn1, amount_markup_btn2, amount_markup_btn3)

bot.py
import telebot
import bs4
from Task import Task
import parser
import markups as m

#main variables
TOKEN = '509706011:AAF7aaaaaaaaaaaaaaaaaaaAAAaaAAaAaAAAaa'
bot = telebot.TeleBot(TOKEN)
task = Task()

#handlers
@bot.message_handler(commands=['start', 'go'])
def start_handler(message):
    if not task. isRunning:
        chat_id = message.chat.id
        msg = bot.send_message(chat_id, 'Откуда парсить?', reply_markup=m.source_markup)
        bot.register_next_step_handler(msg, askSource)
        task.isRunning = True

def askSource(message):
    chat_id = message.chat.id
    text = message.text.lower()
    if text in task.names[0]:
        task.mySource = 'top'
        msg = bot.send_message(chat_id, 'За какой временной промежуток?', reply_markup=m.age_markup)
        bot.register_next_step_handler(msg, askAge)
    elif text in task.names[1]:
        task.mySource = 'all'
        msg = bot.send_message(chat_id, 'Какой минимальный порог рейтинга?', reply_markup=m.rating_markup)
        bot.register_next_step_handler(msg, askRating)
    else:
        msg = bot.send_message(chat_id, 'Такого раздела нет. Введите раздел корректно.')
        bot.register_next_step_handler(msg, askSource)
        return

def askAge(message):
    chat_id = message.chat.id
    text = message.text.lower()
    filters = task. filters[0]
    if text not in filters:
        msg = bot.send_message(chat_id, 'Такого временного промежутка нет. Введите порог корректно.')
        bot.register_next_step_handler(msg, askAge)
        return
    task.myFilter = task.filters_code_names[0][filters.index(text)]
    msg = bot.send_message(chat_id, 'Сколько страниц парсить?', reply_markup=m.amount_markup)
    bot.register_next_step_handler(msg, askAmount)

def askRating(message):
    chat_id = message.chat.id
    text = message.text.lower()
    filters = task.filters[1]
    if text not in filters:
        msg = bot.send_message(chat_id, 'Такого порога нет. Введите порог корректно.')
        bot.register_next_step_handler(msg, askRating)
        return
    task.myFilter = task.filters_code_names[1][filters.index(text)]
    msg = bot.send_message(chat_id, 'Сколько страниц парсить?', reply_markup=m.amount_markup)
    bot.register_next_step_handler(msg, askAmount)

def askAmount(message):
    chat_id = message.chat.id
    text = message. text.lower()
    if not text.isdigit():
        msg = bot.send_message(chat_id, 'Количество страниц должно быть числом. Введите корректно.')
        bot.register_next_step_handler(msg, askAmount)
        return
    if int(text) < 1 or int(text) > 5:
        msg = bot.send_message(chat_id, 'Количество страниц должно быть >0 и <6. Введите корректно.')
        bot.register_next_step_handler(msg, askAmount)
        return
    task.isRunning = False
    print(task.mySource + " | " + task.myFilter + ' | ' + text) #
    output = ''
    if task.mySource == 'top':
        output = parser.getTitlesFromTop(int(text), task.myFilter)
    else:
        output = parser.getTitlesFromAll(int(text), task.myFilter)
    msg = bot.send_message(chat_id, output, reply_markup=m.start_markup)

bot.polling(none_stop=True)

Ура! С кодом впринципе разобрались. Теперь самое важное — деплоинг бота не хероку.

Деплоим бота на Heroku.


Для начала надо зарегистрироваться на Хероку и на Гитхабе.

Теперь создаём репозиторий на гитхабе. (нажмите плюсик слева от вашего аватара)
Сейчас нам нужен Procfile (Procfile.windows для windows). Создаём его и записываем в него bot: python3 bot.py

Теперь удаляем TOKEN из bot.py, здесь он не нужен, ведь мы будем загружать этот файл на гитхаб. Через тот же терминале, что использовали для запуска бота, заливаем файлы на гитхаб. (Предворительно удалите папку __pycache__).

echo "# HabrParser_Bot" >> README.md
git init
git add .
git add *
git commit -m "Initial Commit" -a
git remote add origin origin https://github.com/name/botname.git #Указываем свою ссылку
git push -u origin master

Гит просит логин и пароль, спокойно вводим и преступаем к деплоингу бота на хероку. Пишем всё в том же терминале.

Теперь возвращаем TOKEN в bot.py, здесь он нужен, ведь мы будем загружать этот файл на хероку.

heroku login #Вводим email и пароль
heroku create --region eu habrparserbot #Не забываемпоменять имя приложения
#P. S. в имени могут быть только буквы в нижнем регитсре, цифры  и тире.
heroku addons:create heroku-redis:hobby-dev -a habrparserbot #И снова меняем имя!
heroku buildpacks:set heroku/python
git push heroku master
heroku ps:scale bot=1 # запускаем бота
heroku logs --tail #включаем логи

Чтобы выключить бота
heroku ps:stop bot

И, не забываем перед залитием на гитхаб и удалить TOKEN из нашего bot.py. Ведь нам не нужно, чтобы кто-то им пользовался. Можно конечно воспользоваться .gitignore и вынести токены в отдельный фай.
Поздравляю!

Работа окончена, бот работает удалённо.

Ссылки


Конечный код бота на гитхабе
API для управления ботом
Про деплоинг
Про pipenv
Большой гайд, возможно кому-то пригодится

Заключение


Если кому-то было интересно, то цель написания статьи выполнена. Если кому-то хочется увидеть статью про более сложного бота (с вебхуками, подключенной БД с настройками пользователей и т. д.) — пишите.UPDATES
UPD1
  • Добавлены якори в содержание.
  • Изменён алгоритм залития кода на гитхаб и хероку.
  • Убрана версия PyTelegramBotAPI, т.к. теперь хероку работает нормально с новыми версиями.

28 сервисов по созданию чат-ботов в Telegram — Сервисы на vc.ru

{«id»:110661,»url»:»https:\/\/vc.ru\/services\/110661-28-servisov-po-sozdaniyu-chat-botov-v-telegram»,»title»:»28 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0447\u0430\u0442-\u0431\u043e\u0442\u043e\u0432 \u0432 Telegram»,»services»:{«facebook»:{«url»:»https:\/\/www.facebook.com\/sharer\/sharer.php?u=https:\/\/vc.ru\/services\/110661-28-servisov-po-sozdaniyu-chat-botov-v-telegram»,»short_name»:»FB»,»title»:»Facebook»,»width»:600,»height»:450},»vkontakte»:{«url»:»https:\/\/vk.com\/share.php?url=https:\/\/vc.ru\/services\/110661-28-servisov-po-sozdaniyu-chat-botov-v-telegram&title=28 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0447\u0430\u0442-\u0431\u043e\u0442\u043e\u0432 \u0432 Telegram»,»short_name»:»VK»,»title»:»\u0412\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u0435″,»width»:600,»height»:450},»twitter»:{«url»:»https:\/\/twitter. com\/intent\/tweet?url=https:\/\/vc.ru\/services\/110661-28-servisov-po-sozdaniyu-chat-botov-v-telegram&text=28 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0447\u0430\u0442-\u0431\u043e\u0442\u043e\u0432 \u0432 Telegram»,»short_name»:»TW»,»title»:»Twitter»,»width»:600,»height»:450},»telegram»:{«url»:»tg:\/\/msg_url?url=https:\/\/vc.ru\/services\/110661-28-servisov-po-sozdaniyu-chat-botov-v-telegram&text=28 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0447\u0430\u0442-\u0431\u043e\u0442\u043e\u0432 \u0432 Telegram»,»short_name»:»TG»,»title»:»Telegram»,»width»:600,»height»:450},»odnoklassniki»:{«url»:»http:\/\/connect.ok.ru\/dk?st.cmd=WidgetSharePreview&service=odnoklassniki&st.shareUrl=https:\/\/vc.ru\/services\/110661-28-servisov-po-sozdaniyu-chat-botov-v-telegram»,»short_name»:»OK»,»title»:»\u041e\u0434\u043d\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u0438\u043a\u0438″,»width»:600,»height»:450},»email»:{«url»:»mailto:?subject=28 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0447\u0430\u0442-\u0431\u043e\u0442\u043e\u0432 \u0432 Telegram&body=https:\/\/vc. ru\/services\/110661-28-servisov-po-sozdaniyu-chat-botov-v-telegram»,»short_name»:»Email»,»title»:»\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u043f\u043e\u0447\u0442\u0443″,»width»:600,»height»:450}},»isFavorited»:false}

20 801 просмотров

Bot API: часто задаваемые вопросы

Предупреждение

Если вы незнакомы с ботами в Telegram, рекомендуется сначала прочитать ознакомительную статью.

Также, возможно, вас заинтересует описание Bot API.

Общие вопросы

Как я могу создать бота?

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

К сожалению, какого-либо способа создать бота без программирования не существует. Поэтому, если вы не разработчик, лучше поищите себе готового бота или закажите его разработку.

Можно посмотреть примеры кода?

Вот два бота-образца, написанных на PHP:

  • Hello Bot: демонстрация основных возможностей Bot API.
  • Simple Poll bot: более сложный бот, поддерживающий оба способа получения обновлений (long-polling и вебхуки).
Примечание

Многие разработчики создают своих ботов с открытым исходным кодом. Мы собираем их на специальной странице.

Добавьте в ботов фичу X!

API ботов — весьма молодой проект. Есть ещё масса возможностей, которые уже рассматриваются к реализации. Пока что администрация Telegram наблюдает за тем, как пользователи используют своих ботов, чтобы понять, в каком направлении необходимо развивать платформу.

Если у вас есть мысли по этому поводу, вы можете высказать их пользователю @BotSupport (на английском).

Какие сообщения может получать мой бот?

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

  • Сообщение было ответом боту или нажатием на его клавиатуру
  • В сообщении есть @упоминание бота по его имени пользователя
  • В сообщении содержится общая команда (напр., /start) или команда, предназначающаяся вашему боту (напр., /start@YourBot)
  • Сообщение является служебным (о смене названия группы, выходе кого-либо из чата, и т. д.)

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

  • Сообщений от других ботов
  • Команд для других ботов (напр., /start@NotYourBot)
  • Ответов на сообщения от других ботов, за исключением случаев, когда в сообщении содержится @упоминание вашего бота.

Почему мой бот не видит сообщений от других ботов?

Диалог двух ботов может привести к нежелательным бесконечным циклам, когда боты отвечают друг другу по кругу. Поэтому было принято решение не давать ботам возможности видеть сообщения от других ботов.

Получение обновлений

Как можно получать обновления?

На текущий момент доступно два способа. Вы можете использовать либо опрос, либо вебхуки. Обратите внимание: если вы используете вебхуки, метод getUpdates работать не будет.

Принципиальное отличие: при опросе вашему приложению самому нужно запрашивать обновления у API, а используя вебхуки — сервера Telegram будут отправлять на ваш сервер каждое обновление с помощью HTTPS POST-запроса.

Предупреждение

Вебхуки могут работать только через HTTPS, допустимо использование самозаверенного сертификата.

Доступные порты: 443, 80, 88, 8443.

Опрос всегда выдаёт один и тот же результат!

Метод getUpdates выдаёт 100 последних неподтверждённых обновлений. Чтобы подтвердить обновление, используйте параметр offset при вызове getUpdates вот так:

offset = update_id последнего обработанного обновления + 1

Все обновления с update_id меньшим или равным offset будут отмечены как подтверждённые и не будут больше возвращаться сервером.

У меня проблема с вебхуками

Если вы успешно задали адрес вебхука, но не получаете обновлений, убедитесь, что:

  • SSL-сертификат вашего вебхука валиден и корректен
  • При использовании самозаверенного сертификата, вы передаёте его публичный ключ в поле certificate метода setWebhook. Необходимо загружать InputFile, отправка строки не сработает.
  • Ваш вебхук работает на одном из допустимых портов: 443, 80, 88, 8443.

У меня проблема с самозаверенным сертификатом

Ознакомьтесь с инструкцией по созданию сертификатов. Если после прочтения у вас остались вопросы, напишите пользователю @BotSupport.

Как мне убедиться, что запросы идут с серверов Telegram?

Для этого включите ваш токен в адрес вебхука, примерно так:

https://example.com/your_token

Так как никто посторонний не знает вашего токена, запросы на этот адрес смогут отсылать только сервера Telegram.

Как делать запросы в HTTP-ответах к обновлениям?

Это возможно при использовании вебхуков. Преимуществом является сокращение числа запросов, недостатком — невозможность получения результата запроса и его статуса.

Всякий раз при получении обновления на вебхук, у вас есть два варианта:

1. Отправить POST-запрос к https://api.telegram.org/botTOKEN/МЕТОД

2. Ответить напрямую, указав метод в виде JSON в HTTP-ответе:

Примечание

Пример реализации этой возможности на PHP можно посмотреть в коде HelloBot.

Как скачивать файлы?

Для этого используйте метод getFile.

Предупреждение

Этот метод работает только для файлов объёмом до 20 МБ.

Как закачать большой файл?

На текущий момент боты могут отправлять файлы объёмом до 50 МБ, так что крупные файлы отправить не получится. Возможно, это ограничение будет снято в будущем.

Как долго хранится file_id у файлов?

file_id у отправленных вашим ботом файлов будут удалены после отправления нескольких тысяч файлов.

Для принятых файлов file_id можно считать вечным и неизменным.

Массовая рассылка

Каков лимит сообщений в секунду?

При работе с отдельным чатом, избегайте отправки более 1 сообщения в секунду. Конечно, допустимы небольшие пики, но со временем вы начнёте получать ошибку 429.

При рассылке уведомлений нескольким пользователям, API не позволит отправлять более 30 сообщений в секунду. Для преодоления этого лимита вам необходимо разбить отправку на части с большим интервалом между собой (около 8-12 часов).

При работе с группой ограничение установлено на 20 сообщений в минуту.

Как получить список всех подписчиков моего бота?

К сожалению, пока сделать это встроенными методами нельзя. Возможно, в будущем будут добавлены пару строк для управления подписчиками.

Чтобы максимально эффективно рассылать сообщения, вам необходимо разбивать отправку на несколько частей с интервалом в 8-12 часов. Также недопустимо отправление более 30 сообщений разным пользователям в секунду — иначе вы будете получать ошибку 429.

См. также: Каков лимит сообщений в секунду?

Создаем бота в Телеграм сами — Разработка на TJ

{«id»:117909,»url»:»https:\/\/tjournal.ru\/dev\/117909-instrukciya-sozdaem-bota-v-telegram-sami»,»title»:»\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f: \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0431\u043e\u0442\u0430 \u0432 \u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u0441\u0430\u043c\u0438″,»services»:{«vkontakte»:{«url»:»https:\/\/vk.com\/share.php?url=https:\/\/tjournal.ru\/dev\/117909-instrukciya-sozdaem-bota-v-telegram-sami&title=\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f: \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0431\u043e\u0442\u0430 \u0432 \u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u0441\u0430\u043c\u0438″,»short_name»:»VK»,»title»:»\u0412\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u0435″,»width»:600,»height»:450},»facebook»:{«url»:»https:\/\/www. facebook.com\/sharer\/sharer.php?u=https:\/\/tjournal.ru\/dev\/117909-instrukciya-sozdaem-bota-v-telegram-sami»,»short_name»:»FB»,»title»:»Facebook»,»width»:600,»height»:450},»twitter»:{«url»:»https:\/\/twitter.com\/intent\/tweet?url=https:\/\/tjournal.ru\/dev\/117909-instrukciya-sozdaem-bota-v-telegram-sami&text=\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f: \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0431\u043e\u0442\u0430 \u0432 \u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u0441\u0430\u043c\u0438″,»short_name»:»TW»,»title»:»Twitter»,»width»:600,»height»:450},»telegram»:{«url»:»tg:\/\/msg_url?url=https:\/\/tjournal.ru\/dev\/117909-instrukciya-sozdaem-bota-v-telegram-sami&text=\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f: \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0431\u043e\u0442\u0430 \u0432 \u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u0441\u0430\u043c\u0438″,»short_name»:»TG»,»title»:»Telegram»,»width»:600,»height»:450},»odnoklassniki»:{«url»:»http:\/\/connect. ok.ru\/dk?st.cmd=WidgetSharePreview&service=odnoklassniki&st.shareUrl=https:\/\/tjournal.ru\/dev\/117909-instrukciya-sozdaem-bota-v-telegram-sami»,»short_name»:»OK»,»title»:»\u041e\u0434\u043d\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u0438\u043a\u0438″,»width»:600,»height»:450},»email»:{«url»:»mailto:?subject=\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f: \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0431\u043e\u0442\u0430 \u0432 \u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u0441\u0430\u043c\u0438&body=https:\/\/tjournal.ru\/dev\/117909-instrukciya-sozdaem-bota-v-telegram-sami»,»short_name»:»Email»,»title»:»\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u043f\u043e\u0447\u0442\u0443″,»width»:600,»height»:450}},»isFavorited»:false}

2325 просмотров

Бот в Телеграм: идея, создание, раскрутка

{«id»:73255,»url»:»https:\/\/tjournal. ru\/flood\/73255-bot-v-telegram-ideya-sozdanie-raskrutka-chto-dalshe»,»title»:»\u0411\u043e\u0442 \u0432 \u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c: \u0438\u0434\u0435\u044f, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435, \u0440\u0430\u0441\u043a\u0440\u0443\u0442\u043a\u0430 — \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435?»,»services»:{«vkontakte»:{«url»:»https:\/\/vk.com\/share.php?url=https:\/\/tjournal.ru\/flood\/73255-bot-v-telegram-ideya-sozdanie-raskrutka-chto-dalshe&title=\u0411\u043e\u0442 \u0432 \u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c: \u0438\u0434\u0435\u044f, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435, \u0440\u0430\u0441\u043a\u0440\u0443\u0442\u043a\u0430 — \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435?»,»short_name»:»VK»,»title»:»\u0412\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u0435″,»width»:600,»height»:450},»facebook»:{«url»:»https:\/\/www.facebook.com\/sharer\/sharer.php?u=https:\/\/tjournal.ru\/flood\/73255-bot-v-telegram-ideya-sozdanie-raskrutka-chto-dalshe»,»short_name»:»FB»,»title»:»Facebook»,»width»:600,»height»:450},»twitter»:{«url»:»https:\/\/twitter. com\/intent\/tweet?url=https:\/\/tjournal.ru\/flood\/73255-bot-v-telegram-ideya-sozdanie-raskrutka-chto-dalshe&text=\u0411\u043e\u0442 \u0432 \u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c: \u0438\u0434\u0435\u044f, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435, \u0440\u0430\u0441\u043a\u0440\u0443\u0442\u043a\u0430 — \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435?»,»short_name»:»TW»,»title»:»Twitter»,»width»:600,»height»:450},»telegram»:{«url»:»tg:\/\/msg_url?url=https:\/\/tjournal.ru\/flood\/73255-bot-v-telegram-ideya-sozdanie-raskrutka-chto-dalshe&text=\u0411\u043e\u0442 \u0432 \u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c: \u0438\u0434\u0435\u044f, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435, \u0440\u0430\u0441\u043a\u0440\u0443\u0442\u043a\u0430 — \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435?»,»short_name»:»TG»,»title»:»Telegram»,»width»:600,»height»:450},»odnoklassniki»:{«url»:»http:\/\/connect.ok.ru\/dk?st.cmd=WidgetSharePreview&service=odnoklassniki&st. shareUrl=https:\/\/tjournal.ru\/flood\/73255-bot-v-telegram-ideya-sozdanie-raskrutka-chto-dalshe»,»short_name»:»OK»,»title»:»\u041e\u0434\u043d\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u0438\u043a\u0438″,»width»:600,»height»:450},»email»:{«url»:»mailto:?subject=\u0411\u043e\u0442 \u0432 \u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c: \u0438\u0434\u0435\u044f, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435, \u0440\u0430\u0441\u043a\u0440\u0443\u0442\u043a\u0430 — \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435?&body=https:\/\/tjournal.ru\/flood\/73255-bot-v-telegram-ideya-sozdanie-raskrutka-chto-dalshe»,»short_name»:»Email»,»title»:»\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u043f\u043e\u0447\u0442\u0443″,»width»:600,»height»:450}},»isFavorited»:false}

5261 просмотров

⭐️ Как добавить бота в Telegram — инструкция 2020

Добавить нового бота в Телеграм очень просто. В последнее время этот вопрос актуален для пользователей мессенджера. Это неудивительно, потому что функционал ботов очень разнообразен. Изготавливать их тоже не очень сложно, простого Телеграм-бота с элементарными функциями можно сделать и добавить самому.

Если вы обладаете хотя бы начальными навыками программирования, то функционал работа можно значительно расширить.

Рекомендуем нашу статью о самостоятельном создании Телеграм-ботов.

Программные помощники умеют массу полезного. С их помощью можно находить музыку, фильмы, книги и другую полезную информацию. Есть Телеграм-боты, которые добавляются в групповые чаты и могут озвучивать текстовые сообщения. Масса роботов — хорошие посредники для различных сервисов, компаний и банков.

Свои собственные боты есть у «Сбербанка», «Почты России», «OneTwoTrip», «Связного», «Медузы» и многих других.

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

Доступность, простота и эффективность Телеграм-ботов сделали их крайне популярными среди пользователей. Поговорим о том, что это такое и как ими пользоваться.

Специально для жителей РФ: рекомендуем бота TeleBot, который раздает надежные, быстрые и бесплатные MTProxy для обхода блокировки Telegram.

Содержание:

Как начать работу с ботом

Для обычных пользователей роботы работают через диалоги прямо в Телеграм. Нужного можно найти через строку поиска. Лучше всего использовать для этого имя, оно всегда начинается с «@» и заканчивается на «…bot», например, @PollBot — помощник для создания голосований.

В этом случае предполагается, что вы уже знаете конкретное имя робота, которого хотите добавить. Если же нет, вам помогут подборки и каталоги, такие как наш.

Рекомендуем к обязательному прочтению нашу огромную подборку лучших ботов для Телеграм.

Чтобы активировать помощника, нужно начать с ним диалог нажатием кнопки «Start». В дальнейшем большинство функций будут доступны именно через окно беседы. Но есть, например, @gif (для поиска гифок) или @vkmusic_bot (для поиска музыки) — их можно вызывать в диалоге с вашим собеседником, для чего нужно напечатать символ «@».

Больше музыкальных ботов вы найдете в специальном разделе нашего Каталога.

В окне беседы можно общаться с Телеграм-ботом, вводя команды или нажимая на кнопки. Если кнопки не предусмотрены, а команд вы не знаете, просто напечатайте в поле набора сообщения слеш «/». После этого появится всплывающее меню с подсказками, где будут видны команды, которые можно добавить.

Варианты команд на примере одного из популярных ботов для прокси

Помимо этого, лучше знать несколько универсальных команд, которые работают практически во всех ботах:

  • /start — начало работы с ботом;
  • /help — помощь по функциям и работе бота;
  • /settings — настройки, если они предусмотрены.

 

Что делать, если бот не работает

Бот — это программный продукт, который использует облачные сервера Телеграм для работы. Поэтому их работоспособность может влиять на скорость реакции на команды. Чаще всего, если робот долго не отвечает на команды, то проблема именно в этом. Единственное, что можно сделать в этом случае — немного подождать, пока работа не возобновится.

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

Как ещё можно использовать ботов

Это хороший инструмент для администраторов каналов и групп.

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

Это значительно облегчает администрирование и позволяет удобно и оперативно вести даже несколько каналов сразу.

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

Для того чтобы использовать бота, нужно добавить его в администраторы Телеграм канала или в чат. После этого, в некоторых случаях, может понадобиться назначить ему необходимые права.

Узнайте о том, как добавить админа в Телеграм-канал.

Подробнее о ботах для групп и каналов мы уже писали. Надеемся, что вы найдёте в этой статье что-то полезное.


Как создать бота Telegram с использованием Python

14 февраля 2017 г., Python, 142071 Представления

За последний год Telegram представил множество новых функций, включая игры внутри приложений, ботов, телеграф и мгновенные просмотры, каналы, группы и многое другое. Что будет следующей потрясающей функцией? Никто не знает. В этой скромной заметке я хотел бы показать вам, как можно создать простого бота для телеграмм, используя популярный язык программирования Python.

Боты хороши во многих вещах, особенно в автоматизации скучных задач. Вам решать, какие функции будет у вашего будущего бота, но сегодня мы собираемся создать тот, который будет взаимодействовать с Planet Python, популярным агрегатором новостей Python. Бот просто проанализирует последний контент и отправит его вам через Telegram.

Наше приложение будет состоять из приложения django, и его исходный код доступен на моем github как репозиторий planetpython_telegrambot. Не стесняйтесь форкнуть и делать все, что хотите 🙂

Создание бота Telegram

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

  • Добавить в список контактов BotFather
  • Начните разговор с BotFather , нажав кнопку Начать . Вы сразу увидите список команд.
  • Чтобы создать нового бота для телеграмм, вы должны ввести команду / newbot и следовать инструкциям. Будьте осторожны, имя пользователя вашего бота должно заканчиваться на bot .Например, DjangoBot или Django_bot.
  • Я решил выбрать PlanetPythonBot , что довольно просто с учетом его функциональности.

Если все в порядке, в конце вы увидите токен бота или ключ доступа к API.

Кстати, BotFather также может выполнять за вас следующие действия:

  • Положите описание своему боту
  • Загрузить аватар
  • Изменить токен доступа
  • Удалите своего бота и т. Д.

Давайте закодируем бота Telegram

Ранее я упоминал, что мы собираемся создать приложение Django. Но это не обязательно, вы также можете написать простейший скрипт Python, который будет периодически связываться со службой Telegram, используя вызов API getUpdates. Telegram имеет два взаимоисключающих подхода к обмену данными через API:

  • с использованием вызова API getUpdates
  • настройка Webhook

Идея Webhook состоит в том, чтобы предоставить вашему боту специальный URL-адрес (пост-бэк), и когда происходит событие (например, кто-то начинает разговор с ботом), служба Telegram отправляет почтовые запросы на этот URL-адрес, предоставляя необходимую информацию (идентификатор чата, имя пользователя , содержание и дополнительная метаинформация).Мы собираемся использовать этот подход при создании собственного веб-приложения. Чтобы установить обратный URL, мы будем использовать вызов API setWebhook . Но Telegram требует HTTPS, здесь у вас есть два варианта:

  • Получите действующий сертификат SSL (купите или установите бесплатно в Let’s Encrypt)
  • Создать самоподписанный сертификат с помощью таких инструментов, как OpenSSL

Более подробная информация о getUpdates и setWebhook доступна здесь и здесь.

Для связи с Telegram API мы собираемся использовать библиотеку Python под названием telepot. Давайте напишем код на Python, но перед этим я рекомендую вам настроить отдельную среду Python, используя такие инструменты, как virtualenv:

  pip install telepot  

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

  импортный телепот
токен = '123456'
TelegramBot = телепот.Бот (токен)
распечатать TelegramBot.getMe ()
  

После выполнения вышеуказанного кода вы получите что-то вроде этого:

  {u'username ': u'PythonPlanetBot', u'first_name ': u'Python Planet Bot', u'id ': 199266571}  

Поздравляем! Вы сделали свой первый вызов API getMe в Telegram, который возвращает информацию о боте, такую ​​как его имя пользователя, идентификатор бота и т. Д.

Теперь добавьте своего вновь созданного бота в список контактов Telegram и начните разговор, отправив / start .

А теперь выполните следующий код:

  TelegramBot.getUpdates ()  

И получим:

  [{u'message ': {u'date': 1459927254, u'text ': u' / start ', u'from': {u'username ': u'adilkhash', u'first_name ': u 'Адиль', u'id ': 31337}, u'message_id': 1, u'chat ': {u'username': u'adilkhash ', u'first_name': u'Adil ', u'type': u'private ', u'id': 7350}}, u'update_id ': 649179764}]
  

getUpdates Вызов API возвращает список объектов с именем Update.Каждый объект обновления состоит из объектов сообщения. В нашем примере с ботом нас интересует только сообщение, которое имеет текстовый атрибут (контент) и объект чата, который указывает пользователя, который начал разговор, и идентификатор чата, на который нужно ответить. Также обратите внимание на атрибут update_id , его значение важно, если вы собираетесь использовать подход getUpdates для мониторинга входящих запросов вместо Webhooks . При вызове метода getUpdates вы можете указать смещение, обычно значение смещения рассчитывается как значение update_id последнего вызова + 1, что означает, что вы получите все, кроме того, что вы уже получили от последнего вызова 🙂 Звучит беспорядочно, позвольте мне проиллюстрировать кодом.Отправьте сообщение своему боту еще раз и позвоните:

  TelegramBot.getUpdates (649179764 + 1)  
  [{u'message ': {u'date': 1459928527, u'text ': u'hello bro', u'from ': {u'username': u'adilkhash ', u'first_name': u 'Адиль', u'id ': 31337}, u'message_id': 13, u'chat ': {u'username': u'adilkhash ', u'first_name': u'Adil ', u'type': u'private ', u'id': 7350}}, u'update_id ': 649179765}]  

Достаточно знать, чтобы создать нашего Telegram-бота.Посмотрим, как будет выглядеть приложение django.

Сначала мы должны разобрать RSS-канал Planet Python. Это делает следующая функция:

  # - * - кодировка: utf8 - * -
from xml. etree import cElementTree
запросы на импорт
def parse_planetpy_rss ():
    "" "Анализирует первые 10 элементов из http://planetpython.org/rss20.xml
    "" "
    response = requests.get ('http://planetpython.org/rss20.xml')
    parsed_xml = cElementTree.fromstring (response.content)
    items = []
    для узла в parsed_xml.iter ():
        если node.tag == 'item':
            item = {}
            для item_node в списке (узле):
                если item_node.tag == 'title':
                    item ['title'] = item_node.text
                если item_node.tag == 'ссылка':
                    item ['ссылка'] = item_node.text
            items.append (элемент)
    вернуть товары [: 10]
  

Я использую запросов библиотеки для http (s) вещей в python. Я не обрабатываю никаких исключений, чтобы избежать перегрузки кода.Вот как выглядит представление Django:

  ТОКЕН = ''
TelegramBot = telepot.Bot (ТОКЕН)
def _display_help ():
    вернуть render_to_string ('help. md')
def _display_planetpy_feed ():
    return render_to_string ('feed.md', {'items': parse_planetpy_rss ()})
класс CommandReceiveView (Просмотр):
    def post (self, request, bot_token):
        если bot_token! = ТОКЕН:
            return HttpResponseForbidden ('Недействительный токен')
        commands = {
            '/ start': _display_help,
            'help': _display_help,
            'feed': _display_planetpy_feed,
        }
        пытаться:
            полезная нагрузка = json.загружает (request.body.decode ('utf-8'))
        кроме ValueError:
            return HttpResponseBadRequest ('Неверное тело запроса')
        еще:
            chat_id = payload ['сообщение'] ['чат'] ['id']
            cmd = payload ['message']. get ('text') # команда
            func = commands.get (cmd.split () [0] .lower ())
            если func:
                TelegramBot.sendMessage (chat_id, func (), parse_mode = 'Markdown')
            еще:
                TelegramBot.sendMessage (chat_id, 'Я вас не понимаю, сэр!')
        вернуть JsonResponse ({}, статус = 200)
    @method_decorator (csrf_exempt)
    def dispatch (self, request, * args, ** kwargs):
        вернуть super (CommandReceiveView, self) . dispatch (запрос, * аргументы, ** kwargs)
  

CommandReceiveView — это место, где творится чудо. Он получает запрос POST и обрабатывает его соответствующим образом в соответствии с командой. Полный исходный код доступен здесь. Взгляните на новый вызов API — sendMessage .Вы можете использовать его, когда хотите отправить что-то пользователю, указав chat_id и content. Идентификатор чата — это уникальный идентификатор разговора между пользователем и ботом. Когда вы вызываете getUpdates , вы видите его на каждом объекте Update. Но в Telegram есть ограничение для ботов, которое запрещает им отправлять сообщения пользователю, если конкретный пользователь не инициировал разговор с ботом (защита от спама).

Надеюсь, вы уже клонировали мое репо и запустили приложение django. Пришло время протестировать наше веб-приложение.Чтобы смоделировать взаимодействие между нашим приложением и службой Telegram API, я буду использовать расширение Chrome, которое называется Postman.

Postman — отличный инструмент, который помогает вам тестировать ваши приложения, отправляя запросы GET / POST / DELETE / PUT и т. Д. На определенный URL. Мы собираемся отправить запрос POST на наш CommandReceiveView и посмотреть, как он будет его обрабатывать.

Запустите веб-приложение, выполнив команду runserver. Целевой URL публикации:

http: // 127.0.0.1: 8000 / планета / b …

, где BOT_TOKEN следует заменить на данный ключ токена доступа.

Тело запроса можно получить из одного из объектов Update, которые мы получили при вызове метода getUpdates . Взгляните на скриншоты:

Давайте предоставим команду feed для нашего POST URL.

На скриншотах видно, что Telegram-бот правильно обработал наш запрос. Следующим шагом будет развертывание приложения и установка сертификата SSL для настройки webhook.

Часть 2 — Как развернуть бота Telegram

Ссылки:

32 хороших бота Telegram — Telegraph

@tipsfortelegram

[Это 🇺🇸 английская версия ! Щелкните, чтобы читать на 🇩🇪Немецком языке]

УСТАРЕЛО — БОЛЬШЕ НЕ ОБНОВЛЯЕТСЯ.

Найти новых хороших ботов в Telegram на самом деле довольно сложно. В Telegram нет обзора всех существующих ботов и страницы, на которой вы можете увидеть избранных ботов (например, в разделе стикеров).

Эта статья должна помочь вам познакомиться с миром ботов . Боты — это будущее обмена сообщениями и коммуникациями . Это сторонние приложения, которые запускаются внутри Telegram . Пользователи могут взаимодействовать с ботами, отправляя сообщения, команды и встроенные запросы. Благодаря мощным ботам Telegram больше не просто обычный мессенджер, а открывает новую эру обмена сообщениями.

🤖Зачем вам нужны боты?
Вот пример: несколько «приложений для фонарей» в Google Playstore или Apple Appstore требуют от вас принятия определенных разрешений, таких как доступ к вашей камере, микрофону, контактам, идентификатору телефона, вашему местоположению…

Это касается не только приложений с фонариком, игры — еще один пример.
Почему они это делают? Потому что им нужно что-то заработать, так как приложение бесплатное. Они зарабатывают деньги, размещая рекламу в своих приложениях и / или продавая общие данные другим компаниям.
Вот почему очень удобно использовать ботов как можно чаще. — Боты Telegram видят только ваше имя Telegram и ваш Telegram-ID (НЕ номер телефона), чтобы сохранять результаты игры и т. Д..

Вот список полезных, тщательно отобранных ботов Telegram: [Обновлено 18 декабря 2017 г.]

Утилиты:

🔮 Считыватель QR-кода / Считыватель штрих-кода — @qr_codebot

├ • Создание QR-кодов (также в разных цветов!)
├ • Чтение QRCodes
└ • Поддерживает> 17 языков!

Напоминания и список дел — @skeddybot

С Skeddy вы можете создавать и управлять своими напоминаниями, которые отправляются вам через Telegram.
├ • Создавайте простые напоминания (через 20 мин, в 18:30 ,. ..)
├ • или сложные напоминания (каждое воскресенье в 9:45)
├ • или заметки (для списков дел)
└ • Управляйте всеми своими напоминаниями и заметками, опционально используя Bot-Web-интерфейс.

👨‍👩‍👧‍👦 Задавайте вопросы в группах («каракули») — @GroupAgreeBot

Создавайте различные опросы и делитесь ими с друзьями в группах и каналах. 📊
Personal • Личные или анонимные опросы
├ • голосование (один вариант)
├ • каракули (несколько вариантов)
├ • ограниченный каракули (несколько вариантов и выбор количества вариантов, за которые может проголосовать каждый пользователь)
└ • доска (настраиваемое сообщение)
У этого бота еще больше функций, чем Doodle! 🎉

📲 Мощный RSS-фидер — @thefeedreaderbot

└ • мониторинг веб-сайтов и блогов с помощью RSS-каналов
└ • мониторинг страниц Facebook, каналов YouTube, учетных записей Instagram и Twitter ,. ..
└ • отслеживать изменения веб-сайта (премиум-версия)

📩 Адрес электронной почты (например, для информационных бюллетеней, спама и т. Д.) — @Telegram Email

Создайте свой собственный адрес электронной почты и прочтите его в Telegram мгновенно.
├ • Электронная почта для информационных бюллетеней, подписок, …
└ • Прочтите в Telegram или в аккуратном превью в своем браузере
Скоро прибудет обновление, которое позволит вам легче отвечать.

⏳⏰ Сообщения с обратным отсчетом — @CountdownMeBot

Этот бот позволяет создавать сообщения с обратным отсчетом.⏳⏰
├ • ⚠️ Работает только в режиме inline!
├ • Обратный отсчет обновляется автоматически
└ • Напишите свое сообщение в следующем формате:
«@countdownmebot Some text %% dd-hh-mm %% and more text»

💱 Voice to Text — @voicybot

└ • Отправьте голосовое сообщение боту, и он отправит вам текст.

💱 Переводчик — @interpretbot

├ • Выберите язык ввода и вывода один раз
└ • Используйте встроенный бота для быстрого перевода сообщений

🌤 Погода — @weatherman_bot

├ • Введите свой город и получите прогнозы погоды мгновенно на сегодня, завтра или 5 дней.
└ • Поддерживает множество языков, можно настроить уведомления

💱 Сделайте короткий URL — @shorturl_googl_bot

├ • Просто отправьте ссылку, чтобы сократить ее
└ • Поддерживает «is.gd», «bit.ly «,» tinyurl.com «,» goo.gl «


Музыка и кино:

🎵 Распознавание музыки (» Shazam «) — @AudioRobot

Распознавайте песню с помощью AudioRobot!
├ • Получите название, исполнителя и альбом
├ • Получите ссылку в формате mp3, по которой вы можете сразу прослушать и скачать
└ • Распознает> 40 миллионов треков

🎬 Загрузчик песен с Youtube — @YTAudioBot

Скачать Видео YouTube в виде аудиофайлов, чтобы брать их с собой куда угодно! 🎵
├ • Переслать видео ссылку на этого бота
Search • Искать в строке с помощью @vid
├ • Выбрать тот, у которого лучший рейтинг
├ • Поддерживает> 17 языков!
└ • ⚠️ для пользователей iOS: @YTAudio_Bot

🎵 Получить текст песни — @iLyricsBot

Этот бот извлекает тексты из различных источников. 🎵
├ • Получите текст понравившейся песни
├ • Он содержит ссылки для: Youtube, Soundcloud, Spotify, загрузки MP3
└ • Попробуйте встроить этого бота (например, в сохраненных сообщениях)

🎬 Информация о фильме — @ movieS4Bot

Этот бот предоставит вам информацию о фильмах прямо из IMDB.
├ • используйте его в любом чате 🔎 («@ movies4bot [+ название фильма])
└ • получите такую ​​информацию, как: название, год, рейтинг , время выполнения, актеры, сюжет, рейтинг, награды, …

🎥 Предложение фильма — @movie_adviser_bot

Этот бот предложит вам фильмы для просмотра на основе ваших настроек / фильтров.🎥🎬
├ • Получите предложение со всей необходимой информацией, включая сюжет, рейтинг, год, плакат и т. Д.
├ • Установите фильтры: например, жанры, годы, рейтинг IMDB, страны, …
├ • Топ-листы (например, 10 лучших триллеров и т. д.)
├ • Подписка (ежедневно / еженедельно / случайная)
└ • Список просмотра: сохраните фильм для просмотра позже



Развлечения:

📊 A или B? Голосуйте за свое решение — @swell_bot

Голосуйте за интересные вещи и помогайте другим людям в их повседневных решениях.📊
├ • Свелл содержит:
│ 1 вопрос и 2 варианта.
└ • А или В? Это или то? Высокие каблуки или кроссовки? Горячий или нет?
С этим ботом весело играть, когда вам скучно.

📸 Создайте свой стикер — @StickyAIBot

Этот бот позволяет легко создавать стикеры с изображением самого себя. 📸
├ • Отправьте изображение, например селфи
└ • Бот отправляет вам наклейку

🗞 Новости — @breakingnewsbot

└ • Никогда не пропустите последние новости от CNN

Встроенные боты:

🤖 Что такое встроенные боты?
Они работают как обычные боты, но вам не нужно отдельно открывать чат с ботом. Просто введите имя встроенного бота в ЛЮБОМ чате и сразу приступайте к делу.

🎉 @gif (анимированные картинки)

└ • Введите @gif [+ слово] в любом чате

🎥 @vid (видео на YouTube)

└ • Введите @vid [+ слово] в любом чате

📸 @bing (Bing Images)

└ • Введите @bing [+ слово] в любом чате

🎤 @iLyricsBot (Текст и ссылки на песню)

└ • Введите @iLyricsBot [+ название песни] в любом чате

🗺 Карта выбранной области — @openmap_bot

├ • Введите @openmap_bot [+ город] в любом чате
└ • Перед отправкой выберите из нескольких карт, чтобы найти лучшую

💱 Текст в голос — @ txt2speechbot

├ • Введите @ txt2speechbot [+ сообщение] в любом чате
└ • Выберите свой язык и сразу же отправить голосовое сообщение.

Боты для продвинутых пользователей

(более сложные в настройке, но все же классные и заслуживающие упоминания):

@posttobot — отправьте сообщение со своего ПК в Telegram

@ifttt — подключите Telegram к более 360 различных сервисов


7 🇩🇪Немецкие боты (только на немецком языке):

http://telegra.ph/Telegram-Bots—TipsfortelegramDE-12-18 (они внизу)

2 🇫🇷French Bots:

@Dictonbot

└ • Voir chaque jour le Dicton Du Jour.

@TextbasedGameBot (также на английском языке)

└ • Бот, созданный для создания образа жизни в стиле текстов в стиле Zork.

Есть идеи / рекомендации для ботов? Напишите мне
Особая благодарность @JeanBaptistePlagouille за несколько предложений ботов.
Обновлено: 24.02.2018


ℹ️ @tipsfortelegram Оцените меня, пожалуйста!

Узнайте, как создать группового чат-бота Telegram

В предыдущем руководстве мы увидели, как создать и развернуть чат-бота Telegram с помощью Xenioo.
Хотя мы рассмотрели основы индивидуальных и групповых разговоров и концепцию конфиденциальности ботов, мы не вдавались в подробности того, как полностью управлять групповым чат-ботом Telegram.

На этот раз мы увидим именно это: мы создадим очень простого чат-бота, который будет действовать как менеджер группы и модератор.

Telegram Privacy Mode

При создании чат-бота с помощью BotFather вы заметите несколько параметров конфигурации, в которых вы можете изменить имя, аватар и некоторые другие параметры.

Одна из этих опций — / setprivacy, может использоваться для включения или выключения «Конфиденциальности группы». Что именно?

  • Если Bot Privacy OFF , ваш чат-бот будет получать каждое сообщение, отправленное в чат любым пользователем. Если у вас в группе сто тысяч пользователей, Xenioo получит все сообщения и обработает их.
  • С Bot Privacy ON ни одно из сообщений, отправленных любым пользователем, не попадет в Xenioo. Будут приниматься только сообщения, начинающиеся с символа «/», или прямые упоминания вашего чат-бота.

По умолчанию конфиденциальность ботов включена, и в нашем примере мы оставим ее как есть.

Как мы уже сказали, мы собираемся создать Group Manager и пока не хотим проверять все сообщения пользователей.

Реакция на команды чата

Как объяснялось, при включенной конфиденциальности группы мы будем получать только сообщения чата, начинающиеся с символа «/». Обычно эти команды используются / help или / about, но вы можете просто обрабатывать любую команду, которая вам нравится.

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

В нашем примере чат-бота команда / hep ответит очень простой всплывающей подсказкой, предлагающей две разные команды.

Любой текст, начинающийся с символа «/» внутри текста Xenioo, будет преобразован в команду ссылки внутри Telegram Bubble.

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

Пользователи приходят и уходят

Как только вы добавите своего чат-бота Xenioo в группу Telegram, вы начнете получать события, связанные с каждым присоединением и уходом пользователя.

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

Управление переменными и сообщениями было рассмотрено в нескольких статьях, поэтому сейчас мы сосредоточимся только на том, какие переменные доступны вам всякий раз, когда ваш чат-бот вызывается в группе Telegram.

Переменная Valore contenuto
telegram_new_users_count Содержит количество добавленных новых пользователей.Если значение равно нулю, пользователь не добавлен.
telegram_new_user_ Содержит полное имя пользователя одного из пользователей, только что вошедших в группу, где представляет собой порядковый номер пользователя.
telegram_new_user_ _type Содержит тип пользователя, который только что присоединился к группе, где представляет собой порядковый номер пользователя.Значение может быть либо USER для обычного пользователя, либо BOT для бота.
telegram_user_leaving Содержит полное имя пользователя, только что вышедшего из группы.
last_user Содержит полное имя пользователя последнего пользователя, отправившего текст или команду в групповом чате.

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

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

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

Наблюдение за поведением пользователей

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

Если ваша группа работает с определенной языковой политикой, например, чат-бот может быть очень эффективным способом ее применения, и Xenioo предоставляет не только инструменты для обнаружения пользовательского текста, но и для исключения их из группы.

Первое, что нужно сделать, это отключить конфиденциальность группы на вашем боте: это позволит Xenioo получать и обрабатывать каждое сообщение, поступающее в группу.

После этого вы можете легко создать намерение НЛП, содержащее все выражения, которые вы не хотите, чтобы ваши пользователи использовали.

Выражения могут варьироваться от простых словарных статей до более сложных предложений, охватывающих различные темы. Движок Xenioo NLP автоматически обучится и обнаружит также тексты, которые отличаются, но выражают одно и то же намерение.

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

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

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

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

Ваш персональный менеджер группы

Мы только что увидели, как создание бота Telegram Group Manager с Xenioo невероятно простое и гибкое.

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

Есть ли у вас какие-либо особые запросы или требования для вашей группы Telegram? Дайте нам знать в нашей группе сообщества или просто напишите нашей команде!

Создание ботов Telegram с n8n, платформа без кода

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

В Берлине весна, и погода непредсказуема. Сегодня будет 6 ° C, а на следующий день 21 ° C 🤯 Хорошим первым вариантом использования для меня было бы создание бота, который мог бы присылать мне информацию о погоде, когда я об этом спрашиваю. В этом уроке я научу вас, как создать своего собственного погодного бота в Telegram с помощью n8n.

Для этого мы выполним пять шагов:

  1. Создание бота Telegram
  2. Добавление команд боту
  3. Создание узла триггера Telegram на n8n
  4. Создание узла погоды на n8n
  5. Создание Telegram node на n8n

Создание бота Telegram

Чтобы создать бота Telegram, я скачал приложение Telegram для macOS. Однако вы также можете использовать для этого веб-клиент или мобильное приложение. Мы должны использовать мастера всех ботов, созданных командой Telegram, метко названный BotFather.Вы можете открыть чат с BotFather, нажав здесь. Вы можете получить список всех команд, которые вы можете выполнить, с помощью

  / help  
.

Прежде всего, введите команду

  / newbot  
. Он попросит вас назвать своего бота. Я назвал его «бот n8n», почему бы и нет? Затем вам будет предложено выбрать имя пользователя для бота. Это должно быть уникальное имя пользователя, которое должно заканчиваться на «бот». Я пошел с
  n8n_weather_bot  
.

Это создал моего бота, дал мне ссылку для доступа к нему (вы также можете искать своего бота по имени пользователя, которое вы ему указали) и ключ API, который нам понадобится позже.Просто нажмите на ключ API, чтобы скопировать его в буфер обмена. Вот гифка, на которой я выполняю описанные выше действия.

Добавление команд боту

Давайте создадим команду для нашего бота, прежде чем добавлять в него некоторые функции. Вы можете пропустить этот раздел для руководства, если хотите. Однако, если вы планируете создать больше команд для бота, возможно, имеет смысл примерить это для увеличения размера.

Чтобы установить новую команду для нашего бота, снова зайдите в окно чата BotFather. Введите команду

  / setcommands  
, и вам будет предложено выбрать бота, для которого вы хотите установить команду.Выберите только что созданного бота и введите команду в предложенном формате. Я пошел дальше и ввел следующее:
  погода - Рассказывает о погоде  

Вот гифка, на которой я устанавливаю команду для своего бота.

Теперь, если вы вернетесь к созданному боту и начнете вводить «/», он покажет вам список команд, которые вы подготовили для бота. Хорошо, теперь у нас есть бот и команда. Пришло время добавить к боту некоторые функции.

Создание триггерного узла Telegram на n8n

Чтобы начать создание серверной части бота, сначала необходимо установить n8n с помощью npm с помощью следующей команды:

  npm install n8n -g  

Вы также можете запустить n8n с помощью Docker.После того, как вы установили n8n, вы можете запустить его с помощью следующей команды:

  n8n start --tunnel  

Мы запустили n8n, используя параметр

  --tunnel  
, чтобы иметь возможность использовать триггер веб-хуков из Telegram как он должен быть доступен из Интернета. Чтобы узнать больше об этом, ознакомьтесь с документацией.

Ввод «o» в терминале откроет нам интерфейс редактора.

Давайте теперь создадим узел Trigger, который запускает рабочий процесс, когда веб-перехватчик получает некоторые данные.В нашем случае это будет Telegram Trigger, получающий данные веб-перехватчика через бота.

Создайте узел «Триггер», нажав кнопку «+» в правом верхнем углу экрана. Выберите узел Telegram Trigger в меню узлов Trigger, чтобы создать узел.

Теперь вам нужно настроить этот узел. Прежде всего, мы должны добавить учетные данные для API Telegram и предоставить доступ к этому узлу Telegram Trigger. Если вы забыли скопировать Telegram API, перейдите в окно чата BotFather и получите его оттуда.Добавьте новые учетные данные, нажав «Создать» в разделе «Учетные данные» узла.

После этого вам нужно будет настроить, чтобы узел запускался каждый раз, когда сообщение отправляется боту. Для этого выберите опцию «сообщение» в поле «Обновления». Наконец, нажмите «Выполнить узел» в правом верхнем углу диалогового окна. И вуаля, наш узел Telegram Trigger готов.

Вот гифка, на которой я выполняю описанные выше действия.

Создание узла погоды на n8n

Теперь пришло время добавить узел OpenWeatherMap.Этот узел будет получать информацию о погоде для нашего бота.

Для этого нажмите кнопку + в правом верхнем углу экрана и выберите узел OpenWeatherMap. Нам снова нужно добавить учетные данные для API. Чтобы получить ключ API для OpenWeatherMap, вам необходимо зарегистрировать бесплатную учетную запись, и здесь вы найдете свои ключи API. Получив ключ, создайте новые учетные данные, как вы это делали для узла Telegram Trigger.

Для меня настройки узла по умолчанию были идеальными. Я только что добавил

  berlin, de  
как город.Вы можете проверить код своего города здесь. Наконец, нажмите на «Execute Node», и мы готовы!

Вот гифка, на которой я выполняю описанные выше действия.

Создание узла Telegram на n8n

Теперь вы должны сохранить рабочий процесс, нажав «Сохранить как» в меню «Рабочий процесс» в левом верхнем углу.

Теперь отправьте сообщение боту, и вы увидите, что оно будет получено триггером.

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

Добавьте узел Telegram, как вы добавляли узлы раньше. Перед тем как перейти к настройке узла, убедитесь, что вы подключили его к узлу OpenWeatherMap, прежде чем продолжить. Это гарантирует, что узел получит данные от узла Telegram Trigger и OpenWeatherMap для настройки конфигурации.

Теперь пора настроить узел. У нас уже есть учетные данные Telegram, которые мы ввели на раннем этапе, и их можно использовать повторно. После выбора учетных данных щелкните значок карандаша рядом с учетными данными и убедитесь, что вы переместили узел «Telegram» из столбца «Нет доступа» слева в столбец «Доступ» справа. Как только вы закончите с этим, это должно выглядеть так.

У вас осталось настроить два поля: идентификатор чата и текст. Поскольку нам нужно отправить сообщение человеку, который запросил бота, мы можем получить его идентификатор чата из узла Telegram Trigger. Поскольку это динамический фрагмент информации, мы нажимаем на значок шестеренки рядом с полем «Идентификатор чата», чтобы добавить выражения. Здесь вы можете выбрать:

  Узлы> Триггер Telegram> Выходные данные> JSON> сообщение> чат> id  

Для поля «Текст», поскольку нам снова нужно добавить дополнительную динамическую информацию, мы выберем вывод из OpenWeatherMap аналогичным образом:

  Node> OpenWeatherMap> Output Data> JSON> main> temp  

Это даст нам текущее значение температуры.Наконец, нажмите на «Execute Node», и вы увидите, что это заставит бот отправить вам сообщение в Telegram.

Вот гифка, на которой я выполняю описанные выше действия.

Я бы порекомендовал вам поиграть с различными выходными значениями узла, чтобы создать собственное сообщение. В итоге я добавил следующее выражение для поля «Текст»:

  Прямо сейчас у нас есть {{$ node ["OpenWeatherMap"]. Json ["weather"] [0] ["description"]}}. Температура {{$ node ["OpenWeatherMap"].json ["main"] ["temp"]}} ° C, но это действительно похоже на {{$ node ["OpenWeatherMap"]. json ["main"] ["feel_like"]}} ° C 🙂  

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

После сохранения рабочего процесса вы можете активировать его, нажав кнопку с пометкой «Активный» в правом верхнем углу. Бот будет продолжать работать, пока на вашем компьютере активен рабочий процесс.

Чтобы он работал, его нужно где-то разместить. Дополнительную информацию о настройке сервера можно найти здесь.n8n также работает над собственной размещенной версией. Если вам интересно узнать об этом больше, вы можете написать нам об этом здесь.

Следующие шаги

Это руководство содержало бота Telegram с базовым рабочим процессом n8n. n8n имеет множество интеграций, которые могут просто обеспечить очень сложные рабочие процессы. В качестве следующего упражнения вы также можете изучить получение ежедневных данных панели управления, возможно, из Google Sheets или Airtable. Вы можете создать другую команду и добавить узел IF или Switch перед узлом Telegram Trigger для обработки различных команд.Вы также можете узнать, как создать свои собственные узлы здесь.

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

Заключение

Телеграмм-ботов интересно создавать и они могут открывать шлюз для быстрого получения любой информации. Создание серверной части таких ботов требует знания работы с API и может оказаться сложной задачей, если вы только что вошли в мир программирования или у вас нет времени.Использование решений без кода, таких как n8n, позволяет эффективно создавать внутренний рабочий процесс таких систем без необходимости углубляться в механику.