Ke kākau ʻana i kahi bot telegram ma R (mahele 4): Ke kūkulu ʻana i kahi kamaʻilio kūpaʻa a kūpono me ka bot

Inā ua heluhelu mua ʻoe i ka mua ʻekolu ʻatikala mai kēia moʻo, a laila ʻike ʻoe i ke kākau ʻana i nā bots telegram piha me kahi kī.

Ma kēia ʻatikala, e aʻo mākou pehea e kākau ai i kahi bot e mālama i kahi kamaʻilio kūlike. ʻO kēlā mau. E nīnau ka bot iā ʻoe i nā nīnau a kali iā ʻoe e hoʻokomo i kekahi ʻike. Ma muli o ka ʻikepili āu e hoʻokomo ai, e hana ka bot i kekahi mau hana.

Ma kēia ʻatikala e aʻo mākou pehea e hoʻohana ai i kahi waihona ma lalo o ka pā o ka bot, ma kā mākou hiʻohiʻona ʻo ia ʻo SQLite, akā hiki iā ʻoe ke hoʻohana i kekahi DBMS ʻē aʻe. Ua kākau au i nā kikoʻī hou aku e pili ana i ka launa pū ʻana me nā waihona ma ka ʻōlelo R ma kēiaʻatikala.

Ke kākau ʻana i kahi bot telegram ma R (mahele 4): Ke kūkulu ʻana i kahi kamaʻilio kūpaʻa a kūpono me ka bot

ʻO nā ʻatikala āpau mai ka moʻo "Kākau i kahi bot telegram ma R"

  1. Hana mākou i kahi bot a hoʻohana iā ia e hoʻouna i nā leka ma ke kelepona
  2. Hoʻohui i ke kākoʻo kauoha a me nā kānana memo i ka bot
  3. Pehea e hoʻohui ai i ke kākoʻo keyboard i kahi bot
  4. Ke kūkulu ʻana i kahi kamaʻilio kūpaʻa me ka bot

Nā mea

Inā makemake ʻoe i ka ʻikepili ʻikepili, makemake paha ʻoe i kaʻu telegram и Ukulele nā kahawai. Hoʻolaʻa ʻia ka hapa nui o nā mea i ka ʻōlelo R.

  1. Hōʻike
  2. Kaʻina hana Bot
  3. Pāhana papahana Bot
  4. ʻO ka hoʻonohonoho bot
  5. E hana i kahi hoʻololi kaiapuni
  6. Ke hana ʻana i kahi waihona
  7. Nā hana kākau e hana me ka waihona
  8. Nā ʻano hana bot
  9. Nā kānana memo
  10. Nā mea lawelawe
  11. Code hoʻomaka Bot
  12. hopena

Hōʻike

I mea e noi ai ka bot i ka ʻikepili mai iā ʻoe a kali iā ʻoe e hoʻokomo i kekahi ʻike, pono ʻoe e hoʻopaʻa i ke kūlana o kēia manawa. ʻO ke ala maikaʻi loa e hana ai i kēia, ʻo ia ka hoʻohana ʻana i kekahi ʻano waihona i hoʻopili ʻia, e like me SQLite.

ʻO kēlā mau. Penei ka loina. Kāhea mākou i ke ʻano bot, a ke noi nei ka bot i kekahi ʻike mai iā mākou, a ma kēlā me kēia ʻanuʻu ke kali ʻo ia i kēia ʻike e hoʻokomo ʻia a hiki ke nānā iā ia.

E kākau mākou i ka bot maʻalahi loa, e nīnau mua ia i kou inoa, a laila kou mau makahiki, a e mālama i ka ʻikepili i loaʻa i ka waihona. Ke noi nei i ka makahiki, e nānā ia he helu ka ʻikepili i hoʻokomo ʻia a ʻaʻole kikokikona.

