Ayo tulis bot moderator obrolan keren kami dengan Python. Biarkan dia bisa membersihkan obrolan, mencekal peserta dan memberi mereka peringatan, menyapa peserta obrolan baru, dan banyak lagi.
Kami akan membuat bot skalabel lengkap, dengan mempertimbangkan batasan dan fitur Telegram. Mari kita mulai dengan membuat struktur proyek dan mengajari bot untuk merespons perintah sederhana.
Python , . Telethon Telegram API ( ) Databases SQLAlchemy Core ( ).
, , . BotFather.
. " 2077", — .
Telegram API
", -" , Telegram API Telegram Bot API.
Bot API : , . , Telegram API. , : , , - , - API. .
, Telegram API Telethon:
$ pip install telethon
Telegram API , my.telegram.org. , API .
. api_id api_hash "". .
:
app/
__init__.py
__main__.py
handlers.py
config.py
handlers.py
— .
config.py
. :
BOT_TOKEN = '--'
API_ID = 123456789
API_HASH = '-'
, . config.
, __init__.py
. , telethon — TelegramClient
. .
( id, ). , TelegramClient:
import logging
from telethon import TelegramClient
import config
class Bot(TelegramClient):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.me = None #
# , API
bot = Bot('bot', config.API_ID, config.API_HASH)
. . ( 'bot'
: .)
parse_mode
— . ( , , ). HTML.
:
bot.parse_mode = 'HTML'
logging.basicConfig(level=logging.INFO)
bot , : app.handlers ( ).
import app.handlers
, .
async def start():
#
await bot.connect()
# . sign_in . bot.me
bot.me = await bot.sign_in(bot_token=config.BOT_TOKEN)
#
await bot.run_until_disconnected()
, , run, start:
def run():
bot.loop.run_until_complete(start())
__init__.py
import logging
from telethon import TelegramClient
import config
class Bot(TelegramClient):
def __init__(self, *args):
super().__init__(*args)
self.me = None
bot = Bot('bot', config.API_ID, config.API_HASH)
bot.parse_mode = 'HTML'
logging.basicConfig(level=logging.INFO)
import app.handlers
async def start():
await bot.connect()
bot.me = await bot.sign_in(bot_token=config.BOT_TOKEN)
await bot.run_until_disconnected()
def run():
bot.loop.run_until_complete(start())
.
, handlers.py . .
? ( " ", " ", " " ). :
) ,
) , - ,
) ,
, . : ", !"
, telethon.events.ChatAction.
:
from telethon import events
from app import bot
@bot.on(events.ChatAction())
async def on_join(event: events.ChatAction.Event):
if event.is_group and event.user_added and event.user_id == bot.me.id:
await bot.send_message(event.chat.id, ', !')
@bot.on
. " ". , .
— __main__.py
run:
from app import run
run()
! .
$ python -m app
:
@bot.on(events.ChatAction(func=lambda e: e.is_group and e.user_added and e.user_id == bot.me.id))
async def on_join(event: events.ChatAction.Event):
await event.respond(', !')
ChatAction func
— . . .
event.respond
. , event. bot.send_message
, .
, , ! . :
, " ?":
...
from telethon.tl.custom import Message
...
@bot.on(events.NewMessage(func=lambda e: e.text.lower() == ' ?'))
async def who_are_you(event: Message):
await event.respond(' , , !')
Message — NewMessage.
--, privacy mode.
, /cat.
...
from telethon.tl.custom import Message
...
@bot.on(events.NewMessage(func=lambda e: e.text.lower() == '/cat'))
async def send_cat(event: Message):
await bot.send_message(event.chat.id, file='path/to/cat.png')
, /dice ( )
...
from telethon.tl.custom import Message
from telethon.tl.types import InputMediaDice
...
@bot.on(events.NewMessage(func=lambda e: e.text.lower() == '/dice'))
async def send_dice(event: Message):
await bot.send_message(event.chat.id, file=InputMediaDice('?'))
, , :
@bot.on(events.ChatAction(func=lambda e: (e.user_added or e.user_joined) and e.user_id != bot.me.id))
async def greet(event: events.ChatAction.Event):
await event.respond('!')
Tapi bukan itu alasan kami datang ke sini. Kami ingin membuat tim dan fitur lain untuk admin grup! Untuk melakukan ini, kami harus dapat membedakan antara admin dan anggota grup biasa. Kami akan membahas ini di bagian selanjutnya dari tutorial. Kami akan menghubungkan database dan mempelajari cara cerdas untuk mendapatkan admin.
Bersambung.
Izinkan saya mengingatkan Anda bahwa Anda dapat melihat kode yang dihasilkan di GitHub . Ajukan pertanyaan apa pun di komentar. Pasti saya atau orang lain akan menjawabnya. Dan terima kasih kepada vanutp untuk informasi latar belakang artikel :)