mirror of
https://github.com/eternnoir/pyTelegramBotAPI.git
synced 2023-08-10 21:12:57 +03:00
Merge pull request #1542 from abdullaev388/master
Added examples of multibot
This commit is contained in:
commit
856debe7d2
17
examples/asynchronous_telebot/multibot/README.MD
Normal file
17
examples/asynchronous_telebot/multibot/README.MD
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
You probably have seen bots which allow you to send them token of your bot and then handle updates providing some functionality for your bot.
|
||||||
|
<br>
|
||||||
|
This type of bots are called <b>multibots</b>. They are created using webhooks.
|
||||||
|
<br>
|
||||||
|
|
||||||
|
This is the example of simple multibot.<br>
|
||||||
|
In order to reproduce this example you need to have <b>domain and ssl connection</b>.
|
||||||
|
<br>
|
||||||
|
If you have, go to config.py and specify your data.
|
||||||
|
<br>
|
||||||
|
There is also file called <b>nginx_conf.conf</b>, we will use nginx as proxy-server and this file is example nginx.conf file.
|
||||||
|
<br>
|
||||||
|
Make sure that server_name and port are the same in both config and nginx_conf
|
||||||
|
<br>
|
||||||
|
(nginx_conf.conf IS NOT complete, you would probably use tools like certbot to add ssl connection to it)
|
||||||
|
<br>
|
||||||
|
Also, in this example I used dictionary as tokens storage, but in production you should use database so that you can re-set webhooks in case bot restarts.
|
6
examples/asynchronous_telebot/multibot/config.py
Normal file
6
examples/asynchronous_telebot/multibot/config.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
MAIN_BOT_TOKEN = "your_main_bot_token"
|
||||||
|
|
||||||
|
WEBHOOK_HOST = "your_domain.com"
|
||||||
|
WEBHOOK_PATH = "telegram_webhook"
|
||||||
|
WEBAPP_HOST = "0.0.0.0"
|
||||||
|
WEBAPP_PORT = 3500
|
15
examples/asynchronous_telebot/multibot/handlers.py
Normal file
15
examples/asynchronous_telebot/multibot/handlers.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
from telebot.async_telebot import AsyncTeleBot
|
||||||
|
from telebot import types
|
||||||
|
|
||||||
|
|
||||||
|
async def hello_handler(message: types.Message, bot: AsyncTeleBot):
|
||||||
|
await bot.send_message(message.chat.id, "Hi :)")
|
||||||
|
|
||||||
|
|
||||||
|
async def echo_handler(message: types.Message, bot: AsyncTeleBot):
|
||||||
|
await bot.send_message(message.chat.id, message.text)
|
||||||
|
|
||||||
|
|
||||||
|
def register_handlers(bot: AsyncTeleBot):
|
||||||
|
bot.register_message_handler(hello_handler, func=lambda message: message.text == 'Hello', pass_bot=True)
|
||||||
|
bot.register_message_handler(echo_handler, pass_bot=True)
|
56
examples/asynchronous_telebot/multibot/main.py
Normal file
56
examples/asynchronous_telebot/multibot/main.py
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
import asyncio
|
||||||
|
|
||||||
|
from aiohttp import web
|
||||||
|
from telebot import types, util
|
||||||
|
from telebot.async_telebot import AsyncTeleBot
|
||||||
|
from handlers import register_handlers
|
||||||
|
|
||||||
|
import config
|
||||||
|
|
||||||
|
main_bot = AsyncTeleBot(config.MAIN_BOT_TOKEN)
|
||||||
|
app = web.Application()
|
||||||
|
tokens = {config.MAIN_BOT_TOKEN: True}
|
||||||
|
|
||||||
|
|
||||||
|
async def webhook(request):
|
||||||
|
token = request.match_info.get('token')
|
||||||
|
if not tokens.get(token):
|
||||||
|
return web.Response(status=404)
|
||||||
|
|
||||||
|
if request.headers.get('content-type') != 'application/json':
|
||||||
|
return web.Response(status=403)
|
||||||
|
|
||||||
|
json_string = await request.json()
|
||||||
|
update = types.Update.de_json(json_string)
|
||||||
|
if token == main_bot.token:
|
||||||
|
await main_bot.process_new_updates([update])
|
||||||
|
return web.Response()
|
||||||
|
|
||||||
|
from_update_bot = AsyncTeleBot(token)
|
||||||
|
register_handlers(from_update_bot)
|
||||||
|
await from_update_bot.process_new_updates([update])
|
||||||
|
return web.Response()
|
||||||
|
|
||||||
|
|
||||||
|
app.router.add_post("/" + config.WEBHOOK_PATH + "/{token}", webhook)
|
||||||
|
|
||||||
|
|
||||||
|
@main_bot.message_handler(commands=['add_bot'])
|
||||||
|
async def add_bot(message: types.Message):
|
||||||
|
token = util.extract_arguments(message.text)
|
||||||
|
tokens[token] = True
|
||||||
|
|
||||||
|
new_bot = AsyncTeleBot(token)
|
||||||
|
await new_bot.delete_webhook()
|
||||||
|
await new_bot.set_webhook(f"{config.WEBHOOK_HOST}/{config.WEBHOOK_PATH}/{token}")
|
||||||
|
|
||||||
|
await new_bot.send_message(message.chat.id, "Webhook was set.")
|
||||||
|
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
await main_bot.delete_webhook()
|
||||||
|
await main_bot.set_webhook(f"{config.WEBHOOK_HOST}/{config.WEBHOOK_PATH}/{config.MAIN_BOT_TOKEN}")
|
||||||
|
web.run_app(app, host=config.WEBAPP_HOST, port=config.WEBAPP_PORT)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
asyncio.run(main())
|
8
examples/asynchronous_telebot/multibot/nginx_conf.conf
Normal file
8
examples/asynchronous_telebot/multibot/nginx_conf.conf
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
server {
|
||||||
|
server_name your_domain.com;
|
||||||
|
|
||||||
|
location /telegram_webhook/ {
|
||||||
|
proxy_pass http://localhost:3500;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
17
examples/multibot/README.MD
Normal file
17
examples/multibot/README.MD
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
You probably have seen bots which allow you to send them token of your bot and then handle updates providing some functionality for your bot.
|
||||||
|
<br>
|
||||||
|
This type of bots are called <b>multibots</b>. They are created using webhooks.
|
||||||
|
<br>
|
||||||
|
|
||||||
|
This is the example of simple multibot.<br>
|
||||||
|
In order to reproduce this example you need to have <b>domain and ssl connection</b>.
|
||||||
|
<br>
|
||||||
|
If you have, go to config.py and specify your data.
|
||||||
|
<br>
|
||||||
|
There is also file called <b>nginx_conf.conf</b>, we will use nginx as proxy-server and this file is example nginx.conf file.
|
||||||
|
<br>
|
||||||
|
Make sure that server_name and port are the same in both config and nginx_conf
|
||||||
|
<br>
|
||||||
|
(nginx_conf.conf IS NOT complete, you would probably use tools like certbot to add ssl connection to it)
|
||||||
|
<br>
|
||||||
|
Also, in this example I used dictionary as tokens storage, but in production you should use database so that you can re-set webhooks in case bot restarts.
|
6
examples/multibot/config.py
Normal file
6
examples/multibot/config.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
MAIN_BOT_TOKEN = "your_main_bot_token"
|
||||||
|
|
||||||
|
WEBHOOK_HOST = "your_domain.com"
|
||||||
|
WEBHOOK_PATH = "telegram_webhook"
|
||||||
|
WEBAPP_HOST = "0.0.0.0"
|
||||||
|
WEBAPP_PORT = 3500
|
14
examples/multibot/handlers.py
Normal file
14
examples/multibot/handlers.py
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
from telebot import types, TeleBot
|
||||||
|
|
||||||
|
|
||||||
|
def hello_handler(message: types.Message, bot: TeleBot):
|
||||||
|
bot.send_message(message.chat.id, "Hi :)")
|
||||||
|
|
||||||
|
|
||||||
|
def echo_handler(message: types.Message, bot: TeleBot):
|
||||||
|
bot.send_message(message.chat.id, message.text)
|
||||||
|
|
||||||
|
|
||||||
|
def register_handlers(bot: TeleBot):
|
||||||
|
bot.register_message_handler(hello_handler, func=lambda message: message.text == 'Hello', pass_bot=True)
|
||||||
|
bot.register_message_handler(echo_handler, pass_bot=True)
|
48
examples/multibot/main.py
Normal file
48
examples/multibot/main.py
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
from flask import Flask
|
||||||
|
from flask import request, abort
|
||||||
|
from telebot import TeleBot, types, util
|
||||||
|
from handlers import register_handlers
|
||||||
|
|
||||||
|
import config
|
||||||
|
|
||||||
|
main_bot = TeleBot(config.MAIN_BOT_TOKEN)
|
||||||
|
app = Flask(__name__)
|
||||||
|
tokens = {config.MAIN_BOT_TOKEN: True}
|
||||||
|
|
||||||
|
|
||||||
|
@app.route(f"/{config.WEBHOOK_PATH}/<token>", methods=['POST'])
|
||||||
|
def webhook(token: str):
|
||||||
|
if not tokens.get(token):
|
||||||
|
return abort(404)
|
||||||
|
|
||||||
|
if request.headers.get('content-type') != 'application/json':
|
||||||
|
return abort(403)
|
||||||
|
|
||||||
|
json_string = request.get_data().decode('utf-8')
|
||||||
|
update = types.Update.de_json(json_string)
|
||||||
|
if token == main_bot.token:
|
||||||
|
main_bot.process_new_updates([update])
|
||||||
|
return ''
|
||||||
|
|
||||||
|
from_update_bot = TeleBot(token)
|
||||||
|
register_handlers(from_update_bot)
|
||||||
|
from_update_bot.process_new_updates([update])
|
||||||
|
return ''
|
||||||
|
|
||||||
|
|
||||||
|
@main_bot.message_handler(commands=['add_bot'])
|
||||||
|
def add_bot(message: types.Message):
|
||||||
|
token = util.extract_arguments(message.text)
|
||||||
|
tokens[token] = True
|
||||||
|
|
||||||
|
new_bot = TeleBot(token)
|
||||||
|
new_bot.delete_webhook()
|
||||||
|
new_bot.set_webhook(f"{config.WEBHOOK_HOST}/{config.WEBHOOK_PATH}/{token}")
|
||||||
|
|
||||||
|
new_bot.send_message(message.chat.id, "Webhook was set.")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main_bot.delete_webhook()
|
||||||
|
main_bot.set_webhook(f"{config.WEBHOOK_HOST}/{config.WEBHOOK_PATH}/{config.MAIN_BOT_TOKEN}")
|
||||||
|
app.run(host=config.WEBAPP_HOST, port=config.WEBAPP_PORT)
|
8
examples/multibot/nginx_conf.conf
Normal file
8
examples/multibot/nginx_conf.conf
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
server {
|
||||||
|
server_name your_domain.com;
|
||||||
|
|
||||||
|
location /telegram_webhook/ {
|
||||||
|
proxy_pass http://localhost:3500;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user