タイトルが長い!
python楽しいですね、結構肌にあっていて嬉しいです。
環境
Python3.6
Windows10
Pycharmちゃんが便利すぎてダメになりそうです。JetBrainはいいぞ。
あとPythonは3.6じゃないと動かないです、最新の3.7だとdiscord.pyが動かないです。
導入
Bot導入は割愛します。大体下記の記事見れば分かると思います。
Pythonで実用Discord bot(discord.py解説)
導入したカラパリちゃん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を入れれば、ダウンロードしてくれるようになります。汎用性高いですね、他でも使えそうです。
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作って、効率化を図っていきたいなぁ。