Building Telegram Bots: Develop Bots in 12 Programming Languages using the Telegram Bot API 1st Edition Nicolas Modrzyk 2024 scribd download
Building Telegram Bots: Develop Bots in 12 Programming Languages using the Telegram Bot API 1st Edition Nicolas Modrzyk 2024 scribd download
com
https://textbookfull.com/product/building-telegram-bots-
develop-bots-in-12-programming-languages-using-the-telegram-
bot-api-1st-edition-nicolas-modrzyk/
OR CLICK BUTTON
DOWNLOAD NOW
https://textbookfull.com/product/introducing-azure-bot-service-
building-bots-for-business-waghmare/
textboxfull.com
https://textbookfull.com/product/practical-bot-development-designing-
and-building-bots-with-node-js-and-microsoft-bot-framework-szymon-
rozga/
textboxfull.com
https://textbookfull.com/product/designing-bots-creating-
conversational-experiences-1st-edition-amir-shevat/
textboxfull.com
https://textbookfull.com/product/java-image-processing-recipes-with-
opencv-and-jvm-1st-edition-nicolas-modrzyk/
textboxfull.com
Nicolas Modrzyk
Building Telegram Bots: Develop Bots in 12 Programming Languages using
the Telegram Bot API
Nicolas Modrzyk
Tokyo, Tokyo, Japan
iii
Table of Contents
iv
Table of Contents
v
Table of Contents
vi
Table of Contents
vii
Table of Contents
Index�������������������������������������������������������������������������������������������������271
viii
About the Author
Nicolas Modrzyk has more than 15 years of
IT experience in Asia, Europe, and the United
States and is currently CTO of an international
consulting company in Tokyo, Japan. He is
the author of four other published books,
mostly focused on the Clojure language and
expressive code. When not bringing new
ideas to customers, he spends time with his
two fantastic daughters, Mei and Manon, and
playing live music internationally.
ix
About the Technical Reviewers
Dushyant Rathore is currently working as
a firmware engineer with Western Digital.
His experience includes full-stack web
development, machine learning, decentralized
applications, and others. Dushyant has worked
on several kinds of projects related to IoT,
chatbots, web sites, scrapers, command-
line tools, and machine learning projects,
among others, at various startups. He has participated in national and
international hackathons and has won a few of them. He is a big cloud
computing enthusiast.
xi
Acknowledgments
It’s been yet another typing race to get this book out on time and beat the
odds. Divya and Nikhil, thank you so much for teaming up again. I’m really
looking forward to our next collaboration!
I received support from so many people that it would take another
book just to write the list of names. Nevertheless…
Thank you to my sister, Emily, my brother, Gregor, Mum and Dad,
family, cousins, uncles, aunts, friends, Abe-san, Sawada-san, Gucci,
Marshall, Momo, my soulmate Sachiko, soccer friends (I would break a
knee for you), the Irish crew still enjoying Guinness (one more for me!),
the awesome people in America (who always find the LPs I’m missing),
Chris and the Biners, the French team that’s always there to support
me, even without being asked, and the people deep in my heart, for
your never-ending support. I could not have finished this without you.
I appreciate you all so much.
And, of course, thank you to my two wonderful daughters, Mei and
Manon, for keeping up and always doing your best, even during hard
times. You rock! I love you.
xiii
Introduction
With a hundred ways to do a dozen things, why not try it all?
—Julian Casablancas
Have you ever wondered how you could accomplish more by doing less,
how you could have a sort of double who does all the work while you enjoy
some cool beachside or spend more outdoor time with your beautiful
children? I always have.
I am a big fan of the Telegram chat platform. Let’s call it a platform,
because it is more than a simple chat service with which you can stay in
touch with people who matter to you most. It also enables you to think in
ways you haven’t before.
For example, living in Tokyo, you always care about what time the last
train home is going to depart. I guess most people in big cities around the
globe probably have that same concern. Checking the clock only every so
often can result in a terrible and/or expensive taxi ride, so I started wanting
something that automatically offered me a bunch of options to get home.
The first bot I wrote was to tell me the schedule of the last few trains
home and some different options, from the easiest to reach before the last
few departures to the very latest, which I would have to dash to catch. That
saved me quite a bit of money.
The second bot I wrote was slightly more IoT-oriented. It used a
webcam to send me via Telegram pictures of people who rang my doorbell.
The third one, I also remember, was kind of stupid. It was to use a mini
projector to display the most recent message coming through a Telegram
chat room. (It’s very entertaining to view random messages during a small
party at home.)
xv
Introduction
But there are so many things for which to try to build a bot—search
for a plane ticket, check your fridge, etc. Having a bot is a simple way
to facilitate all the things you do daily, using the same kind of simple
Telegram chat rooms to get answers to questions related to daily life or to
issue commands and conquer the world.
This relatively short book is about learning how to write Telegram
bots in several different programming languages. Why not use one
and stick to it? you might ask. Well, because there’s not one answer to
all questions, and what’s right for others might not be suitable for you.
Exploring different programming languages is also a fun way to examine
the strengths of each language while performing the same tasks. Each of
the Telegram concepts can be introduced one after the other, in a simple
fashion.
Or, you could just jump in and choose the language you want to try and
get started in no time. Some people want it to happen; some wish it would
happen; others make it happen. So, enjoy reading this book, and make it
happen.
xvi
CHAPTER 1
Week 1: Ruby
Mindful Monday Humans, may your coffee kick in before
reality does.
—Napz Cherub Pellazo
Ruby took the world by storm a while ago, owing to the ease and concision
of the code you can write with it. Most programmers have a sweet spot for
Ruby, and when their shell scripts and day-to-day lives get too messy, they
are usually very quick to switch to Ruby.
This first chapter is a bit special, because on top of creating a client
for our bot, I must also introduce you to how to create the bot itself.
Throughout the book, this first bot will be reused at will, although, of
course, the same steps used to make it could be used to create a bot army
and conquer the world!
C
hatting with the BotFather
To register your own Telegram bot, you must talk to the father of all bots.
This bot father has a name, BotFather; Brad or Vladimir just doesn’t cut it.
He can be reached via Telegram as @BotFather.
BotFather does not sleep and can be reached at any time of day.
BotFather does take showers and always looks fresh. Here is the last profile
picture we have of this handsome bot (Figure 1-1).
Finding BotFather is not so difficult; you just have to type his name,
“@BotFather,” in the Telegram list of people in the search box of your
Telegram client (Figure 1-2).
2
Chapter 1 Week 1: Ruby
In the preceding list, the name is the one at the bottom. Next, start a
new chat with BotFather by clicking it.
Once the chat is started, you will also be welcomed by our handsome
bot, with a cordial message about APIs, free help, and an invitation to start
the chat (Figure 1-3).
Once the chat has begun (by pressing the Start button that you can see
at the bottom), you are welcomed by BotFather with a bunch of options on
how to create or edit your list of bots (Figure 1-4).
3
Chapter 1 Week 1: Ruby
4
Chapter 1 Week 1: Ruby
Great! I won’t review the full list of options now but will start just by
creating our new bot. This is done here by typing in the /newbot command
and then following a simple conversation, such as the one in Figure 1-5.
Your bot is now ready to use. Can you see in red something like a
secret code? This is the bot token, which is a chain of characters that
will be used to uniquely identify and authenticate your bot against
the Telegram platform. Do not give away this token. Don’t write it in
a book or allow it to hang somewhere on GitHub, especially now that
Microsoft owns it.
5
Chapter 1 Week 1: Ruby
In our case, in the preceding chat, the token that was generated and
given to use is the one following:
624028896:AAFGfIXp3FEPtX1_S2zmHodHRNpu_wD1acA
If your token, like this one, ever becomes compromised, you can use
the /token command with the bot father, to generate a new token, as
shown in the conversation in Figure 1-6.
Alright, the registration of our Telegram bot is all done. So, let’s switch
to a little bit of coding in Ruby.
6
Chapter 1 Week 1: Ruby
S
etting Up Ruby
Ruby, on most Unix-like platforms, including OS X, is already installed,
or it can be installed using a package manager. For those running lesser
operating systems, like Windows, you can download and install the Ruby
installer (Figure 1-7) from the Ruby download page at www.ruby-lang.
org/en/downloads/. Download the most recent version.
ruby -v
gem -v
7
Chapter 1 Week 1: Ruby
If you have never used Ruby before, you may be wondering what the
gem executable is? It’s simply a Ruby-specific installer for libraries (just like
npm is for Node and pip is for Python), so when you require some open
source library that has been written by someone else, you would use gem to
get it on your machine and the ruby executable to run it.
Apart from Ruby, to have some coding fun outside Notepad, you also
need a text editor, so I propose to use Microsoft’s Visual Studio Code
(https://code.visualstudio.com/), but, of course, any of your favorite
text editors will do.
Alright, let’s get started and code our first bot.
8
Chapter 1 Week 1: Ruby
mkdir chapter-01
cd chapter-01
gem install telegram_bot
9
Chapter 1 Week 1: Ruby
require 'telegram_bot'
10
Chapter 1 Week 1: Ruby
To run the preceding written program on your machine, you pass the
name of the program file, step0.rb, to the ruby executable. Let’s do it.
At the terminal, execute the following command:
ruby step0.rb
Oops! That did not go so well. We forgot to pass the Telegram token to
our program.
This can be done on Linux or OS X with the following:
export BOT_TOKEN='585672177:AAHswpmdA2zP52ZWoJMdteGa0xQ8KeynWvE'
set BOT_TOKEN=585672177:AAHswpmdA2zP52ZWoJMdteGa0xQ8KeynWvE
Let’s run the program again. This time, it looks like the command
is not finishing… This is expected, as the bot is now actually waiting for
messages.
Let’s be the one to start the conversation, so let’s send a greeting
message.
In the Telegram window, search for the bot and start chatting
(Figure 1-11).
11
Chapter 1 Week 1: Ruby
Hmmm, that was not very readable. With Ruby, you can display a more
legible version of any object, by using the to_yaml function. Let’s update
the code and see what happens.
We call require 'yaml', to import it into the Ruby namespace, and
now we can call the to_yaml on the message the bot has received.
require 'telegram_bot'
require 'yaml'
bot = TelegramBot.new(token: ENV['BOT_TOKEN'])
12
Chapter 1 Week 1: Ruby
bot.get_updates() do |message|
# puts message.to_s
puts message.to_yaml
end
You would have to type Ctrl-C to terminate the running version of the
bot first and then start the new bot, by executing the ruby command again.
Figure 1-13 shows the outcome.
In the console, or in the terminal where the bot was started, you now
can see a more detailed version of the received message.
13
Chapter 1 Week 1: Ruby
For standard messages, there is not much beyond what you would
expect from a chat message object. You will probably use the date, text,
and from fields most of the time.
14
Chapter 1 Week 1: Ruby
F irst Reply
Again, Ruby’s concision makes it quite easy to create strings from objects.
With the following, you can use blocks of executable code directly within a
string: #{}.
This makes it very powerful for templated messages, and in our case,
for bot programming. Within the get_updates() call block, let’s now write
and send a reply.
message.reply do |reply|
reply.text = "Hello, #{message.from.first_name}!"
reply.send_with(bot)
end
After restarting the bot (Ctrl-C, ruby step0.rb), we can start a more
talkative version of this Ruby bot (Figure 1-14).
15
Exploring the Variety of Random
Documents with Different Content
3
When Lady Molly heard this theory she laughed, and shrugged her
pretty shoulders.
“Old Mr. Frewin was dying, was he not, at the time of the
burglary?” she said. “Why should his wife, soon to become his
widow, take the trouble to go through a laboured and daring comedy
of a burglary in order to possess herself of things which would
become hers within the next few hours? Even if, after Mr. Frewin’s
death, she could not actually dispose of the miniatures, the old man
left her a large sum of money and a big income by his will, with
which she could help her spendthrift son as much as she pleased.”
This was, of course, why the mystery in this strange case was so
deep. At the Yard they did all that they could. Within forty-eight hours
they had notices printed in almost every European language, which
contained rough sketches of the stolen miniatures hastily supplied by
Mrs. Frewin herself. These were sent to as many of the great
museums and art collectors abroad as possible, and of course to the
principal American cities and to American millionaires. There is no
doubt that the thief would find it very difficult to dispose of the
miniatures, and until he could sell them his booty would, of course,
not benefit him in any way. Works of art cannot be tampered with, or
melted down or taken to pieces, like silver or jewellery, and, so far as
could be ascertained, the thief did not appear to make the slightest
attempt to dispose of the booty, and the mystery became more dark,
more impenetrable than ever.
“Will you undertake the job?” said the chief one day to Lady Molly.
“Yes,” she replied, “on two distinct conditions.”
“What are they?”
“That you will not bother me with useless questions, and that you
will send out fresh notices to all the museums and art collectors you
can think of, and request them to let you know of any art purchases
they may have made within the last two years.”
“The last two years!” ejaculated the chief, “why, the miniatures
were only stolen three months ago.”
“Did I not say that you were not to ask me useless questions?”
This to the chief, mind you; and he only smiled, whilst I nearly fell
backwards at her daring. But he did send out the notices, and it was
generally understood that Lady Molly now had charge of the case.
4
It was about seven weeks later when, one morning, I found her at
breakfast looking wonderfully bright and excited.
“The Yard has had sheaves of replies, Mary,” she said gaily, “and
the chief still thinks I am a complete fool.”
“Why, what has happened?”
“Only this, that the art museum at Budapest has now in its
possession a set of eight miniatures by Engleheart; but the
authorities did not think that the first notices from Scotland Yard
could possibly refer to these, as they had been purchased from a
private source a little over two years ago.”
“But two years ago the Frewin miniatures were still at Blatchley
House, and Mr. Frewin was fingering them daily,” I said, not
understanding, and wondering what she was driving at.
“I know that,” she said gaily, “so does the chief. That is why he
thinks that I am a first-class idiot.”
“But what do you wish to do now?”
“Go to Brighton, Mary, take you with me and try to elucidate the
mystery of the Frewin miniatures.”
“I don’t understand,” I gasped, bewildered.
“No, and you won’t until we get there,” she replied, running up to
me and kissing me in her pretty, engaging way.
That same afternoon we went to Brighton and took up our abode
at the Hotel Metropole. Now you know I always believed from the
very first that she was a born lady and all the rest of it, but even I
was taken aback at the number of acquaintances and smart friends
she had all over the place. It was “Hello, Lady Molly! whoever would
have thought of meeting you here?” and “Upon my word! this is good
luck,” all the time.
She smiled and chatted gaily with all the folk as if she had known
them all her life, but I could easily see that none of these people
knew that she had anything to do with the Yard.
Brighton is not such a very big place as one would suppose, and
most of the fashionable residents of the gay city find their way
sooner or later to the luxurious dining-room of the Hotel Metropole, if
only for a quiet little dinner given when the cook is out. Therefore I
was not a little surprised when, one evening, about a week after our
arrival and just as we were sitting down to the table d’hôte dinner,
Lady Molly suddenly placed one of her delicate hands on my arm.
“Look behind you, a little to your left, Mary, but not just this minute.
When you do you will see two ladies and two gentlemen sitting at a
small table quite close to us. They are Sir Michael and Lady Steyne,
the Honourable Mrs. Frewin in deep black, and her son, Mr. Lionel
Frewin.”
I looked round as soon as I could, and gazed with some interest at
the hero and heroine of the Blatchley House drama. We had a quiet
little dinner, and Lady Molly having all of a sudden become very
silent and self-possessed, altogether different from her gay, excited
self of the past few days, I scented that something important was in
the air, and tried to look as unconcerned as my lady herself. After
dinner we ordered coffee, and as Lady Molly strolled through into the
lounge, I noticed that she ordered our tray to be placed at a table
which was in very close proximity to one already occupied by Lady
Steyne and her party.
Lady Steyne, I noticed, gave Lady Molly a pleasant nod when we
first came in, and Sir Michael got up and bowed, saying “How d’ye
do?” We sat down and began a desultory conversation together.
Soon, as usual, we were joined by various friends and
acquaintances who all congregated round our table and set
themselves to entertaining us right pleasantly. Presently the
conversation drifted to art matters, Sir Anthony Truscott being there,
who is, as you know, one of the keepers of the Art Department at
South Kensington Museum.
“I am crazy about miniatures just now,” said Lady Molly in
response to a remark from Sir Anthony.
I tried not to look astonished.
“And Miss Granard and I,” continued my lady, quite unblushingly,
“have been travelling all over the Continent in order to try and secure
some rare specimens.”
“Indeed,” said Sir Anthony. “Have you found anything very
wonderful?”
“We certainly have discovered some rare works of art,” replied
Lady Molly, “have we not, Mary? Now the two Englehearts we
bought at Budapest are undoubtedly quite unique.”
“Engleheart—and at Budapest!” remarked Sir Anthony. “I thought I
knew the collections at most of the great Continental cities, but I
certainly have no recollection of such treasures in the Hungarian
capital.”
“Oh, they were only purchased two years ago, and have only been
shown to the public recently,” remarked Lady Molly. “There was
originally a set of eight, so the comptroller, Mr. Pulszky, informed me.
He bought them from an English collector whose name I have now
forgotten, and he is very proud of them, but they cost the country a
great deal more money than it could afford, and in order somewhat
to recoup himself Mr. Pulszky sold two out of the eight at, I must say,
a very stiff price.”
While she was talking I could not help noticing the strange glitter in
her eyes. Then a curious smothered sound broke upon my ear. I
turned and saw Mrs. Frewin looking with glowing and dilated eyes at
the charming picture presented by Lady Molly.
“I should like to show you my purchases,” said the latter to Sir
Anthony. “One or two foreign connoisseurs have seen the two
miniatures and declare them to be the finest in existence. Mary,” she
added, turning to me, “would you be so kind as to run up to my room
and get me the small sealed packet which is at the bottom of my
dressing-case? Here are the keys.”
A little bewildered, yet guessing by her manner that I had a part to
play, I took the keys from her and went up to her room. In her
dressing-case I certainly found a small, square, flat packet, and with
that in my hand I prepared to go downstairs again. I had just locked
the bedroom door when I was suddenly confronted by a tall, graceful
woman dressed in deep black, whom I at once recognised as the
Honourable Mrs. Frewin.
“You are Miss Granard?” she said quickly and excitedly; her voice
was tremulous and she seemed a prey to the greatest possible
excitement. Without waiting for my reply she continued eagerly:
“Miss Granard, there is no time to be more explicit, but I give you
my word, the word of a very wretched, heart-broken woman, that my
very life depends upon my catching a glimpse of the contents of the
parcel that you now have in your hand.”
“But——” I murmured, hopelessly bewildered.
“There is no ‘but,’ ” she replied. “It is a matter of life and death.
Here are £200, Miss Granard, if you will let me handle that packet,”
and with trembling hands she drew a bundle of bank-notes from her
reticule.
I hesitated, not because I had any notion of acceding to Mrs.
Frewin’s request, but because I did not quite know how I ought to act
at this strange juncture, when a pleasant, mellow voice broke in
suddenly:
“You may take the money, Mary, if you wish. You have my
permission to hand the packet over to this lady,” and Lady Molly,
charming, graceful and elegant in her beautiful directoire gown,
stood smiling some few feet away, with Hankin just visible in the
gloom of the corridor.
She advanced towards us, took the small packet from my hands,
and held it out towards Mrs. Frewin.
“Will you open it?” she said, “or shall I?”
Mrs. Frewin did not move. She stood as if turned to stone. Then
with dexterous fingers my lady broke the seals of the packet and
drew from it a few sheets of plain white cardboard and a thin piece of
match-boarding.
“There!” said Lady Molly, fingering the bits of cardboard while she
kept her fine large eyes fixed on Mrs. Frewin; “£200 is a big price to
pay for a sight of these worthless things.”
“Then this was a vulgar trick,” said Mrs. Frewin, drawing herself up
with an air which did not affect Lady Molly in the least.
“A trick, certainly,” she replied with her winning smile, “vulgar, if
you will call it so—pleasant to us all, Mrs. Frewin, since you so
readily fell into it.”
“Well, and what are you going to do next?”
“Report the matter to my chief,” said Lady Molly, quietly. “We have
all been very severely blamed for not discovering sooner the truth
about the disappearance of the Frewin miniatures.”
“You don’t know the truth now,” retorted Mrs. Frewin.
“Oh, yes, I do,” replied Lady Molly, still smiling. “I know that two
years ago your son, Mr. Lionel Frewin, was in terrible monetary
difficulties. There was something unavowable, which he dared not
tell his father. You had to set to work to find money somehow. You
had no capital at your own disposal, and you wished to save your
son from the terrible consequences of his own folly. It was soon after
M. de Colinville’s visit. Your husband had had his first apoplectic
seizure; his mind and eyesight were somewhat impaired. You are a
clever artist yourself, and you schemed out a plan whereby you
carefully copied the priceless miniatures and then entrusted them to
your son for sale to the Art Museum at Budapest, where there was
but little likelihood of their being seen by anyone who knew they had
belonged to your husband. English people do not stay more than
one night there, at the Hotel Hungaria. Your copies were works of art
in themselves, and you had no difficulty in deceiving your husband in
the state of mind he then was, but when he lay dying you realised
that his will would inevitably be proved, wherein he bequeathed the
miniatures to Mr. James Hyam, and that these would have to be
valued for probate. Frightened now that the substitution would be
discovered, you devised the clever comedy of the burglary at
Blatchley, which, in the circumstances, could never be brought home
to you or your son. I don’t know where you subsequently concealed
the spurious Engleheart miniatures which you calmly took out of the
library and hid away during the night of your husband’s death, but no
doubt our men will find that out,” she added quietly, “now that they
are on the track.”
With a frightened shriek Mrs. Frewin turned as if she would fly, but
Lady Molly was too quick for her, and barred the way. Then, with that
wonderful charm of manner and that innate kindliness which always
characterised her, she took hold of the unfortunate woman’s wrist.
“Let me give you a word of advice,” she said gently. “We at the
Yard will be quite content with a confession from you, which will clear
us of negligence and satisfy us that the crime has been brought
home to its perpetrator. After that try and enter into an arrangement
with your husband’s legatee, Mr. James Hyam. Make a clean breast
of the whole thing to him and offer him full monetary compensation.
For the sake of the family he won’t refuse. He would have nothing to
gain by bruiting the whole thing abroad; and for his own sake and
that of his late uncle, who was so good to him, I don’t think you
would find him hard to deal with.”
Mrs. Frewin paused awhile, undecided and still defiant. Then her
attitude softened; she turned and looked full at the beautiful, kind
eyes turned eagerly up to hers, and pressing Lady Molly’s tiny hand
in both her own she whispered:
“I will take your advice. God bless you.”
She was gone, and Lady Molly called Hankin to her side.
“Until we have that confession, Hankin,” she said, with the quiet
manner she always adopted where matters connected with her work
were concerned, “Mum’s the word.”
“Ay, and after that, too, my lady,” replied Hankin, earnestly.
You see, she could do anything she liked with the men, and I, of
course, was her slave.
Now we have got the confession, Mrs. Frewin is on the best of
terms with Mr. James Hyam, who has behaved very well about the
whole thing, and the public has forgotten all about the mystery of the
Frewin miniatures.
III.
THE IRISH-TWEED COAT
do?” said Lady Molly after a while. “Do you want to take the proofs
over yourself to your boy’s advocate? Is that it?”
“No, that would be no good,” he replied simply. “I am known in
Sicily. I should be watched, probably murdered, too, and my death
would not benefit my boy.”
“But what then?”
“My boy’s uncle is chief officer of police at Cividale, on the Austro-
Italian frontier. I know that I can rely on his devotion. Mrs. Tadworth,
whose interest in my boy is almost equal to my own, and whose
connection with me cannot possibly be known out there, will take the
proofs of my boy’s innocence to him. He will know what to do and
how to reach my son’s advocate safely, which no one else could
guarantee to do.”
“Well,” said Lady Molly, “that being so, what is it that you want us
to do in the matter?”
“I want a lady’s help, miss—er—ma’am,” he replied, “someone
who is able, willing, strong, and, if possible, enthusiastic, to
accompany Mrs. Tadworth—perhaps in the capacity of a maid—just
to avert the usual suspicious glances thrown at a lady travelling
alone. Also the question of foreign languages comes in. The
gentleman I saw at Scotland Yard said that if you cared to go he
would give you a fortnight’s leave of absence.”
“Yes, I’ll go!” rejoined Lady Molly, simply.
2
Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.
textbookfull.com