ProHoster > Pūnaewele > Nā Administration > 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
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.
ʻO nā ʻatikala āpau mai ka moʻo "Kākau i kahi bot telegram ma R"
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:
ʻ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
wait_name - ka moku'āina kahi e kali ai ka bot no ka hoʻokomo ʻana i kahi inoa
ʻ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:
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.
Hana mākou i kahi hoʻololi kaiapuni kahi e mālama ʻia ai ke ala i ka papahana me ka bot.
Hana mākou i ka ʻikepili ponoʻī, a me nā hana he nui i hiki i ka bot ke launa pū me ia.
Kākau mākou i nā ʻano bot, i.e. nā hana e hana ai.
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.
Hoʻohui mākou i nā mea lawelawe e hoʻopili i nā kauoha a me nā memo me nā ala bot pono.
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
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:
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.