Pure Python 3 MTProto API Telegram client library, for bots too!
Go to file
Lonami a7c7fdd2e4 Refactored interactive example
The interactive example now lives in a separate
class, independant from `main.py` (which no longer
exists) so it's more intuitive.
2016-09-12 14:07:45 +02:00
api Added custom errors, fixes to code generator 2016-09-05 18:35:12 +02:00
crypto Attempt at removing cyclic dependencies 2016-09-08 16:55:46 +02:00
network Minor improvement to updates handling 2016-09-11 11:50:38 +02:00
parser Minor improvement to updates handling 2016-09-11 11:50:38 +02:00
tl Refactored interactive example 2016-09-12 14:07:45 +02:00
unittests Completely refactored unit tests, removed unused code 2016-09-08 16:11:37 +02:00
utils Added ability to upload and send media, and more fixes 2016-09-11 13:10:27 +02:00
.gitignore First attempt at TelegramClient. Added fixes and doc 2016-09-04 11:07:18 +02:00
errors.py Added ability to upload and send media, and more fixes 2016-09-11 13:10:27 +02:00
interactive_telegram_client.py Refactored interactive example 2016-09-12 14:07:45 +02:00
LICENSE Updated README.md 2016-09-10 14:10:47 +02:00
README.md Updated README.md 2016-09-11 17:22:01 +02:00
scheme.tl Several updates, fixes and additions (TcpClient, MtProto...) 2016-09-06 18:54:49 +02:00
telegram_client.py Refactored interactive example 2016-09-12 14:07:45 +02:00
tl_generator.py Added ability to upload and send media, and more fixes 2016-09-11 13:10:27 +02:00
unit_tests.py Completely refactored unit tests, removed unused code 2016-09-08 16:11:37 +02:00

Telethon

Telethon is Telegram client implementation in Python. This project's core is completely based on TLSharp. All the files which are fully based on it will have a notice on the top of the file. Also don't forget to have a look to the original project.

The files without the previously mentioned notice are no longer part of TLSharp itself, or have enough modifications to make them entirely different.

Table of contents

Why Telethon?

Why should I bother with Telethon? You already mentioned TLSharp. telegram-cli has also been around for a long while. And we have the official clients!

With Telethon you don't really need to know anything before using it. Create a client with your settings. Connect. You're ready to go.

Being written on Python, Telethon can run as a script under any environment you wish, (yes, Android too). You can schedule it, or use it in any other script you have. Want to send a message to someone when you're available? Write a script. Do you want check for new messages at a given time and find relevant ones? Write a script.

An official client has a feature which Telethon doesn't? Implement it easily.

Requirements

Python modules

This project requires the following Python modules, which can be installed by issuing sudo -H pip3 install <module> on a Linux terminal:

Obtaining your API ID and Hash

  1. Follow this link and login with your phone number.
  2. Click under API Development tools.
  3. A Create new application window will appear. Fill in your application details. There is no need to enter any URL, and only the first two fields (App title and Short name) can be changed later as long as I'm aware.
  4. Click on Create application at the end. Now that you have the API ID and Hash, head to api/ directory and create a copy of the settings_example file, naming it settings (lowercase!). Then fill the file with the corresponding values (your api_id, api_hash and phone number in international format).

Running Telethon

First of all, you need to run the tl_generator.py by issuing python3 tl_generator.py. This will generate all the TLObjects from the given scheme.tl file. When it's done, you can run python3 main.py to start the interactive example.

Advanced uses

Using more than just TelegramClient

The TelegramClient class should be used to provide a quick, well-documented and simplified starting point. It is not meant to be a place for all the available Telegram Request's, because there are simply too many.

However, this doesn't mean that you cannot invoke all the power of Telegram's API. Whenever you need to invoke a Telegram Request, all you need to do is the following:

result = client.invoke(SomeRequest(...))

You have just invoke'd SomeRequest and retrieved its result! That wasn't hard at all, was it? Now you may wonder, what's the deal with all the power of Telegram's API? Have a look under tl/functions/. That is everything you can do. You have over 200 API Request's at your disposal.

However, we don't pretty know how that result looks like. Easy. print(str(result)) should give you a quick overview. Nevertheless, there may be more than a single result! Let's have a look at this seemingly innocent TL definition:

messages.getWebPagePreview#25223e24 message:string = MessageMedia;

Focusing on the end, we can see that the result of invoking GetWebPagePreviewRequest is MessageMedia. But how can MessageMedia exactly look like? It's time to have another look, but this time under tl/types/:

$ tree -P "message_media_*"
.
├── tl
│   └── types
│       ├── message_media_contact.py
│       ├── message_media_document.py
│       ├── message_media_empty.py
│       ├── message_media_geo.py
│       ├── message_media_photo.py
│       ├── message_media_unsupported.py
│       ├── message_media_venue.py
│       └── message_media_web_page.py

Those are eight different types! How do we know what exact type it is to determine its properties? A simple if type(result) == MessageMediaContact: or similar will do. Now you're ready to take advantage of Telegram's polymorphism.

Tips for porting Telethon

First of all, you need to understand how the scheme.tl (TL language) works. Every object definition is written as follows:

name#id argument_name:argument_type = CommonType

This means that in a single line you know what the TLObject name is. You know it's unique ID, and you know what arguments it has. It really isn't that hard to write a generator for generating code to any platform!

The generated code should also be able to encode the Request into bytes, so they can be sent over the network. This isn't a big deal either, because you know how the TLObject's are made.

Once you have your own code generator, start by looking at the first release of Telethon. The code there is simple to understand, easy to read and hence easy to port. No extra useless features. Only the bare bones. Perfect for starting a new implementation.

P.S.: I may have lied a bit. The TL language is not that easy. But it's not that hard either. You're free to sniff the parser/ files and learn how to parse other more complex lines. Or simply use that code and change the SourceBuilder!

Code generator limitations

The current code generator is not complete, yet adding the missing features would only over-complicate an already hard-to-read code. Some parts of the .tl file should be omitted, because they're "built-in" in the generated code (such as writing booleans, etc.).

In order to make sure that all the generated files will work, please make sure to always comment out these lines in scheme.tl (the latest version can always be found here):

// boolFalse#bc799737 = Bool;
// boolTrue#997275b5 = Bool;
// true#3fedd339 = True;
// vector#1cb5c415 {t:Type} # [ t ] = Vector t;

Also please make sure to rename updates#74ae4240 ... to updates_tg#74ae4240 ... or similar to avoid confusion between the updates folder and the updates.py file! Note that depending on the name, it may break things somewhere else. So please stick with the suggested name or give one which is still descriptive enough and easy to remember.

Updating the scheme.tl

Have you found a more updated version of the scheme.tl file? Those are great news! Updating is as simple as grabbing the latest version and replacing the one you can find in this same directory by the updated one. Don't forget to run python3 tl_generator.py afterwards and specifying the new layer number to be used when creating the TelegramClient.

If the changes weren't too big, everything should still work the same way as it did before; but with extra features.

Plans for the future

If everything works well, this probably ends up being a Python package :)

But as of now, and until that happens, help is highly appreciated!