Kikọ bot telegram ni R (apakan 2): Fifi atilẹyin aṣẹ ati awọn asẹ ifiranṣẹ si bot

В ti tẹlẹ atejade a ṣayẹwo bi o ṣe le ṣẹda bot, ti ipilẹṣẹ apẹẹrẹ ti kilasi naa Bot o si di faramọ pẹlu awọn ọna ti fifiranṣẹ awọn ifiranṣẹ lilo o.

Ninu nkan yii Mo tẹsiwaju koko yii, nitorinaa Mo ṣeduro bẹrẹ lati ka nkan yii nikan lẹhin kika apakan akọkọ.

Ni akoko yii a yoo ṣawari bawo ni a ṣe le sọji bot wa ati ṣafikun atilẹyin aṣẹ si rẹ, ati tun faramọ kilasi naa Updater.

Lakoko ti nkan naa, a yoo kọ ọpọlọpọ awọn bot ti o rọrun, igbehin yoo, da lori ọjọ ti a fun ati koodu orilẹ-ede, pinnu boya ọjọ kan ni orilẹ-ede ti a fun ni ipari ose tabi ọjọ iṣẹ ni ibamu si kalẹnda iṣelọpọ. Ṣugbọn, bi tẹlẹ, idi ti nkan naa ni lati mọ ọ pẹlu wiwo package telegram.bot lati yanju awọn iṣoro ti ara rẹ.

Kikọ bot telegram ni R (apakan 2): Fifi atilẹyin aṣẹ ati awọn asẹ ifiranṣẹ si bot

Gbogbo awọn nkan lati inu jara “Kikọ bot telegram ni R”

  1. A ṣẹda bot ati lo lati firanṣẹ awọn ifiranṣẹ ni telegram
  2. Ṣafikun atilẹyin aṣẹ ati awọn asẹ ifiranṣẹ si bot

Awọn akoonu

Ti o ba nifẹ si itupalẹ data, o le nifẹ ninu mi telegram и youtube awọn ikanni. Pupọ julọ akoonu jẹ igbẹhin si ede R.

  1. Updater kilasi
  2. Handlers - handlers
  3. Ṣafikun aṣẹ akọkọ si bot, olutọju aṣẹ
  4. Ifọrọranṣẹ isise ati Ajọ
  5. Ṣafikun Awọn aṣẹ pẹlu Awọn paramita
  6. Ṣiṣe awọn bot ni abẹlẹ
  7. ipari

Updater kilasi

Updater ni a kilasi ti o mu ki o rọrun fun o lati se agbekale a telegram bot, ati ki o nlo awọn kilasi labẹ awọn Hood Dispetcher. Kilasi iṣẹ iyansilẹ Updater ni lati gba awọn imudojuiwọn lati bot (ninu nkan ti tẹlẹ a lo ọna fun idi eyi getUpdates()), ati gbe wọn siwaju si Dispetcher.

Leteto Dispetcher ni awọn olutọju ti o ṣẹda, i.e. awọn nkan kilasi Handler.

Handlers - handlers

Pẹlu awọn olutọju ti o ṣe afikun si Dispetcher bot aati si orisirisi awọn iṣẹlẹ. Ni akoko kikọ nkan yii ni telegram.bot Awọn oriṣi awọn olutọju atẹle wọnyi ti ṣafikun:

  • MessageHandler - Olutọju ifiranṣẹ
  • CommandHandler - Olutọju aṣẹ
  • CallbackQueryHandler - Olutọju data fun awọn bọtini itẹwe ti a firanṣẹ lati Inline
  • ErrorHandler - Olutọju aṣiṣe nigba ti o beere awọn imudojuiwọn lati bot

Ṣafikun aṣẹ akọkọ si bot, olutọju aṣẹ

Ti o ko ba ti lo awọn bot tẹlẹ ati pe o ko mọ kini aṣẹ jẹ, lẹhinna awọn aṣẹ si bot gbọdọ wa ni fifiranṣẹ ni lilo slash siwaju / bi ìpele.

A yoo bẹrẹ pẹlu awọn aṣẹ ti o rọrun, i.e. jẹ ki a kọ wa bot lati sọ hello lori pipaṣẹ /hi.

