[discord.py] Botがでエラー(AttributeError等)で動かない!原因と解決方法

この記事について

対象読者

  • これまでBotがちゃんと動いていたのに、2019年4月以降、動かなくなった。
  • ネット上のチュートリアル記事がうまく動作せず、こまっている。

具体的には、こんなエラーメッセージにお困りの方は、ぜひお読み下さい。

AttributeError: 'TextChannel' object has no attribute 'server'
AttributeError: 'Client' object has no attribute 'send_message'
AttributeError: 'Bot' object has no attribute 'say'

記事の内容

日本時間の2019/4/9朝、Discord botを作成するPythonライブラリ、discord.pyメジャーアップデート(v0.16.12→v1.0.0)されました。
このバージョンアップには多くの破壊的変更が含まれています。このことにより、1.0.0より前のバージョンを使用していたBotは動かない、または起動もできない状態になるおそれがあります。
この記事では、このバージョンアップについての詳細と、ふたたびBotを動作させるためにやるべきことを紹介します。

今回のアップデートの概要

discord.pyがv1.0.0になりました

今回リリースされたバージョンは、v1.0.0です。
このバージョンは2017年末より開発が行われていたもので、大幅な設計の改善機能の整理が行われています。

2016年10月9日から過去2年8ヶ月。ストレス・血・汗、そして涙とともにあった、とても長い旅でした。
本日2019年4月8日(※米国東部標準時)というリリース日は、Discord APIリリース3周年と一致します。
(Discord.py 開発リーダー Danny氏のコメントより引用)

pip installでインストールできるのは、長らくバージョンv0.16.12でした。しかし、今回のアップデートにてバージョンv1.0.0がインストールされるようになりました。
このことで、多くの既存Botに影響が出ることが予想されています。

バージョンの俗称(async, rewrite)

discord.py開発コミュニティでは、これらのバージョンに、** async と rewrite **という俗称(別名)がついています。余裕があれば覚えておいてください。

  • async
    • いわゆる「古い方」。v0.16.12以前のバージョンを指す
  • rewrite
    • 「新しいほう」。v1.0.0以降のバージョンを指す

対応方法

Botを動かすためには、2通りの方法があります。

  • discord.pyのバージョンをダウングレードする
  • 新しいバージョンに対応できるよう、Botのコードを修正する

以下では、それぞれの方法の手順と、方法のえらびかたについてお話しします。

ライブラリのバージョンをasync版(v0.16.12)に戻す

説明

pip upgradeによってrewrite版(v1.0.0)に上がってしまったバージョンを、async版(v0.16.12)に戻すやりかたです。

こんな人・Botにおすすめ

  • すでに開発を終了しており、これまでどおり動けばいいだけのBot
  • とにかくすぐにBotを一旦動かせる状態にしたい
    • rewrite版(v1.0.0)に対応するコード修正作業をすぐに行えないなど
  • Python3.4以下のBot
    • rewrite版(v1.0.0)ではPython3.4はサポート外になります

手順

インストール済のdiscordを一旦削除し、async版(v0.16.12)を指定してインストールします。

$ pip uninstall discord
$ pip install discord==0.16.12

Botの開発にボイスチャット機能を使っている方は、上記のかわりに以下を実行してください。

$ pip uninstall discord
$ pip install discord\[voice\]==0.16.12

Botがrewrite版(v1.0.0)で動作するよう、コードを修正する

説明

async版(v0.16.12)→rewrite版(v1.0.0)で実施された変更に対応して、コードを書き換える方法です。

こんなBotにおすすめ

  • 開発作業が進行中のBot
    • async版(v0.16.12)よりrewrite版(v1.0.0)のほうが技術的サポートが受けやすいです
    • 今後、新機能の追加やバグ修正はrewrite版(v1.0.0~)のみで行われます
  • ボイスチャットを使用する機能があるBot
    • 自動再接続など、大幅に動作の品質が改善されています
  • Python3.5以上のBot
    • Python3.4はサポート外になります

手順

discord.pyの公式ドキュメントに具体的な変更点や書き換え手順が示されているので、これに従って修正作業を行います。


このような感じで1:1対応で丁寧に修正方法が記されています。
日本語コミュニティ有志による日本語版もあります。お好みでどうぞ。

まとめ

2019年4月初旬、discord.pyのメジャーバージョンがアップデートされます。
これは根本的な設計の変更や、APIの再設計が行われ、多くの破壊的変更を含むアップデートのため、既存のBotの動作に問題が発生する可能性があります。
Botを動かすためには、ライブラリのバージョンをasync版(v0.16.12)に戻すか、rewrite(v1.0.0)に対応するようコードを修正するかの、いずれかの作業が必要です。

今後の保守や機能追加の点からも、rewrite版(v1.0.0)に対応するようコードを書き換えるのがおすすめです。しかし一刻も速く動かしたい場合やもうBotを触る予定がない場合は、とりあえずasync版(v0.16.12)に戻せばBotはすぐに動かせるようになります。

わかりにくい点や困ったことがあればTwitterなどでお気軽にお声がけください。

補足1: venvを使おう

Botによって、Bot1はrewrite版(v1.0.0)を使って開発していきたいけど、もうひとつのBot2はasync版(v0.16.12)で動かしていきたい……という状況が発生するかもしれません。
その場合、venvを使うと気軽に環境を切り替えることができます。使っていない方はぜひこれを機に導入しましょう。
[Python] venvとは?どんなときに便利?使う必要はある?

補足2: discord.py公式サーバに参加しよう

discord.py公式サーバは、discord.pyに関心のある方ならだれでも参加できるサーバです。
今回のような大きなアップデートについてのニュースが受け取れるだけでなく、日本語話者用のテキストチャンネルも存在し、Bot開発の強い味方になってくれると思います。ぜひともご参加ください。