په R کې د ټیلیګرام بوټ لیکل (4 برخه): د بوټ سره یو ثابت، منطقي ډیالوګ رامینځته کول

که تاسو پخوانۍ لوستلی وي درې مقالې د دې لړۍ څخه، بیا تاسو دمخه پوهیږئ چې څنګه د کیبورډ سره د بشپړ ټیلیګرام بوټو لیکلو څرنګوالی.

پدې مقاله کې ، موږ به زده کړو چې څنګه یو بوټ ولیکئ چې دوامداره خبرې اترې وساتي. هغوی. بوټ به تاسو څخه پوښتنې وکړي او تاسو ته به انتظار وکړي چې ځینې معلومات داخل کړئ. د هغه معلوماتو پورې اړه لري چې تاسو یې داخل کړئ، بوټ به ځینې کړنې ترسره کړي.

همدارنګه پدې مقاله کې به موږ زده کړو چې څنګه د بوټ د هود لاندې ډیټابیس وکاروو ، زموږ په مثال کې به دا SQLite وي ، مګر تاسو کولی شئ کوم بل DBMS وکاروئ. ما په R ژبه کې د ډیټابیسونو سره د متقابل عمل په اړه په ډیر تفصیل سره لیکلي دا مقاله.

په R کې د ټیلیګرام بوټ لیکل (4 برخه): د بوټ سره یو ثابت، منطقي ډیالوګ رامینځته کول

د لړۍ ټولې مقالې "په R کې د ټیلیګرام بوټ لیکل"

  1. موږ یو بوټ جوړوو او په ټیلیګرام کې د پیغامونو لیږلو لپاره یې کاروو
  2. بوټ ته د کمانډ ملاتړ او پیغام فلټرونه اضافه کړئ
  3. په بوټ کې د کیبورډ ملاتړ اضافه کولو څرنګوالی
  4. د بوټ سره دوامداره، منطقي خبرو اترو جوړول

منځپانګې

که تاسو د معلوماتو تحلیل سره علاقه لرئ ، تاسو ممکن زما سره علاقه ولرئ telegram и یوتیوب چینلونه ډیری مینځپانګه د R ژبې ته وقف شوې ده.

  1. پېژندنه
  2. د بوټ جوړولو پروسه
  3. د بوټ پروژې جوړښت
  4. د بوټ ترتیب
  5. د چاپیریال متغیر جوړ کړئ
  6. د ډیټابیس جوړول
  7. د ډیټابیس سره کار کولو لپاره د لیکلو افعال
  8. د بوټو میتودونه
  9. د پیغام فلټرونه
  10. سمبالونکي
  11. د بوټ لانچ کوډ
  12. پایلې

پېژندنه

د دې لپاره چې بوټ له تاسو څخه د معلوماتو غوښتنه وکړي او تاسو ته انتظار وکړئ چې کوم معلومات داخل کړئ، تاسو اړتیا لرئ د خبرو اترو اوسنی حالت ثبت کړئ. د دې کولو غوره لاره دا ده چې یو ډول ایمبیډ شوي ډیټابیس وکاروئ ، لکه SQLite.

هغوی. منطق به په لاندې ډول وي. موږ د بوټ میتود ته زنګ وهو، او بوټ په ترتیب سره زموږ څخه ځینې معلومات غوښتنه کوي، او په هر ګام کې دا د دې معلوماتو د ننوتلو انتظار کوي او کولی شي دا وګوري.

موږ به ترټولو ساده ممکن بوټ ولیکئ، لومړی به ستاسو نوم، بیا ستاسو عمر، او ترلاسه شوي معلومات به ډیټابیس ته خوندي کړي. کله چې د عمر غوښتنه وکړئ، دا به وګوري چې داخل شوي معلومات یو شمیر دی او متن نه دی.

دا ډول ساده خبرې اترې به یوازې درې حالتونه ولري:

  1. پیل د بوټ عادي حالت دی، په کوم کې چې دا ستاسو څخه د کوم معلوماتو تمه نلري
  2. انتظار_نوم - هغه حالت چې بوټ د نوم داخلیدو ته انتظار باسي
  3. wait_age هغه حالت دی چیرې چې بوټ ستاسو د عمر داخلیدو ته انتظار باسي ، د بشپړو کلونو شمیر.

