19
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Discordでアップロードした画像をGoogleDriveに自動でアップロードするシステム!

Posted at

タイトルが長い!
python楽しいですね、結構肌にあっていて嬉しいです。

環境

Python3.6
Windows10

Pycharmちゃんが便利すぎてダメになりそうです。JetBrainはいいぞ。
あとPythonは3.6じゃないと動かないです、最新の3.7だとdiscord.pyが動かないです。

導入

Bot導入は割愛します。大体下記の記事見れば分かると思います。
Pythonで実用Discord bot(discord.py解説)

image.png
導入したカラパリちゃんbot
botは名前をつけると、愛着が湧きます、かわいい!

Google側の設定

PythonでGoogleドライブに画像をアップロード
またもここを参考に導入。パッケージのインストールがめっちゃ簡単なPycharmはいいぞ。
クライアントIDとクライアントシークレットをメモして、setting.yamlを同じディレクトリに配置すること。
先に上記の記事を元にローカルに置いた画像をアップロードするということを実践するとスムーズだと思います。

bot側の設定

さぁ、料理を始めましょう。

トリガー指定
async def on_message(message):
    if message.content.startswith('/pic'):

これで、全体のメッセージで「/pic」が含まれたメッセージをトリガーに入ってくることが出来た。
この処理内に、GoogleDriveにアップロードまでの処理を入れる。

ちなみに、@のメンションだけで設定したい場合は下記の通り。

メンションのみ
    if client.user.id in message.content:  # 話しかけられたかの判定
      if message.content.startswith('/pic'):

Client.user.idで自分のIDです。そのIDがメッセージ内に含まれたかどうかを判定しているだけですね。
更にその中で/picが入ってたら反応するって感じです。

先に画像ダウンロード出来るようにする

python3のrequestsを使って画像を保存
これまた、上記を参照にしました。参照というか、もろパクリ。下の方を採用しました。これで、download_imgにurlとfilenameを入れれば、ダウンロードしてくれるようになります。汎用性高いですね、他でも使えそうです。

download_img
def download_img(url, file_name):
    r = requests.get(url, stream=True)
    if r.status_code == 200:
        with open(file_name, 'wb') as f:
            f.write(r.content)

ファイル取得

ファイル取得
        filename = message.attachments[0]['filename']
        download_img(message.attachments[0]['url'], "image.png")

messageのattachementsを呼び出すと、メッセージ内にあるコンテンツを取得する。
中身はこんな感じ

[{
'width': 1920, 
'url': '[url]', 
'size': 1414002, 
'proxy_url': '[url]', 
'id': '563384196488364043', 
'height': 1080, 
'filename': 'VRChat_1920x1080_2019-03-27_01-11-24.218.png'
}]

urlを叩くと、画像だけが出てくるページになる。
これはDiscordで画像を開いて、左下にある「元ファイルを開く」を押したときに出るURLと同じ。
ファイル名とかも取ってるので、これをこのままdownload_imgで投げてあげます。
そうすると、Discordで投げたメッセージを「image.png」という画像形式で保存されます。

GoogleDriveにアップロード

あとはローカルのファイルをアップロードしてあげるだけです。

        # GoogleDrive接続
        gauth = GoogleAuth()
        gauth.CommandLineAuth()
        drive = GoogleDrive(gauth)

        f = drive.CreateFile({'title': filename, 'mimeType': 'image/jpeg'})
        f.SetContentFile('image.png')
        f.Upload()

'title'がファイル名になるので、そのままアップロードされたファイルのファイル名を使いましょう。
また、SetContentFileは必ず、ローカルに保存されているファイルにしてあげてください。イメージ的には、どんどんこのファイルに上書きして、都度GoogleDriveにアップロードする感じです。

記事にもあった通り、初回は認証が必要です。実行時に出てきたURLを叩いて、認証し、キーが発行されたらコンソール画面で打ち込めばOKです。その後は認証が必要になることはない、はず。実装した後に認証ハズレたりしたら、また書きます。

完成!おめでとう!

Discordのbot開発楽しいです。
お天気予報とかも実装したので、Qiitaに書けたら良いなぁ。あとは役職付与とかも自動で出来たりします。
結構仕事でDiscordを使う機会が多いので、汎用性の高いDiscordのbot作って、効率化を図っていきたいなぁ。

19
16
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?