A’ sgrìobhadh bot teileagram ann an R (pàirt 4): A’ togail conaltradh cunbhalach, loidsigeach leis a’ bot

Ma tha thu air an tè mu dheireadh a leughadh mu thràth trì artaigilean bhon t-sreath seo, tha fios agad mu thràth mar a sgrìobhas tu botaichean teileagram làn-chuimseach le meur-chlàr.

San artaigil seo, ionnsaichidh sinn mar a sgrìobhas tu bot a chumas conaltradh cunbhalach. An fheadhainn sin. Bidh am bot a’ faighneachd cheistean dhut agus a’ feitheamh riut beagan fiosrachaidh a chuir a-steach. A rèir an dàta a chuireas tu a-steach, nì am bot cuid de ghnìomhan.

Cuideachd san artaigil seo ionnsaichidh sinn mar a chleachdas tu stòr-dàta fo chochall a ’bot, san eisimpleir againn bidh e SQLite, ach faodaidh tu DBMS sam bith eile a chleachdadh. Sgrìobh mi nas mionaidiche mu bhith ag eadar-obrachadh le stòran-dàta anns a’ chànan R ann an an artaigil seo.

A’ sgrìobhadh bot teileagram ann an R (pàirt 4): A’ togail conaltradh cunbhalach, loidsigeach leis a’ bot

A h-uile artaigil bhon t-sreath "A 'sgrìobhadh teileagram bot ann an R"

  1. Bidh sinn a’ cruthachadh bot agus ga chleachdadh gus teachdaireachdan a chuir ann an teileagram
  2. Cuir taic àithne agus sìoltachain teachdaireachd ris a’ bot
  3. Mar a chuireas tu taic meur-chlàr ri bot
  4. A’ togail conaltradh cunbhalach, loidsigeach leis a’ bot

Clàr-innse

Ma tha ùidh agad ann am mion-sgrùdadh dàta, is dòcha gu bheil ùidh agad ann an mo telegram и youtube seanailean. Tha a’ mhòr-chuid den t-susbaint coisrigte don chànan R.

  1. Ro-ràdh
  2. Pròiseas togail bot
  3. Structar pròiseact bot
  4. Suidheachadh bot
  5. Cruthaich caochladair àrainneachd
  6. A 'cruthachadh stòr-dàta
  7. Gnìomhan sgrìobhaidh gus obrachadh leis an stòr-dàta
  8. Modhan bot
  9. Filters teachdaireachd
  10. Luchd-làimhseachaidh
  11. Còd cur air bhog bot
  12. co-dhùnadh

Ro-ràdh

Gus an iarr am bot dàta bhuat agus feitheamh gus an cuir thu a-steach fiosrachadh sam bith, feumaidh tu suidheachadh làithreach a’ chòmhraidh a chlàradh. Is e an dòigh as fheàrr air seo a dhèanamh a bhith a’ cleachdadh seòrsa de stòr-dàta freumhaichte, leithid SQLite.

An fheadhainn sin. Bidh an loidsig mar a leanas. Is e modh bot a chanas sinn ris, agus bidh am bot ann an sreath ag iarraidh beagan fiosrachaidh bhuainn, agus aig gach ceum bidh e a’ feitheamh ris an fhiosrachadh seo a chuir a-steach agus is urrainn dha sgrùdadh a dhèanamh air.

Sgrìobhaidh sinn am bot as sìmplidh a tha comasach, an toiseach iarraidh e d’ ainm, an uairsin d’ aois, agus sàbhailidh sinn an dàta a fhuaireadh chun stòr-dàta. Nuair a dh’ iarras e aois, nì e cinnteach gur e àireamh a th’ anns an dàta a chaidh a chuir a-steach agus chan e teacsa.

Cha bhi ach trì stàitean ann an còmhradh sìmplidh mar seo:

  1. Is e start staid àbhaisteach a’ bhot, anns nach eil dùil aige ri fiosrachadh sam bith bhuat
  2. wait_name - stàite anns a bheil am bot a 'feitheamh ri ainm a chuir a-steach
  3. Is e wait_age an stàit anns a bheil am bot a’ feitheamh gus an tèid d’ aois a chuir a-steach, an àireamh de bhliadhnaichean slàn.