د بوټ جوړولو پروسه

د مقالې په جریان کې، موږ به ګام په ګام یو بوټ جوړ کړو؛ ټوله پروسه په سکیمیک ډول په لاندې ډول ښودل کیدی شي:
په R کې د ټیلیګرام بوټ لیکل (4 برخه): د بوټ سره یو ثابت، منطقي ډیالوګ رامینځته کول

  1. موږ د بوټ ترتیب جوړوو په کوم کې چې موږ به ځینې ترتیبات ذخیره کړو. زموږ په قضیه کې، د بوټ نښه، او د ډیټابیس فایل ته لاره.
  2. موږ د چاپیریال متغیر رامینځته کوو په کوم کې چې د بوټ سره پروژې ته لاره به زیرمه شي.
  3. موږ پخپله ډیټابیس رامینځته کوو ، او یو شمیر دندې ترڅو بوټ وکولی شي ورسره اړیکه ونیسي.
  4. موږ د بوټو میتودونه لیکو، د بیلګې په توګه هغه دندې چې دا به یې ترسره کړي.
  5. د پیغام فلټرونه اضافه کول. د دې په مرسته چې بوټ به اړین میتودونو ته لاسرسی ومومي ، د چیټ اوسني حالت پورې اړه لري.
  6. موږ هینډلرونه اضافه کوو چې کمانډونه او پیغامونه به د اړین بوټو میتودونو سره وصل کړي.
  7. راځئ چې بوټ پیل کړو.

د بوټ پروژې جوړښت

د اسانتیا لپاره، موږ به زموږ د بوټ کوډ، او نور اړوند فایلونه په لاندې جوړښت کې وویشو.

  • bot.R - زموږ د بوټ اصلي کوډ
  • db_bot_function.R - د ډیټابیس سره کار کولو لپاره د دندو سره د کوډ بلاک
  • bot_methods.R - د بوټو میتودونو کوډ
  • پیغام_فلټرونه.R - د پیغام فلټرونه
  • سمبالونکي.R - سمبالونکي
  • config.cfg - د بوټ ترتیب
  • create_db_data.sql - په ډیټابیس کې د چیٹ ډیټا سره د میز رامینځته کولو لپاره SQL سکریپټ
  • create_db_state.sql - په ډیټابیس کې د اوسني چیٹ حالت جدول رامینځته کولو لپاره SQL سکریپټ
  • bot.db - د بوټ ډیټابیس

تاسو کولی شئ د بوټ ټوله پروژه وګورئ، یا скачать زما څخه په GitHub کې ذخیره.

د بوټ ترتیب

موږ به معمول یو د ترتیب په توګه وکاروو ini فایللاندې فورمه:

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

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

په ترتیب کې موږ د بوټ نښه لیکو او ډیټابیس ته لاره، د بیلګې په توګه. د bot.db فایل ته؛ موږ به په راتلونکي مرحله کې پخپله فایل جوړ کړو.

د ډیرو پیچلو بوټو لپاره، تاسو کولی شئ ډیر پیچلي تشکیلات جوړ کړئ، سربیره پردې، دا اړینه نده چې د ini config ولیکئ، تاسو کولی شئ د JSON په شمول کوم بل شکل وکاروئ.

د چاپیریال متغیر جوړ کړئ

په هر کمپیوټر کې ، د بوټ پروژې فولډر په مختلف لارښودونو او مختلف ډرایو کې موقعیت کیدی شي ، نو په کوډ کې به د پروژې فولډر ته لاره د چاپیریال متغیر له لارې تنظیم شي. TG_BOT_PATH.

د چاپیریال متغیر رامینځته کولو لپاره ډیری لارې شتون لري ، ترټولو ساده یې په فایل کې لیکل دي .رینویرون.

تاسو کولی شئ دا فایل د کمانډ په کارولو سره جوړ یا ترمیم کړئ file.edit(path.expand(file.path("~", ".Renviron"))). دا اجرا کړئ او فایل ته یوه کرښه اضافه کړئ:

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

