R dilinde bir telgraf botu yazıyoruz (bölüm 1): Bir bot oluşturun ve onu kullanarak telgrafa mesaj gönderin

Telegram izleyicisi her geçen gün katlanarak büyüyor; bu, mesajlaşmanın rahatlığı, kanalların varlığı, sohbetler ve tabii ki bot oluşturma yeteneği ile kolaylaştırılıyor.

Botlar, müşterilerinizle iletişimi otomatikleştirmekten kendi görevlerinizi yönetmeye kadar tamamen farklı amaçlar için kullanılabilir.

Temel olarak, telegramı bir bot aracılığıyla herhangi bir işlemi gerçekleştirmek için kullanabilirsiniz: veri göndermek veya istemek, sunucuda görevleri yürütmek, bir veritabanına bilgi toplamak, e-posta göndermek vb.

Nasıl çalışılacağına dair bir dizi makale yazmayı planlıyorum telgraf botu API'sive ihtiyaçlarınıza uygun botlar yazın.

R dilinde bir telgraf botu yazıyoruz (bölüm 1): Bir bot oluşturun ve onu kullanarak telgrafa mesaj gönderin

Bu ilk yazımızda bir telgraf botunun nasıl oluşturulacağını ve onu telgrafta bildirim göndermek için nasıl kullanacağımızı öğreneceğiz.

Sonuç olarak, Windows Görev Zamanlayıcı'daki tüm görevlerin son yürütme durumunu kontrol edecek ve bunlardan herhangi birinin başarısız olması durumunda size bildirim gönderecek bir botumuz olacak.

Ancak bu makale serisinin amacı size belirli, dar bir görev için nasıl bot yazılacağını öğretmek değil, genel olarak size paketin sözdizimini tanıtmaktır. telegram.botve kendi sorunlarınızı çözmek için botlar yazabileceğiniz kod örnekleri.

Içerik

Veri analiziyle ilgileniyorsanız, benim ilginizi çekebilir telgraf и Youtube kanallar. İçeriğin çoğu R diline ayrılmıştır.

  1. Telgraf botu oluşturma
  2. R'de bir telgraf botuyla çalışmak için bir paket kurma
  3. R'den Telegram'a mesaj gönderme
  4. Görev taramalarını çalıştırmak için bir zamanlama ayarlama
  5. Sonuç

Telgraf botu oluşturma

Öncelikle bir bot oluşturmamız gerekiyor. Bu özel bir bot kullanılarak yapılır BotBaba, git bağlantı ve bota yaz /start.

Bundan sonra komutların listesini içeren bir mesaj alacaksınız:

BotFather'dan mesaj

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

Yeni bir bot oluşturmak için komutu gönderin /newbot.

BotFather sizden botun adını girmenizi ve oturum açmanızı isteyecektir.

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

Herhangi bir ad girebilirsiniz ancak oturum açma şununla bitmelidir: bot.

Her şeyi doğru yaptıysanız aşağıdaki mesajı alacaksınız:

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

Daha sonra alınan API belirtecine ihtiyacınız olacak, benim örneğimde öyle 123456789:abcdefghijklmnopqrstuvwxyz.

Bu adımda bot oluşturmaya yönelik hazırlık çalışmaları tamamlanır.

R'de bir telgraf botuyla çalışmak için bir paket kurma

Zaten R dilinin ve RStudio geliştirme ortamının kurulu olduğunu varsayıyorum. Eğer durum böyle değilse, şuna bakabilirsiniz video öğretici bunların nasıl kurulacağı hakkında.

Telegram Bot API ile çalışmak için R paketini kullanacağız telegram.bot.

Paketlerin R'ye kurulması fonksiyon kullanılarak yapılır install.packages(), ihtiyacımız olan paketi yüklemek için şu komutu kullanın: install.packages("telegram.bot").

Çeşitli paketlerin kurulumu hakkında daha fazla bilgiyi şu adresten edinebilirsiniz: bu video.

Paketi yükledikten sonra bağlamanız gerekir:

library(telegram.bot)

R'den Telegram'a mesaj gönderme

Oluşturduğunuz bot, oluşturma sırasında belirtilen giriş bilgileri kullanılarak Telegram'da bulunabilir, benim durumumda @my_test_bot.

Bot'a "Hey bot" gibi herhangi bir mesaj gönderin. Şu anda botla yaptığınız sohbetin kimliğini alabilmek için buna ihtiyacımız var.