Pròiseas togail bot

Rè an artaigil, togaidh sinn bot ceum air cheum; faodar am pròiseas gu lèir a dhealbhadh gu sgeamach mar a leanas:
A’ sgrìobhadh bot teileagram ann an R (pàirt 4): A’ togail conaltradh cunbhalach, loidsigeach leis a’ bot

  1. Bidh sinn a’ cruthachadh config bot anns am bi sinn a’ stòradh cuid de shuidheachaidhean. Anns a 'chùis againn, an tòcan bot, agus an t-slighe gu faidhle an stòr-dàta.
  2. Bidh sinn a’ cruthachadh caochladair àrainneachd anns am bi an t-slighe chun phròiseact leis a’ bot air a stòradh.
  3. Bidh sinn a’ cruthachadh an stòr-dàta fhèin, agus grunn ghnìomhan gus an urrainn don bot eadar-obrachadh leis.
  4. Bidh sinn a’ sgrìobhadh dòighean bot, i.e. na gnìomhan a choileanas e.
  5. A' cur sìoltachain teachdaireachd ris. Le cuideachadh bhon a gheibh am bot cothrom air na dòighean riatanach, a rèir staid làithreach a’ chat.
  6. Bidh sinn a’ cur luchd-làimhseachaidh ris a cheanglas òrdughan agus teachdaireachdan leis na dòighean bot riatanach.
  7. Nach cuir sinn am bot air bhog.

Structar pròiseact bot

Airson goireasachd, roinnidh sinn còd ar bot, agus faidhlichean co-cheangailte eile, a-steach don structar a leanas.

  • bot.R - prìomh chòd ar bot
  • db_bot_function.R - bloc de chòd le gnìomhan airson a bhith ag obair leis an stòr-dàta
  • bot_modhan.R - còd dòighean bot
  • teachdaireachd_filters.R - sìoltachain teachdaireachd
  • luchd-làimhseachaidh.R - luchd-làimhseachaidh
  • config.cfg - rèiteachadh bot
  • cruthaich_db_data.sql - Sgriobt SQL airson clàr a chruthachadh le dàta cabadaich san stòr-dàta
  • cruthaich_db_state.sql - Sgriobt SQL airson clàr a chruthachadh den staid cabadaich gnàthach san stòr-dàta
  • bot.db - stòr-dàta bot

Faodaidh tu am pròiseact bot gu lèir fhaicinn, no скачать bho mo stòr air GitHub.

Suidheachadh bot

Cleachdaidh sinn am fear àbhaisteach mar config ini faidhle, an fhoirm a leanas:

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

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

Anns an rèiteachadh bidh sinn a’ sgrìobhadh an tòcan bot agus an t-slighe chun stòr-dàta, i.e. dhan fhaidhle bot.db; cruthaichidh sinn am faidhle fhèin san ath cheum.

Airson botaichean nas iom-fhillte, faodaidh tu configs nas iom-fhillte a chruthachadh, a bharrachd air an sin, chan eil feum air ini config a sgrìobhadh, faodaidh tu cruth sam bith eile a chleachdadh a ’toirt a-steach JSON.

Cruthaich caochladair àrainneachd

Air gach PC, faodar am pasgan leis a’ phròiseact bot a shuidheachadh ann an diofar chlàran agus air diofar dhràibhearan, agus mar sin anns a’ chòd thèid an t-slighe gu pasgan a’ phròiseict a shuidheachadh tro chaochladair àrainneachd TG_BOT_PATH.

Tha grunn dhòighean ann air caochladair àrainneachd a chruthachadh, is e an rud as sìmplidh a sgrìobhadh ann am faidhle .Rinn.

Faodaidh tu am faidhle seo a chruthachadh no a dheasachadh leis an àithne file.edit(path.expand(file.path("~", ".Renviron"))). Cuir an gnìomh e agus cuir aon loidhne ris an fhaidhle:

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

An ath rud sàbhail am faidhle .Rinn agus ath-thòiseachadh RSstudio.

A 'cruthachadh stòr-dàta

