نوشتن ربات تلگرام به زبان R (قسمت اول): ایجاد ربات و استفاده از آن برای ارسال پیام در تلگرام

مخاطبان تلگرام هر روز به طور تصاعدی در حال افزایش هستند، این امر با راحتی پیام رسان، وجود کانال ها، چت ها و البته امکان ایجاد ربات تسهیل می شود.

ربات ها را می توان برای مقاصد کاملا متفاوت استفاده کرد، از ارتباطات خودکار با مشتریان تا مدیریت وظایف خود.

اساساً می‌توانید از تلگرام برای انجام هر عملیاتی از طریق یک ربات استفاده کنید: ارسال یا درخواست داده، اجرای وظایف روی سرور، جمع‌آوری اطلاعات در پایگاه داده، ارسال ایمیل و غیره.

من قصد دارم یک سری مقاله در مورد نحوه کار با آن بنویسم API ربات تلگرامو ربات ها را متناسب با نیاز خود بنویسید.

نوشتن ربات تلگرام به زبان R (قسمت اول): ایجاد ربات و استفاده از آن برای ارسال پیام در تلگرام

در این مقاله اول نحوه ایجاد ربات تلگرام و استفاده از آن برای ارسال نوتیفیکیشن در تلگرام را خواهیم فهمید.

در نتیجه، ما یک ربات خواهیم داشت که وضعیت آخرین اجرای تمام وظایف را در Windows Task Scheduler بررسی می کند و در صورت عدم موفقیت هر یک از آنها اعلان هایی را برای شما ارسال می کند.

اما هدف از این سری مقالات آموزش نوشتن یک ربات برای یک کار خاص و باریک نیست، بلکه به طور کلی شما را با سینتکس بسته آشنا می کند. telegram.botو نمونه کدهایی که می توانید با آنها ربات بنویسید تا مشکلات خود را حل کنید.

مقدار

اگر به تجزیه و تحلیل داده ها علاقه دارید، ممکن است به من علاقه مند شوید تلگراف и یوتیوب کانال ها بیشتر مطالب به زبان R اختصاص داده شده است.

  1. ساخت ربات تلگرام
  2. نصب پکیج کار با ربات تلگرام در آر
  3. ارسال پیام از R به تلگرام
  4. تنظیم یک برنامه برای اجرای اسکن وظایف
  5. نتیجه

ساخت ربات تلگرام

ابتدا باید یک ربات بسازیم. این کار با استفاده از یک ربات خاص انجام می شود BotFather، رفتن به پیوند و برای ربات بنویسید /start.

پس از آن پیامی حاوی لیستی از دستورات دریافت خواهید کرد:

پیامی از طرف BotFather

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.

در این مرحله کار مقدماتی ایجاد ربات به پایان می رسد.

نصب پکیج کار با ربات تلگرام در آر

من فرض می کنم که شما قبلاً زبان R و محیط توسعه RStudio را نصب کرده اید. اگر اینطور نیست، می توانید به این نگاه کنید آموزش تصویری در مورد نحوه نصب آنها

برای کار با API ربات تلگرام از پکیج R استفاده می کنیم telegram.bot.

نصب بسته ها در R با استفاده از تابع انجام می شود install.packages()، بنابراین برای نصب بسته مورد نیاز خود از دستور استفاده می کنیم install.packages("telegram.bot").

می توانید در مورد نصب بسته های مختلف اطلاعات بیشتری کسب کنید این ویدیو.

پس از نصب بسته، باید آن را وصل کنید:

library(telegram.bot)

ارسال پیام از R به تلگرام

رباتی که ایجاد کردید با استفاده از لاگین مشخص شده در هنگام ایجاد در تلگرام پیدا می شود، در مورد من اینطور است @my_test_bot.

هر پیامی مانند "Hey bot" را برای ربات ارسال کنید. در حال حاضر، ما به این نیاز داریم تا شناسه چت شما با ربات را دریافت کنیم.

حالا کد زیر را در 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("~")) فایل متنی با نام .رنویرون. همچنین می توانید با استفاده از دستور این کار را انجام دهید 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()، به شما امکان می دهد شناسه چتی که پیام از آن ارسال شده است را دریافت کنید. برای ارسال پیام از ربات به این شناسه نیاز داریم.

علاوه بر شناسه چت از شی به دست آمده توسط روش 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"
)