Şimdi aşağıdaki kodu R'ye yazıyoruz.

library(telegram.bot)

# создаём экземпляр бота
bot <- Bot(token = "123456789:abcdefghijklmnopqrstuvwxyz")

# Запрашиваем информацию о боте
print(bot$getMe())

# Получаем обновления бота, т.е. список отправленных ему сообщений
updates <- bot$getUpdates()

# Запрашиваем идентификатор чата
# Примечание: перед запросом обновлений вы должны отправить боту сообщение
chat_id <- updates[[1L]]$from_chat_id()

Başlangıçta, aşağıdaki fonksiyonla botumuzun bir örneğini oluşturuyoruz: Bot(), önceden alınan jetonun argüman olarak ona iletilmesi gerekir.

Belirteci kodda depolamak en iyi uygulama olarak kabul edilmez, böylece onu bir ortam değişkeninde saklayabilir ve ondan okuyabilirsiniz. Varsayılan olarak pakette telegram.bot Aşağıdaki adlara sahip ortam değişkenleri için destek uygulanmıştır: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА... Yerine ИМЯ_ВАШЕГО_БОТА oluştururken belirttiğiniz adı değiştirin, benim durumumda bu bir değişken olacak R_TELEGRAM_BOT_My Test Bot.

Ortam değişkeni oluşturmanın birkaç yolu vardır; size en evrensel ve platformlar arası olanı anlatacağım. Ana dizininizde oluşturun (komutu kullanarak bulabilirsiniz) path.expand("~")) adlı metin dosyası .Renviron. Bunu komutu kullanarak da yapabilirsiniz. file.edit(path.expand(file.path("~", ".Renviron"))).

Ve aşağıdaki satırı buna ekleyin.

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

Daha sonra, işlevi kullanarak ortam değişkenine kaydedilen belirteci kullanabilirsiniz. bot_token()yani bunun gibi:

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

yöntem getUpdates()bot güncellemelerini almamıza olanak tanır; kendisine gönderilen mesajlar. Yöntem from_chat_id(), mesajın gönderildiği sohbetin kimliğini almanızı sağlar. Bottan mesaj göndermek için bu kimliğe ihtiyacımız var.

Yöntemle elde edilen nesnenin sohbet kimliğine ek olarak getUpdates() ayrıca başka yararlı bilgiler de alırsınız. Örneğin mesajı gönderen kullanıcıya ilişkin bilgiler.

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"

Yani bu aşamada bir bottan Telegram'a mesaj göndermek için ihtiyacımız olan her şeye zaten sahibiz. Yöntemi kullanalım sendMessage(), içine sohbet kimliğini, mesaj metnini ve mesaj metni işaretleme türünü aktarmanız gerekir. İşaretleme türü Markdown veya HTML olabilir ve bağımsız değişken tarafından ayarlanır parse_mode.

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