Koodu 1: Nkọ bot lati sọ hello

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# Пишем метод для приветсвия
say_hello <- function(bot, update) {

  # Имя пользователя с которым надо поздароваться
  user_name <- update$message$from$first_name

  # Отправка приветственного сообщения
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Моё почтение, ", user_name, "!"), 
                  parse_mode = "Markdown")

}

# создаём обработчик 
hi_hendler <- CommandHandler('hi', say_hello)

# добаляем обработчик в диспетчер
updater <- updater + hi_hendler

# запускаем бота
updater$start_polling()

Ṣiṣe apẹẹrẹ koodu loke, lẹhin ti o rọpo 'BOT TOKEN rẹ' pẹlu ami-ami gidi ti o gba nigbati o ṣẹda bot nipasẹ Bàbá Bàbá (Mo ti sọrọ nipa ṣiṣẹda bot ni akọkọ article).

Ọna start_polling() kilasi Updater, eyi ti o ti lo ni opin ti awọn koodu, bẹrẹ ohun ailopin lupu ti bere ati processing awọn imudojuiwọn lati bot.

Bayi jẹ ki a ṣii Telegram ki o kọ aṣẹ akọkọ si bot wa /hi.

Kikọ bot telegram ni R (apakan 2): Fifi atilẹyin aṣẹ ati awọn asẹ ifiranṣẹ si bot

Bayi bot wa loye aṣẹ naa /hi, ó sì mọ bí a ṣe ń kí wa.

Sikematiki, ilana ti kikọ iru bot ti o rọrun le ṣe afihan bi atẹle.

Kikọ bot telegram ni R (apakan 2): Fifi atilẹyin aṣẹ ati awọn asẹ ifiranṣẹ si bot

  1. Ṣẹda apẹẹrẹ ti kilasi naa Updater;
  2. A ṣẹda awọn ọna, i.e. awọn iṣẹ ti bot wa yoo ṣe. Ninu apẹẹrẹ koodu eyi jẹ iṣẹ kan say_hello(). Awọn iṣẹ ti iwọ yoo lo bi awọn ọna bot gbọdọ ni awọn ariyanjiyan meji ti o nilo - bot и imudojuiwọn, ati ọkan iyan - ọfa. Ariyanjiyan bot, Eyi ni bot rẹ, pẹlu iranlọwọ rẹ o le dahun si awọn ifiranṣẹ, firanṣẹ awọn ifiranṣẹ, tabi lo awọn ọna miiran ti o wa si bot. Ariyanjiyan imudojuiwọn eyi ni ohun ti bot gba lati ọdọ olumulo, ni otitọ, ohun ti a gba ni nkan akọkọ nipa lilo ọna naa getUpdates(). Ariyanjiyan ọfa gba ọ laaye lati ṣe ilana afikun data ti olumulo ranṣẹ pẹlu aṣẹ, a yoo pada si koko yii diẹ diẹ;
  3. A ṣẹda awọn olutọju, i.e. A ṣepọ diẹ ninu awọn iṣe olumulo pẹlu awọn ọna ti a ṣẹda ni igbesẹ ti tẹlẹ. Ni pataki, olutọju kan jẹ okunfa, iṣẹlẹ ti o pe diẹ ninu iṣẹ bot. Ninu apẹẹrẹ wa, iru okunfa kan ni fifiranṣẹ aṣẹ kan /hi, ati pe o jẹ imuse nipasẹ ẹgbẹ hi_hendler <- CommandHandler('hi', say_hello). Iṣẹ ariyanjiyan akọkọ CommandHandler() gba ọ laaye lati pato aṣẹ kan, ninu ọran wa hi, eyiti bot yoo dahun. Awọn ariyanjiyan keji gba ọ laaye lati pato ọna bot, a yoo pe ọna naa say_hello, eyi ti yoo ṣiṣẹ ti olumulo ba pe aṣẹ ti o pato ninu ariyanjiyan akọkọ;
  4. Nigbamii, a ṣafikun oluṣakoso ti a ṣẹda si olupin ti apẹẹrẹ kilasi wa Updater. O le ṣafikun awọn olutọju ni awọn ọna pupọ; ni apẹẹrẹ loke, Mo lo ọkan ti o rọrun julọ, ni lilo ami naa +, i.e. updater <- updater + hi_hendler. Bakan naa le ṣee ṣe nipa lilo ọna naa add_handler(), eyi ti o jẹ ti awọn kilasi Dispatcher, o le wa ọna yii bi eleyi: updater$dispatcher$add_handler();
  5. Lọlẹ awọn bot lilo awọn pipaṣẹ start_polling().

