Таблица в телеграмм как сделать
Перейти к содержимому

Таблица в телеграмм как сделать

  • автор:

Таблица в телеграмм как сделать

Очень нравится работать с Мажордомо через Телеграм. Спасибо Eraser’у за чудесный модуль, один из моих любимых, не вызывающий никаких нареканий.
Давно хотелось получать сводную инфу о состоянии всего дома разом, а не продираться через систему многоуровневых меню до нужного элемента.
Тут и статейка Удобный просмотр данных сенсоров через телеграмм от directmann подоспела с нужными решениями.

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

//SendTeleStatus //Картинки (как их получить, см Примечание и есть отдельный блог и на форуме ) $drop = hex2bin('F09F92A7'); //капля $tmp = hex2bin('F09F8CA1'); //термометр $walk = json_decode('"'.'\ud83d\ude42'.'"'); //ходют $nomove = json_decode('"'.'\ud83d\udeb7'.'"'); //не ходют $green = json_decode('"'.'\ud83d\udc9a'.'"'); //зеленое сердце $yellow = json_decode('"'.'\ud83d\udc9b'.'"');// и т.д. $red = json_decode('"'.'\ud83d\udc94'.'"'); $subj = ''; $subj .= gg('timeNow').''.PHP_EOL.''.gg('somebodyHomeText').PHP_EOL.'. '.PHP_EOL; $subj .= gg('lastSayMessage').PHP_EOL; $subj .='. '.''.PHP_EOL; $subj .= 'Статусы:'.PHP_EOL; $subj .=''; $subj .='Система: ';//.gg('system.stateTitle').PHP_EOL; if(gg('System.stateColor')=='green')< $subj .= $green.PHP_EOL; >else < if(gg('System.stateColor')=='yellow') $subj .= $yellow; if(gg('System.stateColor')=='red') $subj .= $red; $subj .= gg('System.stateDetails').PHP_EOL; >$subj .='Связь : ';//.gg('Communication.stateTitle').PHP_EOL; if(gg('Communication.stateColor')=='green')< $subj .= $green.PHP_EOL; >else < if(gg('Communication.stateColor')=='yellow') $subj .= $yellow; if(gg('Communication.stateColor')=='red') $subj .= $red; $subj .= gg('Communication.stateDetails').PHP_EOL; >$subj .='. '.PHP_EOL.''; $subj .='комнаты '.$tmp.'°С '.$drop.'% '.$walk.PHP_EOL;//заголовок статуса (я подгонял под свой телефон(( $objects = getObjectsByClass("Rooms"); foreach($objects as $obj) < $room = mb_substr(gg($obj['TITLE'].".title")." ",0,12); // тут основная фишка! $room .= mb_substr(gg($obj['TITLE'].".Temperature")." ",0,7); $room .= mb_substr(gg($obj['TITLE'].".Humidity")." ",0,5); if(gg($obj['TITLE'].".SomebodyHere"))< $room .= $walk.gg($obj['TITLE'].".LatestActivityTime"); >else < $room .= $nomove.substr(gg($obj['TITLE'].".LatestActivityTime"),0,5); >$subj .= $room.PHP_EOL; > $subj .= ''; //echo($subj); runScript('SendTelegram', array("message"=>$subj));

Основная фишка статьи — получение псевдотаблицы ограниченными средствами форматирования телеграма.
Это сделано с помощью имитации табуляции моноширинного шрифта телеграма:

$room = mb_substr(gg($obj['TITLE'].".title")." ",0,12); 

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

runScript('SendTelegram', array("message"=>$subj));

отправляет в телегу текст — абсолютно стандартный:

//SendTelegram // params $message = $params['message']; $img = $params['img']; $video = $params['video']; $album = $params['album']; $descr = $params['description']; include_once(DIR_MODULES . 'telegram/telegram.class.php'); $telegram_module = new telegram(); //Если текст if ($message)< $telegram_module->sendMessageToAll($message); > //Если картинка if ($img) < $telegram_module->sendAction($chat_id,"upload_photo"); $telegram_module->sendImageToAll($img,$descr); > //Если кино if ($video) < $telegram_module->sendVideoToAll($video); > //Если альбом if ($album) < $telegram_module->sendAlbumToAll($album,$descr); >

