LoginSignup
11
18

More than 1 year has passed since last update.

pythonで一方的に通知するdiscord botをつくる(requests, jsonのみ使用)

Last updated at Posted at 2020-07-12

内容

pythonを使ったdiscord botをつくるとなると、大きく分けて2つタイプがあるようです。

  • 対話的に動作するタイプ
    • discord.pyというライブラリが便利らしい。この記事では扱いません。
  • 一方的に通知するタイプ
    • 定期的に通知するにはこちら。以下で説明します。

webhook URL取得

 チャンネルごとに取得が必要です。
 こちらのページの「Webhook URLを取得」が参考になります。
 オプション設定はコードでできるのでパスしてもよし。

簡易版

 一番シンプルな構成は以下。

import requests, json


webhook_url  = 'さっき取得したWebhook URL'
main_content = {'content': '送るテキスト'}
headers      = {'Content-Type': 'application/json'}

response     = requests.post(webhook_url, json.dumps(main_content), headers=headers)

 送信成功!
SS 2020-07-12 21.04.33.png

botの見た目

 botの見た目はコード内で以下のように定義できます。
 アイコンの設定には画像のURLが必要のようです。以下ではtwitterアカウントのアイコンのURLを与えています。
 ローカルの画像ファイルの場合は、Webhook URL取得時に設定するほかなし?

import requests, json


webhook_url  = 'さっき取得したWebhook URL'
main_content = {
                   'username': 'お名前',
                   'avatar_url': '画像のURL',
                   'content': 'テキスト'
               }
headers      = {'Content-Type': 'application/json'}

response     = requests.post(webhook_url, json.dumps(main_content), headers=headers)

 送信成功!
SS 2020-07-12 21.07.59.png

メッセージの見た目を凝りたい

 埋め込み(embeds)を使います。詳しくはこちら
 例を以下にあげます。

import requests, json


webhook_url  = 'さっき取得したWebhook URL'
embeds       = [
                   {
                       'description': 'googleのページ',
                       'color': 15146762,
                       'image': {
                           'url': '画像のURL'
                       }
                    }
               ]
main_content = {
                   'username': 'お名前',
                   'avatar_url': '画像のURL',
                   'content': 'テキスト',
                   'embeds': embeds
               }
headers      = {'Content-Type': 'application/json'}

response     = requests.post(webhook_url, json.dumps(main_content), headers=headers)

 こんな見た目になります。

 左の縦棒の色はembedsの中のcolorで設定します。
 数字と色の対応はこちら。「Color Mixer」のバーを動かして表示したい色を探し、「Decimal:」の右の数字を与えてください。
 SS 2020-07-12 21.27.14.png

関数にして使い回す

 例えばこんな感じです。
 テキストだけ送るときはchannel, contentだけ引数を与えます。
 埋め込みを使いたい時は、必要な情報をembであたえます。

emb = {
          'description': '埋め込み内テキスト',
          'color': '色',
          'img_url': '画像URL',
          'content': '本文'
      }
def send_discord_msg(channel, content, emb=0):
    webhook_dic     = {'channel 1': 'channel 1のWebhook URL', 
                       'channel 2': 'channel 2のWebhook URL'}
    webhook_url     = webhook_dic[channel]

    main_content    = {
        'username': 'botの名前',
        'avatar_url': 'アイコンURL',
        'content': content
    }

    if emb != 0:
        color_dic = {
            '色1': 15146762,
            '色2': 49356,
        }
        embeds = [
            {
                'description': emb['description'],
                "color": color_dic[emb['color']],
                "image": {
                    "url": emb['img_url']
                },
            }
        ]
        main_content.update({'embeds': embeds})
        main_content['content'] = emb['content']

    headers = {'Content-Type': 'application/json'}
    try:
        res = requests.post(webhook_url, json.dumps(main_content), headers=headers)
    except Exception as e:
        print(e)
11
18
0

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
11
18