اصول قالب بندی Markdown:

  • فونت پررنگ با * مشخص می شود:
    • مثال: *жирный шритф*
    • نتیجه: فونت پررنگ
  • حروف کج با زیرخط نشان داده می شوند:
    • مثال: _курсив_
    • نتیجه: مورب
  • فونت monospace، که معمولا برای برجسته کردن کد برنامه استفاده می شود، با استفاده از آپوستروف ها مشخص می شود - `:
    • به عنوان مثال: "فونت monospace".
    • نتیجه: моноширинный шрифт

اصول قالب بندی نشانه گذاری HTML:
در HTML، بخشی از متن را که باید برجسته شود، به عنوان مثال در تگ ها قرار می دهید <тег>текст</тег>.

  • <tag> - باز کردن برچسب
  • - برچسب بسته شدن

برچسب های نشانه گذاری HTML

  • <b> - فونت پررنگ
    • مثال: <b>жирный шрифт</b>
    • نتیجه فونت پررنگ
  • <i> - ایتالیک
    • مثال: <i>курсив</i>
    • نتیجه: مورب
  • — моноширинный шрифт
    • مثال: моноширинный шрифт
    • نتیجه: моноширинный шрифт

علاوه بر متن، می توانید مطالب دیگری را با استفاده از روش های خاص ارسال کنید:

# Отправить изображение
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.

بررسی Task Scheduler ویندوز و ارسال اعلان در مورد وظایفی که به طور غیرعادی خاتمه یافته اند

برای کار با Windows Task Scheduler باید بسته را نصب کنید 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 ما اکنون لیستی از کارهایی داریم که شکست خورده اند، باید این لیست را به تلگرام ارسال کنیم.

اگر به هر دستور با جزئیات بیشتری نگاه کنیم، آنگاه:

  • 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"
  )

}

هنگام استفاده از مثال بالا، رمز ربات و شناسه چت خود را با کد جایگزین کنید.

می توانید شرایطی را برای فیلتر کردن وظایف اضافه کنید، به عنوان مثال، فقط کارهایی را که ایجاد کرده اید بررسی کنید، به استثنای موارد سیستم.

همچنین می توانید تنظیمات مختلفی را در یک فایل پیکربندی جداگانه قرار دهید و شناسه و توکن چت را در آن ذخیره کنید. به عنوان مثال، با استفاده از بسته می توانید پیکربندی را بخوانید configr.

نمونه تنظیمات ini

[telegram_bot]
;настройки телеграм бота и чата, в который будут приходить уведомления
chat_id=12345678
bot_token=123456789:abcdefghijklmnopqrstuvwxyz"

نمونه ای از خواندن متغیرها از یک پیکربندی در R

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

تنظیم یک برنامه برای اجرای اسکن وظایف

روند راه‌اندازی راه‌اندازی اسکریپت‌ها بر اساس یک برنامه با جزئیات بیشتر در این توضیح داده شده است مقاله. در اینجا من فقط مراحلی را که برای این کار باید طی شود شرح خواهم داد. اگر هر یک از مراحل برای شما واضح نیست، به مقاله ای که لینک آن را ارائه کردم مراجعه کنید.

بیایید فرض کنیم که کد ربات خود را در یک فایل ذخیره کرده ایم check_bot.R. برای برنامه ریزی برای اجرای منظم این فایل، مراحل زیر را دنبال کنید:

  1. مسیر پوشه ای که R در آن نصب شده است را در متغیر Path system بنویسید؛ در ویندوز، مسیر چیزی شبیه به این خواهد بود: C:Program FilesRR-4.0.2bin.
  2. یک فایل bat اجرایی فقط با یک خط ایجاد کنید R CMD BATCH C:rscriptscheck_botcheck_bot.R. جایگزین کردن C:rscriptscheck_botcheck_bot.R به مسیر کامل فایل R خود بروید.
  3. در مرحله بعد، از Windows Task Scheduler برای تنظیم برنامه راه اندازی، به عنوان مثال، هر نیم ساعت استفاده کنید.

نتیجه

در این مقاله به نحوه ساخت ربات و استفاده از آن برای ارسال نوتیفیکیشن های مختلف در تلگرام پی بردیم.

من وظیفه نظارت بر Task Scheduler ویندوز را شرح دادم، اما می توانید از مطالب این مقاله برای ارسال هرگونه اعلان، از پیش بینی آب و هوا گرفته تا قیمت سهام در بورس استفاده کنید، زیرا R به شما امکان می دهد به تعداد زیادی از منابع داده متصل شوید.

در مقاله بعدی نحوه اضافه کردن دستورات و صفحه کلید به ربات را خواهیم فهمید تا بتواند نه تنها اعلان ارسال کند، بلکه اقدامات پیچیده تری را نیز انجام دهد.

منبع: www.habr.com

اضافه کردن نظر