Примечание:

Бот — отправляешь ему смайл, он в ответ его код. @getemojicodebot

Как создать бота в телеграм с помощью Google таблицы бесплатно

Основное назначение. Дать возможность любому пользователю быстро запустить телеграм бота со своими данными, размещенными в google таблице. Первый шаг – бот информационный, содержит только текст/кнопки(инлайн) и лонгриды, как ответ на нажатие кнопки. Нажатие на кнопку пробрасывает на лист screen_2…256, который содержит картинку, текст(лонгрид) и кнопку назад.

Порядок работы

1. Создайте бот с помощью @BotFather

2. Создайте копию таблицы https://docs.google.com/spreadsheets/d/1un8_usklBqEPlHbGHSlRcSIXgzinIRL1pLQ2FovXFr0/edit в свой google disk. При создании – поставьте галочку Скопировать настройки доступа

3. Подставьте в таблицу свои данные

4. Для подключения вашей таблице к сервису(активизации бота) – перейдите на лист data, вставьте токен вашего бота в ячейку С2 скопируйте id таблицы в ячейку A2 и перейдите по ссылке в ячейке B2. При успешном подключении вы получите страницу с текстом
——
Table
1un8_usklBqEPlHbGHSlRcSIXgzinIRL1pLQ2FovXFr0
connected successfully.

5. Каждое меню/подменю с сопровождающим текстом создается на отдельном листе

6. Каждый лист (screen_. ) имеет 4 колонки

a. Data – текст сообщения / ссылка на картинку / название кнопки

b. Type – тип сообщения которое посылается пользователю text/img/button

c. Time – сейчас не используется

d. Step – номер листа, на который должна вести кнопка

7. Для переключения между листами используется колонка step. Например, после нажатия пользователя на кнопку HTML step=6 пользователь увидит текст/кнопки с листа screen _6

8. Для ускорения работы бота – все данные из таблицы, кроме страницы log хранятся на сервере сервиса. После изменения данных на любом листе – необходимо обновить данные – для этого перейдите по ссылке из ячейки «data!B2»

9. TODO На странице log ведется база подписчиков бота, с последней активностью(что написал, на что нажал) и номером step на текущий момент. Планируется использование для определения, на каком шаге анкетирования пользователь находится и в дальнейшем – рассылка сообщений, мотивирующих закончить анкетирование.

Замечания по заполнению данных screen_.

1. Все данные из ячеек читаются последовательно A2…A100

2. Желательно меню из кнопок располагать внизу / например А98…А100 — button

3. Inline кнопки должны располагаться после ячейки с текстом / например А2 – text, A3 – button, A4 – button …

4. Количество кнопок любое

Гугл таблица как БД для телеграм бота

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

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

Ниже представлен скрин из чата с ботом.

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

Начнем с создания контейнера и написания скрипта в нем. Создаем новый Spreadsheet.

В качестве забираемых значений укажу 4 вопроса на листе Questions.

И варианты ответов для каждого вопроса на листе Answers. Данные из двух таблиц связаны по ИД – первая колонка.

В таблицу Users буду вносить ответы от пользователей, но об этом позже.

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

const doc = SpreadsheetApp.getActive(); const questionsSheet = doc.getSheetByName("Questions"); const answersSheet = doc.getSheetByName("Answers"); const usersSheet = doc.getSheetByName("Users");

Так как скрипт мы разворачиваем в том же документе (контейнере), то нам достаточно использовать метод getActive(). Если вы ссылаетесь на другой Spreadsheet, то можно на него сослаться методами .openByUrl() или .openById().

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

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

function sendQuestions()

Запустить функцию можно из меню, выбрав имя функции и кликнув Run

Меню

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

Логер

Разберем строку в функции по частям.

const questionsArr = questionsSheet.getRange(1,1,questionsSheet.getLastRow(), questionsSheet.getLastColumn()).getValues()