Is e an ath cheum stòr-dàta a chruthachadh. Feumaidh sinn 2 chlàr:

  • chat_data - dàta a dh’ iarr am bot bhon neach-cleachdaidh
  • chat_state - staid làithreach a h-uile còmhradh

Faodaidh tu na clàran seo a chruthachadh leis a’ cheist SQL a leanas:

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

Ma luchdaich thu sìos am pròiseact bot bho GitHub, an uairsin gus an stòr-dàta a chruthachadh faodaidh tu an còd a leanas a chleachdadh ann an 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'))

Gnìomhan sgrìobhaidh gus obrachadh leis an stòr-dàta

Tha faidhle rèiteachaidh deiseil againn mu thràth agus stòr-dàta air a chruthachadh. A-nis feumaidh tu gnìomhan a sgrìobhadh gus dàta a leughadh agus a sgrìobhadh chun stòr-dàta seo.

Ma luchdaich thu sìos am pròiseact bho GitHub, an uairsin gheibh thu na gnìomhan anns an fhaidhle db_bot_function.R.

Còd gnìomh airson a bhith ag obair leis an stòr-dàta

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

}

Chruthaich sinn 4 gnìomhan sìmplidh:

  • get_state() - faigh an staid cabadaich gnàthach bhon stòr-dàta
  • set_state() - sgrìobh an suidheachadh cabadaich gnàthach chun stòr-dàta
  • get_chat_data() - faigh dàta a chuir an neach-cleachdaidh a-steach
  • set_chat_data() - clàraich dàta a fhuaireadh bhon neach-cleachdaidh

Tha a h-uile gnìomh gu math sìmplidh, leugh iad dàta bhon stòr-dàta a’ cleachdadh an àithne dbGetQuery(), no tiomnadh UPSERT obrachadh (ag atharrachadh an dàta a th’ ann mar-thà no a’ sgrìobhadh dàta ùr dhan stòr-dàta), a’ cleachdadh a’ ghnìomh dbExecute().

Tha an co-chòrdadh airson gnìomhachd UPSERT mar a leanas:

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

An fheadhainn sin. ann an raon ar bùird chat_id tha cuingealachadh sònraichte aige agus is i prìomh iuchair chlàran. An toiseach, bidh sinn a 'feuchainn ri fiosrachadh a chur ris a' chlàr, agus gheibh sinn mearachd ma tha dàta airson a 'chòmhraidh làithreach an làthair mar-thà, agus mar sin bidh sinn dìreach ag ùrachadh an fhiosrachaidh airson a' chat seo.

An uairsin, cleachdaidh sinn na gnìomhan sin ann an dòighean agus sìoltachain bot.

Modhan bot

Is e an ath cheum ann a bhith a’ togail ar bot dòighean a chruthachadh. Ma luchdaich thu sìos am pròiseact bho GitHub, an uairsin tha a h-uile modh anns an fhaidhle bot_modhan.R.

Còd modh 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')
  }

}

Chruthaich sinn 5 dòighean:

  • tòiseachadh - Tòisich còmhradh
  • stàite - Faigh an staid cabadaich gnàthach
  • ath-shuidheachadh - Ath-shuidhich an staid cabadaich gnàthach
  • enter_name - Bidh am bot ag iarraidh d’ ainm
  • enter_age - Bidh am bot ag iarraidh d’ aois

Modh start ag iarraidh d’ ainm, agus ag atharrachadh an staid cabadaich gu feitheamh_ainm, i.e. gus fuireach airson d’ ainm a chuir a-steach.

An ath rud, cuiridh tu an t-ainm agus thèid a phròiseasadh leis an dòigh enter_name, bidh am bot a’ cur fàilte ort, a’ sgrìobhadh an ainm a fhuaireadh a-steach don stòr-dàta, agus ag atharrachadh a’ chat chun stàite feitheamh_aois.

