Te tuhi i te karetao waea i roto i te R (waahanga 4): Te hanga korero riterite, arorau me te karetao

Mena kua panui koe i nga korero o mua e toru nga tuhinga mai i tenei raupapa, katahi ka mohio koe ki te tuhi i nga karetao waea-katoa me te papapātuhi.

I roto i tenei tuhinga, ka ako tatou me pehea te tuhi i te bot ka mau tonu te korero. Ko era. Ka patai te karetao ki a koe ka tatari kia uru koe ki etahi korero. I runga i nga raraunga ka whakauruhia e koe, ka mahia e te bot etahi mahi.

I roto i tenei tuhinga ka ako tatou me pehea te whakamahi i te papaaarangi i raro i te potae o te bot, i roto i ta maatau tauira ko SQLite, engari ka taea e koe te whakamahi i etahi atu DBMS. I tuhia e au nga korero mo te taunekeneke me nga papaa raraunga i te reo R i roto tenei tuhinga.

Te tuhi i te karetao waea i roto i te R (waahanga 4): Te hanga korero riterite, arorau me te karetao

Nga tuhinga katoa mai i te raupapa "Te tuhi i te karetao waea ki R"

  1. Ka hangaia e matou he karetao ka whakamahia hei tuku karere ma te waea waea
  2. Tāpirihia te tautoko whakahau me nga whiriwhiringa karere ki te karetao
  3. Me pehea te taapiri i te tautoko papapātuhi ki te karetao
  4. Te hanga korero riterite, arorau me te karetao

Tuhinga

Mena kei te pirangi koe ki te tātari raraunga, ka aro pea koe ki taku waea и youtube hongere. Ko te nuinga o nga korero e whakatapua ana ki te reo R.

  1. Whakataki
  2. Te tukanga hanga bot
  3. Hangahanga kaupapa bot
  4. whirihora bot
  5. Waihangahia he taurangi taiao
  6. Te hanga i te papaunga raraunga
  7. Ko nga mahi tuhi ki te mahi me te patengi raraunga
  8. Nga tikanga bot
  9. Nga whiriwhiringa karere
  10. Kaihautu
  11. Waehere whakarewa bot
  12. mutunga

Whakataki

Kia taea ai e te karetao te tono raraunga mai i a koe me te tatari kia uru koe ki tetahi korero, me tuhi koe i te ahuatanga o te korero o naianei. Ko te huarahi pai ki te mahi i tenei ko te whakamahi i etahi momo putunga raraunga kua whakauruhia, penei i te SQLite.

Ko era. Ka penei te arorau. Ka karangahia e matou te tikanga bot, a ka tonohia e te bot etahi korero mai i a maatau, a, i ia taahiraa ka tatari kia whakauruhia enei korero ka taea te tirotiro.

Ka tuhia e matou te karetao ngawari rawa atu, i te tuatahi ka patai mo to ingoa, katahi ko to tau, ka tiakina nga raraunga kua riro ki te papaaarangi. Ina tono mo te tau, ka tirohia ko nga raraunga kua whakauruhia he nama, ehara i te tuhinga.

Ko nga korero ngawari ka toru noa nga ahuatanga:

  1. Ko te tiimata te ahua o te karetao, karekau e tumanakohia he korero mai i a koe
  2. ingoa_wai - te ahua e tatari ana te karetao kia whakauruhia he ingoa
  3. Ko te wait_age te ahua e tatari ana te karetao kia whakauruhia to tau, te maha o nga tau katoa.

Te tukanga hanga bot

I roto i te tuhinga, ka hangahia e matou he karetao ma te taahiraa; ka taea te whakaatu i te katoa o nga mahi e whai ake nei:
Te tuhi i te karetao waea i roto i te R (waahanga 4): Te hanga korero riterite, arorau me te karetao

  1. Ka hangaia e matou he whirihora karetao hei penapena i etahi tautuhinga. I roto i to maatau, ko te tohu bot, me te huarahi ki te konae raraunga.
  2. Ka waihangahia e matou he taurangi taiao e penapena ai te huarahi ki te kaupapa me te bot.
  3. Ka hangahia e matou te papaarangi ake, me te maha o nga mahi kia taea ai e te bot te taunekeneke ki a ia.
  4. Ka tuhia e matou nga tikanga bot, i.e. nga mahi ka mahia e ia.
  5. Te taapiri i nga whiriwhiringa karere. Ma te awhina ka uru atu te karetao ki nga tikanga e tika ana, i runga i te ahua o te korerorero o naianei.
  6. Ka taapirihia e matou nga kaihautu ka hono nga whakahau me nga karere me nga tikanga bot e tika ana.
  7. Kia whakarewahia te karetao.

Hangahanga kaupapa bot