Здесь мы объявляем переменную для записи в нее возвращаемого массива. Далее указываем лист, из которого будем забирать значения questionsSheet. Для листа выбираем метод .getRange() и указываем ячейки, к которым функция должна обратиться.

Перевожу написанное в скобках метода getRange на понятный язык:

getRange(номер строки начала диапазона , номер столбца начала диапазона , номер строки конца диапазона , номер столбца конца диапазона)

Методами листа .getLastRow() и .getLastColumn() получаем номер последней строки и столбца, которые будут равны 4 и 2 соответственно. При этом методы возвращают последние столбец и строку, в которых указано значение (ячейка не пуста) или есть валидация.

Границы заданного диапазона

В то же время можно указать в скобках questionsSheet.getRange(«A1:B4»).

Возвращаемся к функции и к методу диапазона .getValues(). Здесь обратим внимание на то, что существует также метод .getValue(), применять который следует, если мы обращаемся к одной ячейке, например questionsSheet.getRange(3,4) или questionsSheet.getRange(«D3»).

getValues() при этом возвращает двумерный массив, а getValue() — значение.

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

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

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

Обратимся к функции send().

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

В функцию мы передаем текст отправляемого ботом сообщения и ид чата, в который это сообщение будет отправлено. Внутри функции объявляем объект payload и указываем передаваемые параметры. Я использую только необходимые в рамках задачи параметры (method, chat_id, text, parse_mode), но их может быть и больше (ссылка на апи телеграмма для метода sendMessage).

В переменную data передаем payload (передаваемые параметры для метода апи «post») и указываем сам метод post.

В строке UrlFetchApp мы обращаемся к АПИ телеги по ссылке (таким же образом можно обратиться к любому другому доступному АПИ). В этой же строке мы передаем значение переменной token и data. Про token чуть позже.

Вернемся к функции sendQuestions() и вызовем из нее send() для каждого элемента массива questionsArr.

Чтобы обратиться к каждому элементу можно воспользоваться циклами типа for или while. Но я предпочитаю использовать методы массивов и стрелочные функции, которые умещаются в одну строку.

Таким образом, вместо конструкции