ʻEkolu mau mokuʻāina wale nō kēlā kamaʻilio maʻalahi:

  1. ʻO ka hoʻomaka ke kūlana maʻamau o ka bot, kahi e manaʻo ʻole ai ia i kahi ʻike mai iā ʻoe
  2. wait_name - ka moku'āina kahi e kali ai ka bot no ka hoʻokomo ʻana i kahi inoa
  3. ʻO wait_age ka moku'āina kahi e kali ai ka bot no kou mau makahiki e hoʻokomo, ka helu o nā makahiki piha.

Kaʻina hana Bot

I ka wā o ka ʻatikala, e kūkulu mākou i kahi bot i kēlā me kēia pae; hiki ke hōʻike ʻia ke kaʻina holoʻokoʻa penei:
Ke kākau ʻana i kahi bot telegram ma R (mahele 4): Ke kūkulu ʻana i kahi kamaʻilio kūpaʻa a kūpono me ka bot

  1. Hana mākou i kahi hoʻonohonoho bot kahi e mālama ai mākou i kekahi mau hoʻonohonoho. I kā mākou hihia, ka hōʻailona bot, a me ke ala i ka waihona waihona.
  2. Hana mākou i kahi hoʻololi kaiapuni kahi e mālama ʻia ai ke ala i ka papahana me ka bot.
  3. Hana mākou i ka ʻikepili ponoʻī, a me nā hana he nui i hiki i ka bot ke launa pū me ia.
  4. Kākau mākou i nā ʻano bot, i.e. nā hana e hana ai.
  5. Hoʻohui i nā kānana memo. Me ke kōkua o ka bot e komo i nā ala kūpono, e pili ana i ke kūlana o kēia manawa o ke kamaʻilio.
  6. Hoʻohui mākou i nā mea lawelawe e hoʻopili i nā kauoha a me nā memo me nā ala bot pono.
  7. E hoʻomaka kākou i ka bot.

Pāhana papahana Bot

No ka maʻalahi, e hoʻokaʻawale mākou i ke code o kā mākou bot, a me nā faila pili ʻē aʻe, i loko o kēia ʻano.

  • bot.R - ke code nui o kā mākou bot
  • db_bot_function.R - he poloka code me nā hana no ka hana ʻana me ka waihona
  • bot_methods.R — code of bot method
  • message_filters.R — nā kānana memo
  • nā mea lawelawe.R - nā mea lawelawe
  • config.cfg - hoʻonohonoho bot
  • create_db_data.sql — Palapala SQL no ka hana ʻana i papa me ka ʻikepili kamaʻilio ma ka waihona
  • create_db_state.sql — Palapala SQL no ka hana ʻana i papa ʻaina o ke kūlana kamaʻilio o kēia manawa ma ka waihona
  • bot.db - waihona waihona bot

Hiki iā ʻoe ke nānā i ka papahana bot holoʻokoʻa, a i ʻole скачать mai ko'u waihona ma GitHub.

ʻO ka hoʻonohonoho bot

E hoʻohana mākou i ka mea maʻamau ma ke ʻano he config ini file, ke ano penei:

[bot_settings]
bot_token=ТОКЕН_ВАШЕГО_БОТА

[db_settings]
db_path=C:/ПУТЬ/К/ПАПКЕ/ПРОЕКТА/bot.db

Ma ka config mākou kākau i ka bot token a me ke ala i ka waihona, i.e. i ka waihona bot.db, e hana mākou i ka faila ponoʻī i ka pae aʻe.

No nā bots paʻakikī, hiki iā ʻoe ke hana i nā configs paʻakikī, ʻokoʻa, ʻaʻole pono e kākau i kahi config ini, hiki iā ʻoe ke hoʻohana i kekahi ʻano ʻē aʻe me JSON.

E hana i kahi hoʻololi kaiapuni

Ma kēlā me kēia PC, hiki ke loaʻa ka waihona me ka papahana bot ma nā papa kuhikuhi like ʻole a ma nā ʻokoʻa ʻē aʻe, no laila ma ke code e hoʻonohonoho ʻia ke ala i ka waihona papahana ma o ka hoʻololi kaiapuni. TG_BOT_PATH.