Markdown biçimlendirme temelleri:

  • Kalın yazı tipi * ile vurgulanmıştır:
    • örnek: *жирный шритф*
    • sonuç: kalın yazı tipi
  • İtalikler alt çizgiyle gösterilir:
    • örnek: _курсив_
    • sonuç: italik
  • Genellikle program kodunu vurgulamak için kullanılan tek aralıklı yazı tipi, kesme işaretleri - ` kullanılarak belirtilir:
    • örnek: 'tek aralıklı yazı tipi'
    • sonuç: моноширинный шрифт

HTML işaretlemesini biçimlendirmenin temelleri:
HTML'de, metnin vurgulanması gereken kısmını etiketlerle sararsınız; örneğin <тег>текст</тег>.

  • <tag> - açılış etiketi
  • - kapanış etiketi

HTML işaretleme etiketleri

  • <b> - kalın yazı tipi
    • örnek: <b>жирный шрифт</b>
    • sonuç kalın yazı tipi
  • <i> - italik
    • örnek: <i>курсив</i>
    • sonuç: italik
  • — моноширинный шрифт
    • örnek: моноширинный шрифт
    • sonuç: моноширинный шрифт

Metnin yanı sıra özel yöntemleri kullanarak başka içerik de gönderebilirsiniz:

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

Onlar. örneğin yöntemi kullanarak sendPhoto() paketi kullanarak oluşturduğunuz, resim olarak kaydedilen bir grafiği gönderebilirsiniz. ggplot2.

Windows Görev Zamanlayıcı'yı kontrol etme ve anormal şekilde sonlandırılan görevlerle ilgili bildirimler gönderme

Windows Görev Zamanlayıcı ile çalışmak için paketi yüklemeniz gerekir taskscheduleRve verilerle çalışmanın rahatlığı için paketi yükleyin dplyr.

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

Daha sonra işlevi kullanarak taskscheduler_ls() zamanlayıcımızdan görevler hakkında bilgi talep ediyoruz. Fonksiyonun kullanılması filter() paketten dplyr Başarıyla tamamlanan ve son sonuç durumu 0 olan, hiç başlatılmamış ve durumu 267011 olan, devre dışı bırakılan görevleri ve şu anda çalışan görevleri listeden kaldırıyoruz.

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

Nesnede task Artık başarısız olan görevlerin bir listesi var, bu listeyi Telegram'a göndermemiz gerekiyor.

Her komuta daha ayrıntılı olarak bakarsak:

  • filter() — yukarıda açıklanan koşullara göre görev listesini filtreler
  • select() — tabloda görevlerin adını içeren yalnızca bir alan bırakır
  • unique() - yinelenen adları kaldırır
  • unlist() — seçilen tablo sütununu bir vektöre dönüştürür
  • paste0() — görevlerin adlarını tek bir satıra bağlar ve ayırıcı olarak bir satır beslemesi koyar; n.

Bize kalan tek şey bu sonucu telgrafla göndermek.

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

Yani şu anda bot kodu şöyle görünüyor:

Görev inceleme bot kodu

# Подключение пакета
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"
  )

}

Yukarıdaki örneği kullanırken kodun içine bot jetonunuzu ve sohbet kimliğinizi yazın.

Görevleri filtrelemek için koşullar ekleyebilirsiniz; örneğin sistem görevleri hariç yalnızca kendi oluşturduğunuz görevleri kontrol edebilirsiniz.

Ayrıca çeşitli ayarları ayrı bir yapılandırma dosyasına koyabilir ve sohbet kimliğini ve jetonunu bu dosyada saklayabilirsiniz. Örneğin paketi kullanarak yapılandırmayı okuyabilirsiniz. configr.

Örnek ini yapılandırması

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

R'deki bir yapılandırmadan değişkenleri okumaya bir örnek

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

Görev taramalarını çalıştırmak için bir zamanlama ayarlama

Komut dosyalarının bir programa göre başlatılmasını ayarlama süreci bu bölümde daha ayrıntılı olarak açıklanmaktadır. Makale. Burada sadece bunun için izlenmesi gereken adımları anlatacağım. Adımlardan herhangi biri sizin için net değilse, bağlantı verdiğim makaleye bakın.

Bot kodumuzu bir dosyaya kaydettiğimizi varsayalım. check_bot.R. Bu dosyayı düzenli olarak çalışacak şekilde planlamak için şu adımları izleyin:

  1. Path sistem değişkenine R'nin yüklü olduğu klasörün yolunu yazın; Windows'ta yol şöyle olacaktır: C:Program FilesRR-4.0.2bin.
  2. Yalnızca bir satırla yürütülebilir bir yarasa dosyası oluşturun R CMD BATCH C:rscriptscheck_botcheck_bot.R. Yer değiştirmek C:rscriptscheck_botcheck_bot.R R dosyanızın tam yoluna.
  3. Daha sonra, örneğin her yarım saatte bir başlatma planı ayarlamak için Windows Görev Zamanlayıcı'yı kullanın.

Sonuç

Bu yazımızda bir botun nasıl oluşturulacağını ve onu telgrafta çeşitli bildirimler göndermek için nasıl kullanacağımızı bulduk.

Windows Görev Zamanlayıcı'yı izleme görevini anlattım, ancak bu makaledeki materyali hava tahminlerinden borsadaki hisse senedi fiyatlarına kadar her türlü bildirimi göndermek için kullanabilirsiniz, çünkü R, çok sayıda veri kaynağına bağlanmanıza olanak tanır.

Bir sonraki makalede, bota yalnızca bildirim göndermekle kalmayıp aynı zamanda daha karmaşık eylemler gerçekleştirebilmesi için komutların ve klavyenin nasıl ekleneceğini bulacağız.

Kaynak: habr.com

Yorum ekle