Воскресенье , 23 июня 2024
Бизнес-Новости
Разное / Создание бота телеграмм: 404 Page not found | База знаний Selectel

Создание бота телеграмм: 404 Page not found | База знаний Selectel

Содержание

Создание бота Telegram для решения бизнес задач | Разработка чат бота

Telegram любят многие. Им пользуется более 200 млн человек, причем цифра ежедневно увеличивается примерно на 600 тысяч. Ваши клиенты сидят в «Телеграме» с вероятностью едва ли не 100%. Значит, к ним непременно стоит обращаться через этот мессенджер.

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

  • Работать с аудиторией;
  • Получать заказы;
  • Отслеживать бизнес-процессы;
  • Получать актуальную статистику по сайту или соцсетям.

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

Решение бизнес-задач через бота «Телеграм»

Наверняка вам хочется снять с себя рутинную работу, сэкономив время и деньги.

Выход — все тот же бот. К задачам, с которыми он может справиться, относятся:

  • Предоставление вам информации по запросу о состоянии вашего бизнеса и деловой и маркетинговой активности;
  • Предоставление клиентам по запросу свежих новостей и акций;
  • Звонки и сообщения клиентам с целью информирования или напоминания;
  • Проведение голосований и опросов;
  • Знакомство с товарами и услугами, помощь в их выборе;
  • Обучение сотрудников компании;
  • Игры с пользователями;
  • Оформление заказов.

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

Мы создаем боты Telegram с нуля, учитывая обратную связь от клиента. Определяя технологию для создания бота «Телеграм», мы ориентируемся на клиентскую задачу и ее цели и стараемся подобрать экономичное и простое решение.

Закажите создание бота для Telegram, чтобы увидеть качественные изменения в бизнесе!

Цена на telegram
Цена на Создание бота для Telegram — от 5 000 р.

Срок выполнения – от 1 рабочего дня.

Чтобы сделать заказ вы можете:

  • позвонить нам по телефону +7 (495) 7777-986, или
  • написать по электронной почте [email protected], или
  • заполнить форму онлайн заказа ниже.

Форма заполнена неверно.

пишем с нуля на примере бота с курсом валют

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

Время переходить к делу и узнать наконец, как создавать ботов в Telegram.

Шаг №0: немного теории об API Telegram-ботов

Начать руководство стоит с простого вопроса: как создавать чат-ботов в Telegram?

Ответ очень простой: для чтения сообщений отправленных пользователями и для отправки сообщений назад используется API HTML. Это требует использования URL:

https://api.telegram.org/bot/METHOD_NAME

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

Токен генерируется при создании бота. METHOD_NAME — это метод, например, getUpdates, sendMessage, getChat и так далее.

Токен выглядит приблизительно так:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Для выполнения запросов используются как GET, так и POST запросы. Многие методы требуют дополнительных параметров (методу sendMessage, например, нужно передать chat_id и текст). Эти параметры могут быть переданы как строка запроса URL, application/x-www-form-urlencoded и application-json (кроме загрузки файлов). Еще одно требование — кодировка UTF-8.

После отправки запроса к API, вы получаете ответ в формате JSON. Например, если извлечь данные с помощью метода getME, ответ будет такой:

GET https://api.telegram.org/bot<token>/getMe
{
   ok: true,
   result: {
       id: 231757398,
       first_name: "Exchange Rate Bot",
       username: "exchangetestbot"
   }
}

Если значение ‘ok’ — true, значит запрос был успешным и результат отобразится в поле ‘field’.

Если false — в поле ‘description’ будет сообщение об ошибке.

Список всех типов данных и методов API Telegram-бота можно найти здесь (ENG) или с переводом здесь (ру) .

Следующий вопрос: как получать пользовательские сообщения?

Есть два варианта.

Первый — вручную создавать запросы с помощью метода getUpdates. В качестве объекта вы получите массив объектов Update. Этот метод работает как технология длинных опросов (long polling), когда вы отправляете запрос, обрабатываете данные и начинаете повторяете процесс. Чтобы избежать повторной обработки одних и тех же данных рекомендуется использовать параметр offset.

Второй вариант — использовать webhooks. Метод setWebhook нужно будет применить только один раз. После этого Telegram будет отправлять все обновления на конкретный URL-адрес, как только они появятся. Единственное ограничение — необходим HTTPS, но можно использовать и сертификаты, заверенные самостоятельно.

Как выбрать оптимальный метод? Метод getUpdates лучше всего подходит, если:

  1. Вы не хотите или не можете настраивать HTTPS во время разработки.
  2. Вы работаете со скриптовыми языками, которые сложно интегрировать в веб-сервер.
  3. У бота высокая нагрузка.
  4. Вы меняете сервер бота время от времени.

Метод с Webhook лучше подойдет в таких случаях:

  1. Вы используете веб-языки (например, PHP).
  2. У бота низкая нагрузка, и нет смысла делать запросы вручную.
  3. Бот на постоянной основе интегрирован в веб-сервер.

В этом руководстве будет использоваться метод getUpdates.

Еще один вопрос: как создать зарегистрировать бота?

@BotFather используется для создания ботов в Telegram. Он также отвечает за базовую настройку (описание, фото профиля, встроенная поддержка и так далее).

Существует масса библиотек, которые облегчают процесс работы с API Telegram-бота.

Вот некоторые из них:

По своей сути, все эти библиотеки — оболочки HTML-запросов. Большая часть из них написана с помощью принципов ООП. Типы данных Telegram Bot API представлены в виде классов.

В этом руководстве будет использоваться библиотека pyTelegramBotApi.

Шаг №1: реализовать запросы курсов валют

Весь код был проверен на версии Python==3.7 c использование библиотек:
pyTelegramBotAPI==3.6.6
pytz==2019.1
requests==2.7.0

Полезно: Краткое руководство по библиотеке Python Requests

Начать стоит с написания Python-скрипта, который будет реализовывать логику конкретных запросов курсов валют. Использовать будем PrivatBank API. URL: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5.

Пример ответа:

[
    {
        ccy:"USD",
	base_ccy:"UAH",
        buy:"25.90000",
        sale:"26.25000"
    },
    {
	ccy:"EUR",
        base_ccy:"UAH",
        buy:"29. 10000",
        sale:"29.85000"
    },
    {
        ccy:"RUR",
        base_ccy:"UAH",
        buy:"0.37800",
        sale:"0.41800"
    },
    {
        ccy:"BTC",
        base_ccy:"USD",
        buy:"11220.0384",
        sale:"12401.0950"
    }
]

Создадим файл pb.py со следующим кодом:

import re  
import requests  
import json  
  
  
URL = 'https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5'  
  
  
def load_exchange():  
    return json.loads(requests.get(URL).text)  
  
  
def get_exchange(ccy_key):  
    for exc in load_exchange():  
        if ccy_key == exc['ccy']:  
            return exc  
    return False  
  
  
def get_exchanges(ccy_pattern):  
    result = []  
    ccy_pattern = re.escape(ccy_pattern) + '.*'  
  for exc in load_exchange():  
        if re.
match(ccy_pattern, exc['ccy'], re.IGNORECASE) is not None: result.append(exc) return result

Были реализованы три метода:

  • load_exchange: загружает курсы валют по указанному URL-адресу и возвращает их в формате словаря(dict).
  • get_exchange: возвращает курсы валют по запрошенной валюте.
  • get_exchanges: возвращает список валют в соответствии с шаблоном (требуется для поиска валют во встроенных запросах).

Шаг №2: создать Telegram-бота с помощью @BotFather

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

Done! Congratulations on your new bot. You will find it at telegram.me/<username>. 
You can now add a description, about section and profile picture for your bot, see /help for a list of commands.  
By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. 
Just make sure the bot is fully operational before you do this.

Use this token to access the HTTP API:
<token> (here goes the bot’s token)

For a description of the Bot API, see this page: https://core.telegram.org/bots/api

Его нужно сразу настроить. Необходимо добавить описание и текст о боте (команды /setdescription и /setabouttext), фото профиля (/setuserpic), включить встроенный режим (/setinline), добавить описания команд (/setcommands). Потребуется использовать две команды: /help и /exchange. Стоит описать их в /setcommands.

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

Шаг №3: настроить и запустить бота

Начнем с создания файла config.py для настройки:

TOKEN = '<bot token>'  
TIMEZONE = 'Europe/Kiev'
TIMEZONE_COMMON_NAME = 'Kiev'

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

Создадим файл bot.py. Нужно импортировать все необходимые библиотеки, файлы с настройками и предварительно созданный pb.py. Если каких-то библиотек не хватает, их можно установить с помощью pip.

import telebot
import config
import pb
import datetime
import pytz
import json
import traceback


P_TIMEZONE = pytz.timezone(config.TIMEZONE)
TIMEZONE_COMMON_NAME = config. TIMEZONE_COMMON_NAME

Создадим бота с помощью библиотеки pyTelegramBotAPI. Для этого конструктору нужно передать токен:

bot.py

bot = telebot.TeleBot(config.TOKEN)
bot.polling(none_stop=True)

Шаг №4: написать обработчик команды /start

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

Из переменной бота возможно вызывать любые методы API Telegram-бота.

Начнем с написания обработчика команды /start и добавим его перед строкой bot.polling(none_stop=True):

@bot.message_handler(commands=['start'])  
def start_command(message):  
    bot.send_message(  
        message.chat.id,  
        'Greetings! I can show you exchange rates.\n' +  
        'To get the exchange rates press /exchange. \n' +  
        'To get help press /help.'  
  )

Как можно видеть, pyTelegramBotApi использует декораторы Python для запуска обработчиков разных команд Telegram. Также можно перехватывать сообщения с помощью регулярных выражений, узнавать тип содержимого в них и лямбда-функции.

В нашем случае если условие commands=['start'] равно True, тогда будет вызвана функция start_command. Объект сообщения (десериализованный тип Message) будет передан функции. После этого вы просто запускаете send_message в том же чате с конкретным сообщением.

Это было просто, не так ли?

Шаг №5: создать обработчик команды /help

Давайте оживим обработчик команды /help с помощью встроенной кнопки со ссылкой на ваш аккаунт в Telegram. Кнопку можно озаглавить “Message the developer”.

