mirror of
https://github.com/LonamiWebs/Telethon.git
synced 2025-02-19 21:11:06 +03:00
Created MTProto vs Bot API (markdown)
parent
fbda74114b
commit
a3a64c66ba
177
MTProto-vs-Bot-API.md
Normal file
177
MTProto-vs-Bot-API.md
Normal file
|
@ -0,0 +1,177 @@
|
|||
HTTP Bot API vs MTProto comparison
|
||||
==================================
|
||||
|
||||
This page aims to show that
|
||||
[MTProto](https://core.telegram.org/mtproto) is superior to the [HTTP
|
||||
Bot API](https://core.telegram.org/bots/api) (from now on referred to as
|
||||
"botapi") when developing bots for [Telegram](https://telegram.org/).
|
||||
|
||||
> This page is in its early stages and needs a lot more work before
|
||||
> being complete, so it's subject to major refactoring. If you have more
|
||||
> information, please edit the page!
|
||||
|
||||
MTProto Advantages
|
||||
==================
|
||||
|
||||
Multiple Instances
|
||||
------------------
|
||||
|
||||
**Status**: Needs testing.
|
||||
|
||||
When you try to run multiple instances of a botapi bot, the old one will
|
||||
no longer receive updates from the server. MTProto lets you have
|
||||
multiple sessions active at the same time.
|
||||
|
||||
Get Messages by ID
|
||||
------------------
|
||||
|
||||
**Status**: Tested manually.
|
||||
|
||||
The botapi doesn't let you get any message by its ID. Instead, this is
|
||||
handled for you so that things like reply messages can always be
|
||||
provided.
|
||||
|
||||
In MTProto, bots can call
|
||||
[messages.getMessages](https://lonamiwebs.github.io/Telethon/methods/messages/get_messages.html)
|
||||
or
|
||||
[channels.getMessages](https://lonamiwebs.github.io/Telethon/methods/channels/get_messages.html)
|
||||
to get any message by its ID.
|
||||
|
||||
Full Control of Entity Access Hashes
|
||||
------------------------------------
|
||||
|
||||
**Status**: Needs testing.
|
||||
|
||||
Usually in Telegram, you need an entity ID and an access hash to be able
|
||||
to do something with that entity (like send a message to a user).
|
||||
|
||||
The botapi stores the access hashes for a limited amount of time, after
|
||||
which it can no longer implicitly provide the access hash to you, so
|
||||
calls such as [getChat](https://core.telegram.org/bots/api#getchat) will
|
||||
fail after your bot no longer has contact with the user for a while.
|
||||
|
||||
With MTProto you have full control over the access hashes, which allows
|
||||
you to perform tasks with the entity without relying on the server to
|
||||
store your access hashes.
|
||||
|
||||
Resolve anything by username
|
||||
----------------------------
|
||||
|
||||
**Status**: Tested manually.
|
||||
|
||||
The botapi has implicit resolving of *channel* usernames when making
|
||||
requests like
|
||||
[sendMessage](https://core.telegram.org/bots/api#sendmessage).
|
||||
|
||||
In MTProto bots can use
|
||||
[contacts.resolveUsername](https://lonamiwebs.github.io/Telethon/methods/contacts/resolve_username.html)
|
||||
to resolve *anything* by username.
|
||||
|
||||
Bulk Delete and Forward
|
||||
-----------------------
|
||||
|
||||
**Status**: Tested manually.
|
||||
|
||||
The botapi lets you delete a single message with
|
||||
[deleteMessage](https://core.telegram.org/bots/api#deletemessage) or
|
||||
[forwardMessage](https://core.telegram.org/bots/api#forwardmessage).
|
||||
|
||||
MTProto lets you bulk delete or forward up to 100 messages at a time
|
||||
([messages.deleteMessages](https://lonamiwebs.github.io/Telethon/methods/messages/delete_messages.html)/[channels.deleteMessages](https://lonamiwebs.github.io/Telethon/methods/channels/delete_messages.html)
|
||||
and
|
||||
[messages.forwardMessages](https://lonamiwebs.github.io/Telethon/methods/messages/forward_messages.html)).
|
||||
|
||||
Get participants of group
|
||||
-------------------------
|
||||
|
||||
**Status**: Tested manually.
|
||||
|
||||
The botapi only allows getting a subset of the participants in a group,
|
||||
with
|
||||
[getChatAdministrators](https://core.telegram.org/bots/api#getchatadministrators)
|
||||
to get administrators.
|
||||
|
||||
With MTProto, bots can use
|
||||
[channels.getParticipants](https://lonamiwebs.github.io/Telethon/methods/channels/get_participants.html)
|
||||
with plenty of different filters, which means you can fetch not only
|
||||
administrators but also banned people, kicked members, etc.
|
||||
|
||||
Byte Types
|
||||
----------
|
||||
|
||||
**Status**: Tested manually.
|
||||
|
||||
The botapi uses JSON to serialize data. JSON does not have a byte type,
|
||||
only strings. This means that fields like `callback_data` in a
|
||||
[InlineKeyboardButton](https://core.telegram.org/bots/api#inlinekeyboardbutton)
|
||||
can't accept arbitrary bytes like the description would have you
|
||||
believe.
|
||||
|
||||
In MTProto you can use arbitrary bytes in this field:
|
||||
[KeyboardButtonCallback](https://lonamiwebs.github.io/Telethon/constructors/keyboard_button_callback.html).
|
||||
|
||||
Full Control over Text Entities
|
||||
-------------------------------
|
||||
|
||||
**Status**: Tested manually.
|
||||
|
||||
The botapi only lets you use either HTML or Markup for adding text
|
||||
entities to your messages (eg: bold, links, etc).
|
||||
|
||||
With MTProto, entities are an entirely optional field in calls like
|
||||
[messages.SendMessageRequest](https://lonamiwebs.github.io/Telethon/methods/messages/send_message.htmL).
|
||||
This allows you to easily do things like [making the entire message
|
||||
monospace](https://github.com/udf/uniborg/blob/8290974235182dccab384f8fc5be653987c1b8c5/stdplugins/info.py#L15-L20)
|
||||
without having to worry about escaping the text.
|
||||
|
||||
See More Fields
|
||||
---------------
|
||||
|
||||
**Status**: Needs testing.
|
||||
|
||||
An example of this is when a user sends a message using an inline bot,
|
||||
the botapi does not provide the via\_bot\_id field of the message
|
||||
object, so you cannot tell which bot was used to send the message.
|
||||
|
||||
Faster Updates
|
||||
--------------
|
||||
|
||||
**Status**: Needs testing.
|
||||
|
||||
The botapi will inevitably need more work to be up and running after an
|
||||
update, while updating a MTProto based library can be done as soon as a
|
||||
layer change is published. Even if the botapi gets this change first,
|
||||
MTProto libraries can grab their layer. This is especially important in
|
||||
some cases:
|
||||
|
||||
> For all the adminbot devs:
|
||||
>
|
||||
> Bots can not see messages with animated stickers but clients already
|
||||
> show them or show the "This message is not supported...." message.
|
||||
> Which means groups can be spammed.
|
||||
|
||||
Anecdotal Advantages
|
||||
====================
|
||||
|
||||
Things that MTProto might do better than the botapi, but which we have
|
||||
no proof for.
|
||||
|
||||
Less Overhead
|
||||
-------------
|
||||
|
||||
Since the botapi servers use MTProto under the hood (through
|
||||
[TDLib](https://core.telegram.org/tdlib)), using MTProto directly would
|
||||
give you less overhead.
|
||||
|
||||
This doesn't really mean much unless the botapi server goes down or
|
||||
starts being slow. In that case, calls like
|
||||
[answerCallbackQuery](https://core.telegram.org/bots/api#answercallbackquery)
|
||||
can fail because you have a limited time to respond to it.
|
||||
|
||||
Update Comparison
|
||||
=================
|
||||
|
||||
The botapi does not send certain updates to your bot, for example
|
||||
messages being deleted.
|
||||
|
||||
(TODO: Add table comparing the updates from MTProto and botapi)
|
Loading…
Reference in New Issue
Block a user