Security News
38% of CISOs Fear They’re Not Moving Fast Enough on AI
CISOs are racing to adopt AI for cybersecurity, but hurdles in budgets and governance may leave some falling behind in the fight against cyber threats.
Ruby wrapper for Telegram's Bot API.
Add following line to your Gemfile:
gem 'telegram-bot-ruby'
And then execute:
$ bundle
Or install it system-wide:
$ gem install telegram-bot-ruby
First things first, you need to obtain a token for your bot. Then create your Telegram bot like this:
require 'telegram/bot'
token = 'YOUR_TELEGRAM_BOT_API_TOKEN'
Telegram::Bot::Client.run(token) do |bot|
bot.listen do |message|
case message.text
when '/start'
bot.api.send_message(chat_id: message.chat.id, text: "Hello, #{message.from.first_name}")
when '/stop'
bot.api.send_message(chat_id: message.chat.id, text: "Bye, #{message.from.first_name}")
end
end
end
Note that bot.api
object implements Telegram Bot API methods as is. So you can invoke any method inside the block without any problems. All methods are available in both snake_case and camelCase notations.
Same thing about message
object - it implements Message spec, so you always know what to expect from it.
If you are going to use webhooks instead of long polling, you need to implement your own webhook callbacks server. Take a look at this repo as an example.
You can use your own custom keyboards. Here is an example:
bot.listen do |message|
case message.text
when '/start'
question = 'London is a capital of which country?'
# See more: https://core.telegram.org/bots/api#replykeyboardmarkup
answers =
Telegram::Bot::Types::ReplyKeyboardMarkup
.new(keyboard: [%w(A B), %w(C D)], one_time_keyboard: true)
bot.api.send_message(chat_id: message.chat.id, text: question, reply_markup: answers)
when '/stop'
# See more: https://core.telegram.org/bots/api#replykeyboardremove
kb = Telegram::Bot::Types::ReplyKeyboardRemove.new(remove_keyboard: true)
bot.api.send_message(chat_id: message.chat.id, text: 'Sorry to see you go :(', reply_markup: kb)
end
end
Furthermore, you can ask user to share location or phone number using KeyboardButton
:
bot.listen do |message|
kb = [
Telegram::Bot::Types::KeyboardButton.new(text: 'Give me your phone number', request_contact: true),
Telegram::Bot::Types::KeyboardButton.new(text: 'Show me your location', request_location: true)
]
markup = Telegram::Bot::Types::ReplyKeyboardMarkup.new(keyboard: kb)
bot.api.send_message(chat_id: message.chat.id, text: 'Hey!', reply_markup: markup)
end
Bot API 2.0 brought us new inline keyboards. Example:
bot.listen do |message|
case message
when Telegram::Bot::Types::CallbackQuery
# Here you can handle your callbacks from inline buttons
if message.data == 'touch'
bot.api.send_message(chat_id: message.from.id, text: "Don't touch me!")
end
when Telegram::Bot::Types::Message
kb = [
Telegram::Bot::Types::InlineKeyboardButton.new(text: 'Go to Google', url: 'https://google.com'),
Telegram::Bot::Types::InlineKeyboardButton.new(text: 'Touch me', callback_data: 'touch'),
Telegram::Bot::Types::InlineKeyboardButton.new(text: 'Switch to inline', switch_inline_query: 'some text')
]
markup = Telegram::Bot::Types::InlineKeyboardMarkup.new(inline_keyboard: kb)
bot.api.send_message(chat_id: message.chat.id, text: 'Make a choice', reply_markup: markup)
end
end
If you are going to create inline bot, check the example below:
bot.listen do |message|
case message
when Telegram::Bot::Types::InlineQuery
results = [
[1, 'First article', 'Very interesting text goes here.'],
[2, 'Second article', 'Another interesting text here.']
].map do |arr|
Telegram::Bot::Types::InlineQueryResultArticle.new(
id: arr[0],
title: arr[1],
input_message_content: Telegram::Bot::Types::InputTextMessageContent.new(message_text: arr[2])
)
end
bot.api.answer_inline_query(inline_query_id: message.id, results: results)
when Telegram::Bot::Types::Message
bot.api.send_message(chat_id: message.chat.id, text: "Hello, #{message.from.first_name}!")
end
end
Now, with inline
mode enabled, your message
object can be an instance of Message, InlineQuery or ChosenInlineResult. That's why you need to check type of each message and decide how to handle it.
Using answer_inline_query
you can send query results to user. results
field must be an array of query result objects.
Your bot can even upload files (photos, audio, documents, stickers, video) to Telegram servers. Just like this:
bot.listen do |message|
case message.text
when '/photo'
bot.api.send_photo(chat_id: message.chat.id, photo: Faraday::UploadIO.new('~/Desktop/jennifer.jpg', 'image/jpeg'))
end
end
By default, bot doesn't log anything (uses NullLoger
). You can change this behavior and provide your own logger class. See example below:
Telegram::Bot::Client.run(token, logger: Logger.new($stderr)) do |bot|
bot.logger.info('Bot has been started')
bot.listen do |message|
# ...
end
end
Since version 0.5.0
we rely on faraday under the hood. You can use any of supported adapters (for example, net/http/persistent
):
require 'net/http/persistent'
Telegram::Bot.configure do |config|
config.adapter = :net_http_persistent
end
If you don't know how to setup database for your bot or how to use it with different languages here are some boilerplates which can help you to start faster:
FAQs
Unknown package
We found that dialog_bot_ruby demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
CISOs are racing to adopt AI for cybersecurity, but hurdles in budgets and governance may leave some falling behind in the fight against cyber threats.
Research
Security News
Socket researchers uncovered a backdoored typosquat of BoltDB in the Go ecosystem, exploiting Go Module Proxy caching to persist undetected for years.
Security News
Company News
Socket is joining TC54 to help develop standards for software supply chain security, contributing to the evolution of SBOMs, CycloneDX, and Package URL specifications.