@bot.message_handler(commands=['help'])  
def help_command(message):  
    keyboard = telebot. types.InlineKeyboardMarkup()  
    keyboard.add(  
        telebot.types.InlineKeyboardButton(  
            'Message the developer', url='telegram.me/artiomtb'  
  )  
    )  
    bot.send_message(  
        message.chat.id,  
        '1) To receive a list of available currencies press /exchange.\n' +  
        '2) Click on the currency you are interested in.\n' +  
        '3) You will receive a message containing information regarding the source and the target currencies, ' +  
        'buying rates and selling rates.\n' +  
        '4) Click “Update” to receive the current information regarding the request. ' +  
        'The bot will also show the difference between the previous and the current exchange rates.\n' +  
        '5) The bot supports inline. Type @<botusername> in any chat and the first letters of a currency.',  
        reply_markup=keyboard  
    )

Как видно в примере выше, был использован дополнительный параметр (reply_markup) для метода send_message. Метод получил встроенную клавиатуру (InlineKeyboardMarkup) с одной кнопкой (InlineKeyboardButton) и следующим текстом: “Message the developer” и url='telegram.me/artiomtb'.

Код выше выглядит вот так:

Шаг №6: добавить обработчик команды /exchange

Обработчик команды /exchange отображает меню выбора валюты и встроенную клавиатуру с 3 кнопками: USD, EUR и RUR (это валюты, поддерживаемые API банка).

@bot.message_handler(commands=['exchange'])  
def exchange_command(message):  
    keyboard = telebot.types.InlineKeyboardMarkup()  
    keyboard.row(  
        telebot.types.InlineKeyboardButton('USD', callback_data='get-USD')  
    )  
    keyboard.row(  
        telebot.types.InlineKeyboardButton('EUR', callback_data='get-EUR'),  
        telebot.types.InlineKeyboardButton('RUR', callback_data='get-RUR')  
    )  
  
    bot.send_message(  
        message. chat.id,   
        'Click on the currency of choice:',  
        reply_markup=keyboard  
    )

Вот как работает InlineKeyboardButton. Когда пользователь нажимает на кнопку, вы получаете CallbackQuery (в параметре data содержится callback-data) в getUpdates. Таким образом вы знаете, какую именно кнопку нажал пользователь, и как ее правильно обработать.

Вот как работает ответ /exchange:

Шаг №7: написать обработчик для кнопок встроенной клавиатуры

В библиотеке pyTelegramBot Api есть декоратор @bot.callback_query_handler, который передает объект CallbackQuery во вложенную функцию.

@bot.callback_query_handler(func=lambda call: True)  
def iq_callback(query):  
    data = query.data  
    if data.startswith('get-'):  
        get_ex_callback(query)

Давайте реализуем метод get_ex_callback:

def get_ex_callback(query):  
    bot. answer_callback_query(query.id)  
    send_exchange_result(query.message, query.data[4:])

Метод answer_callback_query нужен, чтобы убрать состояние загрузки, к которому переходит бот после нажатия кнопки. Отправим сообщение send_exchange_query. Ему нужно передать Message и код валюты (получить ее можно из query.data. Если это, например, get-USD, передавайте USD).

Реализуем send_exchange_result:

def send_exchange_result(message, ex_code):  
    bot.send_chat_action(message.chat.id, 'typing')  
    ex = pb.get_exchange(ex_code)  
    bot.send_message(  
        message.chat.id, serialize_ex(ex),  
        reply_markup=get_update_keyboard(ex),  
	parse_mode='HTML'  
    )

Все довольно просто.

Сперва отправим состояние ввода в чат, так чтобы бот показывал индикатор «набора текста», пока API банка получает запрос. Теперь вызовем метод get_exchange из файла pb. py, который получит код валюты (например, USD). Также нужно вызвать два новых метода в send_message: serialize_ex, сериализатор валюты и get_update_keyboard (который возвращает клавиатуре кнопки “Update” и “Share”).

def get_update_keyboard(ex):  
    keyboard = telebot.types.InlineKeyboardMarkup()  
    keyboard.row(  
        telebot.types.InlineKeyboardButton(  
            'Update',  
	    callback_data=json.dumps({  
                't': 'u',  
		'e': {  
                    'b': ex['buy'],  
		    's': ex['sale'],  
		    'c': ex['ccy']  
                }  
            }).replace(' ', '')  
        ),  
	telebot.types.InlineKeyboardButton('Share', switch_inline_query=ex['ccy'])  
    )  
    return keyboard

Запишем в get_update_keyboard текущий курс валют в callback_data в форме JSON. JSON сжимается, потому что максимальный разрешенный размер файла равен 64 байтам.

Кнопка t значит тип, а e — обмен. Остальное выполнено по тому же принципу.

У кнопки Share есть параметр switch_inline_query. После нажатия кнопки пользователю будет предложено выбрать один из чатов, открыть этот чат и ввести имя бота и определенный запрос в поле ввода.

Методы serialize_ex и дополнительный serialize_exchange_diff нужны, чтобы показывать разницу между текущим и старыми курсами валют после нажатия кнопки Update.

def serialize_ex(ex_json, diff=None):  
    result = '<b>' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':</b>\n\n' + \  
             'Buy: ' + ex_json['buy']  
    if diff:  
        result += ' ' + serialize_exchange_diff(diff['buy_diff']) + '\n' + \  
                  'Sell: ' + ex_json['sale'] + \  
                  ' ' + serialize_exchange_diff(diff['sale_diff']) + '\n'  
    else:  
        result += '\nSell: ' + ex_json['sale'] + '\n'  
    return result


def serialize_exchange_diff(diff):  
    result = ''  
    if diff > 0:  
        result = '(' + str(diff) + ' <img draggable="false" data-mce-resize="false" data-mce-placeholder="1" data-wp-emoji="1" alt="<img draggable="false" data-mce-resize="false" data-mce-placeholder="1" data-wp-emoji="1" alt="<img draggable="false" data-mce-resize="false" data-mce-placeholder="1" data-wp-emoji="1" alt="<img draggable="false" data-mce-resize="false" data-mce-placeholder="1" data-wp-emoji="1" alt="<img draggable="false" data-mce-resize="false" data-mce-placeholder="1" data-wp-emoji="1" alt="↗️" src="https://s. w.org/images/core/emoji/2.3/svg/2197.svg">" src="https://s.w.org/images/core/emoji/2.3/svg/2197.svg">" src="https://s.w.org/images/core/emoji/2.3/svg/2197.svg">" src="https://s.w.org/images/core/emoji/72x72/2197.png">" src="https://s.w.org/images/core/emoji/72x72/2197.png">)'  
    elif diff < 0:  
        result = '(' + str(diff)[1:] + ' <img draggable="false" data-mce-resize="false" data-mce-placeholder="1" data-wp-emoji="1" alt="<img draggable="false" data-mce-resize="false" data-mce-placeholder="1" data-wp-emoji="1" alt="<img draggable="false" data-mce-resize="false" data-mce-placeholder="1" data-wp-emoji="1" alt="<img draggable="false" data-mce-resize="false" data-mce-placeholder="1" data-wp-emoji="1" alt="<img draggable="false" data-mce-resize="false" data-mce-placeholder="1" data-wp-emoji="1" alt="↘️" src="https://s.w.org/images/core/emoji/2.3/svg/2198.svg">" src="https://s.w.org/images/core/emoji/2.3/svg/2198.svg">" src="https://s. w.org/images/core/emoji/2.3/svg/2198.svg">" src="https://s.w.org/images/core/emoji/72x72/2198.png">" src="https://s.w.org/images/core/emoji/72x72/2198.png">)'  
    return result

Как видно, метод serialize_ex получает необязательный параметр diff. Ему будет передаваться разница между курсами обмена в формате {'buy_diff': <float>, 'sale_diff': <float>}. Это будет происходить во время сериализации после нажатия кнопки Update. Когда курсы валют отображаются первый раз, он нам не нужен.

Вот как будет выглядеть бот после нажатия кнопки USD:

Шаг №8: реализовать обработчик кнопки обновления

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

@bot.callback_query_handler(func=lambda call: True)  
def iq_callback(query):  
    data = query.data  
    if data. startswith('get-'):  
        get_ex_callback(query)  
    else:  
        try:  
            if json.loads(data)['t'] == 'u':  
                edit_message_callback(query)  
        except ValueError:  
            pass

Если данные обратного вызова начинаются с get- (get-USD, get-EUR и так далее), тогда нужно вызывать get_ex_callback, как раньше. В противном случае стоит попробовать разобрать строку JSON и получить ее ключ t. Если его значение равно u, тогда нужно вызвать метод edit_message_callback. Реализуем это:

def edit_message_callback(query):  
    data = json.loads(query.data)['e']  
    exchange_now = pb.get_exchange(data['c'])  
    text = serialize_ex(  
        exchange_now,  
	get_exchange_diff(  
            get_ex_from_iq_data(data),  
	    exchange_now  
        )  
    ) + '\n' + get_edited_signature()  
    if query. message:  
        bot.edit_message_text(  
            text,  
	    query.message.chat.id,  
	    query.message.message_id,  
	    reply_markup=get_update_keyboard(exchange_now),  
	    parse_mode='HTML'  
	)  
    elif query.inline_message_id:  
        bot.edit_message_text(  
            text,  
	    inline_message_id=query.inline_message_id,  
	    reply_markup=get_update_keyboard(exchange_now),  
	    parse_mode='HTML'  
	)

Как это работает? Очень просто:

  1. Загружаем текущий курс валюты (exchange_now = pb.get_exchange(data['c'])).
  2. Генерируем текст нового сообщения путем сериализации текущего курса валют с параметром diff, который можно получить с помощью новых методов (о них дальше). Также нужно добавить подпись — get_edited_signature.
  3. Вызываем метод edit_message_text, если оригинальное сообщение не изменилось. Если это ответ на встроенный запрос, передаем другие параметры.

Метод get_ex_from_iq_data разбирает JSON из callback_data:

def get_ex_from_iq_data(exc_json):  
    return {  
        'buy': exc_json['b'],  
	'sale': exc_json['s']  
    }

Метод get_exchange_diff получает старое и текущее значение курсов валют и возвращает разницу в формате {'buy_diff': <float>, 'sale_diff': <float>}:

def get_exchange_diff(last, now):  
    return {  
        'sale_diff': float("%.6f" % (float(now['sale']) - float(last['sale']))),  
	'buy_diff': float("%.6f" % (float(now['buy']) - float(last['buy'])))  
    }

get_edited_signature генерирует текст “Updated…”:

def get_edited_signature():  
    return '<i>Updated ' + \  
           str(datetime.datetime.now(P_TIMEZONE).strftime('%H:%M:%S')) + \  
           ' (' + TIMEZONE_COMMON_NAME + ')</i>'

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