Ifọrọranṣẹ isise ati Ajọ

A ṣe ayẹwo bi a ṣe le fi awọn aṣẹ ranṣẹ si bot, ṣugbọn nigbami a nilo bot lati dahun kii ṣe si awọn aṣẹ nikan, ṣugbọn tun si diẹ ninu awọn ifọrọranṣẹ deede. Lati ṣe eyi o nilo lati lo awọn oluṣakoso ifiranṣẹ - IfiranṣẹHandler.

Deede IfiranṣẹHandler yoo dahun si Egba gbogbo awọn ifiranṣẹ ti nwọle. Nitorinaa, awọn oluṣakoso ifiranṣẹ nigbagbogbo lo papọ pẹlu awọn asẹ. Jẹ ki a kọ bot lati sọ hello kii ṣe lori aṣẹ nikan /hi, sugbon tun nigbakugba ti ọkan ninu awọn wọnyi ọrọ han ninu ifiranṣẹ ranṣẹ si awọn bot: hello, hello, salute, hai, bonjour.

Fun bayi a kii yoo kọ awọn ọna tuntun, nitori… A ti ni ọna kan nipa eyiti bot n kí wa. Gbogbo ohun ti a nilo lati ṣe ni ṣẹda àlẹmọ ti a beere ati oluṣakoso ifiranṣẹ.

Koodu 2: Ṣafikun oluṣakoso ifọrọranṣẹ ati àlẹmọ

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# Пишем метод для приветсвия
## команда приветвия
say_hello <- function(bot, update) {

  # Имя пользователя с которым надо поздароваться
  user_name <- update$message$from$first_name

  # Отправляем приветсвенное сообщение
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Моё почтение, ", user_name, "!"),
                  parse_mode = "Markdown",
                  reply_to_message_id = update$message$message_id)

}

# создаём фильтры
MessageFilters$hi <- BaseFilter(function(message) {

  # проверяем, встречается ли в тексте сообщения слова: привет, здравствуй, салют, хай, бонжур
  grepl(x           = message$text, 
        pattern     = 'привет|здравствуй|салют|хай|бонжур',
        ignore.case = TRUE)
  }
)

# создаём обработчик 
hi_hendler <- CommandHandler('hi', say_hello) # обработчик команды hi
hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)

# добаляем обработчики в диспетчер
updater <- updater + 
             hi_hendler +
             hi_txt_hnd

# запускаем бота
updater$start_polling()

Ṣiṣe apẹẹrẹ koodu loke, lẹhin ti o rọpo 'BOT TOKEN rẹ' pẹlu ami-ami gidi ti o gba nigbati o ṣẹda bot nipasẹ Bàbá Bàbá (Mo ti sọrọ nipa ṣiṣẹda bot ni akọkọ article).

Bayi jẹ ki a gbiyanju lati firanṣẹ awọn ifiranṣẹ bot pupọ ti o ni awọn ọrọ ikini ti a ṣe akojọ tẹlẹ:
Kikọ bot telegram ni R (apakan 2): Fifi atilẹyin aṣẹ ati awọn asẹ ifiranṣẹ si bot

Nitorinaa, akọkọ, a kọ bot kii ṣe lati sọ hello, ṣugbọn lati dahun si ikini kan. A ṣe eyi nipa lilo ariyanjiyan fesi_to_message_id, eyi ti o wa ni ọna sendMessage(), sinu eyiti o nilo lati gbe id ti ifiranṣẹ si eyiti o fẹ dahun. O le gba id ifiranṣẹ bi eleyi: update$message$message_id.

Ṣugbọn ohun akọkọ ti a ṣe ni ṣafikun àlẹmọ si bot nipa lilo iṣẹ naa BaseFilter():