for (let i=0; i

я могу написать

questionsArr.forEach(e => send(e[1],chat_id))

Итак, в качестве текста сообщения я забираю из вложенного массива элемент на позиции [1] (на позиции 0 указан ид вопроса).

Нам не достает только чат ид, который я укажу в качестве аргумента функции sendQuestions() и получу следующее:

function sendQuestions(chat_id) < const questionsArr = questionsSheet.getRange(1,1,questionsSheet.getLastRow(), questionsSheet.getLastColumn()).getValues(); Logger.log(questionsArr); questionsArr.forEach(e =>send(e[1],chat_id)); >

Наконец, функцию sendQuestions(chat_id) мы вызовем, когда пользователь запустит бота по команде /start. Пропишем эту логику.

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

function doPost(e) < const update = JSON.parse(e.postData.contents); let msgData = <>if (update.hasOwnProperty('message')) < msgData = < id : update.message.message_id, chat_id : update.message.chat.id, user_name : update.message.from.username, text : update.message.text, is_msg : true >; > >

Результатом функции является объект msgData с ключами id, chat_id, user_name, text, is_msg. Возвращаемые ключи вы можете определить сами, для простоты я указала только те, которые нужны для задачи.

Здесь же я передам в функцию отправки вопросов значение ключа chat_id.

function doPost(e) < const update = JSON.parse(e.postData.contents); let msgData = <>if (update.hasOwnProperty('message')) < msgData = < id : update.message.message_id, chat_id : update.message.chat.id, user_name : update.message.from.username, text : update.message.text, is_msg : true >; > sendQuestions(msgData.chat_id); >

Как создать бота и получить токен уже описывалось здесь. Берем этот токен и записываем в глобальную переменную token. Далее деплоим приложение (смотреть ссылку выше) и записываем URL веб приложения в переменную appLink.

И наконец функция api_connector() для установки веб хука.

Запускаем эту функцию по кнопке Run.

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

Глава 1 Создаём бота, и отправляем с его помощью сообщения в telegram

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

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

1.1.1 Видео урок о создании telegram бота через BotFather

1.1.2 Конспект о создании telegram бота через BotFather

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

После чего вы получите сообщение со списком команд:

I can help you create and manage Telegram bots. If you're new to the Bot API, please see the manual (https://core.telegram.org/bots). You can control me by sending these commands: /newbot - create a new bot /mybots - edit your bots [beta] Edit Bots /setname - change a bot's name /setdescription - change bot description /setabouttext - change bot about info /setuserpic - change bot profile photo /setcommands - change the list of commands /deletebot - delete a bot Bot Settings /token - generate authorization token /revoke - revoke bot access token /setinline - toggle inline mode (https://core.telegram.org/bots/inline) /setinlinegeo - toggle inline location requests (https://core.telegram.org/bots/inline#location-based-results) /setinlinefeedback - change inline feedback (https://core.telegram.org/bots/inline#collecting-feedback) settings /setjoingroups - can your bot be added to groups? /setprivacy - toggle privacy mode (https://core.telegram.org/bots#privacy-mode) in groups Games /mygames - edit your games (https://core.telegram.org/bots/games) [beta] /newgame - create a new game (https://core.telegram.org/bots/games) /listgames - get a list of your games /editgame - edit a game /deletegame - delete an existing game

Для создания нового бота отправляем команду /newbot .

BotFather попросит вас ввести имя и логин бота.

BotFather, [25.07.20 09:39] Alright, a new bot. How are we going to call it? Please choose a name for your bot. Alexey Seleznev, [25.07.20 09:40] My Test Bot BotFather, [25.07.20 09:40] Good. Now let's choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot. Alexey Seleznev, [25.07.20 09:40] @my_test_bot

Имя вы можете ввести произвольное, а логин должен заканчиваться на bot .

Если вы всё сделали правильно, то получите следующее сообщение:

Done! Congratulations on your new bot. You will find it at t.me/my_test_bot. 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: 123456789:abcdefghijklmnopqrstuvwxyz For a description of the Bot API, see this page: https://core.telegram.org/bots/api

Далее вам понадобится полученный API токен, в моём примере это 123456789:abcdefghijklmnopqrstuvwxyz .

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

1.2 Установка пакета для работы с телеграм ботом на R

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

Для работы с Telegram Bot API мы будем использовать R пакет telegram.bot.

Установка пакетов в R осуществляется функцией install.packages() , поэтому для установки нужного нам пакета используйте команду install.packages(«telegram.bot») .

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

После установки пакета его необходимо подключить:

library(telegram.bot)

1.3 Отправка сообщений из R в Telegram

Созданного вами бота можно найти в Telegram по заданному при создании логину, в моём случае это @my_test_bot .

Отправьте боту любое сообщение, например “Привет бот”. На данный момент это нам надо для того, что бы получить id вашего с ботом чата.

Теперь в R пишем следующий код.

library(telegram.bot) # создаём экземпляр бота bot  Bot(token = "123456789:abcdefghijklmnopqrstuvwxyz") # Запрашиваем информацию о боте print(bot$getMe()) # Получаем обновления бота, т.е. список отправленных ему сообщений updates  bot$getUpdates() # Запрашиваем идентификатор чата # Примечание: перед запросом обновлений вы должны отправить боту сообщение chat_id  updates[[1L]]$from_chat_id()

Изначально мы создаём экземпляр нашего бота функцией Bot() , в качестве аргумента в неё необходимо передать полученный ранее токен.

Хранить токен в коде считается не лучшей практикой, поэтому вы можете хранить его в переменной среды, и считывать его из неё. По умолчанию в пакете telegram.bot реализована поддержка переменных среды следующего наименования: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА . Вместо ИМЯ_ВАШЕГО_БОТА подставьте имя которое вы задали при создании, в моём случае будет переменная R_TELEGRAM_BOT_My Test Bot .

Создать переменную среды можно несколькими способами, я расскажу о наиболее универсальном и кроссплатформенном. Создайте в вашей домашней директории (узнать её можно с помощью команды path.expand(«~») ) текстовый файл с названием .Renviron. Сделать это также можно с помощью команды file.edit(path.expand(file.path(«~», «.Renviron»))) .

И добавьте в него следующую строку.

R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА=123456789:abcdefghijklmnopqrstuvwxyz

Далее вы можете использовать сохранённый в переменной среды токен с помощью функции bot_token() , т.е. вот так:

bot  Bot(token = bot_token("My Test Bot"))

Метод getUpdates() позволяет нам получить обновления бота, т.е. сообщения которые были ему отправлены. Метод from_chat_id() , позволяет получить идентификатор чата, из которого было отправлено сообщение. Этот идентификатор нам нужен для отправки сообщений от бота.

Помимо id чата из объекта полученного методом getUpdates() вы получаете и некоторую другую полезную информацию. Например, информацию о пользователе, отправившем сообщение.

updates[[1L]]$message$from
$id [1] 000000000 $is_bot [1] FALSE $first_name [1] "Alexey" $last_name [1] "Seleznev" $username [1] "AlexeySeleznev" $language_code [1] "ru"

Итак, на данном этапе у нас уже есть всё, что необходимо для отправки сообщения от бота в телеграм. Воспользуемся методом sendMessage() , в который необходимо передать идентификатор чата, текст сообщения, и тип разметки текста сообщения. Тип разметки может быть Markdown или HTML и устанавливается аргументом parse_mode .

# Отправка сообщения bot$sendMessage(chat_id, text = "Привет, *жирный текст* _курсив_", parse_mode = "Markdown" )

Если вам необходимо отправить сообщение от бота не в чат, а в публичный канал, то в chat_id указывайте адрс вашего канала, например ‘@MyTGChannel’ .

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

Соответвенно, к id 012345678 вам необходимо добавить -100, в таком случае в chat_id надо указать -100012345678.

Основы форматирования Markdown разметки:

  • Жирный шрифт выделяется с помощью знака *:
    • пример: *жирный шритф*
    • результат: жирный шритф
    • пример: _курсив_
    • результат: курсив
    • пример: `моноширинный шрифт`
    • результат: моноширинный шрифт

    Основы форматирования HTML разметки:

    В HTML вы заворачиваете часть текста, которую надо выделать, в теги, пример <тег>текст .

    • — открывающий тег — закрывающий тег

    Теги HTML разметки

    • — жирный шрифт
      • пример: жирный шрифт
      • результат жирный шрифт
      • пример: курсив
      • результат: курсив
      • пример: моноширинный шрифт
      • результат: моноширинный шрифт

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

      # Отправить изображение bot$sendPhoto(chat_id, photo = "https://telegram.org/img/t_logo.png" ) # Отправка голосового сообщения bot$sendAudio(chat_id, audio = "http://www.largesound.com/ashborytour/sound/brobob.mp3" ) # Отправить документ bot$sendDocument(chat_id, document = "https://github.com/ebeneditos/telegram.bot/raw/gh-pages/docs/telegram.bot.pdf" ) # Отправить стикер bot$sendSticker(chat_id, sticker = "https://www.gstatic.com/webp/gallery/1.webp" ) # Отправить видео bot$sendVideo(chat_id, video = "http://techslides.com/demos/sample-videos/small.mp4" ) # Отправить gif анимацию bot$sendAnimation(chat_id, animation = "https://media.giphy.com/media/sIIhZliB2McAo/giphy.gif" ) # Отправить локацию bot$sendLocation(chat_id, latitude = 51.521727, longitude = -0.117255 ) # Имитация действия в чате bot$sendChatAction(chat_id, action = "typing" )

      Т.е. например с помощью метода sendPhoto() вы можете отправить сохранённый в виде изображения график, который вы построили с помощью пакета ggplot2 .

      Помимо отправки данных бот имеет и ряд других методов:

      • deleteMessage() — Удалить сообщение
      • editMessageText() — Редактирвать текст сообщения
      • editMessageCaption() — Редактировать описание изображения, файла и т.д.
      • forwardMessage() — Переслать сообщение
      • getFile() — Подготовка файла к скачиванию
      • getMe() — Получить информацию о боте
      • getUpdates() — Получить список обновлений бота
      • getUserProfilePhotos() — Получить аватар пользователя
      • leaveChat() — Выйти из группы
      • clean_updates() — Очистить очередь обновлений

      1.4 Как отправить в telegram таблицу

      К сожалению на момент написания книги telegram не поддерживает полноценные таблицы в HTML или Markdown, но вы можете иметировать подобие таблицы. Для этого воспользуйтесь кодом представленной ниже функции to_tg_table() :

      library(purrr) library(tidyr) library(stringr) # функция для перевода data.frame в telegram таблицу  to_tg_table  function( table, align = NULL, indents = 3, parse_mode = 'Markdown' )  # если выравнивание не задано то выравниваем по левому краю if ( is.null(align) )  col_num  length(table) align  str_c( rep('l', col_num), collapse = '' ) > # проверяем правильно ли заданно выравнивание if ( length(table) != nchar(align) )  align  NULL > # новое выравнивание столбцов  side  sapply(1:nchar(align), function(x)   letter  substr(align, x, x) switch (letter, 'l' = 'right', 'r' = 'left', 'c' = 'both', 'left' ) >) # сохраняем имена t_names  names(table) # вычисляем ширину столбцов names_length  sapply(t_names, nchar)  value_length  sapply(table, function(x) max(nchar(as.character(x)))) max_length  ifelse(value_length > names_length, value_length, names_length) # подгоняем размер имён столбцов под их ширину + указанное в indents к-во пробелов  t_names  mapply(str_pad, string = t_names, width = max_length + indents, side = side) # объединяем названия столбцов str_names  str_c(t_names, collapse = '') # аргументы для фукнции str_pad rules  list(string = table, width = max_length + indents, side = side) # поочереди переводим каждый столбец к нужному виду t_str  pmap_df( rules, str_pad )%>% unite("data", everything(), remove = TRUE, sep = '') %>% unlist(data) %>% str_c(collapse = '\n')  # если таблица занимает более 4096 символов обрезаем её if ( nchar(t_str) >= 4021 )  warning('Таблица составляет более 4096 символов!') t_str  substr(t_str, 1, 4021) > # символы выделения блока кода согласно выбранной разметке code_block  switch(parse_mode, 'Markdown' = c('```', '```'), 'HTML' = c('', '')) # переводим в code res  str_c(code_block[1], str_names, t_str, code_block[2], sep = '\n') return(res) >

      С помощью этой функци вы можете преобразовать любой data.frame и отправить в telegram:

      # преобразуем таблицу iris  tg_table  to_tg_table( head(iris, 15) ) # отправляем таблицу в telegram bot$sendMessage(194336771, tg_table, "Markdown")

      В telegram это буедет выглядеть так:

      У функции to_tg_table() есть несколько дополнительных аргументов:

      • align — выравнивнивание столбцов, тектовая строка, каждая буква соответвует одному столбцу, пример ‘llrrc’ :
        • l — выравнивание по левой стороне
        • r — выравнивание по правой стороне
        • c — выравнивание по центру

        Пример с выравниванием столбцов:

        # преобразуем таблицу iris  tg_table  to_tg_table( head(iris, 15), align = 'llccr') # отправляем таблицу в telegram bot$sendMessage(194336771, tg_table, "Markdown")

        1.5 Как добавить в сообщение Emoji

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

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

        Из таблицы нас интересует поле Unicode. Скопиройте код нужного вам смайла, и замените U+ на \U000 . Т.е. если вам необходимо отправить смайл, код котого в таблице U+1F601 , то в коде на R вам необходимо добавить его в текст сообщения вот так — \U0001F601 .

        bot$sendMessage(chat_id, 'Сообщение со смайлом \U0001F601 код которого в таблице U+1F601')

        Результат:

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

        1.6.1 Видео урок о разработке бота для контроля планировщика заданий

        1.6.2 Конспект о разработке бота для контроля планировщика заданий

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

        # Установка пакетов install.packages(c('taskscheduleR', 'dplyr')) # Подключение пакетов library(taskscheduleR) library(dplyr)

        Далее с помощью функции taskscheduler_ls() мы запрашиваем информацию о задачах из нашего планировщика. С помощью функции filter() из пакета dplyr мы убираем из списка задач те, которые были успешно выполненны и имеют статус последнего результата 0, и те, которые ещё ни разу не запускались и имеют статус 267011, выключенные задачи, и задачи которые выполняются в данный момент.

        # запрашиваем список задач task  task  taskscheduler_ls() %>% filter(! `Last Result` %in% c("0", "267011") &  `Scheduled Task State` == "Enabled" &  Status != "Running") %>% select(TaskName) %>% unique() %>% unlist() %>% paste0(., collapse = "\n")

        В объекте task у нас теперь список задач, работа которых завершилась ошибкой, этот список нам надо отправить в Telegram.

        Если рассмотреть каждую команду подробнее, то:

        • filter() — фильтрует список задач, по описанным выше условиям
        • select() — оставляет в таблице только одно поле с названием задач
        • unique() — убирает дубли названий
        • unlist() — переводит выбранный столбец таблицы в вектор
        • paste0() — соединяет названия задач в одну строку, и ставит в качестве разделителя знак перевода строки, т.е. \n .

        Всё что нам остаётся — отправить этот результат в телеграм.

        bot$sendMessage(chat_id, text = task, parse_mode = "Markdown" )

        Итак, на данный момент код бота выглядит вот так:

        # Подключение пакета library(telegram.bot) library(taskscheduleR) library(dplyr) # инициализируем бота bot  Bot(token = "123456789:abcdefghijklmnopqrstuvwxyz") # идентификатор чата chat_id  123456789 # запрашиваем список задач task  taskscheduler_ls() %>% filter(! `Last Result` %in% c("0", "267011") & `Scheduled Task State` == "Enabled" &  Status != "Running") %>% select(TaskName) %>% unique() %>% unlist() %>% paste0(., collapse = "\n") # если есть проблемные задачи отправляем сообщение if ( task != "" )  bot$sendMessage(chat_id, text = task, parse_mode = "Markdown" ) >

        При использовании приведённого выше примера подставьте в код токен вашего бота и ваш идентификатор чата.

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

        Так же вы можете вынести различные настройки в отдельный файл конфигурации, и хранить в нём id чата и токен. Читать конфиг можно например с помощью пакета configr .

        [telegram_bot] ;настройки телеграм бота и чата, в который будут приходить уведомления chat_id=12345678 bot_token=123456789:abcdefghijklmnopqrstuvwxyz"
        library(configr) # чтение конфина config  read.config('C:/путь_к_конфигу/config.cfg', rcmd.parse = TRUE) bot_token  config$telegram_bot$bot_token chat_id  config$telegram_bot$chat_id

        1.7 Настраиваем расписание запуска проверки задач

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

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

        1. Пропишите в системную переменную Path путь к папке в которой установлен R, в Windows путь будет примерно таким: C:\Program Files\R\R-4.0.2\bin .
        2. Создайте исполняемый bat файл, в котором будет всего одна строка R CMD BATCH C:\rscripts\check_bot\check_bot.R . Замените C:\rscripts\check_bot\check_bot.R на полный путь к вашему R файлу.
        3. Далее настройте с помощью планировщика задач Windows расписание запуска, например на каждые пол часа.

        1.8 Заключение

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

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

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

        1.9 Тесты и задания

        1.9.1 Тесты

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

        1.9.2 Задания

        1. Создайте с помощью BotFather бота.
        2. Перейдите к диалогу с ботом, и узнайте идентификатор вашего с ботом чата.
        3. Отправьте с помощью созданного бота в telegram первые 20 строк из встроенного в R набора данных ToothGrowth .

        Если вы всё сделали правильно то результат будет следующим:

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

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