بیا فایل خوندي کړئ .رینویرون او RStudio بیا پیل کړئ.

د ډیټابیس جوړول

بل ګام د ډیټابیس رامینځته کول دي. موږ به 2 میزونو ته اړتیا ولرو:

  • chat_data - هغه معلومات چې بوټ د کارونکي څخه غوښتنه کړې
  • chat_state - د ټولو چیټونو اوسنی حالت

تاسو کولی شئ دا میزونه د لاندې 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
);

که تاسو د بوټ پروژه له دې څخه ډاونلوډ کړې GitHub، بیا د ډیټابیس جوړولو لپاره تاسو کولی شئ لاندې کوډ په 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'))

د ډیټابیس سره کار کولو لپاره د لیکلو افعال

موږ دمخه د ترتیب کولو فایل چمتو کړی او یو ډیټابیس جوړ شوی. اوس تاسو دې ډیټابیس ته د معلوماتو لوستلو او لیکلو لپاره فنکشن لیکلو ته اړتیا لرئ.

که تاسو پروژه له دې څخه ډاونلوډ کړئ GitHub، بیا تاسو کولی شئ په فایل کې افعال ومومئ db_bot_function.R.

د ډیټابیس سره کار کولو لپاره د فعالیت کوډ

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

}

موږ 4 ساده افعال جوړ کړل:

  • get_state() - د ډیټابیس څخه د چیٹ اوسنی حالت ترلاسه کړئ
  • set_state() - ډیټابیس ته د چیټ اوسنی حالت ولیکئ
  • get_chat_data() - د کارونکي لخوا لیږل شوي معلومات ترلاسه کړئ
  • set_chat_data() - د کارونکي څخه ترلاسه شوي معلومات ثبت کړئ

ټولې دندې خورا ساده دي، دوی یا د کمانډ په کارولو سره د ډیټابیس څخه ډاټا لوستل کوي dbGetQuery()، یا ژمنه UPSERT عملیات (د موجوده ډیټا بدلول یا ډیټابیس ته نوي ډیټا لیکل) ، د فنکشن په کارولو سره dbExecute().

د UPSERT عملیاتو لپاره ترکیب په لاندې ډول دی:

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

هغوی. زموږ د میزونو په ډګر کې chat_id د انفرادیت محدودیت لري او د جدولونو لومړنۍ کلیدي ده. په پیل کې، موږ هڅه کوو چې په میز کې معلومات اضافه کړو، او موږ یوه تېروتنه ترلاسه کوو که چیرې د اوسني چیٹ لپاره معلومات لا دمخه شتون ولري، په دې حالت کې موږ په ساده ډول د دې چیٹ لپاره معلومات تازه کوو.

بیا، موږ به دا دندې د بوټو میتودونو او فلټرونو کې وکاروو.

د بوټو میتودونه

زموږ د بوټ په جوړولو کې بل ګام د میتودونو رامینځته کول دي. که تاسو پروژه له دې څخه ډاونلوډ کړئ GitHub، بیا ټول میتودونه په فایل کې دي bot_methods.R.

د بوټ میتود کوډ

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

}

موږ پنځه میتودونه جوړ کړل:

  • پیل - یو ډیالوګ پیل کړئ
  • حالت - د چیٹ اوسنی حالت ترلاسه کړئ
  • بیا تنظیم کول - د چیٹ اوسنی حالت بیا تنظیم کړئ
  • enter_name - بوټ ستاسو نوم غوښتنه کوي
  • enter_age - بوټ ستاسو د عمر غوښتنه کوي

میتود start ستاسو د نوم غوښتنه کوي، او د چیٹ حالت بدلوي انتظار_نوم, i.e. د خپل نوم د داخلولو لپاره ولاړ شئ.

بیا، تاسو نوم لیږئ او دا د میتود لخوا پروسس کیږي enter_name، بوټ تاسو ته ښه راغلاست وايي ، ترلاسه شوی نوم په ډیټابیس کې لیکي ، او چیټ دولت ته بدلوي انتظار_عمر.

