Hallo-Omeletik , irgendwie hatte ich kürzlich die Idee, einen Telegramm-Bot in Ruby zu einem bestimmten Thema zu schreiben. Kurz gesagt, dieser Bot sollte Online-Chats durch Unterhaltungsereignisse auslösen , die von demselben Bot zu einem zufälligen Zeitpunkt mit einem zufälligen Kontext in den Chat geworfen wurden.
Und während ich diesen Bot schrieb, lernte ich die Telegramm-Bot-Ruby-Bibliothek (Gem) kennen, lernte sie zusammen mit dem Gem 'sqlite3-Ruby' zu verwenden und war außerdem von vielen Funktionen der Telegramm-Bots durchdrungen, die ich mit den lieben Lesern dieses Forums teilen möchte. sozusagen dazu beitragen.
Viele Leute wollen Telegramm-Bots schreiben, weil es Spaß macht und einfach ist.
Zum Zeitpunkt des Schreibens meines Bots war ich mit der Tatsache konfrontiert, dass es schwierig war, gutes Material auf dem Ruby-Bot für Telegramm zu finden. Mit gut meine ich eine, die über elegante und schöne Funktionen berichtet, wie sie in der Telegramm-API enthalten sind.
Sofort werfe ich einen Link zu meinem Repository für diesen Beitrag: hier ,
denn während des Testens gab es Fehler, die ich hier nicht übertragen konnte, warum plötzlich direkt in das Repository schauen.
Als Ergebnis des Lesens dieses Themas hoffe ich, dass der Leser seinen bereits geschriebenen Bot verbessern oder jetzt Ruby, Telegram herunterladen und etwas Neues und Schönes erstellen kann. Immerhin, wie bereits in der "Erklärung des Cyberspace" angegeben:
In unserer Welt kann alles, was der menschliche Geist erschaffen kann, ohne Kosten auf unbestimmte Zeit reproduziert und verbreitet werden. Ihre Fabriken werden für die globale Gedankenübertragung nicht mehr benötigt.
Ich schlage vor zu beginnen:
Meine Ruby-Version ist 2.7.2, aber es ist möglich, dass alles mit früheren / späteren Versionen funktioniert.
Die ungefähre Struktur der Anwendung sieht folgendermaßen aus
Der erste Schritt besteht darin, eine Gem-Datei zu erstellen - den Hauptabhängigkeitsinhaber für Edelsteine von Drittanbietern in Ruby.
Datei der Gemfile :
source 'https://rubygems.org' gem 'json' gem 'net-http-persistent', '~> 2.9' gem 'sqlite3'#gem gem 'telegram-bot-ruby'# Telegram
Wir speichern die Datei und führen den Vorgang im Terminal durch
bundle install
( Ruby) Gemfile .
( ) GitHub’a, .gitignore , JetBrains :
.gitignore:
/.idea/
, , FishSocket:
-
require 'telegram/bot' require './library/mac-shake' require './library/database' require './modules/listener' require './modules/security' require './modules/standart_messages' require './modules/response' Entry point class class FishSocket include Database def initialize super # Initialize BD Database.setup # Establishing webhook via @gem telegram/bot, using API-KEY Telegram::Bot::Client.run(TelegramOrientedInfo::APIKEY) do |bot| # Start time variable, for exclude message what was sends before bot starts startbottime = Time.now.toi # Active socket listener bot.listen do |message| # Processing the new income message #if that message sent after bot run. Listener.catchnewmessage(message,bot) if Listener::Security.messageisnew(startbottime,message) end end end end Bot start FishSocket.new
5 :Gem telegram/bot, mac-shake, listener, security, database.
:
-
# frozenstringliteral: true module TelegramOrientedInfo APIKEY = '' end
API-KEY , , Telegram API : @BotFather
API-Key , API-Key, .
-
class FishSocket module Listener # Module for checks module Security def messageisnew(starttime, message) messagetime = (defined? message.date) ? message.date : message.message.date messagetime.toi > starttime end def message_too_far message_date = (defined? Listener.message.date) ? Listener.message.date : Listener.message.message.date message_delay = Time.now.to_i - message_date.to_i # if message delay less then 5 min then processing message, else ignore message_delay > (5 * 60) end module_function :message_is_new, :message_too_far end end end
: , ( ). , 5 ( , )
-
class FishSocket # Sorting new message module module Listener attr_accessor :message, :bot def catch_new_message(message,bot) self.message = message self.bot = bot return false if Security.message_too_far case self.message when Telegram::Bot::Types::CallbackQuery CallbackMessages.process when Telegram::Bot::Types::Message StandartMessages.process end end module_function( :catch_new_message, :message, :message=, :bot, :bot= ) end end
, callback , . callback . Telegram API 2.0 InlineMessages. , UI , InlineKeyboardMarkup , , CallbackMessage, , , Telegram API. .
-
# This module assigned to all database operations module Database attr_accessor :db require 'sqlite3' # This module assigned to create table action module Create def steamaccountlist Database.db.execute <<-SQL CREATE TABLE steamaccountlist ( accesses VARCHAR (128), used INTEGER (1)) SQL true rescue SQLite3::SQLException false end modulefunction( :steamaccount_list ) end def setup # Initializing database file self.db = SQLite3::Database.open 'autosteam.db' # Try to get custom table, if table not exists - create this one unless gettable('steamaccountlist') Create.steamaccount_list end end # Get all from the selected table # @var tablename def gettable(tablename) db.execute <<-SQL Select * from #{tablename} SQL rescue SQLite3::SQLException false end modulefunction( :gettable, :setup, :db, :db= ) end
/ .
, fishsocket.rb , , Active Socket Telegram API. - Webhook Telegram API, .
-
standartmessages.rb, () . : Standart Callback.
class FishSocket module Listener # This module assigned to processing all standart messages module StandartMessages def process case Listener.message.text when '/getaccount' Response.stdmessage 'Very sorry, ' else Response.stdmessage ' , ' end end module_function( :process ) end end end
/getaccount, , .
, Response,
class FishSocket module Listener # This module assigned to responses from bot module Response def stdmessage(message, chatid = false ) chat = (defined?Listener.message.chat.id) ? Listener.message.chat.id : Listener.message.message.chat.id chat = chatid if chatid Listener.bot.api.sendmessage( parsemode: 'html', chatid: chat, text: message ) end module_function( :std_message ) end end end
API Telegrama , gem telegram-ruby, api.sendmessage. Telegram API , .
: ( BotFather, API .
/getaccount
.
Inline , , Inline .
assets/ inlinebutton. inlinebutton.rb :
class FishSocket # This module assigned to creating InlineKeyboardButton module InlineButton GETACCOUNT = Telegram::Bot::Types::InlineKeyboardButton.new(text: ' account', callbackdata: 'getaccount') end end
telegram-ruby-gem InlineKeyboardButton.
Reponse :
def inlinemessage(message, inlinemarkup,editless = false, chatid = false) chat = (defined?Listener.message.chat.id) ? Listener.message.chat.id : Listener.message.message.chat.id chat = chatid if chatid Listener.bot.api.sendmessage( chatid: chat, parsemode: 'html', text: message, replymarkup: inlinemarkup) end def generateinlinemarkup(kb, force = false) Telegram::Bot::Types::InlineKeyboardMarkup.new( inlinekeyboard: kb ) end
modulefunction() :
modulefunction( :stdmessage, :generateinlinemarkup, :inlinemessage )
/start
, , StandartMessages
def process case Listener.message.text when '/getaccount' Response.stdmessage 'Very sorry, ' when '/start' Response.inlinemessage ', ', Response::generateinlinemarkup( InlineButton::GETACCOUNT ) else Response.stdmessage ' , ' end end
callbackmessages.rb Callback : callbackmessages.rb
class FishSocket module Listener # This module assigned to processing all callback messages module CallbackMessages attraccessor :callback_message def process self.callback_message = Listener.message.message case Listener.message.data when 'get_account' Listener::Response.std_message(' ') end end module_function( :process, :callback_message, :callback_message= ) end end end
StandartMessages , Telegram , - .
, . fishsocket.rb
require 'telegram/bot' require './library/mac-shake' require './library/database' require './modules/listener' require './modules/security' require './modules/standartmessages' require './modules/response' require './modules/callbackmessages' require './modules/assets/inlinebutton' Entry point class class FishSocket include Database def initialize super
/start
- .
, - 2 ForceReply , EditInlineMessage
ForceReply, Response
def forcereplymessage(text, chatid = false) chat = (defined?Listener.message.chat.id) ? Listener.message.chat.id : Listener.message.message.chat.id chat = chatid if chatid Listener.bot.api.sendmessage( parsemode: 'html', chatid: chat, text: text, replymarkup: Telegram::Bot::Types::ForceReply.new( forcereply: true, selective: true ) ) end
modulefunction - .
( , )
:
module InlineButton GETACCOUNT = Telegram::Bot::Types::InlineKeyboardButton.new(text: ' account', callbackdata: 'getaccount') HAVEPROMO = Telegram::Bot::Types::InlineKeyboardButton.new(text: ' ?', callbackdata: 'forcepromo') end
/start
StandartMessages
when '/start' Response.inlinemessage ', ', Response::generateinlinemarkup( [ InlineButton::GETACCOUNT, InlineButton::HAVEPROMO ] )
, .
, ForceReply: CallbackMessages
def process self.callbackmessage = Listener.message.message case Listener.message.data when 'getaccount' Listener::Response.stdmessage(' ') when 'forcepromo' Listener::Response.forcereplymessage(' ') end end
,
ForceReply, : (Reply) , . .
" ." , StandartMessages : StandartMessages
def process case Listener.message.text when '/getaccount' Response.stdmessage 'Very sorry, ' when '/start' Response.inlinemessage ', ', Response::generateinlinemarkup( [ InlineButton::GETACCOUNT, InlineButton::HAVEPROMO ] ) else unless Listener.message.replytomessage.nil? case Listener.message.replytomessage.text when / / return Listener::Response.std_message ' , :' if Promos::validate Listener.message.text return Listener::Response.std_message ' ' end end Response.std_message ' , ' end end
-
class FishSocket module Listener # This module assigned to processing all promo-codes module Promos def validate(code) return true if code =~ /^1[a-zA-Z]*0$/ false end module_function( :validate ) end end end
. FishSocket : FishSocket
require 'telegram/bot' require './library/mac-shake' require './library/database' require './modules/listener' require './modules/security' require './modules/standartmessages' require './modules/response' require './modules/callbackmessages' require './modules/assets/inline_button' require './modules/promos' Entry point class class FishSocket include Database def initialize
, :
, : InlineMessages:
"",
/start
" ?" InlineButton
module InlineButton GETACCOUNT = Telegram::Bot::Types::InlineKeyboardButton.new(text: ' account', callbackdata: 'getaccount') HAVEPROMO = Telegram::Bot::Types::InlineKeyboardButton.new(text: ' ?', callbackdata: 'forcepromo') ADDITIONMENU = Telegram::Bot::Types::InlineKeyboardButton.new(text: '', callbackdata: 'advancedmenu') end
StandartMessages
when '/start' Response.inlinemessage ', ', Response::generateinlinemarkup( [ InlineButton::GETACCOUNT, InlineButton::ADDITIONMENU ] )
allbackMessages: CallbackMessages
def process self.callbackmessage = Listener.message.message case Listener.message.data when 'getaccount' Listener::Response.stdmessage(' ') when 'forcepromo' Listener::Response.forcereply¨C222Cmenu' Listener::Response.inline¨C223Cinline¨C224CButton::HAVE¨C225Cmessage
Response, inlinemessage Response
def inlinemessage(message, inlinemarkup, editless = false, chatid = false) chat = (defined?Listener.message.chat.id) ? Listener.message.chat.id : Listener.message.message.chat.id chat = chatid if chatid if editless return Listener.bot.api.editmessagetext( chatid: chat, parsemode: 'html', messageid: Listener.message.message.messageid, text: message, replymarkup: inlinemarkup ) end Listener.bot.api.sendmessage( chatid: chat, parsemode: 'html', text: message, replymarkup: inline_markup ) end
? - , , , - , , , .
, :
, , ReplyKeyboard.
:
.
Nachwort: Viele Dinge wurden hier nicht angesprochen, aber schließlich gibt es Hände und Dokumentation für alles, für mich persönlich gab es auf GitHub nicht genug Beschreibung. Ich glaube, dass in unserer Zeit jeder ein Botman werden kann, und jetzt weiß diese Person, was zu tun ist. Frieden für alle.