Mo te waatea, ka wehewehea e matou te waehere o to maatau bot, me etahi atu konae e pa ana, ki te hanganga e whai ake nei.

  • bot.R — te waehere matua o to tatou bot
  • db_bot_function.R — he poraka o te waehere me nga mahi mo te mahi me te putunga raraunga
  • tikanga_bot.R — waehere o tikanga bot
  • message_filters.R — whiriwhiringa karere
  • kaikawe.R - kaikawe
  • config.cfg - whirihora bot
  • waihanga_db_data.sql — Hōtuhi SQL mo te hanga tepu me nga raraunga korerorero i roto i te papaa raraunga
  • create_db_state.sql — Hōtuhi SQL mo te hanga tepu o te ahua korerorero o naianei i roto i te papaa raraunga
  • bot.db - pātengi raraunga bot

Ka taea e koe te tiro i te kaupapa bot katoa, ranei скачать mai i taku putunga i runga i GitHub.

whirihora bot

Ka whakamahia e matou te mea o mua hei whirihora ini kōnae, te ahua e whai ake nei:

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

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

I roto i te whirihora ka tuhia e matou te tohu bot me te huarahi ki te papaa raraunga, i.e. ki te kōnae bot.db, ka hangahia e matou te konae ake i te taahiraa e whai ake nei.

Mo nga potae uaua ake, ka taea e koe te hanga i nga whirihora uaua ake, i tua atu, kaore e tika te tuhi i te whirihora ini, ka taea e koe te whakamahi i etahi atu whakatakotoranga tae atu ki a JSON.

Waihangahia he taurangi taiao

I runga i ia PC, ko te kōpaki me te kaupapa bot ka taea ki roto i nga raarangi rereke me nga puku rereke, na i roto i te waehere ka whakatauhia te ara ki te kōpaki kaupapa ma te taurangi taiao TG_BOT_PATH.

He maha nga huarahi hei hanga i tetahi taurangi taiao, ko te mea ngawari ko te tuhi ki roto i te konae .Te Taiao.

Ka taea e koe te hanga, te whakatika ranei i tenei konae ma te whakamahi i te whakahau file.edit(path.expand(file.path("~", ".Renviron"))). Whakahaerehia ka taapirihia he raina ki te konae:

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

Whai muri tiakina te konae .Te Taiao ka whakaara ano i te RStudio.

Te hanga i te papaunga raraunga

Ko te mahi e whai ake nei ko te hanga i tetahi putunga raraunga. Ka hiahia matou kia 2 tepu:

  • chat_data — nga raraunga i tonoa e te karetao mai i te kaiwhakamahi
  • chat_state — te ahua o naianei o nga korerorero katoa

Ka taea e koe te hanga i enei ripanga ma te whakamahi i te patai SQL e whai ake nei:

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
);

Mena i tangohia e koe te kaupapa bot mai i GitHub, katahi ka taea e koe te hanga i te papanga raraunga ka taea e koe te whakamahi i te waehere e whai ake nei i roto i te 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'))

Ko nga mahi tuhi ki te mahi me te patengi raraunga

Kua oti kee he konae whirihoranga kua reri me te hanga i tetahi putunga raraunga. Inaianei me tuhi koe i nga mahi ki te panui me te tuhi raraunga ki tenei putunga raraunga.

Mena i tikiakehia e koe te kaupapa mai i GitHub, ka kitea e koe nga mahi i roto i te konae db_bot_function.R.

Waehere mahi mo te mahi me te papaarangi

# ###########################################################
# 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]])

}

I hanga e matou nga mahi ngawari e 4:

  • get_state() — tiki i te ahua o nga korero o naianei mai i te papaunga raraunga
  • set_state() — tuhia te ahua korero o naianei ki te papaarangi
  • get_chat_data() - whiwhi raraunga i tukuna e te kaiwhakamahi
  • set_chat_data() - tuhi raraunga i riro mai i te kaiwhakamahi

He tino ngawari nga mahi katoa, ka panuihia e raatau nga raraunga mai i te paataka ma te whakamahi i te whakahau dbGetQuery(), mahi ranei UPSERT mahi (te huri i nga raraunga o naianei, te tuhi ranei i nga raraunga hou ki te paataka raraunga), ma te whakamahi i te mahi dbExecute().

Ko te wetereo mo te mahi UPSERT e whai ake nei:

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

Ko era. i roto i a maatau tepu mara kōrero_id he herenga ahurei, ko ia te matua matua o nga ripanga. I te timatanga, ka ngana taatau ki te taapiri i nga korero ki te teepu, ka puta he hapa mena kua tae mai nga raraunga mo te korerorero o naianei, na reira ka whakahou noa i nga korero mo tenei korerorero.

I muri mai, ka whakamahia e matou enei mahi i roto i nga tikanga a te bot me nga whiriwhiringa.

Nga tikanga bot

