feat: sync Bot API gateway support
This commit is contained in:
parent
9a501f900a
commit
4c0cc2b7a7
44 changed files with 4609 additions and 49 deletions
63
scripts/botapi_echo_once.py
Normal file
63
scripts/botapi_echo_once.py
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
import argparse
|
||||
import asyncio
|
||||
import sys
|
||||
import time
|
||||
|
||||
from telegram import Bot
|
||||
|
||||
|
||||
async def main() -> int:
|
||||
parser = argparse.ArgumentParser(description="Listen once via telesrv Bot API and echo the first text message.")
|
||||
parser.add_argument("--token", required=True)
|
||||
parser.add_argument("--base-url", default="http://127.0.0.1:8081/bot")
|
||||
parser.add_argument("--base-file-url", default="http://127.0.0.1:8081/file/bot")
|
||||
parser.add_argument("--timeout-seconds", type=int, default=180)
|
||||
parser.add_argument("--prefix", default="echo: ")
|
||||
args = parser.parse_args()
|
||||
|
||||
bot = Bot(token=args.token, base_url=args.base_url, base_file_url=args.base_file_url)
|
||||
me = await bot.get_me()
|
||||
print(f"listening as @{me.username or me.id} ({me.id})", flush=True)
|
||||
await bot.delete_webhook(drop_pending_updates=False)
|
||||
|
||||
offset = None
|
||||
stale = await bot.get_updates(timeout=0, allowed_updates=["message", "edited_message"])
|
||||
if stale:
|
||||
offset = max(update.update_id for update in stale) + 1
|
||||
await bot.get_updates(offset=offset, timeout=0, allowed_updates=["message", "edited_message"])
|
||||
print(f"drained {len(stale)} stale update(s), next offset={offset}", flush=True)
|
||||
|
||||
deadline = time.monotonic() + max(1, args.timeout_seconds)
|
||||
while time.monotonic() < deadline:
|
||||
remaining = max(1, min(30, int(deadline - time.monotonic())))
|
||||
updates = await bot.get_updates(
|
||||
offset=offset,
|
||||
timeout=remaining,
|
||||
allowed_updates=["message", "edited_message"],
|
||||
)
|
||||
if not updates:
|
||||
continue
|
||||
offset = max(update.update_id for update in updates) + 1
|
||||
for update in updates:
|
||||
msg = update.message or update.edited_message
|
||||
if msg is None or msg.chat_id is None:
|
||||
continue
|
||||
text = msg.text or msg.caption or ""
|
||||
if not text:
|
||||
continue
|
||||
reply = args.prefix + text
|
||||
sent = await bot.send_message(chat_id=msg.chat_id, text=reply)
|
||||
print(
|
||||
f"echoed update_id={update.update_id} chat_id={msg.chat_id} "
|
||||
f"message_id={msg.message_id} sent_message_id={sent.message_id} text={text!r}",
|
||||
flush=True,
|
||||
)
|
||||
await bot.get_updates(offset=offset, timeout=0, allowed_updates=["message", "edited_message"])
|
||||
return 0
|
||||
|
||||
print("timed out waiting for a text message", file=sys.stderr, flush=True)
|
||||
return 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(asyncio.run(main()))
|
||||
61
scripts/botapi_receive_selftest.py
Normal file
61
scripts/botapi_receive_selftest.py
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
import argparse
|
||||
import asyncio
|
||||
import sys
|
||||
|
||||
from telegram import Bot
|
||||
|
||||
|
||||
async def main() -> int:
|
||||
parser = argparse.ArgumentParser(description="Poll telesrv Bot API with python-telegram-bot.")
|
||||
parser.add_argument("--token", required=True)
|
||||
parser.add_argument("--base-url", default="http://127.0.0.1:8081/bot")
|
||||
parser.add_argument("--base-file-url", default="http://127.0.0.1:8081/file/bot")
|
||||
parser.add_argument("--offset", type=int, default=0)
|
||||
parser.add_argument("--expect-chat-id", type=int, default=0)
|
||||
parser.add_argument("--expect-text", default="")
|
||||
parser.add_argument("--confirm", action="store_true")
|
||||
args = parser.parse_args()
|
||||
|
||||
bot = Bot(token=args.token, base_url=args.base_url, base_file_url=args.base_file_url)
|
||||
me = await bot.get_me()
|
||||
print(f"getMe: id={me.id} username={me.username!r} is_bot={me.is_bot}")
|
||||
await bot.delete_webhook(drop_pending_updates=False)
|
||||
|
||||
updates = await bot.get_updates(
|
||||
offset=args.offset or None,
|
||||
timeout=0,
|
||||
allowed_updates=["message", "edited_message"],
|
||||
)
|
||||
print(f"getUpdates: count={len(updates)}")
|
||||
for update in updates:
|
||||
msg = update.message or update.edited_message
|
||||
chat_id = msg.chat_id if msg else None
|
||||
text = msg.text if msg else None
|
||||
print(f"update_id={update.update_id} chat_id={chat_id} text={text!r}")
|
||||
|
||||
if args.expect_text:
|
||||
matched = False
|
||||
for update in updates:
|
||||
msg = update.message or update.edited_message
|
||||
if msg is None:
|
||||
continue
|
||||
if args.expect_chat_id and msg.chat_id != args.expect_chat_id:
|
||||
continue
|
||||
if msg.text == args.expect_text:
|
||||
matched = True
|
||||
break
|
||||
if not matched:
|
||||
print("expected update not found", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
if args.confirm and updates:
|
||||
next_offset = max(update.update_id for update in updates) + 1
|
||||
after = await bot.get_updates(offset=next_offset, timeout=0, allowed_updates=["message", "edited_message"])
|
||||
print(f"confirm offset={next_offset}: count={len(after)}")
|
||||
if after:
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(asyncio.run(main()))
|
||||
Loading…
Add table
Add a link
Reference in a new issue