mirror of
https://github.com/LonamiWebs/Telethon.git
synced 2024-11-22 09:26:37 +03:00
Update documentation
This commit is contained in:
parent
837258f4c8
commit
183d07ff25
|
@ -1,2 +1,210 @@
|
||||||
Frequently Asked Questions
|
Frequently Asked Questions (FAQ)
|
||||||
==========================
|
================================
|
||||||
|
|
||||||
|
.. currentmodule:: telethon
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
|
||||||
|
|
||||||
|
Code without errors doesn't work
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
Then it probably has errors, but you haven't enabled logging yet.
|
||||||
|
To enable logging, at the following code to the top of your main file:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
import logging
|
||||||
|
logging.basicConfig(format='[%(levelname) 5s/%(asctime)s] %(name)s: %(message)s',
|
||||||
|
level=logging.WARNING)
|
||||||
|
|
||||||
|
Do not wrap your code in ``try / except`` blocks just to hide errors.
|
||||||
|
It will be a lot more difficult to find what the problem is.
|
||||||
|
Instead, let Python print the full traceback, or fix the actual error properly.
|
||||||
|
|
||||||
|
See the official Python documentation for more information on :mod:`logging`.
|
||||||
|
|
||||||
|
|
||||||
|
My account was deleted/limited when using the library
|
||||||
|
-----------------------------------------------------
|
||||||
|
|
||||||
|
First and foremost, **this is not a problem exclusive to Telethon.
|
||||||
|
Any third-party library is prone to cause the accounts to appear banned.**
|
||||||
|
Even official applications can make Telegram ban an account under certain circumstances.
|
||||||
|
Third-party libraries such as Telethon are a lot easier to use, and as such,
|
||||||
|
they are misused to spam, which causes Telegram to learn certain patterns and ban suspicious activity.
|
||||||
|
|
||||||
|
There is no point in Telethon trying to circumvent this. Even if it succeeded,
|
||||||
|
spammers would then abuse the library again, and the cycle would repeat.
|
||||||
|
|
||||||
|
The library will only do things that you tell it to do.
|
||||||
|
If you use the library with bad intentions, Telegram will hopefully ban you.
|
||||||
|
|
||||||
|
However, you may also be part of a limited country, such as Iran or Russia.
|
||||||
|
In that case, we have bad news for you. Telegram is much more likely to ban these numbers,
|
||||||
|
as they are often used to spam other accounts, likely through the use of libraries like this one.
|
||||||
|
The best advice we can give you is to not abuse the API, like calling many requests really quickly.
|
||||||
|
|
||||||
|
We have also had reports from Kazakhstan and China, where connecting would fail.
|
||||||
|
To solve these connection problems, you should use a proxy (see below).
|
||||||
|
|
||||||
|
Telegram may also ban virtual (VoIP) phone numbers, as again, they're likely to be used for spam.
|
||||||
|
|
||||||
|
More recently (year 2023 onwards), Telegram has started putting a lot more measures to prevent spam,
|
||||||
|
with even additions such as anonymous participants in groups or the inability to fetch group members at all.
|
||||||
|
This means some of the anti-spam measures have gotten more aggressive.
|
||||||
|
|
||||||
|
The recommendation has usually been to use the library only on well-established accounts (and not an account you just created),
|
||||||
|
and to not perform actions that could be seen as abuse.
|
||||||
|
Telegram decides what those actions are, and they're free to change how they operate at any time.
|
||||||
|
|
||||||
|
If you want to check if your account has been limited, simply send a private message to `@SpamBot <https://t.me/SpamBot>`_ through Telegram itself.
|
||||||
|
You should notice this by getting errors like ``PeerFlood``, which means you're limited,
|
||||||
|
for instance, when sending a message to some accounts but not others.
|
||||||
|
|
||||||
|
For more discussion, please see `issue 297 <https://github.com/LonamiWebs/Telethon/issues/297>`_.
|
||||||
|
|
||||||
|
|
||||||
|
How can I use a proxy?
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
Proxies can be used with Telethon, but they are not directly supported.
|
||||||
|
If you have problems with Telethon when using a proxy, it will *not* be considered a Telethon bug.
|
||||||
|
|
||||||
|
You can use any :mod:`asyncio`-compatible proxy library of your choice, and then define a custom connector:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
from telethon import Client
|
||||||
|
# from some_proxy_library import open_proxy_connection
|
||||||
|
|
||||||
|
async def my_proxy_connector(ip, port):
|
||||||
|
return await open_proxy_connection(
|
||||||
|
host=ip,
|
||||||
|
port=port,
|
||||||
|
proxy_url='socks5://user:password@127.0.0.1:1080'
|
||||||
|
)
|
||||||
|
|
||||||
|
client = Client(..., connector=my_proxy_connector)
|
||||||
|
|
||||||
|
For more information, see the :doc:`/concepts/datacenters` concept.
|
||||||
|
|
||||||
|
|
||||||
|
AttributeError: 'coroutine' object has no attribute 'id'
|
||||||
|
--------------------------------------------------------
|
||||||
|
|
||||||
|
Telethon is an asynchronous library, which means you must ``await`` calls that require network access:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
async def handler(event):
|
||||||
|
me = await client.get_me()
|
||||||
|
# ^^^^^ note the await
|
||||||
|
print(me.id)
|
||||||
|
|
||||||
|
|
||||||
|
sqlite3.OperationalError: database is locked
|
||||||
|
--------------------------------------------
|
||||||
|
|
||||||
|
An older process is still running and is using the same ``'session'`` file.
|
||||||
|
|
||||||
|
This error occurs when **two or more clients use the same session**,
|
||||||
|
that is, when you write the same session name to be used in the client:
|
||||||
|
|
||||||
|
* You have an older process using the same session file.
|
||||||
|
* You have two different scripts running (interactive sessions count too).
|
||||||
|
* You have two clients in the same script running at the same time.
|
||||||
|
|
||||||
|
The solution is, if you need two clients, use two sessions.
|
||||||
|
If the problem persists and you're on Linux, you can use ``fuser my.session`` to find out the process locking the file.
|
||||||
|
As a last resort, you can reboot your system.
|
||||||
|
|
||||||
|
If you really dislike SQLite, use a different session storage.
|
||||||
|
See the :doc:`/concepts/sessions` concept to learn more about session storages.
|
||||||
|
|
||||||
|
|
||||||
|
File download is slow or sending files takes too long
|
||||||
|
-----------------------------------------------------
|
||||||
|
|
||||||
|
The communication with Telegram is encrypted.
|
||||||
|
Encryption requires a lot of math, and doing it in pure Python is very slow.
|
||||||
|
|
||||||
|
``cryptg`` is a library which containns the encryption functions used by Telethon.
|
||||||
|
If it is installed (via ``pip install cryptg``), it will automatically be used and should provide a considerable speed boost.
|
||||||
|
|
||||||
|
|
||||||
|
What does "Task was destroyed but it is pending" mean?
|
||||||
|
------------------------------------------------------
|
||||||
|
|
||||||
|
Your script likely finished abruptly, the :mod:`asyncio` event loop got destroyed,
|
||||||
|
and the library did not get a chance to properly close the connection and close the session.
|
||||||
|
|
||||||
|
Make sure you're either using the context manager for the client (``with client``)
|
||||||
|
or always call :meth:`~Client.disconnect` before the scripts exits (for example, using ``try / finally``).
|
||||||
|
|
||||||
|
|
||||||
|
Can I use threading with the library?
|
||||||
|
-------------------------------------
|
||||||
|
|
||||||
|
Yes, if you know what you are doing.
|
||||||
|
However, you will probably have a lot of headaches to get :mod:`threading` threads and :mod:`asyncio` tasks to work together.
|
||||||
|
|
||||||
|
If you want to use a threaded library alongside Telethon, like `Flask <flask.pocoo.org/>`_,
|
||||||
|
consider instead using an asynchronous alternative like `Quart <https://pgjones.gitlab.io/quart/>`_.
|
||||||
|
|
||||||
|
If you want to do background work, you probably do not need threads.
|
||||||
|
See the :mod:`asyncio` documentation to learn how to use tasks and wait on multiple things at the same time.
|
||||||
|
|
||||||
|
|
||||||
|
Telethon gets stuck when used with other async libraries
|
||||||
|
--------------------------------------------------------
|
||||||
|
|
||||||
|
After you call :meth:`Client.connect` (either directly or implicitly via ``with client``),
|
||||||
|
you cannot change the :mod:`asyncio` event loop from which it's used.
|
||||||
|
|
||||||
|
The most common cause is :func:`asyncio.run`, since it creates a new event loop.
|
||||||
|
If you :func:`asyncio.run` a function to create the client and set it up, you cannot then use a second :func:`asyncio.run` on that client.
|
||||||
|
|
||||||
|
Instead, it's often a good idea to have a single ``async def main`` and :func:`asyncio.run` that.
|
||||||
|
From it, you're also able to call other ``async def`` without having to touch :func:`asyncio.run` again:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
# It's fine to create the client outside as long as you don't connect
|
||||||
|
client = Client(...)
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
# Now the client will connect, so the loop must not change from now on.
|
||||||
|
# But as long as you do all the work inside main, including calling
|
||||||
|
# other async functions, things will work.
|
||||||
|
async with client:
|
||||||
|
....
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
asyncio.run(main())
|
||||||
|
|
||||||
|
Be sure to read the :mod:`asyncio` documentation if you want a better understanding of event loop, tasks, and what functions you can use.
|
||||||
|
|
||||||
|
|
||||||
|
Can Telethon also do this thing the official clients do?
|
||||||
|
--------------------------------------------------------
|
||||||
|
|
||||||
|
With the exception of creating accounts, Telethon can do everything an official client can do.
|
||||||
|
|
||||||
|
Following the `Pareto principle <https://en.wikipedia.org/wiki/Pareto_principle>`_,
|
||||||
|
the small curated API Telethon offers aims to cover most common use-cases, but not all of them.
|
||||||
|
If your use-case is not covered by the :class:`Client` methods, you can instead resort to the :doc:`/concepts/full-api`.
|
||||||
|
|
||||||
|
To learn how Telegram Desktop performs a certain request, you can enable what is known as "debug mode".
|
||||||
|
Different clients may have different ways to enable this feature.
|
||||||
|
|
||||||
|
With the Settings screen of Telegram Desktop open, type "debugmode" on your keyboard (without quotes).
|
||||||
|
This should prompt you to confirm whether you want to enable DEBUG logs.
|
||||||
|
Confirm, and logging should commence.
|
||||||
|
|
||||||
|
With logging enabled, perform the action you want (for example, "delete all messages").
|
||||||
|
After that, open the text file starting with ``mtp_`` inside Telegram's ``DebugLogs`` folder.
|
||||||
|
You should find this folder where Telegram is installed (on Windows, ``%AppData%\Telegram Desktop``).
|
||||||
|
|
||||||
|
After you're done, you can disable debug mode in the same way you enabled it.
|
||||||
|
The debug logs may have recorded sensitive information, so be sure to delete them afterwards if you need to.
|
||||||
|
|
|
@ -8,9 +8,7 @@ class MemorySession(Storage):
|
||||||
"""
|
"""
|
||||||
Session storage without persistence.
|
Session storage without persistence.
|
||||||
|
|
||||||
This is the simplest storage and is the one used by default.
|
Session data is only kept in memory and is not saved to disk.
|
||||||
|
|
||||||
Session data is only kept in memory and is not persisted to disk.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__slots__ = ("session",)
|
__slots__ = ("session",)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user