پدې مرحله کې، بوټ تمه لري چې تاسو خپل عمر ته ننوځي. تاسو خپل عمر واستوئ، بوټ پیغام چیک کوي، که تاسو د شمیرې پرځای یو څه متن واستوئ، دا به ووایي: Ты ввёл некорректные данные, введи число، او ستاسو د معلوماتو بیا ننوتلو ته به انتظار وباسي. که تاسو یو شمیره واستوئ، بوټ به راپور ورکړي چې دا ستاسو عمر منلی دی، ترلاسه شوي ډاټا ډیټابیس ته ولیکئ، ستاسو څخه ترلاسه شوي ټول معلومات راپور کړئ او د چیٹ حالت بیرته خپل اصلي حالت ته راولي، د بیلګې په توګه. وی start.

د طريقه په بلنه state تاسو کولی شئ په هر وخت کې د اوسني چیٹ حالت غوښتنه وکړئ، او د کارولو څخه reset چیټ خپل اصلي حالت ته راستانه کړئ.

د پیغام فلټرونه

زموږ په قضیه کې ، دا د بوټ جوړولو کې یو له خورا مهم برخو څخه دی. دا د پیغام فلټرونو په مرسته ده چې بوټ به پوه شي چې کوم معلومات ستاسو څخه تمه لري او څنګه باید پروسس شي.

په پروژه کې GitHub فلټرونه په فایل کې ثبت شوي دي پیغام_فلټرونه.R.

د پیغام فلټر کوډ:

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

په فلټرونو کې موږ مخکې لیکل شوي فنکشن کاروو get_state()د چیټ د اوسني حالت غوښتنه کولو لپاره. دا فنکشن یوازې 1 دلیل ته اړتیا لري، چیټ ID.

بل فلټر انتظار_نوم پیغامونه پروسس کوي کله چې چیټ په حالت کې وي wait_name، او د دې مطابق فلټر انتظار_عمر پیغامونه پروسس کوي کله چې چیټ په حالت کې وي wait_age.

سمبالونکي

د لاس لرونکی فایل بلل کیږي سمبالونکي.R، او لاندې کوډ لري:

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

لومړی موږ د کمانډ هینډلرونه رامینځته کوو چې تاسو ته به اجازه درکړي د ډیالوګ پیل کولو لپاره میتودونه پرمخ بوځي ، بیا یې تنظیم کړئ ، او اوسني حالت پوښتنه وکړئ.

بیا، موږ په تیرو مرحلو کې رامینځته شوي فلټرونو په کارولو سره د 2 پیغام اداره کونکي رامینځته کوو ، او دوی ته فلټر اضافه کوو !MessageFilters$command، نو موږ کولی شو په هر چیټ حالت کې کمانډونه وکاروو.

د بوټ لانچ کوډ

اوس موږ هر څه د پیل کولو لپاره چمتو یو، د بوټ لانچ کولو اصلي کوډ په فایل کې دی 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()

د پایلې په توګه، موږ دا بوټ ترلاسه کړ:
په R کې د ټیلیګرام بوټ لیکل (4 برخه): د بوټ سره یو ثابت، منطقي ډیالوګ رامینځته کول

په هر وخت کې د قوماندې په کارولو سره /state موږ کولی شو د اوسني چیٹ حالت پوښتنه وکړو، او د کمانډ په کارولو سره /reset چیټ خپل اصلي حالت ته راستانه کړئ او بیا ډیالوګ پیل کړئ.

پایلې

پدې مقاله کې ، موږ معلومه کړه چې څنګه د بوټ دننه ډیټابیس وکاروو ، او د چیټ حالت ثبتولو سره د ترتیب منطقي ډیالوګونو رامینځته کولو څرنګوالی.

په دې حالت کې، موږ خورا ابتدايي مثال ته کتنه وکړه، نو دا به ستاسو لپاره اسانه وي چې د داسې بوټونو د جوړولو مفکوره پوه شي؛ په عمل کې، تاسو کولی شئ ډیر پیچلي ډیالوګونه جوړ کړئ.

د دې لړۍ په راتلونکي مقاله کې به موږ زده کړو چې څنګه د بوټو کاروونکو حقونه محدود کړو ترڅو د دې مختلف میتودونه وکاروي.

سرچینه: www.habr.com

Add a comment