НИИГрам: media/voip/status delivery and layer workarounds
Gzip RPC so session AOT does not drop TUser; live status push; call/edit handlers; LocalMediaStore.
This commit is contained in:
41
scripts/import-telegram-sticker-pack.py
Executable file
41
scripts/import-telegram-sticker-pack.py
Executable file
@@ -0,0 +1,41 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Import a public Telegram sticker pack via Bot API into local Mongo+MinIO.
|
||||
Usage: BOT_TOKEN=123:abc python3 import-telegram-sticker-pack.py in_DHAIDC_by_NaiDrawBot
|
||||
"""
|
||||
import os, sys, json, time, hashlib, io, urllib.request
|
||||
from pathlib import Path
|
||||
|
||||
def api(token, method, **params):
|
||||
q = "&".join(f"{k}={urllib.request.quote(str(v))}" for k,v in params.items())
|
||||
url = f"https://api.telegram.org/bot{token}/{method}?{q}"
|
||||
with urllib.request.urlopen(url, timeout=60) as r:
|
||||
data = json.loads(r.read().decode())
|
||||
if not data.get("ok"):
|
||||
raise SystemExit(data)
|
||||
return data["result"]
|
||||
|
||||
def main():
|
||||
token = os.environ.get("BOT_TOKEN") or os.environ.get("TELEGRAM_BOT_TOKEN")
|
||||
if not token:
|
||||
sys.exit("Set BOT_TOKEN to a Telegram Bot API token")
|
||||
name = sys.argv[1] if len(sys.argv)>1 else "in_DHAIDC_by_NaiDrawBot"
|
||||
sset = api(token, "getStickerSet", name=name)
|
||||
print("pack", sset.get("title"), "count", len(sset.get("stickers") or []))
|
||||
out = Path("/tmp/sticker-import")/name
|
||||
out.mkdir(parents=True, exist_ok=True)
|
||||
meta=[]
|
||||
for i,st in enumerate(sset.get("stickers") or []):
|
||||
file_id = st["file_id"]
|
||||
emoji = st.get("emoji") or "😀"
|
||||
f = api(token, "getFile", file_id=file_id)
|
||||
path = f.get("file_path")
|
||||
url = f"https://api.telegram.org/file/bot{token}/{path}"
|
||||
ext = Path(path).suffix or ".webp"
|
||||
dest = out / f"{i:03d}_{emoji}{ext}"
|
||||
urllib.request.urlretrieve(url, dest)
|
||||
meta.append({"emoji": emoji, "file": str(dest), "is_animated": st.get("is_animated"), "is_video": st.get("is_video")})
|
||||
print("saved", dest)
|
||||
(out/"manifest.json").write_text(json.dumps({"title": sset.get("title"), "name": name, "stickers": meta}, ensure_ascii=False, indent=2))
|
||||
print("done", out)
|
||||
if __name__=="__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user