{"id":315785,"date":"2020-12-30T03:00:52","date_gmt":"2020-12-30T03:00:52","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=315785"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=315785","title":{"rendered":"\u041f\u043e\u0448\u0430\u0433\u043e\u0432\u044b\u0439 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b \u043f\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e Telegram \u0431\u043e\u0442\u0430 \u043d\u0430 Ruby (native)"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p><strong>\u041f\u0440\u0438\u0432\u0435\u0442\u0438\u043a\u0438-\u043e\u043c\u043b\u0435\u0442\u0438\u043a\u0438<\/strong>, \u043a\u0430\u043a-\u0442\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0438\u0434\u0435\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c Telegram \u0431\u043e\u0442\u0430 \u043d\u0430&nbsp;<strong>Ruby<\/strong>&nbsp;\u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0443, \u0432 \u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u0432\u0430\u0445 \u044d\u0442\u043e\u0442 \u0431\u043e\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c \u043e\u043d\u043b\u0430\u0439\u043d \u0447\u0430\u0442\u0430\u0445 \u043f\u043e \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u0440\u0430\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044d\u0442\u0438\u043c \u0436\u0435 \u0431\u043e\u0442\u043e\u043c \u0432\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u0432 \u0447\u0430\u0442 \u0432 \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0441 \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c.<\/p>\n<p>\u0418 \u0432\u043e\u0442 \u043f\u043e\u043a\u0430 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0441\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u0431\u043e\u0442\u0430 \u0442\u043e \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0441\u044f \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 (gem) telegram-bot-ruby, \u043d\u0430\u0443\u0447\u0438\u043b\u0441\u044f \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 gem &#8216;sqlite3-ruby\u2019 \u0438 \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u043f\u0440\u043e\u043d\u0438\u043a\u0441\u044f \u043c\u043d\u043e\u0433\u0438\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 Telegram \u0431\u043e\u0442\u043e\u0432 \u0447\u0435\u043c \u0438 \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u0441\u044f \u0441 \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u043c\u0438 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u044d\u0442\u043e\u0433\u043e \u0444\u043e\u0440\u0443\u043c\u0430, \u0432\u043d\u0435\u0441\u0442\u0438 \u0432\u043a\u043b\u0430\u0434 \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c.<\/p>\n<p>\u041c\u043d\u043e\u0433\u043e \u043b\u044e\u0434\u0435\u0439 \u0445\u043e\u0447\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c Telegram \u0431\u043e\u0442\u044b, \u0432\u0435\u0434\u044c \u044d\u0442\u043e \u0432\u0435\u0441\u0435\u043b\u043e \u0438 \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<p>\u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0431\u043e\u0442\u0430 \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u0442\u0435\u043c \u0447\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0430\u0439\u0442\u0438 \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043d\u0430 \u0442\u0435\u043c\u0443 Ruby \u0431\u043e\u0442\u0430 \u0434\u043b\u044f Telegram. \u041f\u043e\u0434 \u0445\u043e\u0440\u043e\u0448\u0438\u043c \u044f \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u044e \u0442\u0430\u043a\u043e\u0439, \u0433\u0434\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0438\u0437\u044f\u0449\u043d\u044b\u0435 \u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439, \u0442\u0430\u043a\u043e\u0439, \u043a\u0430\u043a\u043e\u0439 \u043e\u043d \u0435\u0441\u0442\u044c \u0432 Telegram API.<\/p>\n<p>\u0421\u0440\u0430\u0437\u0443 \u043a\u0438\u0434\u0430\u044e \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u0432\u043e\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u0442\u0443:&nbsp;<a href=\"https:\/\/github.com\/sorshireality\/sorshireality-ruby-teleram-bot-native\" rel=\"noopener noreferrer nofollow\">here<\/a>,<br \/>\u0418\u0431\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u0431\u0430\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043c\u043e\u0433 \u0441\u044e\u0434\u0430 \u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438, \u0432\u0434\u0440\u0443\u0433 \u0447\u0435\u0433\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439.<\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u043e\u043f\u0438\u043a\u0430, \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0441\u043c\u043e\u0436\u0435\u0442 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0441\u0432\u043e\u0435\u0433\u043e \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e\u0433\u043e \u0431\u043e\u0442\u0430, \u0438\u043b\u0438 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u043a\u0430\u0447\u0430\u0442\u044c Ruby, Telegram \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435 \u0438 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e\u0435. \u0412\u0435\u0434\u044c \u043a\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u00ab\u0414\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0438 \u041a\u0438\u0431\u0435\u0440\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430\u00bb:<\/p>\n<blockquote>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0436\u0435 \u043c\u0438\u0440\u0435 \u0432\u0441\u0435, \u0447\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u0439 \u0443\u043c, \u043c\u043e\u0436\u0435\u0442 \u0440\u0435\u043f\u0440\u043e\u0434\u0443\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0434\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438 \u0431\u0435\u0437\u043e \u0432\u0441\u044f\u043a\u043e\u0439 \u043f\u043b\u0430\u0442\u044b. \u0414\u043b\u044f \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043c\u044b\u0441\u043b\u0438 \u0432\u0430\u0448\u0438 \u0437\u0430\u0432\u043e\u0434\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f.<\/p>\n<\/blockquote>\n<ul>\n<li>\n<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043d\u0430\u0447\u0430\u0442\u044c :<\/p>\n<p>\u0423 \u043c\u0435\u043d\u044f \u0432\u0435\u0440\u0441\u0438\u044f Ruby &#8212; 2.7.2, \u043d\u043e \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0447\u0442\u043e \u0432\u0441\u0451 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0441 \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u043d\u043d\u0438\u043c\u0438\/\u043f\u043e\u0437\u0434\u043d\u0438\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438.<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6ab\/1c1\/6bb\/6ab1c16bb25f6ea5bcbc3fffdac7639f\" width=\"712\" height=\"678\"><figcaption><\/figcaption><\/figure>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c Gemfile &#8212; \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 gem\u2019s \u0432 Ruby.<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0424\u0430\u0439\u043b&nbsp;<strong>Gemfile<\/strong>:<\/p>\n<pre><code>source 'https:\/\/rubygems.org' gem 'json' gem 'net-http-persistent', '~&gt; 2.9' gem 'sqlite3'#gem \u0434\u043b\u044f \u0411\u0414 gem 'telegram-bot-ruby'#\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0433\u0435\u043c \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0435\u043d\u0435\u043d\u0438\u044f \u0441 Telegram \u0431\u043e\u0442\u043e\u043c <\/code><\/pre>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0444\u0430\u0439\u043b \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e<\/p>\n<pre><code>bundle install<\/code><\/pre>\n<p>\u0423\u0432\u0438\u0434\u0438\u043c \u0443\u0441\u043f\u0435\u0448\u043d\u0443\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0432\u0441\u0435\u0445 \u0433\u0435\u043c\u043e\u0432 (\u043d\u0443 \u044d\u0442\u043e \u0436\u0435 \u043f\u0440\u0435\u043b\u0435\u0441\u0442\u044c Ruby) \u0438 \u043d\u0430 \u044d\u0442\u043e\u043c \u0441&nbsp;<strong>Gemfile<\/strong>&nbsp;\u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u043e\u043d\u0447\u0435\u043d\u043e.<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b (\u043a\u0430\u043a \u0438 \u044f) \u043b\u0430\u0431\u043e\u0440\u0430\u0442\u043e\u0440\u043d\u0430\u044f \u043a\u0440\u044b\u0441\u0430 GitHub\u2019a, \u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u043c .<strong>gitignore<\/strong>&nbsp;\u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u0443 \u043c\u0435\u043d\u044f \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 JetBrains \u0444\u0430\u0439\u043b:<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0424\u0430\u0439\u043b .<strong>gitignore<\/strong>:<\/p>\n<pre><code>\/.idea\/<\/code><\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u043a \u0445\u043e\u0442\u0438\u043c \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u0432 \u0440\u043e\u043b\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430, \u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e&nbsp;<strong>FishSocket<\/strong>:<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0444\u0430\u0439\u043b&nbsp;<a href=\"http:\/\/fishsocket.rb\/\" rel=\"noopener noreferrer nofollow\"><strong>FishSocket.rb<\/strong><\/a>&nbsp;:<\/p>\n<pre><code>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 <\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c \u0432 \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b \u0441\u0440\u0430\u0437\u0443 5 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 :<strong>Gem telegram\/bot,<\/strong>\u041c\u043e\u0434\u0443\u043b\u0438 mac-shake, listener, security, database.<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0441\u0440\u0430\u0437\u0443 \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e \u043a \u0447\u0435\u043c\u0443:<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p><strong>\u0424\u0430\u0439\u043b&nbsp;<\/strong><a href=\"http:\/\/mac-shake.rb\/\" rel=\"noopener noreferrer nofollow\"><strong>mac-shake.rb<\/strong><\/a><strong>:<\/strong><\/p>\n<pre><code># frozenstringliteral: true module TelegramOrientedInfo APIKEY = '' end <\/code><\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p><em>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c \u0432 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f API-KEY \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 \u0441 \u043d\u0430\u0448\u0438\u043c \u0431\u043e\u0442\u043e\u043c, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0441\u0440\u0430\u0437\u0443 \u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a \u0431\u043e\u0442\u0443 \u043e\u0442 Telegram API :&nbsp;<\/em><a href=\"https:\/\/lolz.guru\/members\/117234\/\" rel=\"noopener noreferrer nofollow\"><em>@BotFather<\/em><\/a><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/460\/480\/b09\/460480b09528b36eb5861c5a1d775d7a\" width=\"886\" height=\"1200\"><figcaption><\/figcaption><\/figure>\n<p>&nbsp;&nbsp;API-Key \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u0432\u0435\u0440\u043d\u0443\u043b \u0431\u043e\u0442, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 API-Key, \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u0443\u044e \u0440\u0430\u043d\u0435\u0435.<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p><em>\u0424\u0430\u0439\u043b&nbsp;<\/em><a href=\"http:\/\/security.rb\/\" rel=\"noopener noreferrer nofollow\"><strong><em>security.rb<\/em><\/strong><\/a><strong><em>:&nbsp;<\/em><\/strong><\/p>\n<pre><code>class FishSocket   module Listener     # Module for checks     module Security       def messageisnew(starttime, message)         messagetime = (defined? message.date) ? message.date : message.message.date         messagetime.toi &gt; 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 &gt; (5 * 60)   end   module_function :message_is_new, :message_too_far end  end end <\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u0432\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 : \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0431\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043e\u0442\u043f\u0430\u0440\u0432\u043b\u0435\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u0441\u0442\u0430\u0440\u0442\u0430 \u0431\u043e\u0442\u0430 (\u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u043b\u0435\u043d\u043d\u044b \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438). \u0418 \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u0431\u044b \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u043e\u043b\u044c\u0448\u0435 5 \u043c\u0438\u043d\u0443\u0442 (\u0432\u0434\u0440\u0443\u0433 \u0432\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0435\u0451 \u0434\u043b\u0438\u043d\u0443)<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0424\u0430\u0439\u043b&nbsp;<a href=\"http:\/\/listener.rb\/\" rel=\"noopener noreferrer nofollow\"><strong>listener.rb<\/strong><\/a>:<\/p>\n<pre><code>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 <\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043c\u044b \u0434\u0435\u043b\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u0434\u0432\u0435 \u0433\u0440\u0443\u043f\u043f\u044b, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043b\u0438 \u043e\u043d\u0438 \u043e\u0442\u0432\u0435\u0442\u043e\u043c \u043d\u0430 callback \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0438\u043b\u0438 \u043e\u043d\u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0435.&nbsp;\u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u043e\u044f\u0441\u043d\u044e \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 callback \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u0435.&nbsp;Telegram API \u0432\u0435\u0440\u0441\u0438\u0438 2.0 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u0448\u0438\u0440\u043d\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 InlineMessages. \u042d\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0441\u0435\u0431\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0435\u0442 UI \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u0437\u0430\u0435\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c, \u044f \u0432 \u0441\u0432\u043e\u0435\u043c \u0431\u043e\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442&nbsp;<a href=\"https:\/\/core.telegram.org\/bots\/api#inlinekeyboardmarkup\" rel=\"noopener noreferrer nofollow\"><u>InlineKeyboardMarkup<\/u><\/a>&nbsp;\u044d\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0438, \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0439\u0434\u0435\u0442 \u043d\u0430 \u0431\u043e\u0442\u0430, \u0431\u0443\u0434\u0435\u0442 \u0442\u0438\u043f\u0430&nbsp;<strong>CallbackMessage<\/strong>, \u0438 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d \u0442\u043e\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u0432 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043a\u043d\u043e\u043f\u043a\u0438, \u043f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 Telegram API. \u041f\u043e\u0437\u0436\u0435 \u043c\u044b \u0435\u0448\u0451 \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0430\u0439\u043b<strong>&nbsp;<\/strong><a href=\"http:\/\/database.rb\/\" rel=\"noopener noreferrer nofollow\"><strong>Database.rb<\/strong><\/a><strong>&nbsp;<\/strong><\/p>\n<pre><code># 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 &lt;&lt;-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 &lt;&lt;-SQL     Select * from #{tablename}     SQL   rescue SQLite3::SQLException     false   end modulefunction(     :gettable,     :setup,     :db,     :db=   ) end <\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0434 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\/\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u041c\u043e\u0436\u0435\u043c \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043e\u0442\u0430, \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430&nbsp;<a href=\"http:\/\/fish_socket.rb\/\" rel=\"noopener noreferrer nofollow\"><strong>fish<em>socket.rb<\/em><\/strong><\/a><em>\u0415\u0441\u043b\u0438 \u043c\u044b \u0432\u0441\u0451 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0442\u043e \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 Active Socket \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u044b\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 Telegram API.\u041c\u044b \u043f\u043e-\u0441\u0443\u0442\u0438 \u0440\u0435\u0435\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u044f \u0435\u0433\u043e \u043a Webhook \u043e\u0442 Telegram API, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e \u043b\u044e\u0431\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445.<\/em><\/p>\n<\/li>\n<li>\n<p><em>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u0431\u043e\u0442\u0435&nbsp;<\/em><\/p>\n<p><em>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b<\/em><strong><em>&nbsp;<\/em><\/strong><a href=\"http:\/\/standart_messages.rb\/\" rel=\"noopener noreferrer nofollow\"><strong><em>standart<\/em>messages.rb<\/strong><\/a>, \u043c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 (\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435) \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043e\u0442\u0430. \u041a\u0430\u043a \u043f\u043e\u043c\u043d\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0431\u044b\u0432\u0430\u044e\u0442 \u0434\u0432\u0443\u0445 \u0442\u0438\u043f\u043e\u0432 : Standart \u0438 Callback.&nbsp;<\/p>\n<p>\u0424\u0430\u0439\u043b&nbsp;<a href=\"http:\/\/standart_messages.rb\/\" rel=\"noopener noreferrer nofollow\">standart<em>messages.rb<\/em><\/a><em>&nbsp;:<\/em><\/p>\n<pre><code>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, \u043d\u0435\u0442\u0443 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u0432 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442'         else           Response.stdmessage '\u041f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437 \u0442\u0430\u043a\u043e\u0435 \u0441\u043b\u044b\u0448\u0443, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0442\u0435\u043a\u0441\u0442'         end       end   module_function(       :process   ) end  end end <\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \/get<em>account, \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u0447\u0442\u043e \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u0432 \u043d\u0435\u0442\u0443, \u0432\u0435\u0434\u044c \u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0435\u0449\u0451 \u043d\u0435\u0442\u0443.&nbsp;<\/em><\/p>\n<\/li>\n<li>\n<p><em>\u0410\u0445 \u0434\u0430, \u043e\u0442\u0432\u0435\u0442 \u043c\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0434\u0443\u043b\u044f&nbsp;<\/em><strong><em>Response<\/em><\/strong><em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c<\/em><\/p>\n<p>\u0424\u0430\u0439\u043b&nbsp;<a href=\"http:\/\/response.rb\/\" rel=\"noopener noreferrer nofollow\">response.rb<\/a><\/p>\n<pre><code>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 <\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043c\u044b \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a API Telegrama \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u043d\u043e \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f gem telegram-ruby, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044e&nbsp;<a href=\"http:\/\/api.send_message\/\" rel=\"noopener noreferrer nofollow\">api.send<em>message<\/em><\/a><em>. \u0412\u0441\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 Telegram API \u0438 \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u0441\u044f \u0441 \u043d\u0438\u043c\u0438, \u0441\u043a\u0430\u0436\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u0438\u0448\u044c \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<\/em><\/p>\n<\/li>\n<li>\n<p><em>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0431\u043e\u0442\u0430 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u0434\u0432\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b :&nbsp;(\u0411\u043e\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u0430\u043c \u0432\u0435\u0440\u043d\u0443\u043b BotFather, \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 API \u043a\u043b\u044e\u0447\u0435\u043c.<\/em><\/p>\n<pre><code>\u041f\u0440\u0438\u0432\u0435\u0442<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/eab\/9bd\/d84\/eab9bdd84e07cc065852cb38bd41845e\" width=\"882\" height=\"232\"><figcaption><\/figcaption><\/figure>\n<pre><code>\/getaccount<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9d5\/470\/c75\/9d5470c7530ad9b0bcf876e3027c52d2\" width=\"882\" height=\"232\"><figcaption><\/figcaption><\/figure>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c \u0432\u0441\u0451 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0438 \u0445\u043e\u0442\u0435\u043b\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043e\u0431\u043e\u0440\u043e\u0442\u044b \u0438 \u0441\u0440\u0430\u0437\u0443 \u0441\u043e\u0437\u0434\u0430\u0442\u044c Inline \u043a\u043d\u043e\u043f\u043a\u0443, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0430\u043a\u0446\u0438\u044e \u043d\u0430 \u043d\u0435\u0451, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 Inline \u043a\u043d\u043e\u043f\u043a\u043e\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u043e\u0434\u043f\u0430\u043f\u043a\u0443 assets\/ \u0432 \u043d\u0435\u0439 \u043c\u043e\u0434\u0443\u043b\u044c inline<em>button.\u0424\u0430\u0439\u043b&nbsp;<\/em><a href=\"http:\/\/inline_button.rb\/\" rel=\"noopener noreferrer nofollow\"><em>inline<\/em>button.rb<\/a>&nbsp;:&nbsp;<\/p>\n<pre><code>class FishSocket   # This module assigned to creating InlineKeyboardButton   module InlineButton     GETACCOUNT = Telegram::Bot::Types::InlineKeyboardButton.new(text: '\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c account', callbackdata: 'getaccount')   end end <\/code><\/pre>\n<p>\u0421\u0434\u0435\u0441\u044c \u043c\u044b \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0432\u0441\u0451 \u043a \u0442\u043e\u043c\u0443 \u0436\u0435<strong>&nbsp;telegram-ruby-gem&nbsp;<\/strong>\u0447\u0442\u043e \u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044c\u0435\u043a\u0442 \u0442\u0438\u043f\u0430 InlineKeyboardButton.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0448\u0438\u0440\u0438\u043c \u043d\u0430\u0448 \u0444\u0430\u0439\u043b&nbsp;<strong>Reponse&nbsp;<\/strong>\u043d\u043e\u0432\u044b\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u043c\u0438 :&nbsp;<\/p>\n<pre><code>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 <\/code><\/pre>\n<p><em>\u041d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u0432\u044b\u043d\u043e\u0441\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0432 module<\/em>function() :<\/p>\n<pre><code>modulefunction(   :stdmessage,   :generateinlinemarkup,   :inlinemessage ) <\/code><\/pre>\n<\/li>\n<li>\n<p><em>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f&nbsp;<\/em><\/p>\n<pre><code>\/start<\/code><\/pre>\n<p>, \u0432\u044b\u0432\u043e\u0434 \u043d\u0430\u0448\u0435\u0439 \u043a\u043d\u043e\u043f\u043a\u0438, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0440\u0430\u0437\u0448\u0438\u0440\u0438\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u043e\u0434\u0443\u043b\u044c&nbsp;<strong>StandartMessages<\/strong><\/p>\n<pre><code>def process   case Listener.message.text   when '\/getaccount'     Response.stdmessage 'Very sorry, \u043d\u0435\u0442\u0443 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u0432 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442'   when '\/start'     Response.inlinemessage '\u041f\u0440\u0438\u0432\u0435\u0442, \u0432\u044b\u0431\u0435\u0440\u0438 \u0438\u0437 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439', Response::generateinlinemarkup(         InlineButton::GETACCOUNT     )   else     Response.stdmessage '\u041f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437 \u0442\u0430\u043a\u043e\u0435 \u0441\u043b\u044b\u0448\u0443, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0442\u0435\u043a\u0441\u0442'   end end <\/code><\/pre>\n<\/li>\n<li>\n<p><em>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b&nbsp;<\/em><a href=\"http:\/\/callback_messages.rb\/\" rel=\"noopener noreferrer nofollow\"><strong><em>callback<\/em>messages.rb<\/strong><\/a><strong>&nbsp;<\/strong>\u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 Callback \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 :\u0424\u0430\u0439\u043b<strong>&nbsp;<\/strong><a href=\"http:\/\/callback_messages.rb\/\" rel=\"noopener noreferrer nofollow\"><strong>callback<em>messages.rb<\/em><\/strong><\/a><\/p>\n<pre><code>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('\u041d\u0435\u0442\u0443 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u0432 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442')     end   end    module_function(       :process,       :callback_message,       :callback_message=   ) end  end end <\/code><\/pre>\n<p>\u041f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438 \u0440\u043e\u0431\u043e\u0442\u044b \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u043e\u0442 StandartMessages \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e Telegram \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0430\u0437\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0434\u0432\u0443\u0445 \u0442\u0438\u043f\u043e\u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0438 \u0447\u0442\u043e \u0431\u044b \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c&nbsp;<em>\u0441\u043f\u0430\u0433\u0435\u0442\u0442\u0438-\u043a\u043e\u0434&nbsp;<\/em>\u0432\u044b\u043d\u043e\u0441\u0438\u043c \u0440\u0430\u0437\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u043d\u043e\u0432\u044b\u043c\u0438 \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438.\u0424\u0430\u0439\u043b&nbsp;<a href=\"http:\/\/fish_socket.rb\/\" rel=\"noopener noreferrer nofollow\"><strong>fish<em>socket.rb<\/em><\/strong><\/a><\/p>\n<pre><code>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 <\/code><\/pre>\n<\/li>\n<li>\n<p>\u041f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0431\u043e\u0442\u0430 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u043f\u0438\u0448\u0435\u043c&nbsp;<\/p>\n<pre><code>\/start<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/797\/7c3\/dd5\/7977c3dd53496dbd850c51dff57f5ed0\" width=\"882\" height=\"362\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430\u0436\u0438\u043c\u0430\u044f \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0442\u043e &#8212; \u0447\u0442\u043e \u0445\u043e\u0442\u0435\u043b\u0438 \u0443\u0432\u0438\u0434\u0435\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u042f \u0431\u044b \u0435\u0449\u0451 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0447\u0435\u043c \u0445\u043e\u0442\u0435\u043b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u0441\u044f, \u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438 &#8212; \u043c\u044b \u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0449\u0451 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e 2 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 ForceReply \u043a\u043d\u043e\u043f\u043a\u0438, \u0438 \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 EditInlineMessage \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/p>\n<p><\/p>\n<\/li>\n<li>\n<p>ForceReply, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432 \u043d\u0430\u0448\u0435\u043c&nbsp;<strong>Response<\/strong>&nbsp;\u043c\u043e\u0434\u0443\u043b\u0435<\/p>\n<pre><code>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 <\/code><\/pre>\n<p>\u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c module<em>function \u043d\u0430\u0448\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0438\u0437\u043c\u0438\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043b-\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432.<\/em><\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u0440\u0435\u0430\u043a\u0446\u0438\u044e \u043d\u0430 \u0432\u0432\u043e\u0434 \u043f\u0440\u043e\u043c\u043e\u043a\u043e\u0434\u0430 (\u0445\u0437 \u0437\u0430\u0447\u0435\u043c, \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430)<\/p>\n<\/li>\n<li>\n<p><em>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u043e\u0432\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443 :&nbsp;<\/em><\/p>\n<pre><code>module InlineButton   GETACCOUNT = Telegram::Bot::Types::InlineKeyboardButton.new(text: '\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c account', callbackdata: 'getaccount')   HAVEPROMO = Telegram::Bot::Types::InlineKeyboardButton.new(text: '\u0415\u0441\u0442\u044c \u043f\u0440\u043e\u043c\u043e\u043a\u043e\u0434?', callbackdata: 'forcepromo') end <\/code><\/pre>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0451 \u0432 \u0432\u044b\u0432\u043e\u0434 \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435&nbsp;<\/p>\n<pre><code>\/start<\/code><\/pre>\n<p>\u041c\u043e\u0434\u0443\u043b\u044c&nbsp;<strong>StandartMessages<\/strong><\/p>\n<pre><code>when '\/start'   Response.inlinemessage '\u041f\u0440\u0438\u0432\u0435\u0442, \u0432\u044b\u0431\u0435\u0440\u0438 \u0438\u0437 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439', Response::generateinlinemarkup(     [         InlineButton::GETACCOUNT,         InlineButton::HAVEPROMO     ]   ) <\/code><\/pre>\n<p><em>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438, \u0438\u0445 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432.<\/em><\/p>\n<\/li>\n<li>\n<p><em>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0440\u0435\u0430\u043a\u0446\u0438\u044e \u043d\u0430 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443, \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c<\/em><strong><em>&nbsp;ForceReply:<\/em><\/strong><em>\u041c\u043e\u0434\u0443\u043b\u044c&nbsp;<\/em><strong><em>CallbackMessages<\/em><\/strong><\/p>\n<pre><code>def process   self.callbackmessage = Listener.message.message   case Listener.message.data   when 'getaccount'     Listener::Response.stdmessage('\u041d\u0435\u0442\u0443 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u0432 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442')   when 'forcepromo'     Listener::Response.forcereplymessage('\u041e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u043f\u0440\u043e\u043c\u043e\u043a\u043e\u0434')   end end <\/code><\/pre>\n<\/li>\n<li>\n<p><em>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0442\u043e \u0447\u0442\u043e \u043c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438,&nbsp;<\/em><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/59d\/738\/0d1\/59d7380d176167572de89516ebca396a\" width=\"886\" height=\"676\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0442 \u0431\u043e\u0442\u0430 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b ForceReply, \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 : \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043e \u043a\u0430\u043a \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u0430 (Reply) \u0442\u0430\u043a, \u043a\u0430\u043a \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0441\u0430\u043c\u0438 \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u043e\u0442\u0432\u0435\u0442\u0438\u043c \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u041e\u0447\u0435\u043d\u044c&nbsp;<u>\u044e\u0437\u0435\u0444\u0443\u043b&nbsp;<\/u>\u0435\u0441\u043b\u0438 \u0440\u0435\u0447\u044c \u043e \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 \u0433\u0434\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0437\u043d\u0430\u0442\u044c \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0445\u043e\u0447\u0435\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c&nbsp;<u>\u044e\u0437\u0435\u0440.<br \/><\/u><\/p>\n<\/li>\n<li>\n<p><em>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0440\u0435\u0430\u043a\u0446\u0438\u044e \u043d\u0430 \u043e\u0442\u0432\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 &#171;\u041e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u043f\u0440\u043e\u043c\u043a\u043e\u0434.&#187; \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442, \u0442\u043e \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432 StandartMessages :&nbsp;\u041c\u043e\u0434\u0443\u043b\u044c&nbsp;<\/em><strong><em>StandartMessages<\/em><\/strong><\/p>\n<pre><code>def process   case Listener.message.text   when '\/getaccount'     Response.stdmessage 'Very sorry, \u043d\u0435\u0442\u0443 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u0432 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442'   when '\/start'     Response.inlinemessage '\u041f\u0440\u0438\u0432\u0435\u0442, \u0432\u044b\u0431\u0435\u0440\u0438 \u0438\u0437 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439', Response::generateinlinemarkup(       [           InlineButton::GETACCOUNT,           InlineButton::HAVEPROMO       ]     )   else     unless Listener.message.replytomessage.nil?       case Listener.message.replytomessage.text       when \/\u041e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u043f\u0440\u043e\u043c\u043e\u043a\u043e\u0434\/         return Listener::Response.std_message '\u041f\u0440\u043e\u043c\u043e\u043a\u043e\u0434 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u043e\u0442 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 :' if Promos::validate Listener.message.text     return Listener::Response.std_message '\u041f\u0440\u043e\u043c\u043e\u043a\u043e\u0434 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d'   end end Response.std_message '\u041f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437 \u0442\u0430\u043a\u043e\u0435 \u0441\u043b\u044b\u0448\u0443, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0442\u0435\u043a\u0441\u0442'  end end <\/code><\/pre>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b&nbsp;<a href=\"http:\/\/promos.rb\/\" rel=\"noopener noreferrer nofollow\">promos.rb<\/a>&nbsp;\u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u043a\u0438 \u043f\u0440\u043e\u043c\u043e\u043a\u043e\u0434\u043e\u0432\u0424\u0430\u0439\u043b&nbsp;<a href=\"http:\/\/promos.rb\/\" rel=\"noopener noreferrer nofollow\"><strong>promos.rb<\/strong><\/a><\/p>\n<pre><code>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 <\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u043e\u043c\u043e\u043a\u043e\u0434\u0430.\u041d\u0415 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0432 FishSocket \u043c\u043e\u0434\u0443\u043b\u0435 :&nbsp;\u041c\u043e\u0434\u0443\u043b\u044c&nbsp;<strong>FishSocket<\/strong><\/p>\n<pre><code>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 <\/code><\/pre>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u043c \u043f\u0440\u043e\u043c\u043e\u043a\u043e\u0434\u043e\u043c, \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b\u043c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4b6\/1c0\/1a7\/4b61c01a7c7d13606546041aaf989642\" width=\"886\" height=\"1178\"><figcaption><\/figcaption><\/figure>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u0438 \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c, \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c\u0443 \u043f\u0443\u043d\u043a\u0442\u0443: \u0438\u0437\u043c\u0438\u043d\u0435\u043d\u0438\u044f InlineMessages:&nbsp;<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u043d\u0435\u0441\u0435\u043c \u043f\u0440\u043e\u043c\u043e\u043a\u043e\u0434\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 &#171;\u041c\u0435\u043d\u044e&#187;, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u043e\u0432\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u043d\u0430 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435&nbsp;<\/p>\n<pre><code>\/start<\/code><\/pre>\n<p>\u0437\u0430\u043c\u0435\u043d\u0438\u0432 \u0435\u0451 \u043a\u043d\u043e\u043f\u043a\u0443 &#171;\u0415\u0441\u0442\u044c \u043f\u0440\u043e\u043c\u043a\u043e\u0434?&#187;\u041c\u043e\u0434\u0443\u043b\u044c&nbsp;<strong>InlineButton<\/strong><\/p>\n<pre><code>module InlineButton   GETACCOUNT = Telegram::Bot::Types::InlineKeyboardButton.new(text: '\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c account', callbackdata: 'getaccount')   HAVEPROMO = Telegram::Bot::Types::InlineKeyboardButton.new(text: '\u0415\u0441\u0442\u044c \u043f\u0440\u043e\u043c\u043e\u043a\u043e\u0434?', callbackdata: 'forcepromo')   ADDITIONMENU = Telegram::Bot::Types::InlineKeyboardButton.new(text: '\u041d\u0438\u0448\u0442\u044f\u043a\u0438', callbackdata: 'advancedmenu') end <\/code><\/pre>\n<p>\u041c\u043e\u0434\u0443\u043b\u044c StandartMessages<\/p>\n<pre><code>when '\/start'   Response.inlinemessage '\u041f\u0440\u0438\u0432\u0435\u0442, \u0432\u044b\u0431\u0435\u0440\u0438 \u0438\u0437 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439', Response::generateinlinemarkup(     [         InlineButton::GETACCOUNT,         InlineButton::ADDITIONMENU     ]   ) <\/code><\/pre>\n<p><em>\u041e\u0442\u043b\u0438\u0447\u043d\u043e<\/em><\/p>\n<\/li>\n<li>\n<p><em>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0440\u0435\u0430\u043a\u0446\u0438\u044e \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u043c\u043e\u0434\u0443\u043b\u044c \u0421allbackMessages:&nbsp;\u041c\u043e\u0434\u0443\u043b\u044c&nbsp;<\/em><strong><em>CallbackMessages<\/em><\/strong><\/p>\n<pre><code>def process   self.callbackmessage = Listener.message.message   case Listener.message.data   when 'getaccount'     Listener::Response.stdmessage('\u041d\u0435\u0442\u0443 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u0432 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442')   when 'forcepromo'     Listener::Response.forcereply\u00a8C222Cmenu'     Listener::Response.inline\u00a8C223Cinline\u00a8C224CButton::HAVE\u00a8C225Cmessage<\/code><\/pre>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u044d\u0442\u043e\u0433\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 \u0432 \u043c\u043e\u0434\u0443\u043b\u0435&nbsp;<strong>Response<\/strong>, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0432 \u043c\u0435\u0442\u043e\u0434&nbsp;<strong>inline<em>message<\/em><\/strong><em>\u041c\u043e\u0434\u0443\u043b\u044c&nbsp;<\/em><strong><em>Response<\/em><\/strong><\/p>\n<pre><code>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 <\/code><\/pre>\n<p>\u041a\u0430\u043a\u043e\u0432\u0430 \u0438\u0434\u0435\u044f? &#8212; \u041c\u044b \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0430 \u043d\u043e\u0432\u043e\u0435, \u0441 \u043d\u043e\u0432\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c, \u044d\u0442\u043e\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f &#8212; \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u043c\u0435\u043d\u044e, \u043e\u043f\u043b\u0430\u0442\u0430, \u0441\u043f\u0438\u0441\u043e\u043a \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432, \u0432\u0438\u0442\u0440\u0438\u043d\u0430 \u0438\u0442\u0434.<\/p>\n<\/li>\n<li>\n<p>\u0427\u0442\u043e \u0436, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c :<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1de\/ca9\/608\/1deca9608e3628acf8d2aa6a7025046c\" width=\"886\" height=\"504\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f4e\/06b\/f9c\/f4e06bf9cfa0680bf7ad96fb09cac158\" width=\"886\" height=\"410\"><figcaption><\/figcaption><\/figure>\n<p>&nbsp;&nbsp;<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043d\u0430\u0436\u0430\u043b\u0438 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443, \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u043b\u043e\u0441\u044c, \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0432 \u0434\u0440\u0443\u0433\u043e\u0439 ReplyKeyboard.&nbsp;<br \/>\u0418 \u0435\u0441\u043b\u0438 \u043c\u044b \u043a\u043b\u0430\u0446\u043d\u0435\u043c \u043d\u0430 \u043d\u0435\u0451 :&nbsp;<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/310\/6f3\/9e4\/3106f39e4acce8a38abc12f927efc4e9\" width=\"886\" height=\"584\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u0447\u0430\u0441\u044b.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041f\u043e\u0441\u043b\u0435\u0441\u043b\u043e\u0432\u0438\u0435:&nbsp;<\/strong>\u041c\u043d\u043e\u0433\u043e \u0447\u0435\u0433\u043e \u0442\u0443\u0442 \u043d\u0435 \u0431\u044b\u043b\u043e \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u043e, \u043d\u043e \u0432\u0435\u0434\u044c \u043d\u0430 \u0432\u0441\u0451 \u0435\u0441\u0442\u044c \u0440\u0443\u043a\u0438 \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f, \u043b\u0438\u0447\u043d\u043e \u043c\u043d\u0435, \u0431\u044b\u043b\u043e \u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043b\u0438\u0431\u044b \u043d\u0430 GitHub. \u042f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u0432 \u043d\u0430\u0448\u0435 \u0432\u0440\u0435\u043c\u044f \u0441\u0442\u0430\u0442\u044c \u0431\u043e\u0442\u043e\u0432\u043e\u0434\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u043b\u044e\u0431\u043e\u0439 \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0439, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u043e\u0442 \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0439 \u0437\u043d\u0430\u0435\u0442 \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c. \u0412\u0441\u0435\u043c \u043c\u0438\u0440.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/535618\/\"> https:\/\/habr.com\/ru\/post\/535618\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p><strong>\u041f\u0440\u0438\u0432\u0435\u0442\u0438\u043a\u0438-\u043e\u043c\u043b\u0435\u0442\u0438\u043a\u0438<\/strong>, \u043a\u0430\u043a-\u0442\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0438\u0434\u0435\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c Telegram \u0431\u043e\u0442\u0430 \u043d\u0430&nbsp;<strong>Ruby<\/strong>&nbsp;\u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0443, \u0432 \u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u0432\u0430\u0445 \u044d\u0442\u043e\u0442 \u0431\u043e\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c \u043e\u043d\u043b\u0430\u0439\u043d \u0447\u0430\u0442\u0430\u0445 \u043f\u043e \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u0440\u0430\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044d\u0442\u0438\u043c \u0436\u0435 \u0431\u043e\u0442\u043e\u043c \u0432\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u0432 \u0447\u0430\u0442 \u0432 \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0441 \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c.<\/p>\n<p>\u0418 \u0432\u043e\u0442 \u043f\u043e\u043a\u0430 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0441\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u0431\u043e\u0442\u0430 \u0442\u043e \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0441\u044f \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 (gem) telegram-bot-ruby, \u043d\u0430\u0443\u0447\u0438\u043b\u0441\u044f \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 gem &#8216;sqlite3-ruby\u2019 \u0438 \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u043f\u0440\u043e\u043d\u0438\u043a\u0441\u044f \u043c\u043d\u043e\u0433\u0438\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 Telegram \u0431\u043e\u0442\u043e\u0432 \u0447\u0435\u043c \u0438 \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u0441\u044f \u0441 \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u043c\u0438 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u044d\u0442\u043e\u0433\u043e \u0444\u043e\u0440\u0443\u043c\u0430, \u0432\u043d\u0435\u0441\u0442\u0438 \u0432\u043a\u043b\u0430\u0434 \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c.<\/p>\n<p>\u041c\u043d\u043e\u0433\u043e \u043b\u044e\u0434\u0435\u0439 \u0445\u043e\u0447\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c Telegram \u0431\u043e\u0442\u044b, \u0432\u0435\u0434\u044c \u044d\u0442\u043e \u0432\u0435\u0441\u0435\u043b\u043e \u0438 \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<p>\u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0431\u043e\u0442\u0430 \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u0442\u0435\u043c \u0447\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0430\u0439\u0442\u0438 \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043d\u0430 \u0442\u0435\u043c\u0443 Ruby \u0431\u043e\u0442\u0430 \u0434\u043b\u044f Telegram. \u041f\u043e\u0434 \u0445\u043e\u0440\u043e\u0448\u0438\u043c \u044f \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u044e \u0442\u0430\u043a\u043e\u0439, \u0433\u0434\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0438\u0437\u044f\u0449\u043d\u044b\u0435 \u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439, \u0442\u0430\u043a\u043e\u0439, \u043a\u0430\u043a\u043e\u0439 \u043e\u043d \u0435\u0441\u0442\u044c \u0432 Telegram API.<\/p>\n<p>\u0421\u0440\u0430\u0437\u0443 \u043a\u0438\u0434\u0430\u044e \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u0432\u043e\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u0442\u0443:&nbsp;<a href=\"https:\/\/github.com\/sorshireality\/sorshireality-ruby-teleram-bot-native\" rel=\"noopener noreferrer nofollow\">here<\/a>,<br \/>\u0418\u0431\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u0431\u0430\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043c\u043e\u0433 \u0441\u044e\u0434\u0430 \u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438, \u0432\u0434\u0440\u0443\u0433 \u0447\u0435\u0433\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439.<\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u043e\u043f\u0438\u043a\u0430, \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0441\u043c\u043e\u0436\u0435\u0442 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0441\u0432\u043e\u0435\u0433\u043e \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e\u0433\u043e \u0431\u043e\u0442\u0430, \u0438\u043b\u0438 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u043a\u0430\u0447\u0430\u0442\u044c Ruby, Telegram \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435 \u0438 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e\u0435. \u0412\u0435\u0434\u044c \u043a\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u00ab\u0414\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0438 \u041a\u0438\u0431\u0435\u0440\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430\u00bb:<\/p>\n<blockquote>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0436\u0435 \u043c\u0438\u0440\u0435 \u0432\u0441\u0435, \u0447\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u0439 \u0443\u043c, \u043c\u043e\u0436\u0435\u0442 \u0440\u0435\u043f\u0440\u043e\u0434\u0443\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0434\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438 \u0431\u0435\u0437\u043e \u0432\u0441\u044f\u043a\u043e\u0439 \u043f\u043b\u0430\u0442\u044b. \u0414\u043b\u044f \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043c\u044b\u0441\u043b\u0438 \u0432\u0430\u0448\u0438 \u0437\u0430\u0432\u043e\u0434\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f.<\/p>\n<\/blockquote>\n<ul>\n<li>\n<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043d\u0430\u0447\u0430\u0442\u044c :<\/p>\n<p>\u0423 \u043c\u0435\u043d\u044f \u0432\u0435\u0440\u0441\u0438\u044f Ruby &#8212; 2.7.2, \u043d\u043e \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0447\u0442\u043e \u0432\u0441\u0451 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0441 \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u043d\u043d\u0438\u043c\u0438\/\u043f\u043e\u0437\u0434\u043d\u0438\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438.<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c Gemfile &#8212; \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 gem\u2019s \u0432 Ruby.<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0424\u0430\u0439\u043b&nbsp;<strong>Gemfile<\/strong>:<\/p>\n<pre><code>source 'https:\/\/rubygems.org' gem 'json' gem 'net-http-persistent', '~&gt; 2.9' gem 'sqlite3'#gem \u0434\u043b\u044f \u0411\u0414 gem 'telegram-bot-ruby'#\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0433\u0435\u043c \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0435\u043d\u0435\u043d\u0438\u044f \u0441 Telegram \u0431\u043e\u0442\u043e\u043c <\/code><\/pre>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0444\u0430\u0439\u043b \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e<\/p>\n<pre><code>bundle install<\/code><\/pre>\n<p>\u0423\u0432\u0438\u0434\u0438\u043c \u0443\u0441\u043f\u0435\u0448\u043d\u0443\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0432\u0441\u0435\u0445 \u0433\u0435\u043c\u043e\u0432 (\u043d\u0443 \u044d\u0442\u043e \u0436\u0435 \u043f\u0440\u0435\u043b\u0435\u0441\u0442\u044c Ruby) \u0438 \u043d\u0430 \u044d\u0442\u043e\u043c \u0441&nbsp;<strong>Gemfile<\/strong>&nbsp;\u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u043e\u043d\u0447\u0435\u043d\u043e.<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b (\u043a\u0430\u043a \u0438 \u044f) \u043b\u0430\u0431\u043e\u0440\u0430\u0442\u043e\u0440\u043d\u0430\u044f \u043a\u0440\u044b\u0441\u0430 GitHub\u2019a, \u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u043c .<strong>gitignore<\/strong>&nbsp;\u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u0443 \u043c\u0435\u043d\u044f \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 JetBrains \u0444\u0430\u0439\u043b:<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0424\u0430\u0439\u043b .<strong>gitignore<\/strong>:<\/p>\n<pre><code>\/.idea\/<\/code><\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u043a \u0445\u043e\u0442\u0438\u043c \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u0432 \u0440\u043e\u043b\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430, \u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e&nbsp;<strong>FishSocket<\/strong>:<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0444\u0430\u0439\u043b&nbsp;<a href=\"http:\/\/fishsocket.rb\/\" rel=\"noopener noreferrer nofollow\"><strong>FishSocket.rb<\/strong><\/a>&nbsp;:<\/p>\n<pre><code>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 <\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c \u0432 \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b \u0441\u0440\u0430\u0437\u0443 5 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 :<strong>Gem telegram\/bot,<\/strong>\u041c\u043e\u0434\u0443\u043b\u0438 mac-shake, listener, security, database.<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0441\u0440\u0430\u0437\u0443 \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e \u043a \u0447\u0435\u043c\u0443:<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p><strong>\u0424\u0430\u0439\u043b&nbsp;<\/strong><a href=\"http:\/\/mac-shake.rb\/\" rel=\"noopener noreferrer nofollow\"><strong>mac-shake.rb<\/strong><\/a><strong>:<\/strong><\/p>\n<pre><code># frozenstringliteral: true module TelegramOrientedInfo APIKEY = '' end <\/code><\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p><em>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c \u0432 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f API-KEY \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 \u0441 \u043d\u0430\u0448\u0438\u043c \u0431\u043e\u0442\u043e\u043c, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0441\u0440\u0430\u0437\u0443 \u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a \u0431\u043e\u0442\u0443 \u043e\u0442 Telegram API :&nbsp;<\/em><a href=\"https:\/\/lolz.guru\/members\/117234\/\" rel=\"noopener noreferrer nofollow\"><em>@BotFather<\/em><\/a><\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>&nbsp;&nbsp;API-Key \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u0432\u0435\u0440\u043d\u0443\u043b \u0431\u043e\u0442, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 API-Key, \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u0443\u044e \u0440\u0430\u043d\u0435\u0435.<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p><em>\u0424\u0430\u0439\u043b&nbsp;<\/em><a href=\"http:\/\/security.rb\/\" rel=\"noopener noreferrer nofollow\"><strong><em>security.rb<\/em><\/strong><\/a><strong><em>:&nbsp;<\/em><\/strong><\/p>\n<pre><code>class FishSocket   module Listener     # Module for checks     module Security       def messageisnew(starttime, message)         messagetime = (defined? message.date) ? message.date : message.message.date         messagetime.toi &gt; 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 &gt; (5 * 60)   end   module_function :message_is_new, :message_too_far end  end end <\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u0432\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 : \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0431\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043e\u0442\u043f\u0430\u0440\u0432\u043b\u0435\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u0441\u0442\u0430\u0440\u0442\u0430 \u0431\u043e\u0442\u0430 (\u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u043b\u0435\u043d\u043d\u044b \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438). \u0418 \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u0431\u044b \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u043e\u043b\u044c\u0448\u0435 5 \u043c\u0438\u043d\u0443\u0442 (\u0432\u0434\u0440\u0443\u0433 \u0432\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0435\u0451 \u0434\u043b\u0438\u043d\u0443)<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0424\u0430\u0439\u043b&nbsp;<a href=\"http:\/\/listener.rb\/\" rel=\"noopener noreferrer nofollow\"><strong>listener.rb<\/strong><\/a>:<\/p>\n<pre><code>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 <\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043c\u044b \u0434\u0435\u043b\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u0434\u0432\u0435 \u0433\u0440\u0443\u043f\u043f\u044b, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043b\u0438 \u043e\u043d\u0438 \u043e\u0442\u0432\u0435\u0442\u043e\u043c \u043d\u0430 callback \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0438\u043b\u0438 \u043e\u043d\u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0435.&nbsp;\u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u043e\u044f\u0441\u043d\u044e \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 callback \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u0435.&nbsp;Telegram API \u0432\u0435\u0440\u0441\u0438\u0438 2.0 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u0448\u0438\u0440\u043d\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 InlineMessages. \u042d\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0441\u0435\u0431\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0435\u0442 UI \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u0437\u0430\u0435\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c, \u044f \u0432 \u0441\u0432\u043e\u0435\u043c \u0431\u043e\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442&nbsp;<a href=\"https:\/\/core.telegram.org\/bots\/api#inlinekeyboardmarkup\" rel=\"noopener noreferrer nofollow\"><u>InlineKeyboardMarkup<\/u><\/a>&nbsp;\u044d\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0438, \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0439\u0434\u0435\u0442 \u043d\u0430 \u0431\u043e\u0442\u0430, \u0431\u0443\u0434\u0435\u0442 \u0442\u0438\u043f\u0430&nbsp;<strong>CallbackMessage<\/strong>, \u0438 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d \u0442\u043e\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u0432 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043a\u043d\u043e\u043f\u043a\u0438, \u043f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 Telegram API. \u041f\u043e\u0437\u0436\u0435 \u043c\u044b \u0435\u0448\u0451 \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0430\u0439\u043b<strong>&nbsp;<\/strong><a href=\"http:\/\/database.rb\/\" rel=\"noopener noreferrer nofollow\"><strong>Database.rb<\/strong><\/a><strong>&nbsp;<\/strong><\/p>\n<pre><code># 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 &lt;&lt;-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 &lt;&lt;-SQL     Select * from #{tablename}     SQL   rescue SQLite3::SQLException     false   end modulefunction(     :gettable,     :setup,     :db,     :db=   ) end <\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0434 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\/\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u041c\u043e\u0436\u0435\u043c \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043e\u0442\u0430, \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430&nbsp;<a href=\"http:\/\/fish_socket.rb\/\" rel=\"noopener noreferrer nofollow\"><strong>fish<em>socket.rb<\/em><\/strong><\/a><em>\u0415\u0441\u043b\u0438 \u043c\u044b \u0432\u0441\u0451 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0442\u043e \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 Active Socket \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u044b\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 Telegram API.\u041c\u044b \u043f\u043e-\u0441\u0443\u0442\u0438 \u0440\u0435\u0435\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u044f \u0435\u0433\u043e \u043a Webhook \u043e\u0442 Telegram API, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e \u043b\u044e\u0431\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445.<\/em><\/p>\n<\/li>\n<li>\n<p><em>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u0431\u043e\u0442\u0435&nbsp;<\/em><\/p>\n<p><em>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b<\/em><strong><em>&nbsp;<\/em><\/strong><a href=\"http:\/\/standart_messages.rb\/\" rel=\"noopener noreferrer nofollow\"><strong><em>standart<\/em>messages.rb<\/strong><\/a>, \u043c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 (\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435) \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043e\u0442\u0430. \u041a\u0430\u043a \u043f\u043e\u043c\u043d\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0431\u044b\u0432\u0430\u044e\u0442 \u0434\u0432\u0443\u0445 \u0442\u0438\u043f\u043e\u0432 : Standart \u0438 Callback.&nbsp;<\/p>\n<p>\u0424\u0430\u0439\u043b&nbsp;<a href=\"http:\/\/standart_messages.rb\/\" rel=\"noopener noreferrer nofollow\">standart<em>messages.rb<\/em><\/a><em>&nbsp;:<\/em><\/p>\n<pre><code>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, \u043d\u0435\u0442\u0443 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u0432 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442'         else           Response.stdmessage '\u041f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437 \u0442\u0430\u043a\u043e\u0435 \u0441\u043b\u044b\u0448\u0443, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0442\u0435\u043a\u0441\u0442'         end       end   module_function(       :process   ) end  end end <\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \/get<em>account, \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u0447\u0442\u043e \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u0432 \u043d\u0435\u0442\u0443, \u0432\u0435\u0434\u044c \u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0435\u0449\u0451 \u043d\u0435\u0442\u0443.&nbsp;<\/em><\/p>\n<\/li>\n<li>\n<p><em>\u0410\u0445 \u0434\u0430, \u043e\u0442\u0432\u0435\u0442 \u043c\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0434\u0443\u043b\u044f&nbsp;<\/em><strong><em>Response<\/em><\/strong><em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c<\/em><\/p>\n<p>\u0424\u0430\u0439\u043b&nbsp;<a href=\"http:\/\/response.rb\/\" rel=\"noopener noreferrer nofollow\">response.rb<\/a><\/p>\n<pre><code>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 <\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043c\u044b \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a API Telegrama \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u043d\u043e \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f gem telegram-ruby, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044e&nbsp;<a href=\"http:\/\/api.send_message\/\" rel=\"noopener noreferrer nofollow\">api.send<em>message<\/em><\/a><em>. \u0412\u0441\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 Telegram API \u0438 \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u0441\u044f \u0441 \u043d\u0438\u043c\u0438, \u0441\u043a\u0430\u0436\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u0438\u0448\u044c \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<\/em><\/p>\n<\/li>\n<li>\n<p><em>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0431\u043e\u0442\u0430 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u0434\u0432\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b :&nbsp;(\u0411\u043e\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u0430\u043c \u0432\u0435\u0440\u043d\u0443\u043b BotFather, \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 API \u043a\u043b\u044e\u0447\u0435\u043c.<\/em><\/p>\n<pre><code>\u041f\u0440\u0438\u0432\u0435\u0442<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<pre><code>\/getaccount<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c \u0432\u0441\u0451 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0438 \u0445\u043e\u0442\u0435\u043b\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043e\u0431\u043e\u0440\u043e\u0442\u044b \u0438 \u0441\u0440\u0430\u0437\u0443 \u0441\u043e\u0437\u0434\u0430\u0442\u044c Inline \u043a\u043d\u043e\u043f\u043a\u0443, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0430\u043a\u0446\u0438\u044e \u043d\u0430 \u043d\u0435\u0451, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 Inline \u043a\u043d\u043e\u043f\u043a\u043e\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u043e\u0434\u043f\u0430\u043f\u043a\u0443 assets\/ \u0432 \u043d\u0435\u0439 \u043c\u043e\u0434\u0443\u043b\u044c inline<em>button.\u0424\u0430\u0439\u043b&nbsp;<\/em><a href=\"http:\/\/inline_button.rb\/\" rel=\"noopener noreferrer nofollow\"><em>inline<\/em>button.rb<\/a>&nbsp;:&nbsp;<\/p>\n<pre><code>class FishSocket   # This module assigned to creating InlineKeyboardButton   module InlineButton     GETACCOUNT = Telegram::Bot::Types::InlineKeyboardButton.new(text: '\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c account', callbackdata: 'getaccount')   end end <\/code><\/pre>\n<p>\u0421\u0434\u0435\u0441\u044c \u043c\u044b \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0432\u0441\u0451 \u043a \u0442\u043e\u043c\u0443 \u0436\u0435<strong>&nbsp;telegram-ruby-gem&nbsp;<\/strong>\u0447\u0442\u043e \u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044c\u0435\u043a\u0442 \u0442\u0438\u043f\u0430 InlineKeyboardButton.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0448\u0438\u0440\u0438\u043c \u043d\u0430\u0448 \u0444\u0430\u0439\u043b&nbsp;<strong>Reponse&nbsp;<\/strong>\u043d\u043e\u0432\u044b\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u043c\u0438 :&nbsp;<\/p>\n<pre><code>def inlinemessage(message, inlinemarkup,editless = false, chatid = false)   chat =<\/code><\/pre>\n<\/li>\n<\/li>\n<\/ul>\n<\/p>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-315785","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/315785","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=315785"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/315785\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=315785"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=315785"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=315785"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}