И вот так — если изменились:

Шаг №9: реализовать встроенный режим

Реализация встроенного режима значит, что если пользователь введет @ + имя бота в любом чате, это активирует поиск введенного текста и выведет результаты. После нажатия на один из них бот отправит результат от вашего имени (с пометкой “via bot”).

@bot.inline_handler(func=lambda query: True)  
def query_text(inline_query):  
    bot.answer_inline_query(  
        inline_query.id,  
        get_iq_articles(pb.get_exchanges(inline_query.query))  
    )

Обработчик встроенных запросов реализован.

Библиотека передаст объект InlineQuery в функцию query_text. Внутри используется функция answer_line, которая должна получить inline_query_id и массив объектов (результаты поиска).

Используем get_exchanges для поиска нескольких валют, подходящих под запрос. Нужно передать этот массив методу get_iq_articles, который вернет массив из InlineQueryResultArticle:

def get_iq_articles(exchanges):  
    result = []  
    for exc in exchanges:  
        result.append(  
            telebot. types.InlineQueryResultArticle(  
                id=exc['ccy'],  
	        title=exc['ccy'],  
	        input_message_content=telebot.types.InputTextMessageContent(  
                    serialize_ex(exc),  
		    parse_mode='HTML'  
		),  
	        reply_markup=get_update_keyboard(exc),  
	        description='Convert ' + exc['base_ccy'] + ' -> ' + exc['ccy'],  
	        thumb_height=1  
	    )  
        )   
    return result

Теперь при вводе “@exchangetestbost + пробел” вы увидите следующее:

Попробуем набрать usd, и результат мгновенно отфильтруется:

Проверим предложенный результат:

Кнопка “Update” тоже работает:

Отличная работа! Вы реализовали встроенный режим!

Выводы

Поздравляем! Теперь вы знаете, как сделать бота для Telegram, добавить встроенную клавиатуру, обновление сообщений и встроенный режим. Можете похлопать себя по спине и поднять тост за нового бота.

Источник: How to make a bot: a guide to your first Python chat bot for Telegram

боты для Telegram, Facebook, Viber — Компания MFMS

Диалоговые боты


Meeter Greeter


• Приветственные сообщения
• Обнаружение СПАМа и нецензурной лексики
• Определение тематики обращения
• Самообучение для повышения качества
   автоответов

Suggest


• Подсказка оператору наиболее подходящих
   ответов
• Вычисление эффективности каждого
   предложенного варианта ответа
• Учет предыдущего выбора оператора
• Полноценная и продуктивная замена живого
   оператора


Tag Bot


• Определение языка, тональности и тематики
   обращения
• Распределение обращений на нужного оператора

Кнопочные боты

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

Сценарии кнопочных ботов

Банки и финансовые организации

 

  • адреса банкоматов и офисов
  • курс валют
  • процентные ставки
  • расчет тарифов
  • подбор оптимального вклада/кредита
Перевозчики
  • расписания
  • покупка билета
  • бронирование мест
  • изменение бронирования
  • программы лояльности
Ретейлеры и online-магазины
  • подтверждение доставки
  • выбор времени доставки
  • специальные предложения
  • подбор покупки по интересам
  • товар дня
Страховые компании

статус страхового дела

оформление заявки

расчет стоимости страховки

Клиники

запись к врачу

просмотр результатов анализов

подбор процедур

консультации

Автосервисы

запись на сервисное обслуживание

подбор автомобиля

тест-драйв

заказ деталей

Интеграция

API

Для интеграции с другими системами используется удобные задокументированные библиотеки PHP, JS, JavaScript

Интеграция c edna

BOT подключается как дополнительный модуль к чат-платформе edna

Обучение

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

Преимущества

  • Увелечение скорости ответа
  • Эффективная обработка обращений
  • Сокращение операционных расходов
  • Кнопочные боты
  • Гибкие сценарии
  • Работа с лояльностью
  • Исключение живого оператора
  • Все каналы
  • АнтиСПАМ
  • Исключение нецензурной лексики
  • Повышение вовлеченности

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

Для чего мне это понадобилось? Как писал ранее, телефон не всегда почему-то проверяет почту, несмотря на заданный минимальный интервал проверки. Более удобным показалось использовать telegram для срочных оповещений. Задавшись этой целью, установил на сервер telegram-cli, который, как оказалось позднее, не понадобился. Снесу, однако 🙂
Для начала создаем бота при помощи @BotFather. Задаем ему имя и описание. Я также задал и юзерпик для красоты. Открываем чат с этим ботом, набрав в браузере ссылку https://t.me/. Затем нужно узнать ваш идентификатор. Для этого я воспользовался ботом @userinfobot, вы можете использовать другие методы. В принципе, вся нужная информация у нас есть.
Следующей задачей стала отправка сообщений из скрипта linux. Здесь нам поможет стандартный curl. После серии опытов обрисовалось примерно вот такое тело скрипта:

ChatID=*****
BotToken=******
Text="Hello, world!"

curl -s -X POST "https://api.telegram.org/bot$BotToken/sendMessage" -F chat_id="$ChatID" -F text="$Text"

Здесь ChatID, BotToken и Text — ваш идентификатор в telegram, токен бота, который вам выдали при его создании, и текст сообщения, соответственно. Хочу обратить внимание на то, что переменные в строке curl взяты в двойные кавычки. Это сделано для того, чтобы избежать утери части текста, если в нем присутствуют пробелы.
С текстом разобрались, остается отправка фотографии. Здесь все чуть-чуть сложней:

curl -s -X POST "https://api.telegram.org/bot$BotToken/sendPhoto" -F chat_id="$ChatID" -F photo="@$1" -F caption="$Text"

Добавился еще один параметр photo, в который передается имя файла. Полный путь к файлу у меня передается самому скрипту, поэтому просто используем его. Также параметр text из предыдущего примера я заменил на необязательный caption — название фото.
На текущий момент motion оповещает меня об обнаружении движения, чуть позже присылает фото и ссылку на файл с записью. В планах еще добавить обнаружение лиц на фото, чтобы было видно кто пришел или ушел. Следующим шагом может стать, например, автоматическое включение моего компьютера когда прихожу домой.

Подключение Telegram | База знаний BotHelp

Открыть статью в новом окне ↗
Вы можете подключить Telegram бота к Bothelp. После подключения вы сможете отвечать на сообщения подписчиков боту, отправлять рассылки и создавать автоворонки. Подробнее о возможностях платформы, читайте в статье: Возможности Bothelp.

Шаг 1. Создать бота

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

Как создать бота?

1. Зайдите в свой аккаунт Телеграм. 

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

2. Найдите в поиске аккаунт @BotFather и начните с ним диалог.

3. Введите команду «/newbot».


Создание нового бота

  • Введите имя бота. 

Имя может быть любым. Оно будет отображаться в списке контактов и в диалоге.

  • Введите ник бота. 

Ник обязательно должен заканчиваться на bot. Например: mybot, newbot, qwertybot. Ник уникальный и некоторые ники уже заняты, так что подбирайте до тех пор пока не найдется свободное. Лучше всего использовать название компании или вашу фамилию.
Длинна ника 5 до 32 символов, можно использовать только латинские буквы, цифры и нижнее подчеркивание.

После успешного создания вы увидите следующее сообщение:

Позже вы сможете добавить аватар, описание и другую информацию о боте.


Шаг 2. Скопировать токен

После создания вы увидите следующую надпись:

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

Шаг 3. Подключение к Bothelp

  • Перейдите в настройки кабинета

В старом дизайне:

В новом дизайне:

  • Нажмите на кнопку «Добавить новый канал» 
  • Выберите Telegram в списке доступных каналов 
  • Введите в поле токен вашего бота Telegram
  • Нажмите Продолжить

Новый канал отобразится в списке подключенных, теперь вы можете настроить цепочку сообщений бота. Для этого воспользуйтесь инструкцией: «Создаем сценарий бота».

Настройка бота

Если вы хотите изменить аватар или описание бота вернитесь назад в Телеграм в аккаунт Botfather.

  • Введите команду /mybots чтобы выбрать нужного бота.
  • Выберите Edit bot, чтобы перейти к его редактированию.

Настройки

  • Edit Botpic — позволит загрузить файл с аватаркой для бота
  • Edit Description — позволит добавить описание (до 512 символов). Описание будет отображаться когда пользователи зайдут в диалог с ботом в окне «Что может этот бот?»
  • Edit About — позволит отредактировать описание в профиле бота

Шаг 4. Тестирование

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

Протестировать бота с компьютера можно при помощи приложения или воспользоваться веб-версией.

Видеоинструкция:

_______

Если у вас остались вопросы, задайте их в чате техподдержки. Мы всегда готовы помочь 😃

Разработка Telegram ботов на Python

Резюме:

Telegram — один из самых перспективных месседжеров на данный момент. В отличие от конкурентов вроде WhatsApp и Viber, в этом месседжере никакой рекламы, максимальная безопасность переписок, персонализированные цветные темы, и главное, боты!

Боты в Telegram это не просто автоматизация каких-то процессов вроде скачивания видео с YouTube, это и торговые площадки, магазины для продажи товаров, это и общение с клиентами, ответы на часто-задаваемые вопросы, и много много всего!

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

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

И, самое интересное, вы можете начинать с нуля. Вернее, вам обязательно потребуется изучать параллельно с курсом язык Python, иначе в полной мере вы не постигнете всего, что изложено в курсе, но начать писать ботов — возможно! Просто кому-то это дается быстрее, а кому-то дольше.

Помимо этого курса существуют и бесплатные решения и материалы, которые можно найти на нашем канале по разработке ботов: @botfatherdev

Основные этапы курса

  1. Работа с API Telegram

  2. Экспресс-курс по Python

  3. IDE Pycharm

  4. Работа с асинхронной библиотекой aiogram

  5. Настройка логики в боте

  6. Базы данных

  7. Деплой на сервер

  8. Админка в Django

  9. Бонусы:

    1. Многоуровневое меню

    2. Пример Бота с базой данных, рефералами

    3. Асинхронизация синхронных запросов

    4. Создание статистики в боте (Chatbase) (в разработке)

Создание и разработка чат-ботов для бизнеса — Sibdev

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

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

