Откуда бот телеграм делает выгрузку
Перейти к содержимому

Откуда бот телеграм делает выгрузку

  • автор:

Подключение телеграм бота к гугл таблицам

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

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

Далее речь пойдет о создании первого бота и написании скрипта в Apps Script. Поехали!

Создание телеграм-бота

Откуда вообще берутся боты в телеграме? Опытному пользователю можно пропустить это пункт, ну а новичкам настало время познакомится с @BOTFATHER

Находим отца всех ботов в поиске телеги и видим, что этот бот вообще из себя представляет.

После старта этого бота мы увидим список команд.

Здесь нам нужна команда /newbot, чтобы создать нашего первого бота.

Порядок действий незамысловатый: создаем бота помандой /newbot, даем ему вменяемое имя и задать ему username с обязательным окончанием bot. В результате получаем API токен нашего бота, который и будем дальше использовать.

Можете проверить работоспособность созданного бота перейдя по следующему URL:

https://api.telegram.org/bot2011183802:AAEW7ZNRVvlr1TG1N0DNkRB9G4FmvkBUUUU/getMe

выделенное жирным замените на апи своего бота

Запрос вернет примерно это:

Подключение гугл-таблицы

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

Нам нужен пункт меню Инструменты/Tools -> Редактор скриптов/ Script editor.

Должно получиться вот это:

Затрем скрипт и напишем свой на языке JavaScript. Дополнительно в скрипте могут быть использованы инструменты гугла (классы, методы и т.п.), что мы далее и рассмотрим.

Начнем с объявления глобальных переменных. У нас их будет только две — API бота и App_link.

const API = "2011183802:AAEW7ZNRVvlr1TG1N0DNkRB9G4FmvkBUUUU"; //в кавычки впишите свой апи const App_link = ""; //значение переменной пока оставляем пустым

Напомню, что АПИ бота мы получили в диалоге с botfather.

Далее напишем функцию send, которая отправляет сообщение в чат с нашим ботом.

function send (msg, chat_id) < let payload = < 'method': 'sendMessage', 'chat_id': String(chat_id), 'text': msg, 'parse_mode': 'HTML' >let data = < 'method': 'post', 'payload': payload >UrlFetchApp.fetch('https://api.telegram.org/bot' + API + '/', data); > 

Функция send() отправляет запрос для общения со строними приложениями, в нашем случае — с телегой. Подробнее в документации Class UrlFetchApp.

Аргументы функции — текст отправляемого сообщения и ид чата, в которое это сообщение отправляется.

Далее нужно предусмотреть механизм запуска функции send() . Осуществим это из тела другой функции doPost():

function doPost(e) < let update = JSON.parse(e.postData.contents); //нам нужен только тип "сообщение" if (update.hasOwnProperty('message')) < let msg = update.message; let chat_id = msg.chat.id; let text = msg.text; let user = msg.from.username; if (text == "/hello") < send("Hello World", chat_id) >> > 

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

Здесь мы сравниваем текст полученного ботом сообщения с текстом «/hello» и вызываем функцию send() при совпадении. Это все действия нашего бота.

Сначала сохраним скрипт и задеплоим проект. Кликаем на кнопку Deploy -> New deployment.

В результате откроется окно New deployment, где нужно кликнуть по шестеренке и выбрать Web app.

В поле Who has access выбираем Anyone, что позволит другим пользователям вносить правки в проект и деплоить без вашего участия.

И кликаем Deploy.

При первом запуске приложение попросит авторизации. Проделываем это упражнение.

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

Создадим функцию установки вебхука для получения обновлений от нашего бота.

Добавим следующий код к нашему скрипту:

