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

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

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

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

- [[Ruby]DiscordにWebhookでメッセージを投稿する](https://qiita.com/otuhs_d/items/41f018ec3762db93a740)

# 簡易版
　一番シンプルな構成は以下。

```python
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)
```
　送信成功！
<img width="277" alt="SS 2020-07-12 21.04.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600603/01158a04-5af9-6695-a5fd-b523451c10ce.png">

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

```python
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)
```
　送信成功！
<img width="229" alt="SS 2020-07-12 21.07.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600603/b4005778-3ba8-41b4-f9a4-646ac9a9d4a3.png">


# メッセージの見た目を凝りたい
　埋め込み（embeds）を使います。詳しくは[こちら](https://birdie0.github.io/discord-webhooks-guide/structure/embeds.html)。
　例を以下にあげます。

```python
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`**で設定**します。
　数字と色の対応は[こちら](https://www.mathsisfun.com/hexadecimal-decimal-colors.html)。「Color Mixer」のバーを動かして表示したい色を探し、「Decimal:」の右の数字を与えてください。
　<img width="399" alt="SS 2020-07-12 21.27.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600603/800c27c8-289d-dff0-d66d-24d23d511a41.png">

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

```python
emb = {
          'description': '埋め込み内テキスト',
          'color': '色',
          'img_url': '画像URL',
          'content': '本文'
      }
```

```python
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)
```