Можете заказать бота любого вида:

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

  • Нейросетевой: разрабатывается с использованием машинного обучения и методов понимания естественного языка. Разрабатывать такой бот дольше и сложнее, но список задач, с которыми он справляется, обширнее. Бот обучается по мере взаимодействия с пользователями. Он может выбирать ответы из готового списка, опираясь на контекст диалога, а может создавать ответы самостоятельно.

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

Этапы создания бота:

  1. 1. Изучаем специфику проекта и потребности целевой аудитории.

  2. 2. С учетом этих данных и ваших требований формулируем техническое задание.

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

  4. 4. Реализуем все необходимые функции — навигация, консультирование пользователей по FAQ, сбор статистики и другие.

  5. 5. Интегрируем по API с нужными сервисам, например, с интернет-магазином.

  6. 6. Тестируем и запускаем. 

  7. 7. Если понадобится — доработаем бота после запуска.

Чат-бот для Telegram, Viber, ВКонтакте и любых других платформ разрабатываем в срок от 1 недели, в зависимости от сложности поставленных задач.

 

Технологии создания чат-ботов

При разработке используем технологический стек: Vue, React, Python.

встроенных ботов

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


Чтобы включить эту опцию, отправьте команду / setinline в @BotFather и укажите текст-заполнитель, который пользователь увидит в поле ввода после ввода имени вашего бота.

См. Соответствующие методы и объекты в Руководстве по API для ботов.

Встроенные результаты

Встроенные боты поддерживают всех типов контента , доступных в Telegram (всего 20). Они могут отправлять стикеры, видео, музыку, локации, документы и многое другое.


Клиенты могут отображать результаты с вертикальной или горизонтальной прокруткой, в зависимости от типа контента:


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

Переключение режимов inline / PM

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


Вы можете отобразить специальную кнопку «Перейти в личку» над встроенными результатами (или вместо них). Эта кнопка откроет приватный чат с ботом и передаст параметр по вашему выбору, чтобы вы могли запросить у пользователя соответствующие действия по настройке. После этого вы можете использовать встроенную клавиатуру с кнопкой switch_inline_query , чтобы отправить пользователя обратно в исходный чат.

Примеры ботов
@youtube — показывает кнопку «Войти на YouTube», а затем предлагает персонализированные результаты.

Руководство: переход на PM

Результаты на основе местоположения

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

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

Вирусное распространение

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

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

Сбор отзывов

Чтобы узнать, какие из предоставленных результатов ваши пользователи отправляют своим партнерам по чату, отправьте @Botfather команду / setinlinefeedback .Если этот параметр включен, вы будете получать обновления результатов, выбранных вашими пользователями.

Обратите внимание, что это может вызвать проблемы с загрузкой популярных ботов — вы можете получить больше результатов, чем фактические запросы из-за кеширования (см. Параметр cache_time в answerInlineQuery). В этих случаях мы рекомендуем отрегулировать настройку вероятности, чтобы получить 1/10, 1/100 или 1/1000 результатов.

Примеры встроенных ботов

Вот несколько примеров встроенных ботов на случай, если вам интересно увидеть один в действии.Попробуйте любой из этих вариантов:
@gif — поиск GIF
@vid — поиск видео
@pic — поиск изображений Яндекс
@bing — поиск изображений Bing
@wiki — поиск в Википедии
@imdb — поиск IMDB
@bold — выделите жирным, курсивный или фиксированный системный текст

NEW
@youtube — Подключите свою учетную запись для получения персонализированных результатов
@music — Поиск и отправка классической музыки
@foursquare — Найдите и отправьте адреса мест проведения
@sticker — Найдите и отправьте стикеры на основе эмодзи

Создайте бота Telegram без кода и получайте уведомления — NoCodeAPI

Вы должны использовать Telegram для общения с друзьями, семьей или коллегами. Но это удивительное приложение не только. Вы можете создавать своих собственных РОБОТОВ с помощью телеграммы. Например, вы можете держать себя в курсе предстоящего выхода фильма, выпуска альбома-блокбастера, оповещения о выходе следующего эпизода вашего любимого шоу, получать сводку своих тренировок каждую ночь перед сном или получать оповещение о снижении цен на ваш следующий телефон. Все это в одном месте — в вашем приложении Telegram.

Достаточно сказано! Теперь давайте создадим бота для телеграмм через nocodeapi.

бонусных балла: — Telegram-боты быстрее, проще и проще, чем слабые боты.Я лично использую телеграмм-ботов для отслеживания простоев своего сайта.

Шаг 1. Получите токен бота

  • Найдите @botfather в телеграмме.
  • Нажмите и добавьте этот внизу телеграмм канала.
  • Отправьте команду / newbot , чтобы создать нового бота.
  • Дайте этому боту имя.
  • Дайте этому боту имя пользователя.

Бот ответит вам Bot Token Key .Сохраните его, потому что он понадобится вам на шаге 3.

Шаг 2. Запустите бота

  • Найдите окно своего бота в сообщении с токеном @botfather. Это выглядит так: — t.me/your_username. И нажмите на него.
  • Откроется окно чата с ботом.
  • Нажмите / начать в нижней части окна чата с ботом.

Шаг 3. Создайте свое приложение на NoCodeAPI

  • Нажмите «Make Telegram Webhook API»
  • Дайте своему веб-перехватчику «имя»
  • Введите «токен доступа бота» , @botfather дал вам в телеграмме
  • Нажмите «Обновить раскрывающееся меню»
  • Выберите свой «ID чата»
  • Нажмите «Создать»

Шаг 4. Проверьте, работает ли он

  • Ваш веб-перехватчик указан на панели управления nocodeapi.
  • Щелкните по «Открытая площадка»
  • Вы можете видеть URL-адреса для отправки текстового или объектного сообщения вашему боту
  • Отправьте тестовое сообщение, и оно должно появиться в вашем приложении Telegram.

Заключение 😀

Если сработало. Это хорошие новости. Но если вы столкнулись с какой-либо проблемой — свяжитесь с нами по телеграмме. Мы вас посадим.

Я использую веб-перехватчики Telegram для: —

  • Уведомление о сборке Netlify
  • Новая встреча забронирована в календаре
  • Новый пользователь Stripe
  • Веб-сайт недоступен / обновлен с помощью робота безотказной работы

Большинство сервисов поддерживают хуки.Вы можете использовать приложение Telegram для получения уведомлений на свой мобильный телефон.

Надеюсь, это помогло вам в создании вашего API. Если вы нашли это полезным, подпишитесь на наш канал в Twitter по адресу @nocodeapi. Спасибо за чтение. 👋

Как создать канал Telegram для бизнеса: полное руководство

  1. Что такое канал Telegram?
  2. Как настроить канал Telegram: Пошаговая инструкция
  3. Как настроить канал Telegram
  4. Как управлять своим каналом Telegram
  5. Боты Telegram
  6. Как продвигать свой канал Telegram и отслеживать статистику
  7. Заключение

В 2018 году аудитория Telegram достигла 200 миллионов человек, при этом 500 000 новых пользователей присоединяются к мессенджеру каждый день.Telegram — это мощный инструмент, который позволяет обмениваться мгновенными сообщениями, создавать каналы и управлять ими, настраивать ботов и многое другое.

Что такое Telegram-канал?

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

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

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

Как настроить канал Telegram: Пошаговая инструкция

Каналы Telegram делятся на два типа:

  1. Частный канал доступен только подписчикам и не отображается в публичном поиске.Чтобы присоединиться к приватному каналу, вам необходимо получить ссылку от владельца (администратора). Частный канал — отличное решение для компаний и команд. Вы также можете использовать этот тип канала для записи личных заметок, размышлений и т. Д. Кстати, вы можете сделать свой частный канал общедоступным в любой момент.
  2. Публичный канал доступен всем пользователям независимо от того, подписаны они или нет. Публичный канал отображается в результатах поиска и имеет короткий адрес (ссылку).

Вот более полезная информация, которую вы должны знать:

  • Логин вашего канала должен содержать 5-32 символа.
  • Название вашего канала и биография должны содержать не более 255 символов.
  • В одной учетной записи можно создать до 10 общедоступных каналов.
  • Количество абонентов не ограничено.
  • Вы можете пригласить до 200 пользователей из ваших контактов присоединиться к вашему каналу.
  • Вы можете добавить до 50 администраторов.
  • Вы можете активировать до 20 ботов.
  • Вы можете редактировать свой контент в течение 2 дней после публикации.
  • Чтобы удалить канал, у которого более 1000 подписчиков, необходимо обратиться в службу поддержки пользователей.

Как создать канал Telegram

Вы можете настроить канал Telegram через настольное приложение или мобильное приложение (для Android и iOS):

  • Настольное приложение: в верхнем левом углу щелкните значок меню (тот с тремя линиями). В раскрывающемся меню выберите «Создать канал».
  • Приложение для Android: откройте список чатов, щелкните значок меню и выберите «Новый канал».
  • Приложение для iOS: на вкладке «Чаты» щелкните значок нового сообщения в правом верхнем углу.Выберите «Новый канал».

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

Выберите «Создать канал».

Откроется новое окно. Введите название вашего канала и биографию. (См. Ограничения на количество символов выше.) Нажмите «Создать».

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

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

Готово! Теперь вы счастливый обладатель Telegram-канала. Следующим шагом будет настройка и настройка вашего канала.

Как настроить свой канал Telegram

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

Основные элементы дизайна вашего канала Telegram включают имя, биографию (краткое описание) и аватар. Ваша биография должна быть:

  • краткой;
  • прозрачный;
  • информативный.

Пока ограничение составляет 255 символов, попробуйте уместить 200 символов. Таким образом, пользователи смогут быстро и легко воспринимать ваш текст.Раскройте суть вашего канала и предоставьте контактную информацию. Например, вы можете добавить имя бота, ссылку на свои тарифные планы и т. Д.

Чтобы просмотреть свою биографию, щелкните значок меню и выберите «Просмотреть информацию о канале».

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

Чтобы изменить свое имя или биографию, щелкните значок «Меню» и выберите «Управление каналом».

Ваш аватар — это лицо вашего Telegram-канала. Это небольшое изображение вызывает правильные ассоциации в умах вашей аудитории. Для лучшей узнаваемости бренда мы рекомендуем использовать ваш корпоративный логотип в качестве аватара. Как вы могли заметить, Telegram использует круглые аватарки. Однако обрезать изображение не нужно; мессенджер сделает это автоматически.Вам просто нужно загрузить квадратное изображение размером 300 х 300 пикселей. Убедитесь, что основные элементы вашего дизайна расположены по центру.