Aig an ìre seo, tha am bot an dùil gun cuir thu a-steach d’ aois. Bidh thu a’ cur d’ aois, bidh am bot a’ sgrùdadh na teachdaireachd, ma chuir thu beagan teacsa an àite àireamh, canaidh e: Ты ввёл некорректные данные, введи число, agus fuirichidh e riut gus an dàta agad a chuir a-steach a-rithist. Ma chuir thu àireamh, innsidh am bot gu bheil e air gabhail ris an aois agad, sgrìobhaidh e an dàta a fhuaireadh chun stòr-dàta, thoir cunntas air an dàta gu lèir a fhuaireadh bhuat agus tillidh e an suidheachadh cabadaich chun t-suidheachadh tùsail aige, i.e. V start.

Le bhith a 'gairm an dòigh state faodaidh tu an inbhe cabadaich gnàthach iarraidh aig àm sam bith, agus a’ cleachdadh an reset thoir air ais an còmhradh chun staid thùsail aige.

Filters teachdaireachd

Anns a 'chùis againn, is e seo aon de na pàirtean as cudromaiche ann a bhith a' togail bot. Is ann le cuideachadh bho shìoltachain teachdaireachd a thuigeas am bot dè am fiosrachadh a tha e a’ sùileachadh bhuat agus mar a bu chòir a làimhseachadh.

Anns a 'phròiseact air GitHub tha sìoltachain clàraichte san fhaidhle teachdaireachd_filters.R.

Còd sìoltachain teachdaireachd:

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

Ann an sìoltachain bidh sinn a’ cleachdadh a’ ghnìomh a chaidh a sgrìobhadh roimhe seo get_state(), ann an òrdugh a dh'iarraidh staid làithreach a 'chat. Chan fheum an gnìomh seo ach 1 argamaid, id cabadaich.

An ath chriathra feitheamh_ainm pròiseas teachdaireachdan nuair a tha an còmhradh ann an staid wait_name, agus a rèir sin an criathar feitheamh_aois pròiseas teachdaireachdan nuair a tha an còmhradh ann an staid wait_age.

Luchd-làimhseachaidh

Canar am faidhle le luchd-làimhseachaidh luchd-làimhseachaidh.R, agus tha an còd a leanas aige:

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

An toiseach bidh sinn a’ cruthachadh làimhseachadh òrdughan a leigeas leat dòighean a ruith gus còmhradh a thòiseachadh, ath-shuidheachadh, agus ceasnachadh an staid làithreach.

An uairsin, bidh sinn a’ cruthachadh 2 làimhseachadh teachdaireachd a’ cleachdadh na sìoltachain a chaidh a chruthachadh sa cheum roimhe, agus a’ cur sìoltachan riutha !MessageFilters$command, gus an urrainn dhuinn òrdughan a chleachdadh ann an staid cabadaich sam bith.

Còd cur air bhog bot

A-nis gu bheil a h-uile dad deiseil againn airson a chuir air bhog, tha am prìomh chòd airson am bot a chuir air bhog san fhaidhle 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()

Mar thoradh air an sin, fhuair sinn am bot seo:
A’ sgrìobhadh bot teileagram ann an R (pàirt 4): A’ togail conaltradh cunbhalach, loidsigeach leis a’ bot

Aig àm sam bith a 'cleachdadh an àithne /state faodaidh sinn ceist a chur air an t-suidheachadh cabadaich làithreach, agus a 'cleachdadh an àithne /reset till an còmhradh chun staid thùsail aige agus tòisich a’ chòmhradh a-rithist.

co-dhùnadh

San artaigil seo, dh’ obraich sinn a-mach mar a chleachdas tu stòr-dàta taobh a-staigh bot, agus mar a thogas tu còmhraidhean loidsigeach sreath le bhith a’ clàradh an staid cabadaich.

Anns a 'chùis seo, thug sinn sùil air an eisimpleir as prìomhadail, gus am biodh e na b' fhasa dhut a 'bheachd a bhith a' togail a leithid de bhotan a thuigsinn; ann an cleachdadh, faodaidh tu còmhraidhean fada nas iom-fhillte a thogail.

Anns an ath artaigil san t-sreath seo, ionnsaichidh sinn mar a chuireas sinn casg air còraichean luchd-cleachdaidh bot gus diofar dhòighean a chleachdadh.

Source: www.habr.com

Cuir beachd ann