Nui nā ala e hana ai i kahi ʻano hoʻololi kaiapuni, ʻo ka maʻalahi ka kākau ʻana i loko o kahi faila .Kaiapuni.

Hiki iā ʻoe ke hana a hoʻoponopono paha i kēia faila me ke kauoha file.edit(path.expand(file.path("~", ".Renviron"))). E hoʻokō a hoʻohui i hoʻokahi laina i ka faila:

TG_BOT_PATH=C:/ПУТЬ/К/ВАШЕМУ/ПРОЕКТУ

A laila e mālama i ka faila .Kaiapuni a hoʻomaka hou iā RStudio.

Ke hana ʻana i kahi waihona

ʻO ka hana aʻe e hana i kahi waihona. Pono mākou i 2 papa:

  • chat_data - ʻikepili i noi ʻia e ka bot mai ka mea hoʻohana
  • chat_state - ke kūlana o kēia manawa o nā kamaʻilio āpau

Hiki iā ʻoe ke hana i kēia mau papa me ka hoʻohana ʻana i kēia nīnau SQL:

CREATE TABLE chat_data (
    chat_id BIGINT  PRIMARY KEY
                    UNIQUE,
    name    TEXT,
    age     INTEGER
);

CREATE TABLE chat_state (
    chat_id BIGINT PRIMARY KEY
                   UNIQUE,
    state   TEXT
);

Inā ʻoe i hoʻoiho i ka papahana bot mai GitHub, a laila e hana i ka ʻikepili hiki iā ʻoe ke hoʻohana i kēia code ma R.

# Скрипт создания базы данных
library(DBI)     # интерфейс для работы с СУБД
library(configr) # чтение конфига
library(readr)   # чтение текстовых SQL файлов
library(RSQLite) # драйвер для подключения к SQLite

# директория проекта
setwd(Sys.getenv('TG_BOT_PATH'))

# чтение конфига
cfg <- read.config('config.cfg')

# подключение к SQLite
con <- dbConnect(SQLite(), cfg$db_settings$db_path)

# Создание таблиц в базе
dbExecute(con, statement = read_file('create_db_data.sql'))
dbExecute(con, statement = read_file('create_db_state.sql'))

Nā hana kākau e hana me ka waihona

Loaʻa iā mākou kahi faila hoʻonohonoho i mākaukau a hana ʻia kahi waihona. I kēia manawa pono ʻoe e kākau i nā hana e heluhelu a kākau i ka ʻikepili i kēia waihona.

Inā ʻoe i hoʻoiho i ka papahana mai GitHub, a laila hiki iā ʻoe ke ʻike i nā hana ma ka faila db_bot_function.R.

Code hana no ka hana ʻana me ka waihona

# ###########################################################
# Function for work bot with database

# получить текущее состояние чата
get_state <- function(chat_id) {

  con <- dbConnect(SQLite(), cfg$db_settings$db_path)

  chat_state <- dbGetQuery(con, str_interp("SELECT state FROM chat_state WHERE chat_id == ${chat_id}"))$state

  return(unlist(chat_state))

  dbDisconnect(con)
}