Есть три способа получить логотип для вашего аватара Telegram:

  1. Найдите подходящее изображение на веб-сайте стоковой фотографии. К плюсам можно отнести большой выбор дизайнов и удобный поиск по теме. С другой стороны, вы никогда не можете быть уверены, что ваше изображение не используется кем-то другим.
  2. Поручите профессиональному дизайнеру создать логотип для вашей компании или проекта.Вы получите уникальный дизайн, который как перчатка соответствует индивидуальности вашего бренда. Единственное, что нарушает сделку — это высокая стоимость таких услуг.
  3. Используйте онлайн-конструктор логотипов, например Логастер. Введите название своего канала, выберите отрасль и выберите один из десятков красивых вариантов.

Чтобы загрузить логотип, щелкните значок меню и выберите «Управление каналом». В новом окне нажмите значок камеры.

Добавьте логотип с вашего устройства. Отрегулируйте видимую область вашего изображения.

Щелкните «Сохранить».Поздравляю! Теперь у вашего Telegram-канала есть лицо!

Как управлять своим каналом Telegram

Администраторы

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

Выберите: Настройки — Управление каналом — Администраторы — Добавить администратора. Из вашего списка подписчиков выберите нужного пользователя. На экране появится новое окно. Проверьте права, которые вы хотите предоставить своему администратору.

Щелкните «Сохранить».

Хэштеги

Хештеги — это быстрый способ найти нужную информацию в социальных сетях. Чтобы опубликовать свой контент, не забудьте добавить хэштеги к каждому из своих постов. У нас есть два полезных совета:

  • Избегайте составных хэштегов, состоящих из нескольких слов.Если у вас есть хэштег, например #marketingnewsinusa, разделите его на более мелкие хэштеги: «#marketing, #news, #usa.
  • Напишите свои хэштеги на языке вашей целевой аудитории.

Опросы

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

Умные правила публикации контента

Ознакомьтесь с нашими советами по управлению контентом:

  • Не публикуйте новый контент в ночное время. Так как не все пользователи отключают уведомления на ночь, вы рискуете случайно их потревожить.
  • Найдите оптимальный график публикаций и придерживайтесь его. В социальных сетях пиковое время публикации сообщений — 8:00, 18:00 и 20:00.Постарайтесь публиковать серьезные материалы утром и оставить менее требовательный контент на потом.
  • Выбирайте качество, а не количество. Помните, что один качественный пост лучше, чем 5 коротких публикаций сомнительной ценности.
  • Ваша частота публикаций зависит от темы вашего канала. Если у вас есть новостной канал, можно публиковать новый контент каждый день (или даже каждый час). Для других отраслей старайтесь делать 2-3 больших сообщения в неделю.
  • Пользователи более открыты для новой информации в рабочие дни, а не в выходные.

Боты Telegram

Боты — это сторонние приложения, которые помогают пользователям Telegram:

  • создавать красивые сообщения;
  • более эффективно взаимодействовать с подписчиками;
  • календарных публикаций;
  • отслеживает жизненно важные показатели
  • устанавливает предупреждения и уведомления и т. Д.

Боты значительно расширяют функциональность Telegram. Взгляните на некоторых популярных ботов Telegram:

  1. @ControllerBot помогает создавать и публиковать сообщения (включая запланированные).С помощью этого бота вы также можете добавлять смайлики в свой пост и просматривать аналитические показатели.
  2. @BotFather — конструктор чат-ботов от SendPulse. Используйте его, чтобы создавать потоки автоответчиков и информировать, консультировать и даже продавать товары своей аудитории.
  3. @vote — эксперт в создании опросов.
  4. @LivegramBot отвечает на сообщения от ваших подписчиков, создает информационные бюллетени и предоставляет вам важную статистику.
  5. @mrkdwnrbt помогает редактировать и планировать содержимое.

Как встроить бота (@ControllerBot) в свой канал Telegram

Во-первых, вам нужно создать собственного бота.Скопируйте это имя — @BotFather — и введите его в поле поиска Telegram. Перейдите на страницу BotFather и отправьте боту команду / start. Затем создайте нового бота, отправив команду / newbot.

Система попросит вас назвать нового бота.

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

Бот успешно создан.Теперь вам нужно скопировать его токен.

Введите @ControllerBot в поле поиска. Перейдите на страницу Controller Bot. Отправьте боту команды / start и / addchannel.

Вставьте токен своего бота.

Добавьте своего вновь созданного бота в качестве администратора своего канала Telegram (см. Выше).

Скопируйте ссылку на канал из своей биографии и вставьте ее в диалоговое окно @ControllerBot.

Введите свой город, чтобы установить часовой пояс. Выполнено! Теперь ваш бот запущен!

Спуститесь вниз и узнайте, на что способен ваш умный бот.

Как продвигать свой канал в Telegram и отслеживать статистику

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

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

Используйте возможности социальных сетей (Instagram, Twitter и т. Д.), Чтобы повысить осведомленность о своем канале Telegram.

Постарайтесь привлечь внимание прессы к вашему каналу. Например, рассмотрите возможность публикации статьи «Лучшие каналы Telegram на [ ваша отрасль / ниша / область знаний ]». Не забудьте поставить свой канал первым или последним в списке. Таким образом, читатели с большей вероятностью запомнят его.

Статистика Telegram

Если вы используете свой канал в коммерческих целях, вам необходимо внимательно следить за его эффективностью. Для аналитических показателей используйте @ChannelAnalyticsBot, Tgstat.ru, или Telemetr.me. Ориентируемся на следующие данные:

  • количество абонентов;
  • количество просмотров за день;
  • количество репостов;
  • количество упоминаний.

Заключение

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

Как создать базового бота Telegram с Python 3

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

Хотя для некоторых разработка бота может показаться сложной задачей, на самом деле это не так. При правильном планировании вы можете настроить бота Telegram менее чем за час! Вот как создать простого бота Telegram, который при запросе выводит милые картинки интернет-кошек.

Начало работы

В этом руководстве мы собираемся использовать Python 3, библиотеку python-telegram-bot и requests, а также TheCatAPI.

У каждого бота в Telegram есть уникальный токен, который помогает ему взаимодействовать с Bot API, чтобы использовать интерфейс обмена сообщениями приложения.Bot API, одна из самых популярных функций Telegram среди разработчиков, позволяет использовать его сообщения в качестве интерфейса.

Чтобы получить токен, начните разговор с @BotFather, который, как следует из названия, является официальным ботом, который позволяет вам создавать и настраивать собственных ботов. Вы можете получить доступ к боту, используя данную ссылку или, альтернативно, поискать «@botfather» в Telegram.

Оказавшись в чате, создайте своего бота, набрав команду / newbot .Продолжайте устанавливать имя и логин вашего бота (мы решили назвать наш @pawsomebot). После этого вы получите токен, уникальный для вашего бота.

Теперь, когда у нас есть все предпосылки, пора переходить к захватывающей части!

Установка библиотек

Если вы используете Windows, откройте командную строку и введите следующие команды:

  pip install python-telegram-bot 
pip install запросы

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

  pip3 install python-telegram-bot 
pip3 install запросы

Написание программы

Создайте новую папку на своем компьютере и откройте ее в своем любимом редакторе. Создайте новый файл и назовите его main.py. Этот файл будет содержать исходный код вашего бота.

Теперь давайте импортируем библиотеки, которые мы установили ранее, вместе с некоторыми из их встроенных функций.

  из telegram. ext import Updater, CommandHandler 
запросов на импорт
import re

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

Начнем с функции получения URL изображения, что можно сделать с помощью модуля запросов. В этой функции мы загружаем данные JSON случайного файла, предоставленного TheCatAPI, и извлекаем его URL для дальнейшего использования. Чтобы посмотреть формат объекта JSON, перейдите на страницу https://api.thecatapi.com/v1/images/search в своем браузере. Вы заметите что-то вроде этого:

  [{"породы": [], "id": "a8c", "url": "url.jpg "," width ": 800," height ": 533}] 

Обратите внимание, что объект JSON — это массив, содержащий словарь. Этот словарь содержит URL с ключом url. Чтобы извлечь URL-адрес, нам нужно указать первый элемент массива, а затем соответствующий ключ.

  def getUrl (): 
# получить объект json с деталями изображения
# извлечь URL-адрес изображения из объекта json
contents = requests.get ('https://api.thecatapi.com/v1/images/search')
url = contents [0] ['url']
вернуть URL

Далее нам нужно отправить это изображение в чат пользователя. Для этого нам понадобится URL изображения, а также уникальный идентификатор чата пользователя. Для этого создадим функцию-оболочку. Сначала мы вызываем getUrl () . для получения URL-адреса случайного изображения — этот URL-адрес изменяется каждый раз, когда ваша программа выполняет итерацию по функции.

Затем следует получение идентификатора чата пользователя-получателя, который определяет целевое местоположение бота для сообщений, и анализ URL-адреса с помощью встроенной функции send_photo () в Bot API.

  def sendImage (bot, update): 
url = getUrl ()
chat_id = update.message.chat_id
bot.send_photo (chat_id = chat_id, image = url)

Чтобы узнать больше о различных встроенных функциях Bot API и о том, как они работают, ознакомьтесь с официальной документацией Telegram после этого руководства.

Наконец, давайте создадим функцию, которая контролирует общую работу бота.В этой функции — условно называемой main () — мы отправляем HTTP-запрос в API бота, используя токен, полученный в начале руководства, а затем определяем, как будет выглядеть пользовательское взаимодействие бота. В таком простом случае, как наш, это означает запуск бота и вызов функции sendImage () по запросу пользователя.

  def main (): 
