⭐️ Thanks everyone who has starred the project, it means a lot!
This project is to help you use Telethon.
Djagno-Telethon is an asyncio Python 3 MTProto library to interact with Telegram's API as a user or through a bot account (bot API alternative).
Telegram is a popular messaging application. This library is meant to make it easy for you to write Python programs that can interact with Telegram. Think of it as a wrapper that has already done the heavy job for you, so you can focus on developing an application.
A Django-Telethon session storage implementation backed for Django ORM to use telethon in django projects.
- Python 3.7+
- Django 3.0+
- Use the following command to install using pip:
pip install django-telethon
OR
- You can use the following command to set it up locally so that you can fix bugs or whatever and send pull requests:
pip install -e ".[dev]"
pre-commit install
For better understanding, please read the:
- Telethon documentation.
- Telethon Session documentation.
- pre-commit documentation.
- pip documentation.
- python package documentation.
- github pull requests documentation.
INSTALLED_APPS = [
# ....
'django_telethon',
# ...
]
from django.contrib import admin
from django.urls import path
from django_telethon.urls import django_telethon_urls
admin.autodiscover()
urlpatterns = [
path('admin/', admin.site.urls),
path('telegram/', django_telethon_urls()),
]
python manage.py migrate
Before working with Telegram’s API, you need to get your own API ID and hash:
Login to your Telegram account with the phone number of the developer account to use. Click under API Development tools. 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 currently be changed later. Click on Create application at the end. Remember that your API hash is secret and Telegram won’t let you revoke it. Don’t post it anywhere!
This API ID and hash is the one used by your application, not your phone number. You can use this API ID and hash with any phone number or even for bot accounts.
Read more (proxy, bot and etc) Here.
-
Open a terminal and run the following command:
python manage.py shell
-
Enable
DJANGO_ALLOW_ASYNC_UNSAFE
in your environment.import os os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
-
You can import these from
django_telethon.sessions
. For example, using theDjangoSession
is done as follows:from telethon.sync import TelegramClient from django_telethon.sessions import DjangoSession from django_telethon.models import App, ClientSession from telethon.errors import SessionPasswordNeededError # Use your own values from my.telegram.org API_ID = 12345 API_HASH = '0123456789abcdef0123456789abcdef' app, is_created = App.objects.update_or_create( api_id=API_ID, api_hash=API_HASH ) cs = ClientSession.objects.update_or_create( name='default', ) telegram_client = TelegramClient(DjangoSession(client_session=cs), app.api_id, app.api_hash) telegram_client.connect() if not telegram_client.is_user_authorized(): phone = input('Enter your phone number: ') telegram_client.send_code_request(phone) code = input('Enter the code you received: ') try: telegram_client.sign_in(phone, code) except SessionPasswordNeededError: password = input('Enter your password: ') telegram_client.sign_in(password=password)
print((await telegram_client.get_me()).stringify())
await telegram_client.send_message('username', 'Hello! Talking to you from Telethon')
await telegram_client.send_file('username', '/home/myself/Pictures/holidays.jpg')
await telegram_client.download_profile_photo('me')
messages = await telegram_client.get_messages('username')
await messages[0].download_media()
@telegram_client.on(telegram_client.NewMessage(pattern='(?i)hi|hello'))
async def handler(event):
await event.respond('Hey!')
-
run the following command to start the server:
python manage.py runserver
-
run the following command to start telegram client:
python manage.py runtelegram
-
go to admin panel and telegram app section. create a new app. get data from the your Telegram account.
-
request code from telegram:
import requests import json url = "http://127.0.0.1:8000/telegram/send-code-request/" payload = json.dumps({ "phone_number": "+12345678901", "client_session_name": "name of the client session" }) headers = { 'Content-Type': 'application/json' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text)
-
send this request for sign in:
import requests import json url = "http://127.0.0.1:8000/telegram/login-user-request/" payload = json.dumps({ "phone_number": "+12345678901", "client_session_name": "name of the client session", "code": "1234", "password": "1234" }) headers = { 'Content-Type': 'application/json' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text)
send this request for sign in:
import requests
import json
url = "http://127.0.0.1:8000/telegram/login-bot-request/"
payload = json.dumps({
"bot_token": "bot token",
"client_session_name": "name of the client session",
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
If you are using supervisord or another process manager, you can use the following command to start the server:
python manage.py runtelegram
-
Add the following lines to your
/etc/supervisord.d/[yourproject].ini
file:[program:telegram_worker] directory=/home/projectuser/[your_project_directory]/ command=/home/projectuser/venv/bin/python manage.py runtelegram autostart=true autorestart=true stderr_logfile=/home/projectuser/logs/telegramworker.err.log stdout_logfile=/home/projectuser/logs/telegramworker.out.log
-
Reload the supervisor daemon:
supervisorctl reread supervisorctl update supervisorctl start telegram_worker supervisorctl status
After login telegram client the signal telegram_client_registered
is emitted.
-
you can listen to this signal by using the following code for example put this code to your
receivers.py
file in app directory:from functools import partial from django.dispatch import receiver from telethon import events from django_telethon.signals import telegram_client_registered async def event_handler(event, client_session): print(client_session.name, event.raw_text, sep=' | ') # if you need access to telegram client, you can use event.client # telegram_client = event.client await event.respond('!pong') @receiver(telegram_client_registered) def receiver_telegram_registered(telegram_client, client_session, *args, **kwargs): handler = partial(event_handler, client_session=client_session) telegram_client.add_event_handler( handler, events.NewMessage(incoming=True, pattern='ping'), )
-
In the
apps.py
file, add the following code:from django.apps import AppConfig class MyAppConfig(AppConfig): ... def ready(self): from .receivers import receiver_telegram_registered # noqa: F401
-
Read more about signals in Django signals
-
Read more about events in Telethon events
The MIT License (MIT). Please see License File for more information.