function api_connector () < UrlFetchApp.fetch("https://api.telegram.org/bot"+API+"/setWebHook?url full-width ">

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

Сообщение «/hello» успешно распознано, на что наш бот ответил «Hello world».

Скрипт целиком ниже:

  • telegrambot
  • google spreadsheets
  • telegram
  • javascript

Как подключить платежную систему с Payments к Telegram

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

Эта инструкция — часть курса «Как создавать Telegram-ботов».

Смотреть весь курс

Введение

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

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

Платежные системы Telegram

Сейчас мессенджер поддерживает оплату в более чем 200 странах через такие шлюзы, как: Stripe, YooMoney, Sberbank, LiqPay, PayMaster и другие.

Все начинается с установки библиотеки aiogram. Сейчас, пожалуй, это самая популярная библиотека для разработки ботов на Python.

python -m pip install aiogram

Переходим в Telegram и пишем тут BotFather’у команду /newbot. Вводим имя нового бота. Важно, чтобы оно заканчивалось словом Bot.

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

Связать бота с приложением

Создаем файл config.py и вписываем в него токен, который выдал BotFather. В основном файле main.py прописываем базовый код любого бота.

Обратите внимание на один важный момент: бот должен обрабатывать каждое сообщение с серверов Telegram. Для этого при запуске бота обязательно нужно поставить аргумент skip_updates в значение False. Это спасет от проблем при обработке платежей.

import config import logging from aiogram import Bot, Dispatcher, executor, types from aiogram.types.message import ContentType # log logging.basicConfig(level=logging.INFO) # init bot = Bot(token=config.TOKEN) dp = Dispatcher(bot) # echo bot @dp.message_handler() async def echo(message; types.Message): await message.answer (message.text) # run long-polling if __name__ == "main": executor.start_polling(dp, skip_updates=False)

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

Возвращаемся к BotFather’у, даем команду /mybots и выбираем из списка своего бота.

В открывшемся меню кликаем на кнопку «Payments». Из предоставленного списка выбираем нужный платежный шлюз. В качестве теста используем PayMaster. Чтобы подключить оплату в Telegram-бота, сначала нужно выполнить тест, поэтому выбираем «PayMaster Test».

Следуем простым инструкциям бота платежной системы и получаем тестовый токен PayMaster. Его сразу же можно сохранить в config.py.

TOKEN = "5432877141:AAHEwBEb2mwnZX56oaHM10o33ZBZwVkvv-s" PAYMENTS_TOKEN = "1744374395:TEST:f14d9f0d42528b780370"

Возвращаемся к коду бота. Для того, чтобы запросить оплату товаров/услуг, нужно сгенерировать invoice с деталями платежа. Отправить его клиенту и обработать результат.

Подключаем оплату

Указываем список доступных цен на продукты. В качестве цены нужно передать целочисленное значение в минимально возможных единицах валюты. Если речь идет о рублях, то стоимость нужно указывать в копейках. То есть место 500 рублей мы тут укажем 500 * 100 или же 50 000 копеек. В случае с долларами будет почти также, $1=100 центов. Если предполагается работа с другими валютами, можно использовать currencies.json от Telegram API.

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

import config import logging from aiogram import Bot, Dispatcher, executor, types from aiogram.types.message import ContentType # log logging.basicConfig(level=logging.INFO) # init bot = Bot(token=config.TOKEN) dp = Dispatcher(bot) # prices PRICE = types.LabeledPrice(label="Подписка на 1 месяц", amount=500*100) # в копейках (руб) # buy @dp.message_handler(commands=['buy']) async def buy(message: types.Message): if config.PAYMENTS_TOKEN.split(':')[1] == 'TEST': await bot.send_message(message.chat.id, "Тестовый платеж. ") await bot.send_invoice(message.chat.id, title="Подписка на бота", description="Активация подписки на бота на 1 месяц", provider_token=config.PAYMENTS_TOKEN, currency="rub", photo_url="https://www.aroged.com/wp-content/uploads/2022/06/Telegram-has-a-premium-subscription.jpg", photo_width=416, photo_height=234, photo_size=416, is_flexible=False, prices=[PRICE], start_parameter="one-month-subscription", payload="test-invoice-payload")

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

Настройки платежей

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

О других параметрах метода send_invoice вы всегда можете прочитать в официальной документации Telegram API.

Теперь нужно создать еще два обработчика: Pre Checkout Query и Successful Payment.

Pre Checkout Query отвечает за обработку и утверждение платежа перед тем, как пользователь его совершит. Так можно проверить доступность товара на складе или уточнить стоимость.

Важно, что серверам Telegram ответ нужен в течение 10 секунд. Если его не будет, платеж не пройдет.

Successful Payment отвечает за обработку успешно проведенного платежа.

# pre checkout (must be answered in 10 seconds) @dp.pre_checkout_query_handler(lambda query: True) async def pre_checkout_query(pre_checkout_q: types.PreCheckoutQuery): await bot.answer_pre_checkout_query(pre_checkout_q.id, ok=True) # successful payment @dp.message_handler(content_types=ContentType.SUCCESSFUL_PAYMENT) async def successful_payment(message: types.Message): print("SUCCESSFUL PAYMENT:") payment_info = message.successful_payment.to_python() for k, v in payment_info.items(): print(f" = ") await bot.send_message(message.chat.id, f"Платеж на сумму  прошел успешно. ") # run long-polling if __name__ == "__main__": executor.start_polling(dp, skip_updates=False)

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

Как бот работает на практике

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

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

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

Перенос бота на боевой сервер

Чтобы бот работал 24/7 вне зависимости от того, включен компьютер или нет, зальем его на реальный сервер.

Для этого воспользуемся облачным сервером линейки Shared Line от Selectel. Калькулятор панели управления позволяет выбрать гибкую конфигурацию сервера и сразу узнать, сколько будет стоить решение. Все продукты и услуги собраны у провайдера в одном месте, поэтому ими легко управлять. Арендовать сервер можно от 10 ₽/день, а в консоли есть возможность быстро масштабировать вычислительные ресурсы при необходимости.

Регистрируемся и входим в панель управления my.selectel.ru. Переходим в раздел «Облачная платформа» и выбираем «Серверы». Создаем сервер — после этого шага он загорится в списке как «ACTIVE».

Настраиваем конфигурацию. Для примера используем 1 ядро, 512 МБ DDR4 и 5 ГБ на диске.

Теперь переходим к выгрузке бота на боевой сервер. Сначала нужно подключиться к серверу через SSH. Для этого мы можем воспользоваться программой WinSCP для Windows. В Linux и MAC для этого есть свои встроенные инструменты.

Запускаем WinSCP. В качестве имени хоста указываем IP адрес нашего нового сервера. Логин и пароль можно взять во вкладке «Консоль» в панели управления.

Теперь перенесем сюда файлы нашего бота: config.py и main.py. Далее открываем отдельное соединение с сервером по SSH в консоли.

Для этого в WinSCP нажать кнопку и открыть PuTTY. Можно также воспользоваться командной строкой, принципиальной разницы нет.

Инструкция по настройке уведомлений в Телеграм
из amoCRM с помощью виджета

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

Установка и настройка

Данный виджет вы можете установить самостоятельно из списка интеграций в amoCRM
Или установите по кнопке →

Установить
  1. Создание бота в Телеграм и добавление в чат

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

  • Создайте БОТА в Telegram. Для этого напишите пользователю @BotFather в Телеграме и следуйте инструкции.
  • Скопируйте API Token бота, вида: 365554109:AAGwwRNdBbDeoIlg4w43HsnXmpY7jLVJF8
  • Перейдите в настройки виджета, во вкладке Подключение, вставьте токен и нажмите Отправить;
  • Бот подключен, сохраните настройки виджета.
  • Для сообщений в общий чат — добавьте вновь созданного бота в общий чат, после этого обязательно напишите что либо в чате от любого пользователя.
  • Для личных сообщений — напишите в личку вновь созданному боту любое сообщение.

2. Отправка сообщений из цифровой воронки

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

  • Перейдите в настройки нужной воронки и добавьте новое действие, выберите виджет «Уведомления в Телеграм» от F5;
  • Укажите условия триггера, например, при наличии тега у сделки;
  • Выберите чат, группу, тред или канал, куда нужно отправить сообщение. Сообщения можно отправлять сразу в несколько чатов, выбрав нужный из списка и добавив новое поле.
  • Можно выбрать «Свое значение» и указать любые чаты, перечислив их ID из Телеграмм. ID чатов можно внести как в одно поле через запятую, так и создать несколько полей.
  • В “Свое значение” можно записать переменную и подтянуть значение из любого кастомного поля, в котором может хранится ID чата.
  • Чтобы отправить сообщение в тред, выберите «Использовать топики» и укажите ID треда для каждого чата.
  • Пример ID топика: «-1002101075493».
  • Если список чатов пуст или нужного чата нет в списке: напишите боту любое сообщение или добавьте бота в чат с правами администратора, или напишите любое сообщение в группе, где добавлен бот, после такой активности, чат появится в списке, либо укажите ID чата, выбрав «Свое значение».
  • Добавьте текст, который нужно отправить. Можно использовать любые поля сделки, контакта, компании, эмоджи и форматирование текст. Используйте шаблоны переменных, для модификаций.
  • Пример > — название сделки; > — ответственный; любое поле по ID — >;
  • Поставьте галочку «Запросить заполнение полей», если требуется, и выберите нужные поля. В этом случае вместе с сообщением в чат приходит кнопка редактирования полей прямо из Телеграм.
  • Сохраняйте результат отправки в любое кастомное поле, выбрав пункт «Сохранить уникальный идентификатор сообщения».

Окно настроек виджета

Как форматировать текст в сообщениях в Телеграм

Начертание
жирный
курсив
подчеркнутый
зачеркнутый
текст в виде моноширинного кода

Ссылка в виде кнопки
[button link=»https://cmdf5.ru/widjety-amocrm» text=»Виджеты»]
[button url=»https://start1.com/» text=»Запустить» once] — убрать кнопку, после её нажатия

Кнопка для триггерной ссылки (работает только с виджетом Триггеры )
[button url=»» text=»Завершить сделку»]

Как добавить эмоджи ☕ ?
Win + точка

Запрос полей для заполнения

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

  • Текст
  • Число
  • Дата
  • Список
  • Мультисписок
  • Переключатели и флажки
  • Примечание (добавляет текстовое примечание в сделку)
  • Примечание с геолокацией (добавляет текущую локацию устройства в amoCRM)

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

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

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

На каждый триггер ОТПРАВКИ нужен отдельный триггер УДАЛЕНИЯ

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

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

3. Отправка сообщений из виджета Триггеры

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

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

Добавление кнопок вместо ссылок
Данный функционал работает только в виджете Триггеры! При отправке сообщения из цифровой воронки кнопки не отобразятся.

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

Вместо:
«>Создать
напишите:
[button url=»» text=»Создать»]
При нажатии на такую кнопку браузер не откроется, но сценарий в Триггерах сработает.

Telegram боты. Загружаем файлы больше 50мб

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

  • Для пользователей максимальный размер файла — 1.5Гб
  • Боты ограничены размером всего лишь в 50мб
Telegram API

Раз пользователи могут загружать файлы до 1.5Гб — значит и мы можем — для этого создадим агента (назвал чтобы не путать с ботами) который будет работать в связке с нашим Telegram ботом. Для этого потребуется отдельный аккаунт и Telegram API.

Для начала идем на https://core.telegram.org и по инструкции регистрируем приложение, в итоге вы должны получить api_id и api_hash

Что делает агент?

Бот не может загружать файлы больше 50мб, но если у него есть file_id уже загруженного на сервера Telegram файла — то он может его пересылать. Так что алгоритм следующий

  1. Приложение, работающее на сервере через Bot API формирует файл для отправки
  2. Вызывает агента для загрузки файла на сервера Telegram
  3. Получает от агента file_id
  4. Пользуется загруженным файлом
Пример кода

Потребность загружать большие файлы появилась при написании @AudioTubeBot — изначально аудиофайл разбивался на части и отправлялся по частям. Функционал загрузки больших файлов было решено вынести в отдельное приложение, которое вызывается через subprocess.check_call

#!/usr/bin/env python3 # -*- coding: utf-8 -*- from telethon import TelegramClient from telethon.tl.types import DocumentAttributeAudio import mimetypes entity = 'AudioTube_bot' #имя сессии - все равно какое api_id = 1959 api_hash = '88b68d6da53fe68c1c3541bbefc' phone = '+79620181488' client = TelegramClient(entity, api_id, api_hash, update_workers=None, spawn_read_thread=False) client.connect() if not client.is_user_authorized(): # client.send_code_request(phone) #при первом запуске - раскомментить, после авторизации для избежания FloodWait советую закомментить client.sign_in(phone, input('Enter code: ')) client.start() def main(argv): file_path = argv[1] file_name = argv[2] chat_id = argv[3] object_id = argv[4] bot_name = argv[5] duration = argv[6] mimetypes.add_type('audio/aac','.aac') mimetypes.add_type('audio/ogg','.ogg') msg = client.send_file( str(bot_name), file_path, caption=str(chat_id + ':' + object_id + ':' + duration), file_name=str(file_name), use_cache=False, part_size_kb=512, attributes=[DocumentAttributeAudio( int(duration), voice=None, title=file_name[:-4], performer='')] ) client.disconnect() return 0 if __name__ == '__main__': import sys main(sys.argv[0:]) 
Комментарии:

Вот и весь код — тут используется библиотека Telethon — при запуске программе передается путь к файлу для отправки, имя файла, chat_id — для кого предназначается данный файл), имя бота, который вызвал агента(например у меня это beta и release боты).

client.send_file

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

caption=str(. ) — wat?!

Агент пересылает файлы только боту, добавляя комментарий в caption-у меня это:

  • chat_id конечного пользователя
  • длительность трека
  • object_id в базе данных, к которому нужно привязать file_id, чтобы повторно не загружать файл(индексация, оптимизация и все такое)

Пример вызова в коде бота

На диске в path_file_mp3 уже сохранен файл для загрузки, вызываем подпрограмму и ждем ее завершения.

status = subprocess.check_call( "python3.6 audiotubeagent36/main.py " + path_file_mp3 + ' ' + audio_title + '.'+ us_audio_codec + ' ' + str(chat_id) + ' ' + str(pool_object['_id']) + ' ' + config.BOT_NAME + ' ' + str(duration),shell=True) 

В обработчике входящих сообщений делаем что то подобное

 if message.content_type in ['document','audio']: user_id = message.from_user.id bot_settings = SafeConfigParser() bot_settings.read(config.PATH_SETTINGS_FILE) c_type = message.content_type if functions.check_is_admin(bot_settings, user_id): if c_type == 'audio': file_id = message.audio.file_id audio_title = message.audio.title else: file_id = message.document.file_id audio_title = message.document.file_name[:-4] client_chat_id = message.caption if client_chat_id.find(u':') != -1: client_chat_id, q_pool_obj_id, duration_s = re.split(r':',client_chat_id) #добавляем file_id в базу q_pool.update_request_file_id(str(q_pool_obj_id), str(file_id)) #пересылаем конечному адресату bot.send_audio(int(client_chat_id), file_id,caption='', duration=int(duration_s), title=audio_title, performer='') return 

Вопросы/предложения пишите в комментариях или в чате.

  • Ненормальное программирование
  • Python
  • Программирование
  • API
  • Хранение данных

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

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