ファイルを送るとパスワード付きzipを返してくれるDiscordBot

# はじめに
パスワード付きのzipファイルを扱う際、個人だと7-Zip、Lhaplus、zipコマンドなど使う方法があるが、正直面倒くさい。
そこで、pythonでzipを扱うpyminizipモジュールがあったので、discordにファイルを投げるとパスワード付きのzipを返してくれるbotを作りました。

#📗目次
実行環境

bot作成

コード

使い方

課題

#🔧実行環境
Raspbian GNU/Linux 9

python 3.5.3

discord.py 1.2.5

requests 2.23.0

pyminizip 0.2.4

# 📦 bot作成
こちらに詳細が載った記事があります。

[Discord Botアカウント初期設定ガイド for Developer](https://qiita.com/1ntegrale9/items/cb285053f2fa5d0cccdf)

[Pythonで実用Discord Bot(discordpy解説)](https://qiita.com/1ntegrale9/items/9d570ef8175cf178468f)

# コード
botを作成できたら、main.pyとconfig.pyを作成し、下記のコードを貼り付けます。

```python:main.py
# -*- coding:utf8 -*-

# インストールした discord.py を読み込む
import discord
# 自分のBotのアクセストークンをconfig.pyに書いておく
# config.pyは同じディレクトリ内に配置
import config
import requests
# pythonでパスワード付きzipを作成するモジュール
import pyminizip
import os

# -----------------------------------クラス分けしたほうがいい------------------------------------
# ファイルをダウンロードする関数
# import requests
def download(title, url):
    try:
        r = requests.get(url)
        # openの中で保存先のパス（ファイル名を指定）
        with open("添付ファイルの保存先のディレクトリのパス" + title, mode='w') as f:
            f.write(r.text)
    except requests.exceptions.RequestException as err:
        print(err)
# --------------------------------------------------------------------------------

# 自分のBotのアクセストークンをconfig.pyに書いておく
TOKEN = config.TOKEN

# 接続に必要なオブジェクトを生成
client = discord.Client()

# 起動時に動作する処理
@client.event
async def on_ready():
    # 起動したらターミナルにログイン通知が表示される
    print('ログインしました')

# メッセージ受信時に動作する処理
@client.event
async def on_message(message):
    # メッセージ送信者がBotだった場合は無視する
    if message.author.bot:
        return
    # ファイルを添付して、「/zip」が含まれていたらローカルに保存
    # テキストに「/zip」が含まれているか判定
    if "/zip" in message.content.split():
        text = message.content.split()
        # ifで分岐 パスワード入力があるかどうか
        try:
            password = text[1]

            # 投稿されたファイルの詳細を取得
            file = message.attachments[0]
            # ファイルを保存
            # 編集しなくていい
            download(file.filename, file.url)
            await message.channel.send("パスワード付き" + file.filename + ".zipを返します")

            # 保存したファイルをパスワード付きzipに変換
            # IndexError: list index out of range
            # ()内を編集してください
            pyminizip.compress("添付ファイルを保存したディレクトリのパス" + file.filename,"/","zipファイルを保存したいディレクトリのパス" + file.filename + ".zip",password,9)

            # zipしたファイルを送り返す
            await message.channel.send(file=discord.File("zipファイルを保存したディレクトリのパス" + file.filename + ".zip"))
            # ファイルの削除
            # 権限をbotに与えないと使えないエラー発生
            # discord.errors.Forbidden: 403 Forbidden (error code: 50013): Missing Permissions
            await message.delete()

            # 保存したファイルを削除
            os.remove("zipファイルを保存したディレクトリのパス" + file.filename + ".zip")
            os.remove("添付したファイルを保存したディレクトリのパス" + file.filename)

        # パスワード入力がなかった場合エラー
        except IndexError:
            await message.channel.send('パスワードを入力してください')


# Botの起動とDiscordサーバーへの接続
client.run(TOKEN)
```

同じmain.pyと同じディレクトリ内に、config.pyを作成する。

```python:config.py
# -*- coding:utf8 -*-

TOKEN = "自分のbotのアクセストークン"
```
# 使い方
<img width="400" alt="コメント 2020-03-30 225048.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172182/9e0cbb72-e65b-7673-ff3f-3fc75cb8cc88.png">
botのいるサーバーにファイルを投げるときに、「/zip パスワード」とコメント入れると、パスワードの部分に書いた文字列がパスワードに設定されたzipがbotから返ってきます。
<img width="303" alt="コメント 2020-03-30 225130.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172182/4e3294b1-4d18-07e3-67ef-cd37ec9eb6f9.png">
写真の例でいうと、main.py.zipには、passwordという文字列がパスワードに設定されています。

# 課題

現在discordでは、8MBを超えるファイルを貼ることができないという点と、フォルダーを貼ることができないという点で、簡単なファイルの圧縮、パスワード設定にしか使えないので、解決方法を模索していきたいと思います。