# создаём фильтры
MessageFilters$hi <- BaseFilter( 

  # анонимная фильтрующая функция
  function(message) {

    # проверяем, встречается ли в тексте сообщения слова приветствия
    grepl(x           = message$text, 
          pattern     = 'привет|здравствуй|салют|хай|бонжур',
          ignore.case = TRUE)
  }

)

Bi o ṣe le ti ṣe akiyesi, awọn asẹ nilo lati ṣafikun si ohun naa Awọn Asẹ Ifiranṣẹ, eyiti o wa lakoko ti o ti ni ipilẹ kekere ti awọn asẹ ti a ti ṣetan. Ninu apẹẹrẹ wa, si nkan naa Awọn Asẹ Ifiranṣẹ a fi kun ohun ano hi, Eyi jẹ àlẹmọ tuntun.

Lati ṣiṣẹ BaseFilter() o nilo lati kọja iṣẹ àlẹmọ. Ni pataki, àlẹmọ jẹ iṣẹ kan ti o gba apẹẹrẹ ifiranṣẹ kan ati pada TÒÓTỌ tabi eke. Ninu apẹẹrẹ wa, a kọ iṣẹ ti o rọrun ti, lilo iṣẹ ipilẹ grepl() ṣayẹwo ọrọ ifiranṣẹ ati ti o ba baamu ikosile deede привет|здравствуй|салют|хай|бонжур pada TÒÓTỌ.

Nigbamii ti a ṣẹda oluṣakoso ifiranṣẹ hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Iṣẹ ariyanjiyan akọkọ MessageHandler() ni ọna ti yoo pe olutọju naa, ati pe ariyanjiyan keji jẹ àlẹmọ nipasẹ eyiti yoo pe. Ninu ọran wa, eyi ni àlẹmọ ti a ṣẹda MessageFilters$hi.

O dara, ni ipari, a ṣafikun si dispatcher oluṣakoso ti a ṣẹda hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Bi mo ti kowe loke, ninu awọn package telegram.bot ati nkan Awọn Asẹ Ifiranṣẹ Ajọ ti a ṣe sinu tẹlẹ ti wa ti o le lo:

  • gbogbo - Gbogbo awọn ifiranṣẹ
  • ọrọ - Awọn ifọrọranṣẹ
  • pipaṣẹ - Awọn aṣẹ, i.e. awọn ifiranṣẹ ti o bẹrẹ pẹlu /
  • fesi - Awọn ifiranṣẹ ti o jẹ idahun si ifiranṣẹ miiran
  • ohun - Awọn ifiranṣẹ ti o ni faili ohun ohun
  • iwe - Awọn ifiranṣẹ pẹlu iwe ti a firanṣẹ
  • Fọto - Awọn ifiranṣẹ pẹlu awọn aworan ti a firanṣẹ
  • sitika - Awọn ifiranṣẹ pẹlu sitika ti a firanṣẹ
  • fidio - Awọn ifiranṣẹ pẹlu fidio
  • ohùn - Awọn ifiranṣẹ ohun
  • olubasọrọ - Awọn ifiranṣẹ ti o ni akoonu telegram olumulo
  • ipo - Awọn ifiranṣẹ pẹlu geolocation
  • ibi isere - Awọn ifiranṣẹ ti a firanṣẹ siwaju
  • ere - Games

Ti o ba fẹ lati darapọ diẹ ninu awọn asẹ ni olutọju kan kan lo ami naa | - bi mogbonwa TABI, ati ami & bi mogbonwa И. Fun apẹẹrẹ, ti o ba fẹ ki bot pe ọna kanna nigbati o ba gba fidio, aworan tabi iwe, lo apẹẹrẹ atẹle lati ṣẹda oluṣakoso ifiranṣẹ:

handler <- MessageHandler(callback, 
  MessageFilters$video | MessageFilters$photo | MessageFilters$document
)

Ṣafikun Awọn aṣẹ pẹlu Awọn paramita