# установить текущее состояние чата
set_state <- function(chat_id, state) {

  con <- dbConnect(SQLite(), cfg$db_settings$db_path)

  # upsert состояние чата
  dbExecute(con, 
            str_interp("
            INSERT INTO chat_state (chat_id, state)
                VALUES(${chat_id}, '${state}') 
                ON CONFLICT(chat_id) 
                DO UPDATE SET state='${state}';
            ")
  )

  dbDisconnect(con)

}

# запись полученных данных в базу
set_chat_data <- function(chat_id, field, value) {

  con <- dbConnect(SQLite(), cfg$db_settings$db_path)

  # upsert состояние чата
  dbExecute(con, 
            str_interp("
            INSERT INTO chat_data (chat_id, ${field})
                VALUES(${chat_id}, '${value}') 
                ON CONFLICT(chat_id) 
                DO UPDATE SET ${field}='${value}';
            ")
  )

  dbDisconnect(con)

}

# read chat data
get_chat_data <- function(chat_id, field) {

  con <- dbConnect(SQLite(), cfg$db_settings$db_path)

  # upsert состояние чата
  data <- dbGetQuery(con, 
                     str_interp("
            SELECT ${field}
            FROM chat_data
            WHERE chat_id = ${chat_id};
            ")
  )

  dbDisconnect(con)

  return(data[[field]])

}

Ua hana mākou i 4 mau hana maʻalahi:

  • get_state() - e kiʻi i ke kūlana kamaʻilio o kēia manawa mai ka waihona
  • set_state() — kākau i ke kūlana kamaʻilio o kēia manawa i ka waihona
  • get_chat_data() - loaʻa ka ʻikepili i hoʻouna ʻia e ka mea hoʻohana
  • set_chat_data() - hoʻopaʻa i ka ʻikepili i loaʻa mai ka mea hoʻohana

He maʻalahi nā hana a pau, heluhelu lākou i ka ʻikepili mai ka waihona me ka hoʻohana ʻana i ke kauoha dbGetQuery(), a hoʻopaʻa UPSERT hana (hoʻololi i ka ʻikepili i loaʻa a i ʻole ke kākau ʻana i nā ʻikepili hou i ka waihona), me ka hoʻohana ʻana i ka hana dbExecute().

ʻO ka syntax no ka hana UPSERT penei:

INSERT INTO chat_data (chat_id, ${field})
VALUES(${chat_id}, '${value}') 
ON CONFLICT(chat_id) 
DO UPDATE SET ${field}='${value}';

ʻO kēlā mau mea. ma ko makou kahua papa kamaʻilio_id loaʻa i kahi kaohi ʻokoʻa a ʻo ia ke kī nui o nā papa. I ka hoʻomaka ʻana, hoʻāʻo mākou e hoʻohui i ka ʻike i ka papaʻaina, a loaʻa iā mākou kahi hewa inā loaʻa ka ʻikepili no ke kamaʻilio o kēia manawa, a laila e hoʻonui mākou i ka ʻike no kēia kamaʻilio.

A laila, e hoʻohana mākou i kēia mau hana i nā ala a me nā kānana o ka bot.

Nā ʻano hana bot

ʻO ka hana aʻe i ke kūkulu ʻana i kā mākou bot ka hana ʻana i nā ala. Inā ʻoe i hoʻoiho i ka papahana mai GitHub, a laila aia nā ala āpau i ka faila bot_methods.R.

Code kaʻina Bot

# ###########################################################
# bot methods

# start dialog
start <- function(bot, update) {

  # 

  # Send query
  bot$sendMessage(update$message$chat_id, 
                  text = "Введи своё имя")

  # переключаем состояние диалога в режим ожидания ввода имени
  set_state(chat_id = update$message$chat_id, state = 'wait_name')

}

# get current chat state
state <- function(bot, update) {

  chat_state <- get_state(update$message$chat_id)

  # Send state
  bot$sendMessage(update$message$chat_id, 
                  text = unlist(chat_state))

}

# reset dialog state
reset <- function(bot, update) {

  set_state(chat_id = update$message$chat_id, state = 'start')

}

# enter username
enter_name <- function(bot, update) {

  uname <- update$message$text

  # Send message with name
  bot$sendMessage(update$message$chat_id, 
                  text = paste0(uname, ", приятно познакомится, я бот!"))

  # Записываем имя в глобальную переменную
  #username <<- uname
  set_chat_data(update$message$chat_id, 'name', uname) 

  # Справшиваем возраст
  bot$sendMessage(update$message$chat_id, 
                  text = "Сколько тебе лет?")

  # Меняем состояние на ожидание ввода имени
  set_state(chat_id = update$message$chat_id, state = 'wait_age')

}

# enter user age
enter_age <- function(bot, update) {

  uage <- as.numeric(update$message$text)

  # проверяем было введено число или нет
  if ( is.na(uage) ) {

    # если введено не число то переспрашиваем возраст
    bot$sendMessage(update$message$chat_id, 
                    text = "Ты ввёл некорректные данные, введи число")

  } else {

    # если введено число сообщаем что возраст принят
    bot$sendMessage(update$message$chat_id, 
                    text = "ОК, возраст принят")

    # записываем глобальную переменную с возрастом
    #userage <<- uage
    set_chat_data(update$message$chat_id, 'age', uage) 

    # сообщаем какие данные были собраны
    username <- get_chat_data(update$message$chat_id, 'name')
    userage  <- get_chat_data(update$message$chat_id, 'age')

    bot$sendMessage(update$message$chat_id, 
                    text = paste0("Тебя зовут ", username, " и тебе ", userage, " лет. Будем знакомы"))

    # возвращаем диалог в исходное состояние
    set_state(chat_id = update$message$chat_id, state = 'start')
  }

}

Ua hana mākou i 5 mau ala:

  • hoʻomaka - Hoʻomaka i kahi kūkākūkā
  • mokuʻāina - E kiʻi i ke kūlana kamaʻilio o kēia manawa
  • reset — Hoʻihoʻi hou i ke kūlana kamaʻilio o kēia manawa
  • enter_name - Nīnau ka bot i kou inoa
  • enter_age - Nīnau ka bot i kou mau makahiki

Palapala start noi i kou inoa, a hoʻololi i ke kūlana kamaʻilio i inoa_kali, i.e. no ka hoʻokomo ʻana i kou inoa.

A laila, hoʻouna ʻoe i ka inoa a hana ʻia e ke ʻano enter_name, aloha ka boti iā ʻoe, kākau i ka inoa i loaʻa i loko o ka waihona, a hoʻololi i ke kamaʻilio i ka mokuʻāina kali_makahiki.

I kēia pae, manaʻo ka bot e komo i kou mau makahiki. Hoʻouna ʻoe i kou mau makahiki, nānā ka bot i ka memo, inā ʻoe i hoʻouna i kahi kikokikona ma kahi o kahi helu, e ʻōlelo ʻia: Ты ввёл некорректные данные, введи число, a e kali iā ʻoe e hoʻokomo hou i kāu ʻikepili. Inā hoʻouna ʻoe i kahi helu, e hōʻike ka bot ua ʻae ʻo ia i kou mau makahiki, e kākau i ka ʻikepili i loaʻa i ka waihona, e hōʻike i nā ʻikepili āpau i loaʻa mai iā ʻoe a hoʻihoʻi i ke kūlana kamaʻilio i kona kūlana mua, ʻo ia hoʻi. V start.

Ma ke kāhea ʻana i ke ʻano state hiki iā ʻoe ke noi i ke kūlana kamaʻilio o kēia manawa i kēlā me kēia manawa, a me ka hoʻohana ʻana i ka reset e hoʻihoʻi i ke kamaʻilio i kona kūlana mua.

Nā kānana memo

I kā mākou hihia, ʻo kēia kekahi o nā mea nui i ke kūkulu ʻana i kahi bot. Me ke kōkua o nā kānana memo e hoʻomaopopo ai ka bot i ka ʻike e manaʻo ʻia mai iā ʻoe a pehea e hana ʻia ai.

Ma ka papahana ma GitHub hoʻopaʻa inoa ʻia nā kānana ma ka faila message_filters.R.

Code kānana memo:

# ###########################################################
# message state filters

# фильтр сообщений в состоянии ожидания имени
MessageFilters$wait_name <- BaseFilter(function(message) {
  get_state( message$chat_id )  == "wait_name"
}
)

# фильтр сообщений в состоянии ожидания возраста
MessageFilters$wait_age <- BaseFilter(function(message) {
  get_state( message$chat_id )   == "wait_age"
}
)

Ma nā kānana hoʻohana mākou i ka hana i kākau mua ʻia get_state(), i mea e noi ai i ke kūlana o ke kamaʻilio ʻana. Pono kēia hana i 1 hoʻopaʻapaʻa wale nō, kamaʻilio id.

kānana aʻe inoa_kali kaʻina hana i nā memo ke noho ke kamaʻilio ma kahi mokuʻāina wait_name, a no laila ke kānana kali_makahiki kaʻina hana i nā memo ke noho ke kamaʻilio ma kahi mokuʻāina wait_age.

Nā mea lawelawe

Ua kapa ʻia ka faila me nā mea lawelawe nā mea lawelawe.R, a loaʻa kēia code:

# ###########################################################
# handlers

# command handlers
start_h <- CommandHandler('start', start)
state_h <- CommandHandler('state', state)
reset_h <- CommandHandler('reset', reset)

# message handlers
## !MessageFilters$command - означает что команды данные обработчики не обрабатывают, 
## только текстовые сообщения
wait_age_h  <- MessageHandler(enter_age,  MessageFilters$wait_age  & !MessageFilters$command)
wait_name_h <- MessageHandler(enter_name, MessageFilters$wait_name & !MessageFilters$command)

ʻO ka mea mua, hana mākou i nā mea lawelawe kauoha e ʻae iā ʻoe e holo i nā ala e hoʻomaka ai i kahi kamaʻilio, hoʻonohonoho hou, a nīnau i ke kūlana o kēia manawa.

Ma hope aʻe, hana mākou i 2 mau memo memo me ka hoʻohana ʻana i nā kānana i hana ʻia i ka pae mua, a hoʻohui i kahi kānana iā lākou !MessageFilters$command, i hiki iā mākou ke hoʻohana i nā kauoha i kekahi kūlana kamaʻilio.

Code hoʻomaka Bot

I kēia manawa ua mākaukau mākou e hoʻomaka, aia ka code nui no ka hoʻokuʻu ʻana i ka bot i ka faila bot.R.

library(telegram.bot)
library(tidyverse)
library(RSQLite)
library(DBI)
library(configr)

# переходим в папку проекта
setwd(Sys.getenv('TG_BOT_PATH'))

# читаем конфиг
cfg <- read.config('config.cfg')

# создаём экземпляр бота
updater <- Updater(cfg$bot_settings$bot_token)

# Загрузка компонентов бота
source('db_bot_function.R') # функции для работы с БД
source('bot_methods.R')     # методы бота
source('message_filters.R') # фильтры сообщений
source('handlers.R') # обработчики сообщений

# Добавляем обработчики в диспетчер
updater <- updater +
  start_h +
  wait_age_h +
  wait_name_h +
  state_h +
  reset_h

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

ʻO ka hopena, ua loaʻa iā mākou kēia bot:
Ke kākau ʻana i kahi bot telegram ma R (mahele 4): Ke kūkulu ʻana i kahi kamaʻilio kūpaʻa a kūpono me ka bot

I kēlā me kēia manawa e hoʻohana ana i ke kauoha /state hiki iā mākou ke nīnau i ke kūlana kamaʻilio o kēia manawa, a me ka hoʻohana ʻana i ke kauoha /reset e hoʻihoʻi i ke kamaʻilio i kona kūlana mua a hoʻomaka hou i ke kamaʻilio.

hopena

Ma kēia ʻatikala, ua noʻonoʻo mākou pehea e hoʻohana ai i kahi waihona i loko o kahi bot, a pehea e kūkulu ai i nā kamaʻilio logical sequential ma ka hoʻopaʻa ʻana i ke kūlana kamaʻilio.

I kēia hihia, ua nānā mākou i ka hiʻohiʻona mua loa, i maʻalahi iā ʻoe ke hoʻomaopopo i ka manaʻo o ke kūkulu ʻana i ia mau bots; ma ka hoʻomaʻamaʻa, hiki iā ʻoe ke kūkulu i nā kamaʻilio paʻakikī.

Ma ka ʻatikala aʻe ma kēia pūʻulu, e aʻo mākou pehea e kaupalena ai i nā kuleana o nā mea hoʻohana bot e hoʻohana i nā ʻano hana like ʻole.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka