Raspberry Pi Zero WH カメラモジュールで遊ぶ その2

前→[Raspberry Pi Zero WH カメラモジュールで遊ぶ その1](https://qiita.com/yuzzy22/items/2ed472a3e690fed1b2ba)
次→未定

本記事では、discordと連携した監視カメラアプリを作ってみます。

<!-- TOC -->

- [1. 各種pythonライブラリの追加](#1-各種pythonライブラリの追加)
    - [1.1. discord](#11-discord)
- [2. 監視カメラアプリの作成](#2-監視カメラアプリの作成)
    - [2.1. discordサーバ作成](#21-discordサーバ作成)
    - [2.2. Botアカウント作成](#22-botアカウント作成)
    - [2.3. サーバへの登録](#23-サーバへの登録)
    - [2.4. チャネルの作成とIDのコピー](#24-チャネルの作成とidのコピー)
    - [2.5. 監視カメラアプリテスト](#25-監視カメラアプリテスト)
    - [2.6. 追記](#26-追記)

<!-- /TOC -->

## 1. 各種pythonライブラリの追加

### 1.1. discord

discordをインストールします。

```bash
# discordのインストール
$ sudo pip3 install discord
```

## 2. 監視カメラアプリの作成

### 2.1. discordサーバ作成

discordアプリから、「サーバーを追加」→「サーバーを作成」→「新規作成」でサーバを作成します。(サーバ名はお好きに。)

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543188/a2a63e63-4f18-2f8d-3ea2-8136fb71654e.png)
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543188/6f528f5e-6584-e0c6-84c1-8c5ad8f08069.png)
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543188/f15c40b9-8e05-6047-7f66-51ae68f8c871.png)

### 2.2. Botアカウント作成

<https://discord.com/developers/applications/>にアクセスします。
"New Application" → "Create"でアプリを作成します。(アプリ名はお好きに。)

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543188/d8278424-b3ef-11f6-d561-dd975207ab22.png)
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543188/f3c731b9-c240-a041-c7b4-9680bcae49eb.png)

Applicationsタブから、作成されたアプリを選択して、Botタブに移動します。
"Add Bot" → "Yes, do it!"でBotを追加します。(追加後、Bot名の後ろに"_bot"を付けました。)
Botのトークンは"Build-A-Bot"欄のトークンからコピーしておきます。(後で使います。)

![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543188/899bd7f6-8d93-12ce-b751-df25e57d5d91.png)
![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543188/2662ac1b-fb6d-1334-3893-0d84994151e9.png)
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543188/13a92c03-96fa-3a9a-2fec-57e036948aca.png)

### 2.3. サーバへの登録

OAuth2タブから、サーバに参加させるための認証URLを作成します。
"OAuth2 URL Generator" → "SCOPES"でbotにチェックし、作成されたURLをコピーしてアクセスします。

![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543188/1db96e72-734d-d9ec-ba79-9f1b7ab35661.png)

BOTを追加する場所を聞かれるので、先に作成したサーバを選択し、「認証」をクリックします。
「ロボットではありません」にチェックし、「認証しました」と表示されれば登録は完了です。

![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543188/ad13bb52-a042-afd3-60a9-cc6b4f3aa72d.png)

### 2.4. チャネルの作成とIDのコピー

discordアプリから、サーバを選択し、テキストチャネル横の"＋"をクリックしてチャネルを作成します。

![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543188/b320ec4f-ec65-8108-c8e9-23bc1ba3cd3b.png)

作成したテキストチャネルにポインタを合わせ、右クリックしてチャネルIDをコピーしておきます。(後で使います。)

![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543188/a692d790-7db3-308c-f850-5ff9a206b953.png)

### 2.5. 監視カメラアプリテスト

discordのチャネルに"surveillance"とメッセージを送ると、静止画を撮影してdiscordに送信するBotのスクリプト部分です。
YOUR_CHANNEL_IDとYOUR_BOT_TOKEN部分を、先ほどコピーしておいたチャネルID、Botトークンと入れ替えてください。

```python:discord_bot_test.py

import picamera
import discord
import asyncio
import datetime

def discord_bot():
    print('### Bot is running.')
    client = discord.Client()

    chid = YOUR_CHANNEL_ID
    token = 'YOUR_BOT_TOKEN'

    @client.event
    async def on_ready():
        channel = client.get_channel(chid)
        await channel.send("I've joined!")

    @client.event
    async def on_message(message):
        if message.content == 'surveillance':
            with picamera.PiCamera() as camera:
                camera.resolution = (1920,1080)
                dt_now = datetime.datetime.now()
                fname = '.'.join([dt_now.strftime('%Y%m%d_%H%M%S'), 'jpg'])
                camera.capture(fname)
                channel = client.get_channel(chid)
                await channel.send(file=discord.File(fname))

    client.run(token)

if __name__=='__main__':
    discord_bot()
```

実行結果は以下のようになります。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ラズパイとdiscordで監視カメラもどき作った。 <a href="https://t.co/7kqP56h0XG">pic.twitter.com/7kqP56h0XG</a></p>&mdash; う〜し〜@ラズパイ勉強中 (@yuzzy2222) <a href="https://twitter.com/yuzzy2222/status/1277983960224563200?ref_src=twsrc%5Etfw">June 30, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### 2.6. 追記

discord_bot_test.pyは、2020年6月時点で実行可能であることを確認済みです。2020年8月時点で実行すると下記エラーが出力されました。

```python
Traceback (most recent call last):
  File "discord_bot_test.py", line 34, in <module>
    discord_bot()
#
# 中略
#
TypeError: __new__() got an unexpected keyword argument 'deny_new'
```

どうやらdiscord.pyのバージョンが古くなったことが原因のようだったので、アップデートしたら実行できました。

```bash
# discord.pyのアップデート(1.3.3 → 1.4.1)
$ sudo pip3 install -U discord.py
```