A ti mọ iru awọn aṣẹ jẹ, bii o ṣe le ṣẹda wọn, ati bii o ṣe le fi ipa mu bot lati ṣiṣẹ aṣẹ ti o fẹ. Ṣugbọn ni awọn igba miiran, ni afikun si orukọ aṣẹ, a nilo lati kọja diẹ ninu awọn data lati ṣiṣẹ.

Ni isalẹ jẹ apẹẹrẹ ti bot ti, fi fun ọjọ ti a fun ati orilẹ-ede, da pada fun ọ ni iru ọjọ lati kalẹnda iṣelọpọ.

Bot isalẹ nlo API kalẹnda iṣelọpọ isdayoff.ru.

Koodu 3: Bot ti o ṣe ijabọ nipasẹ ọjọ ati orilẹ-ede

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('1165649194:AAFkDqIzQ6Wq5GV0YU7PmEZcv1gmWIFIB_8')

# Пишем метод для приветсвия
## команда приветвия
check_date <- function(bot, update, args) {

  # входящие данные
  day     <- args[1]  # дата
  country <- args[2]  # страна

  # проверка введённых параметров
  if ( !grepl('\d{4}-\d{2}-\d{2}', day) ) {

    # Send Custom Keyboard
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(day, " - некорреткная дата, введите дату в формате ГГГГ-ММ-ДД"),
                    parse_mode = "Markdown")

  } else {
    day <- as.Date(day)
    # переводим в формат POSIXtl
    y <- format(day, "%Y")
    m <- format(day, "%m")
    d <- format(day, "%d")

  }

  # страна для проверки
  ## проверяем задана ли страна
  ## если не задана устанавливаем ru
  if ( ! country %in% c('ru', 'ua', 'by', 'kz', 'us') ) {

    # Send Custom Keyboard
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(country, " - некорретктный код страны, возможнные значения: ru, by, kz, ua, us. Запрошены данные по России."),
                    parse_mode = "Markdown")

    country <- 'ru'

  }

  # запрос данных из API
  # компоновка HTTP запроса
  url <- paste0("https://isdayoff.ru/api/getdata?",
                "year=",  y, "&",
                "month=", m, "&",
                "day=",   d, "&",
                "cc=",    country, "&",
                "pre=1&",
                "covid=1")

  # получаем ответ
  res <- readLines(url)

  # интрепретация ответа
  out <- switch(res, 
                "0"   = "Рабочий день",
                "1"   = "Нерабочий день",
                "2"   = "Сокращённый рабочий день",
                "4"   = "covid-19",
                "100" = "Ошибка в дате",
                "101" = "Данные не найдены",
                "199" = "Ошибка сервиса")

  # отправляем сообщение
  bot$sendMessage(update$message$chat_id, 
                  text = paste0(day, " - ", out),
                  parse_mode = "Markdown")

}

# создаём обработчик 
date_hendler <- CommandHandler('check_date', check_date, pass_args = TRUE)

# добаляем обработчик в диспетчер
updater <- updater + date_hendler

# запускаем бота
updater$start_polling()

Ṣiṣe apẹẹrẹ koodu loke, lẹhin ti o rọpo 'BOT TOKEN rẹ' pẹlu ami-ami gidi ti o gba nigbati o ṣẹda bot nipasẹ Bàbá Bàbá (Mo ti sọrọ nipa ṣiṣẹda bot ni akọkọ article).

A ṣẹda bot kan ti o ni ọna kan nikan ni Asenali rẹ check_date, Ọna yii ni a npe ni nipasẹ aṣẹ ti orukọ kanna.

Ṣugbọn, ni afikun si orukọ aṣẹ, ọna yii nilo ki o tẹ awọn aye meji sii, koodu orilẹ-ede ati ọjọ naa. Nigbamii ti, bot ṣayẹwo boya ọjọ ti a fun ni orilẹ-ede ti a sọ pato jẹ ipari ose, ọjọ kuru, tabi ọjọ iṣẹ ni ibamu si kalẹnda iṣelọpọ osise.