updater = Updater ("11

035: AAGeJ9316R95NqJLFefV5vQA-UL4np11V2c")


# call sendImage (), когда пользователь вводит команду в телеграммном чате
Updater. dispatcher.add_handler (CommandHandler ('meow', sendImage))
# запуск бота
updater.start_polling ()
updater.idle ()
if __name__ == '__main__':
main ()

Ваша окончательная программа должна выглядеть так:

  из телеграммы. ext import Updater, CommandHandler 
запросы на импорт
import re
def getUrl ():
# получить объект json с деталями изображения
# извлечь URL-адрес изображения из объекта json
contents = requests.get ('https: //api.thecatapi .com / v1 / images / search ')
url = contents [0] [' url ']
return url
def sendImage (bot, update):
url = getUrl ()
chat_id = update.message.chat_id
bot .send_photo (chat_id = chat_id, image = url)
def main ():
updater = Updater ("11

035: AAGeJ9316R95NqJLFefV5vQA-UL4np11V2c")


#call sendImage () когда пользователь вводит команду в телеграмм chat
updater.dispatcher.add_handler (CommandHandler ('meow', sendImage))
# запуск бота
updater.start_polling ()
updater.idle ()
if __name__ == '__main__':
main ()

Ваш собственный Telegram Bot

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

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

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

Разместите своего бота Telegram в сети

Теперь, когда у вас есть бот, попробуйте закрыть main. py на своем ПК и используйте бота в своем приложении для обмена сообщениями Telegram. Он по-прежнему отвечает на команду / meow ? Нет, это не так.

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

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

Один из способов сделать это — использовать недорогую печатную плату (PCB), такую ​​как Raspberry Pi, для настройки собственного веб-сервера и использования его для запуска вашей программы. Он имеет те же преимущества, что и запуск программы на вашем ПК, без затрат на то, чтобы держать его включенным весь день и ночь, поскольку печатные платы, как правило, имеют значительно меньшее энергопотребление.

Кроме того, вы также можете развернуть свою программу в облаке.Перейдите на платформу хостинга веб-приложений, такую ​​как Heroku, AWS, Google Cloud или Microsoft Azure, и выберите подписку, которая наилучшим образом соответствует вашим потребностям. Мы рекомендуем выбрать бесплатную пробную версию или подписку и обновлять ее по мере увеличения масштаба или объема вашей программы.

Как бесплатно разместить свой веб-сайт Python на Heroku

Нужно бесплатно разместить небольшой веб-сайт? Heroku может быть именно тем, что вы ищете.

Об авторе Яш Челлани (Опубликовано 7 статей)

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

Более От Яша Челлани
Подпишитесь на нашу рассылку новостей

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

Еще один шаг…!

Подтвердите свой адрес электронной почты в только что отправленном вам электронном письме.

Создание бота Telegram с помощью Micronaut

Telegram — это хорошо известное приложение для обмена мгновенными сообщениями, используемое во всем мире миллионами пользователей, поэтому здесь нет необходимости в презентации. Сегодня от имени команды Apiumhub мы сосредоточимся на особой функции: ботах, сторонних приложениях, которые работают внутри Telegram. Пользователи могут взаимодействовать с ботами с помощью сообщений и команд. Эти приложения могут иметь несколько применений: получение некоторой информации, покупка товаров, поддержка в чате для электронной коммерции,… вы называете это.И сегодняшняя статья о том, как создать Telegram-бота с Micronaut.

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

Чтобы увидеть, как они работают, мы собираемся создать бота Telegram с некоторыми базовыми командами для развлечения. В проекте будет бот, возвращающий информацию о запрошенной популяции. Мы получаем эти данные из открытого стороннего API. Сервис будет создан с использованием фреймворка Micronaut, чтобы убедиться, что он подходит для наших нужд.

Чтобы наш бот работал и работал, нам нужны 2 штуки:

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

Давайте посмотрим, как создать весь проект.

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

Telegram предлагает бота, который создает новые учетные записи: botfather
Взаимодействуя с ботфотером через вашу учетную запись Telegram, вводя некоторые команды (/ newbot для запуска), он создаст вашего бота.

Отец-бот создаст токен доступа, который понадобится для взаимодействия с API телеграммы.

Настроить веб-сервис

Чтобы получать запросы от нашего бота, Telegram предлагает два варианта:

1.- длинный опрос — наш веб-сервис будет постоянно подключен к серверам Telegram, просто ожидая запроса.
2. — Веб-перехватчики — Наш сервис должен предоставлять API, через который Telegram будет звонить каждый раз, когда появляется новое сообщение.

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

Для настройки url необходим простой вызов API телеграммы:

 
curl -F "url = https: // ВАШ ДОМ.ПРИМЕР / РАСПОЛОЖЕНИЕ ВЕБ-ЧУКА "https://api.telegram.org/bot/setWebhook
  

Внимание!

  • URL-адрес должен быть с https

  • Порт может быть только одним из следующих: 443, 80, 88 или 8443

  • В целях безопасности может быть хорошей идеей разрешить только запросы из телеграмм сетей.

Наш бот уже настроен, и любое сообщение, которое мы ему отправим, будет получено в наш веб-сервис.

Как отвечать на запросы

Чтобы ответить нашему боту, Telegram также предлагает нам 2 варианта:

1-. Ответьте на ответ в том же запросе

2.- Ответьте на запрос HTTP 200 и отправьте новый запрос в API.

Поскольку наш веб-сервис будет взаимодействовать с третьими поставщиками, и мы не можем знать, как долго это будет их ответ, мы выберем второй вариант: мы немедленно отправим сообщение OK, и мы отправим POST на API с ответом, когда у нас есть данные.

Создание веб-сервиса

Для создания веб-сервиса мы будем использовать Micronaut. Это JVM-фреймворк (он может быть написан на Java, Kotlin или Groovy), который обещает низкое потребление памяти и предлагает неблокирующий http-сервер, который кажется очень удобным для нашего варианта использования: нам нужна легкая структура, которая сразу же отвечает ОК, пока он обрабатывает запрос. Этот асинхронный вызов будет обрабатываться через RxJava, поскольку Micronaut поддерживает реактивные потоки.

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

Когда фреймворк запущен и работает, мы создаем контроллер, который будет обрабатывать запросы:

 

@Controller ("/ бот")
class BotController {

    @Почтовый("/")
    индекс развлечения (@ запрос тела: строка): HttpResponse {
        processRequest (запрос)
        вернуть HttpResponse.ok ()
    }
}

  

* Анотация @Controller определяет контроль над рутом / ботом
* @Post определяет метод управления Http POST, как это делается.
* La petición se processa de forma asíncrona y el 200 OK se response inmediatamente.


Для управления протоколом Telegram мы собираемся использовать одну библиотеку с открытым исходным кодом, в которой уже реализованы все запросы и ответы для Telegram API. Многие из них написаны на разных языках и перечислены в телеграмме.

Реализуйте логику бота

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

Шаги заключаются в том, что сначала пользователь ищет имя с / town XXX, и бот ответит списком возможных названий городов со ссылкой рядом с ним. Если пользователь нажимает на любую ссылку, подтверждающую название места, отображается информация о населении.

Пока нам уже нужно обработать 2 возможных запроса, давайте их напишем.

1.- Получить список городов

 

{...}

    приватное развлечение processRequest (request: String) {
        сообщение val: Сообщение = BotUtils.parseUpdate (запрос) .message ()
        val chatId: Long = message.chat (). id ()
        val messageReceived = message.text ()
        when (messageReceived.split ("") [0]) {
            "/ start" -> sendResponse (chatId, "Это самое начало")
            «/ город» -> getCityNamesList (messageReceived, chatId)
            else -> sendResponse (chatId, messageReceived. обратный ())
        }
    }


{...}

  приватное развлечение getCityNamesList (messageReceived: String, chatId: Long) {
        val search = messageReceived.split ("") .drop (1) .joinToString ("% 20")
        val body: Текучий
        пытаться {
            val client = RxHttpClient.create (URL ("https://api.idescat.cat"))
            val города: HttpRequest = HttpRequest.GET ("/ pob / v1 / sug.txt? p = q / $ search; tipus / mun")
            body = client.retrieve (town) .doOnError {sendResponse (chatId, "Ошибка. Попробуйте другое имя")}
        } catch (e: Exception) {
            sendResponse (chatId, "Ничего не найдено.Пожалуйста, попробуйте другое имя ")
            возвращаться
        }

        body.subscribe {
            val split = it.split ("\ n")
            val eq = "Это найденные города: \ n" + split.map {"$ {cleanName (it)} / $ {it.base64encode ()}"}
                .joinToString ("\ n")
            sendResponse (chatId, eq)
        }
    }

  приватное развлечение sendResponse (chatId: Long, reply: String): SendResponse? {
        val bot = TelegramBot (TELEGRAM_TOKEN)
        return bot. execute (SendMessage (chatId, ответ))
    }




  


Команда / town XX вызовет запрос к внешнему API для получения списка городов.RxHttpClient создаст Flowable , который в конечном итоге вернет ответ от внешнего вызова. Мы зафиксируем это событие, потому что мы на него подписаны ( body.subscribe ). При этом процесс не будет ждать ответа и не заблокирует весь запрос.

Асинхронный ответ отправляется через библиотеку Telegram, для которой требуется только в качестве конфигурации токен доступа, созданный для нас botFather.

2.- Получить информацию о данном городе

 

приватное развлечение getCityInfo (chatId: Long, messageReceived: String) {
        val cityDecoded: Строка
        пытаться {
            cityDecoded = сообщение получено.replace ("/", "") .base64decode ()
        } catch (e: Exception) {
            sendResponse (chatId, «неверный текст»)
            возвращаться
        }

        val client = RxHttpClient. create (URL ("https://api.idescat.cat"))
        val города: HttpRequest = HttpRequest.GET ("/ emex / v1 / dades.json? i = f171, f36, f42 & lang = en & id = $ {cityDecoded}")
        client.retrieve (города) .subscribe {
            val data = Gson (). fromJson (это, Fitxes :: class.java)
            valtext = data.fitxes.indicadors.i.map {"$ {it.c}: $ {it.v.split (","). first ()} "}
                .joinToString ("\ n")
            sendResponse (chatId, "Информация о $ {cleanName (cityDecoded)} \ n $ {text}")
        }
    }



  

/ XXXX , где XXX — имя в кодировке base64, вызовет запрос к внешнему API для получения информации для этого конкретного города.

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

Бот работает

Здесь мы видим скриншот бота, ищущего информацию о Барселоне.В качестве бонуса любая несуществующая команда вернет строку в обратном порядке.

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

Заметки по созданию телеграмм-бота

Я хочу получать уведомления о новых объявлениях о недвижимости в моем районе.

Контекст

  • Есть популярный портал объявлений о недвижимости, который я в настоящее время проверяю, чтобы «почувствовать» интересующий меня рынок. Я хочу передать проверку боту на аутсорсинг и получать уведомления о новых объявлениях.
  • Это для любопытства и отслеживания ценовых тенденций. Мне не нужно знать о каждом новом объявлении. Меня интересуют только объявления, соответствующие определенным критериям. Мне не нужно получать уведомления сразу — можно один раз в день, может быть, даже раз в неделю.
  • Это проект для хобби, цена хостинга, образовательная ценность и радость разработчиков — важные и законные опасения по поводу решения 😀
  1. Напишите бот для телеграмм, который будет очищать рекламный портал и отправлять уведомления о новых объявлениях, соответствующих заданным критериям.

    • Я использую телеграмму для некоторых групповых чатов, и она уже есть на моем телефоне.
    • У него хороший бот API.
    • Пользователь / бот может помечать отправляемые сообщения как без звука , чтобы они не отвлекали получателя.
  2. Написать боту с помощью go.

    • Я участвую в некоторых проектах го на работе и чувствую себя довольно продуктивно с языком.
    • Маленькие серверные службы — идеальное место для работы.
    • Я участвовал в некоторых проектах го, но начинать с нуля — это совсем другая игра. Я хотел попрактиковаться в этом.
  3. Разместите бота на Google App Engine (GAE) в Google Cloud (GCP).

    • Я не хочу запускать бота на своем ноутбуке и не хочу обслуживать сервер дома. Нам нужно перейти в ОБЛАКО! 🌥
      • Конечно, мы также можем разместить виртуальную машину в цифровом океане (или в другом месте) за 5 долларов в месяц;).
        • Примечание: если вы хотите попробовать цифровой океан, моя ссылка даст вам кредит в размере 100 долларов для начала (более 60 дней; и 25 долларов для меня).
      • Я хотел использовать управляемое решение, в основном, чтобы по возможности избежать работ по техническому обслуживанию проекта.
    • Почему Google App Engine, а не Heroku или эквиваленты Azure / AWS?
      • В основном, чтобы получить больше практического опыта работы с GCP.
      • У них щедрый уровень бесплатного пользования, и я ожидаю, что мой вариант использования будет соответствовать ограничениям и будет стоить мне 0 долларов в месяц (или около того).

Почему бы не открыть код?

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

Надеюсь, вы все равно найдете эти заметки полезными!

Telegram bot API действительно хорош для экспериментов

Документы действительно хороши, и с ними легко работать. Учебника нет, поэтому я рекомендую использовать клиентское расширение VS code + REST для экспериментов.Это пригодится позже, когда вы попытаетесь отладить или немного лучше понять API. Клиент REST дает нам приятный, интерактивный, почти REPL-подобный опыт разработки.

  1. Поговорите с BothFather в телеграмме, чтобы создать нового бота: [docs].

  2. Начните со следующих запросов:

  @token = токен от отца-бота
@root = https://api.telegram.org/bot


### Информация
GET / getMe


### Получить новые сообщения, отправленные боту
ПОЛУЧИТЬ / getUpdates


### Ответить в чате
@chat_id = числовой-чат-идентификатор
POST / sendMessage? Chat_id = & text = Привет


### Проверить статус веб-перехватчика
GET / getWebhookInfo
  

Кто угодно может общаться с вашим ботом

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

Google App Engine

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

Секреты, которыми сложно управлять

Как ответственный гражданин двенадцатифакторного приложения вы хотите предоставить конфигурацию, включая секреты, через переменные среды. На GAE вы помещаете их в приложение .yaml файл. Проблема в том, что вы не можете сохранить открытый текст файла в своем репо — каждый, у кого есть доступ к коду, также сможет получить доступ к секретам.

См., Например, https://cloud.google.com/appengine/docs/standard/go/sending-messages

Добавьте ключ в раздел переменных среды в app.yaml

вашего приложения.

Обратите внимание, что любой, у кого есть доступ к вашему app.yaml, также будет иметь доступ к вашим ключам API. Если вы не можете хранить app.yaml в безопасном месте, мы рекомендуем вам хранить ключи API в безопасном месте, таком как Datastore, и извлекать ключи во время выполнения, или хранить ключи в своем коде, но зашифровать их с помощью хранилища ключей, например как облачная служба управления ключами.

Это очень далеко от простоты добавления «секретных» переменных env в другие службы. Например. добавление секретов в GitHub Actions — это всего лишь несколько щелчков мышью в пользовательском интерфейсе.

Альтернативой является использование чего-то вроде gitcrypt для прозрачного шифрования файла в вашем репо.

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

Если вы не знакомы с GAE, начните с концепции

См. Https: // cloud.google.com/appengine/docs/standard/go/concepts, особенно раздел Как управляются экземпляры .

Беги по дешевке 🙂

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

На момент написания статьи уровень бесплатного пользования GAE выглядит следующим образом [src]:

  - 28 часов в сутки инстансов "F"
- 9 часов в сутки инстансов «Б»
- 1 ГБ исходящего трафика в день
- Уровень бесплатного пользования доступен только для стандартной среды.
  

Поместите что-нибудь подобное в приложение .yaml , чтобы оставаться в пределах:

  instance_class: F1
автоматическое масштабирование:
  max_instances: 1
  

Старые версии приложения могут все еще работать

Когда вы выполняете приложение gcloud, развертываете сборку GCP и развертываете новую версию вашего приложения. Проблема в том, что старые версии все еще могут работать. Если вы не выполняете разделение трафика, они, вероятно, получат 0 трафика, но они могут обслуживать существующие соединения или выполнять некоторые операции в фоновом режиме. Имейте это в виду, удаляйте старые версии, когда они вам не нужны (и избегайте асинхронных операций, GAE не предназначен для этого, см. Шаблоны параллелизма Go не так полезны, раздел ).

Масштабирование приложения с 0 до 1 после развертывания не гарантируется.

Не забывайте удалять устаревшие изображения!

[docs]

Каждый раз, когда вы развертываете новую версию, создается образ контейнера с помощью службы Cloud Build.Затем этот образ контейнера запускается в стандартной среде App Engine. (…) После завершения развертывания App Engine больше не нуждается в образах контейнеров. Обратите внимание, что они не удаляются автоматически, поэтому, чтобы избежать достижения квоты хранилища, вы можете безопасно удалить любые изображения, которые вам не нужны.

Изображения хранятся в корзине Google Cloud Storage. На самом деле, я заметил, что GCP создал два новых сегмента, к одному из них была прикреплена политика жизненного цикла 15d, а к другому нет.

Встроенные инструменты наблюдения действительно хороши (по крайней мере, для личного проекта)

  • журналов: для журналов предоставляется щедрый уровень бесплатного пользования в размере 50 ГБ на проект, пока вы остаетесь в рамках периода хранения по умолчанию (30 дней).См. [Цены].

  • Следы для профилирования приложения.

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

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

  • Отладчик

    Отладчик действительно великолепен на бумаге, но я не мог заставить его работать. Судя по документации, он недоступен для Go в GAE [src].

Структурирование приложения

Шаблоны параллелизма

Go бесполезны

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

Приложение GAE должно основываться на модели «запрос-ответ». Он получает запрос, выполняет обработку и отвечает на запрос.

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

GCP предоставляет нам примитивы для компенсации отсутствия асинхронной обработки. Мы можем использовать очереди задач и cron jobs .

  • Очереди задач позволяют (что неудивительно!) Ставить задачи в очередь. Задача представляет собой запрос на выполнение в отношении нашего приложения. Это почти как если бы мы экстернализовали каналы го 🙂

  • Задания Cron позволяют нам запускать запрос по определенному расписанию.

Защита внутренних конечных точек

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

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

  • Проверьте, существует ли заголовок X-AppEngine-TaskName [см. Документацию].
  • Проверьте, существует ли заголовок X-Appengine-Cron: true [см. Документацию].

GAE гарантирует, что такие заголовки будут удалены из внешних запросов. Список заголовков, удаленных / перезаписанных GCP, находится [здесь].

Использовать firestore для хранения состояния приложения

Если есть состояние, которое вы хотите сохранить между перезапусками приложения (например, список чатов Telegram для отправки новых объявлений, список уже обработанных объявлений), вам понадобится база данных. О диске не может быть и речи, потому что в GAE нет постоянного хранилища.Firestore — единственная БД, доступная на уровне бесплатного пользования GCP.

К

Firestore нужно немного привыкнуть. Предлагаю посмотреть пару видеороликов Знакомьтесь с Cloud Firestore . Они отличные — короткие и по существу.

Firestore предлагает эмулятор, который можно использовать локально для интеграционных тестов:

Оценить FaaS как альтернативу

Если вы передаете состояние в базу данных (это необходимо, потому что приложение может быть уменьшено до 0 узлов), используйте queues / cron (приложение может быть уменьшено до 0), избегайте кода инициализации (приложение не гарантирует запускается после развертывания), ваше приложение становится набором обработчиков HTTP-запросов, взаимодействующих с БД.

На этом этапе вы можете рассмотреть возможность использования платформы Function-as-a-Service (например, GCP Cloud Functions, AWS Lambda).

Телеграмм-бот — отличный вариант в качестве фасада UI вашего личного проекта. Вы можете дешево запустить его в Google App Engine. После начального обучения с платформой приятно работать, и она не требует значительного обслуживания. Я надеюсь, что этот пост даст вам представление о проблемах, связанных с разработкой для GAE.

Создайте бессерверный чат-бот Telegram, развернутый с использованием Vercel

Мне нравится помогать людям автоматизировать свою жизнь.

Еще в 2018/19 году я потратил много времени на создание автоматических чат-ботов с использованием платформы Facebook Messenger. Это был отличный способ для бизнеса автоматизировать взаимодействие со своими клиентами. Совсем недавно Facebook значительно усложнил создание ботов на своей платформе, ограничив их API, особенно если вы являетесь европейским пользователем.

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

Сообщения Telegram

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

Альтернативный способ получения сообщений из Telegram — использование веб-перехватчиков. Этот метод основан на событиях, и Telegram отправит вам HTTP-запрос POST только тогда, когда от пользователя будет отправлено новое сообщение. Это идеально соответствует идее управляемой событиями архитектуры, такой как бессерверные функции.

Давайте посмотрим на использование API Telegram и бессерверных функций Vercel для создания базового бота и его развертывания на их облачном хостинге.

Создание нового Telegram-бота

Первая задача — создать нового бота, с которым сможет взаимодействовать наш пользователь.Для этого мы должны поговорить с Botfather. Это собственный бот Telegram, который создает и обновляет новых ботов. Либо начните новый чат с Botfather, либо нажмите на этот URL, чтобы открыть бота в Telegram: https://t.me/botfather

Чтобы создать нового бота, мы должны отправить ему команду / newbot . Вам будет предложено ввести имя и имя пользователя бота. Имя отображается в контактных данных. Имя пользователя — это краткое имя, которое используется для упоминаний, например @mybot или t.мне ссылок для обмена. Имя пользователя должно заканчиваться на bot . Поскольку имена пользователей ботов уникальны, на скриншоте видно, что мне потребовалось несколько попыток, чтобы получить имя бота MarcDevBot , которое еще не использовалось другим разработчиком.

Botfather отправит вам токен авторизации в виде длинной строки. Вы используете его для отправки запросов в Telegram Bot API.

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

Vercel account

Чтобы развернуть код нашего чат-бота в Vercel, мы должны создать учетную запись Vercel. Перейдите на страницу регистрации и создайте новую учетную запись, используя свою учетную запись GitHub, GitLab или BitBucket. Если он у вас уже есть, то отлично!

Создание бессерверной функции нашего бота

Мы собираемся использовать Node.js и JavaScript и пару пакетов npm для создания бессерверной функции.Я предполагаю, что у вас установлен Node.js на локальной машине разработки и вы понимаете основы добавления пакетов в проект с помощью командного терминала.

Давайте настроим проект. Создайте каталог с именем test-bot и перейдите в него:

  mkdir тестовый бот 
cd тестовый бот

Далее мы создадим базовый проект Node. js, используя npm . Здесь мы пропускаем ту часть, где заполняем детали проекта в пакете .json файл. Я оставлю это тебе позже.

  npm init -y  

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

  npm install -g vercel  

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

  Vercel логин  

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

Vercel бессерверные функции

Vercel можно использовать для развертывания любого внешнего приложения на своем облачном хостинге, но он также позволяет запускать бессерверные функции, используя AWS Lambda и Google Cloud Functions под капотом. Создать новую бессерверную функцию просто.Vercel хочет каталог с именем / api в корне вашего проекта. Внутри этого каталога вы можете добавить экспортируемую функцию JavaScript, Go, Ruby или Python, и она будет отображаться как маршрут API. Давайте добавим новую функцию для обработки наших сообщений Telegram.

Создайте каталог / api в корне вашего проекта.

  мкдир API  

В выбранном вами редакторе создайте файл с именем webhook.js в каталоге / api .

  module.exports = (запрос, ответ) => {
response.json ({
body: request.body,
query: request.query,
cookies: request.cookies,
});
};

Это откроет функцию API по следующему пути / api / webhook . Для базового использования имя файла представляет собой последнюю часть нашего пути (т.е. webhook.js становится / webhook ). Он всегда находится по пути / api , если вы не измените его через конфигурацию. Мы можем проверить правильность работы кода в нашем браузере, запустив разрабатываемую версию Vercel, используя следующую команду:

  Vercel dev  

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

В конце процесса по умолчанию будет открыта конечная точка HTTP на порту 3000. Нажмите этот URL-адрес в своем браузере, и он сделает запрос GET к вашей недавно открытой бессерверной функции.

http: // localhost: 3000 / api / webhook? Hello = world

Вы должны увидеть аналогичный ответ на следующее:

  {
"запрос": {
"привет": "мир"
},
"куки": {
"_ga": "GA1.1.10178417.1582143681",
"__smToken": "2PgmPwvNz7Ss6Os5nQexTPAl",
" _gid ":" GA1.1.327749069.1610568137 ",
" io ":" WRSUGikIUBDcMAQ_AAAZ "
}
}

Ура! Наша бессерверная функция работает локально и отвечает ответом JSON. 🎉

Создание обработчика сообщений бота Telegram

Telegram ожидает вызова веб-перехватчика, отправив нам запрос POST, когда пользователь вводит сообщение. Давайте создадим обработчик сообщений, чтобы получить это. Мы можем установить пакет npm под названием node-telegram-bot-api , который позволит нам легко получать и отправлять сообщения боту Telegram.

  npm установить node-telegram-bot-api  

Давайте обновим наш API веб-перехватчиков, чтобы получать сообщения, которые нам отправляет Telegram.Сообщение Telegram содержит тело JSON со свойством message в нем. Telegram может отправлять нам и другие сообщения, но пока эта функция будет обрабатывать только текстовые сообщения.

Чтобы отправлять сообщения с помощью Bot API, нам необходимо использовать токен авторизации, который Botfather отправил нам ранее. Мы не хотим жестко закодировать это как переменную в нашем коде, так как это будет угрозой безопасности. Вместо этого мы установим его как переменную среды, которую мы можем использовать.

Скопируйте следующий код поверх веб-перехватчика .js , который вы написали ранее.

  
process.env.NTBA_FIX_319 = «тест»;


const TelegramBot = require ('node-telegram-bot-api');


module.exports = async (запрос, ответ) => {
try {
const bot = new TelegramBot (process.env.TELEGRAM_TOKEN);


const {body} = запрос;


if (body.message) {
const {chat: {id}, text} = body.message;


const message = `✅ Спасибо за ваше сообщение: *" $ {text} "* \ nВеселого дня! 👋🏻`;


ждать бота.sendMessage (идентификатор, сообщение, {parse_mode: 'Markdown'});
}
}
catch (ошибка) {
console.error ('Ошибка отправки сообщения');
console.log (error.toString ());
}


response.send («ОК»);
};

Локальное тестирование нашей функции

Telegram должен отправить нам сообщение на общедоступный URL-адрес с шифрованием SSL / TLS. Поскольку vercel dev предоставляет только конечную точку HTTP, а не HTTPS, нам необходимо предоставить конечную точку HTTPS для общедоступного Интернета, чтобы сервер Telegram мог отправлять нам сообщения.Мы можем сделать это с помощью замечательной библиотеки под названием ngrok . Это позволяет нам обеспечить безопасное соединение с нашим локальным сервером.

Давайте установим ngrok в качестве зависимости разработки для нашего проекта:

  npm install --save-dev ngrok  

Чтобы открыть доступ к Интернету через порт 3000, мы можем запустить эту команду:

  нгрок http 3000  

ngrok теперь будет запущен и предоставит нам два URL-адреса: один для HTTP, а другой для HTTPS.URL-адрес HTTPS необходимо установить в качестве URL-адреса веб-перехватчика для Telegram для связи. Обратите внимание, что ngrok будет генерировать уникальный URL-адрес при каждом запуске. Если вы перезапустите его, вам также придется обновить URL-адрес веб-перехватчика Telegram.

Настройка веб-перехватчика Telegram

Используя предоставленный вам URL-адрес ngrok HTTPS, мы можем сделать HTTP-запрос POST к Telegram API, используя curl , чтобы сообщить ему об отправке сообщений в нашу локальную бессерверную функцию. Для этого используйте следующую команду.Убедитесь, что вы заменили (включая скобки <>) и https://your-ngrok-subdomain.ngrok.io URL на те, которые вам дали:

  curl -X POST https://api.telegram.org/bot/setWebhook -H "Content-type: application / json" -d '{"url": "https: // your-ngrok-subdomain.ngrok.io/api/webhook "} ' 

Если это удастся, API отправит вам следующий ответ JSON:

  {"ok": true, "result": true, "description": "Webhook был установлен"}  

Тестирование с Telegram API

Давайте запустим локальный режим vercel dev , пока работает ngrok . Это запустит среду разработки vercel и позволит функции получать запросы на порт 3000. Чтобы взаимодействовать с API Telegram, мы должны установить токен авторизации в качестве переменной среды. Замените на тот, который дал вам Botfather, и выполните следующую команду:

  TELEGRAM_TOKEN =  vercel dev  

А теперь поговорим с нашим ботом в Telegram. Начните разговор с созданным вами ранее ботом.Отправьте ему любое сообщение, и вы получите ответ.

Бот запущен и отвечает на сообщения! 🎉

Развертывание на Vercel

Теперь, когда ваш бот работает должным образом локально, давайте развернем его в Vercel. Развертывание с помощью Vercel удивительно просто, и поэтому мне это нравится. Введите в корень вашего проекта следующее:

  vercel  

Vercel создаст ваш проект и развернет его на своих серверах для размещения в качестве бессерверной функции.Он развернет его с именем проекта, которое вы создали ранее при запуске vercel login . Для меня это был test-bot .

Прежде чем мы сможем переключиться на использование нашего производственного бота Telegram, нам необходимо настроить переменную среды для токена авторизации Botfather. Есть несколько способов сделать это, но давайте для простоты установим текстовую переменную с помощью консоли Vercel. Перейдите в область настроек вашего проекта. URL-адрес будет примерно таким:

https: // vercel.com / / / settings / environment-variables

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

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

  vercel  

И наконец .

..

Теперь, когда у нас есть наш бессерверный бот Telegram, развернутый в Vercel, нам нужно обновить Telegram, чтобы он отправлял сообщения в нашу функцию Vercel. Установите веб-перехватчик Telegram с помощью команды curl . Опять же, не забудьте заменить токеном авторизации Telegram, а доменное имя project-name.username.vercel.app своим собственным URL-адресом, который Vercel предоставил вам при развертывании приложения. .

  curl -X POST https://api.telegram.org/bot/setWebhook -H "Content-type: application / json" -d '{"url": "https: // имя-проекта.имя пользователя.vercel.app/api/webhook "} ' 

Вот и все. Теперь у вас есть бессерверный бот Telegram, развернутый в Vercel, который может отвечать на сообщения пользователей. Попробуйте ввести другое сообщение в Telegram своему боту и убедитесь, что он правильно отвечает.

Что дальше?

Теперь, когда вы знаете, как развернуть бота Telegram с помощью Vercel, пришло время обновить код. Telegram имеет множество фантастических функций. Вы можете отправлять ему команды и создавать набор автоматических функций. Вы можете использовать своего бота для вызова внешних API-интерфейсов, чтобы получить данные для вас. Подумайте и посмотрите, каких потрясающих ботов вы можете создать!

Звоните мне или пишите в Твиттере, если у вас есть какие-либо вопросы или вам нужна помощь!

Полезные ресурсы

Я загрузил код в репозиторий GitHub здесь: https://github.com/MarcL/telegram-test-bot Не стесняйтесь форкнуть и повторно использовать его по своему усмотрению.

Прочтите Telegram API, чтобы получить более подробные сведения о том, на что способны боты.

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

.

Check Also

Н хилл: Наполеон Хилл — Новинки книг 2020 – скачать или читать онлайн

Содержание Наполеон Хилл «Десять законов процветания» Наполеон Хилл «Десять законов процветания» Читать «Закон успеха» — …

Добавить комментарий

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