Ko te mahi e whai ake nei ki te hanga i to tatou bot ko te hanga tikanga. Mena i tikiakehia e koe te kaupapa mai i GitHub, na ko nga tikanga katoa kei roto i te konae tikanga_bot.R.

Waehere tikanga 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')
  }

}

I hanga e matou nga tikanga e 5:

  • timata — Tīmatahia he korero
  • state — Tikina te ahua korero o naianei
  • tautuhi - Tautuhi ano i te ahua o naianei korerorero
  • enter_name - Ka patai te karetao mo to ingoa
  • enter_age — Ka patai te karetao mo to tau

Tikanga start ka patai mo to ingoa, ka huri i te ahua korerorero ki ingoa_tatari, i.e. ki te tatari mo te whakauru i to ingoa.

I muri mai, ka tukuna e koe te ingoa ka tukatukahia e te tikanga enter_name, ka mihi te karetao ki a koe, ka tuhi i te ingoa kua riro ki roto i te putunga korero, ka huri i te korerorero ki te kawanatanga tatari_tau.

I tenei wa, ka tumanako te karetao kia uru koe ki to reanga. Ka tukuna e koe to reanga, ka tirohia e te karetao te panui, mena ka tukuna e koe etahi tuhinga hei utu mo te nama, ka kii: Ты ввёл некорректные данные, введи число, a ka tatari koe ki te whakauru ano i o raraunga. Mena ka tukuna e koe he nama, ka kii mai te karetao kua whakaae ia ki to tau, tuhia nga raraunga kua riro ki te papaaarangi, panui i nga raraunga katoa i riro mai i a koe ka whakahoki i te ahua o te korerorero ki tona turanga taketake, ara. V start.

Ma te karanga i te tikanga state ka taea e koe te tono i te mana korero o naianei i nga wa katoa, me te whakamahi i te reset whakahokia te korerorero ki tona ahua taketake.

Nga whiriwhiringa karere

I roto i a maatau, koinei tetahi o nga waahanga nui ki te hanga i te bot. Ma te awhina o nga whiriwhiringa karere ka mohio te karetao he aha nga korero e tumanakohia ana mai i a koe me pehea te tukatuka.

I roto i te kaupapa i runga GitHub kua rehitatia nga whiriwhiringa ki te konae message_filters.R.

Waehere tātari karere:

# ###########################################################
# 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"
}
)

I roto i nga whiriwhiringa ka whakamahia e matou te mahi i tuhia i mua get_state(), ki te tono i te ahua o naianei o te korerorero. Ko tenei mahi me 1 noa te tautohetohe, id korerorero.

Tātari Panuku ingoa_tatari ka tukatuka i nga karere ina he ahua te korerorero wait_name, a na runga i te tātari tatari_tau ka tukatuka i nga karere ina he ahua te korerorero wait_age.

Kaihautu

Ka karangahia te konae me nga kaikawe kaikawe.R, a kei a ia te waehere e whai ake nei:

# ###########################################################
# 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)

Tuatahi ka hangahia e matou he kaikawe whakahau e taea ai e koe te whakahaere tikanga ki te tiimata i te korero, te tautuhi, me te patai i te ahuatanga o naianei.

I muri mai, ka hangaia e matou nga kaikawe karere e 2 ma te whakamahi i nga whiriwhiringa i hangaia i te taahiraa o mua, ka taapirihia he tātari ki a raatau !MessageFilters$command, kia taea ai e tatou te whakamahi i nga whakahau i roto i nga ahuatanga korerorero.

Waehere whakarewa bot

Inaianei kua rite nga mea katoa ki te whakarewa, ko te waehere matua mo te whakarewa i te bot kei roto i te konae 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()

Ko te mutunga, ka whiwhi matou i tenei bot:
Te tuhi i te karetao waea i roto i te R (waahanga 4): Te hanga korero riterite, arorau me te karetao

I nga wa katoa ma te whakamahi i te whakahau /state ka taea e tatou te uiui i te ahua o te korerorero o naianei, me te whakamahi i te whakahau /reset whakahokia te korerorero ki tona ahua taketake ka timata ano te korerorero.

mutunga

I roto i tenei tuhinga, i whakaaro matou me pehea te whakamahi i te papaaarangi i roto i te karetao, me te hanga i nga korero arorau raupapa ma te tuhi i te ahua korero.

I tenei keehi, i titiro matou ki te tauira tino tuatahi, kia maamaa ake ai te maarama ki te whakaaro mo te hanga i enei momo bots; i roto i te mahi, ka taea e koe te hanga korero tino uaua.

I roto i te tuhinga e whai ake nei i roto i tenei raupapa, ka ako tatou me pehea te aukati i nga mana o nga kaiwhakamahi bot ki te whakamahi i nga momo tikanga.

Source: will.com

Tāpiri i te kōrero