Ni ibere fun ọna ti a ṣẹda lati gba afikun awọn paramita pẹlu aṣẹ, lo ariyanjiyan naa pass_args = TRUE ni iṣẹ CommandHandler(), ati nigba ṣiṣẹda ọna kan, ni afikun si awọn ariyanjiyan ti a beere bot, imudojuiwọn ṣẹda aṣayan aṣayan - ọfa. Ọna ti a ṣẹda ni ọna yii yoo gba awọn paramita ti o kọja si bot lẹhin orukọ aṣẹ. Awọn paramita gbọdọ jẹ niya nipasẹ aaye kan; wọn yoo firanṣẹ si ọna bi fekito ọrọ.

Jẹ ki a ṣe ifilọlẹ ati idanwo bot wa.

Kikọ bot telegram ni R (apakan 2): Fifi atilẹyin aṣẹ ati awọn asẹ ifiranṣẹ si bot

Ṣiṣe awọn bot ni abẹlẹ

Igbesẹ ti o kẹhin ti a nilo lati pari ni lati ṣe ifilọlẹ bot ni abẹlẹ.

Lati ṣe eyi, tẹle algorithm ti a ṣalaye ni isalẹ:

  1. Fi koodu bot pamọ si faili pẹlu itẹsiwaju R. Nigbati o ba ṣiṣẹ ni RStudio, eyi ni a ṣe nipasẹ akojọ aṣayan. faili, egbe Fipamọ Bi ....
  2. Ṣafikun ọna si folda bin, eyiti o wa ninu folda ninu eyiti o fi ede R sii, si oniyipada Ọna, awọn ilana nibi.
  3. Ṣẹda faili ọrọ deede ninu eyiti o kọ laini 1: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. Dipo C: Awọn olumuloAlseyDocumentsmy_bot.R kọ ọna si iwe afọwọkọ bot rẹ. Ni akoko kanna, o ṣe pataki pe ko si awọn ohun kikọ Cyrillic tabi awọn aaye ni ọna, nitori eyi le fa awọn iṣoro nigbati o nṣiṣẹ bot. Fipamọ, ki o rọpo itẹsiwaju rẹ pẹlu txt on adan.
  4. Ṣii Iṣeto Iṣẹ-ṣiṣe Windows, awọn ọna pupọ lo wa lati ṣe eyi, fun apẹẹrẹ, ṣii folda eyikeyi ki o tẹ adirẹsi sii %windir%system32taskschd.msc /s. Awọn ọna ifilọlẹ miiran le ṣee rii nibi.
  5. Ni apa ọtun oke ti oluṣeto, tẹ "Ṣẹda iṣẹ-ṣiṣe...".
  6. Lori taabu “Gbogbogbo”, fun iṣẹ-ṣiṣe rẹ ni orukọ aṣa, ki o yipada si ipo “Ṣiṣe fun gbogbo awọn olumulo”.
  7. Lọ si taabu "Awọn iṣẹ", tẹ "Ṣẹda". Ni aaye "Eto tabi iwe afọwọkọ", tẹ "Ṣawakiri", wa eyi ti o ṣẹda ni ipele keji adan faili ki o tẹ O DARA.
  8. Tẹ O DARA ati, ti o ba jẹ dandan, tẹ ọrọ igbaniwọle sii fun akọọlẹ ẹrọ iṣẹ rẹ.
  9. Wa iṣẹ-ṣiṣe ti a ṣẹda ninu oluṣeto, yan ki o tẹ bọtini “Ṣiṣe” ni igun apa ọtun isalẹ.

Bot wa nṣiṣẹ ni abẹlẹ ati pe yoo ṣiṣẹ titi ti o fi da iṣẹ naa duro, tabi pa PC tabi olupin rẹ lori eyiti o ti ṣe ifilọlẹ.

ipari

Ninu àpilẹkọ yii, a ṣe akiyesi bi a ṣe le kọ bot ti o ni kikun ti ko le firanṣẹ nikan, ṣugbọn tun dahun si awọn ifiranṣẹ ti nwọle ati awọn aṣẹ. Imọ ti o gba ti to lati yanju pupọ julọ awọn iṣoro rẹ.

Nkan ti o tẹle yoo sọrọ nipa bii o ṣe le ṣafikun keyboard si bot fun iṣẹ irọrun diẹ sii.

Alabapin si mi telegram и youtube awọn ikanni.

orisun: www.habr.com

Fi ọrọìwòye kun