見出し画像

Telegram APIのアップデートでbotがログインできない問題(解決)

普段の読者の皆様を置いてけぼりにする技術的な記事になりますので、読み飛ばしてください。

昨日記事に追記したように、開発中のWeTheMediaの自動翻訳チャネルでつかっていたBotが突然ログインできないという問題が発生していました。


どうやら12月1日からだと思うけど、テレグラムのAPIに仕様変更があり、ユーザー名のやり取りには32ビットじゃなくって64ビットのIDを使うように変更されたらしいです。
事前に公式サイトからのアナウンスとかあったんだろうけど、全然知らなかったので、お行儀よく使ってたのに私のBotがBan食らった????と恐怖におびえていたんだけども、Spam Info Botというテレグラム公式のBotにお伺いを立てると私のBotにはなんの制限もなし。

ということは、安定版の最新バージョンであるlibtdjson.so.1.7.0がいけないのだろうと予想して、昨日の夜寝る前に公式なテレグラムAPIのライブラリTDLibのmasterブランチのHEAD (1d3cf2c209bfbe613bd718fe46a3829999295a99)のコンパイルを始めてから就寝した。


TDLibのビルドはLinux Mint 20で上のメニューからビルドコマンドを出力して出てきたのそのままでOKだった。ターゲットをDebian 10+にしたけどUbuntuベースのMintでも動いたから、これをデプロイメント先のDebianサーバーへコピーして動けば問題解決だな。

1.7.9でちゃんとビルドできたみたいだから、早速これのコピーを/usr/local/libへ置いてldconfigしてダイナミックライブラリを認識させる。

sudo ldconfig

してから

ldconfig -p | grep libtdjson

としてちゃんとpathが認識されているか確認。


一般公開されているチャネルであるWTMからチャットヒストリーを取ってくる都合上、通常のBot APIではだめなのでTelegram APIをつかって、いわゆるUserbotにしているので電話番号が必要なの。

WTMチャネルに私のBotをアドミンとして追加してもらえるなら問題ないが、そんなことできるはずもなし。

という訳で、みんなが使っているだろうpython-telegram-botという紛らわしいパッケージにDuckDuckGo!の検査結果を蹂躙されつつも、Telegram APIをPython側から使えるようにpython-telegramで実装しています。


ちゃんとlibrary_pathを指定してsite-packages内にある同梱されたlibtdjson.so.1.7.0が使われないようにしてから、ログインを試みたら成功。

API_ID = os.getenv('API_ID')
API_HASH = os.getenv('API_HASH')
PHONE = os.getenv('PHONE')
DB_encryption = os.getenv('DB_encryption')

tg = Telegram(
    api_id=API_ID,
    api_hash=API_HASH,
    phone=PHONE,
    database_encryption_key=DB_encryption,
    library_path='/usr/local/lib/libtdjson.so.1.7.9'
)
tg.login()


そして、一日遅れで、公式からもアナウンスがあった。遅いんだよw

Dear developer,
Telegram continues to grow worldwide, in part thanks to your third-party app. If your app is built from your own code, you'll need to make two changes so your users can keep chatting. If you are using the up-to-date open source code for one of our apps, these changes have already been made.
Support for int64 IDs
With its rapid growth, Telegram is moving from 32-bit to 64-bit IDs so that users can continue creating billions of groups, channels and bots. Your app will need to support these new IDs as soon as possible to ensure users aren't interrupted.

Telegramは、サードパーティーアプリのおかげもあり、世界的に成長を続けています。アプリが公式ライブラリ以外の自前のコードで構築されている場合、チャットを続けられるようには2つの変更を加える必要がある。もしあなたが最新の公式オープンソースコードを使っているなら、これらの変更は既に行われています。Telegramは急成長を遂げており、32ビットIDから64ビットIDへと移行することで、ユーザーは何十億ものグループ、チャネル、ボットを作成し続けることができます。ユーザーが影響を受けないように、アプリ製作者はこれらの新しいIDをできるだけ早くサポートする必要があります。

To do so, make sure your app supports this API layer: https://core.telegram.org/api/layers#layer-133

ユーザー数とBot数が増えているから32から64へと今の内に変えておきたいというのが理由だったみたい。

あーびっくりした。