【Python】Slackbotでパスワードを生成する

こんにちは、みやびのです。

今回はSlackbot+Pythonでパスワードを実装する方法について説明します。
具体的には以下の2つについて説明します。

・Pythonでパスワードを生成する方法
・Slackbot＋Pythonでパスワードを生成する


Pythonで作るSlackbotの基本については「[SlackbotをPythonで作成しよう](https://miyabikno-jobs.com/entrance-labotlatori/)」をお読みください。

## Pythonでパスワード生成する方法
Pythonのrandomライブラリを活用すれば比較的簡単にパスワード生成処理を作成できます。

```text:関数実装例
引数1：パスワードの桁数（デフォルト8）
引数2：文字列の種類(デフォルト：大文字・小文字・数字)
リターン値：パスワード
```

引数1に指定した桁数分の文字列をリターン。
さらに引数2によって「小文字と数字」、「大文字と小文字」、「大文字だけ」のように文字列を細かく指定できるようにします。
 
```py
import random


def make_password(digit=8, word_type=None):
    words = ''
    password = ''
    uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    lowercase = 'abcdefghijklmnopqrstuvwxyz'
    number = '0123456789'

    # 引数がない場合は全て指定
    if word_type is None:
        word_type = ['uppercase', 'lowercase', 'number']
    # 使用する文字の判定
    if 'uppercase' in word_type:
        words = words + uppercase
    if 'lowercase' in word_type:
        words = words + lowercase
    if 'number' in word_type:
        words = words + number

    # パスワードを生成ループ
    for i in range(0, digit):
        # 配列で返ってくるので0番目の値を取得
        password = password + random.sample(words, 1)[0]

    return password
```

パスワードの実装方法の詳細については「[Pythonでパスワード生成処理を実装する](https://miyabikno-jobs.com/python-make-password/)」をお読みください。

## Slackbot＋Pythonでパスワードを生成する
上記処理をSlackbotの応答に埋め込みます。

### Slackbotの応答仕様
引数1:パスワードの桁数
引数2:パスワードの文字の種類

文字の種類は以下の形で指定します。

```
数字:数字のみ
大英数字：大文字の英字と数字
小英数字：小文字の英字と数字
英字:小文字と大文字の英字
大英字：大文字の英字のみ
小英字:小文字の英字のみ
それ以外：英数字全て
```

### パスワードをダイレクトメッセージに送信
message.send()でチャンネルに応答してしまうと他の人にもパスワードが見えてしまうためセキュリティ上あまりよろしくありません。
よってダイレクトメッセージに応答します。

ダイレクトメッセージへの応答はslackerライブラリを使用すれば実現できます。

ダイレクトメッセージを使う場合はチャンネル名の代わりにユーザIDの指定が必要です。
ユーザIDはmessageに格納されています。
```py
# ユーザーID取得
user_id = message.user['id']
# ダイレクトメッセージでパスワードを送信
slack = Slacker(slackbot_settings.API_TOKEN)
slack.chat.post_message(user_id, password, as_user=True)
```

実装例は以下の通り。

```py
import random
from slackbot.bot import respond_to
from slacker import Slacker
import slackbot_settings

def make_password(digit=8, word_type=None):
    words = ''
    password = ''
    uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    lowercase = 'abcdefghijklmnopqrstuvwxyz'
    number = '0123456789'

    # 引数がない場合は全て指定
    if word_type is None:
        word_type = ['uppercase', 'lowercase', 'number']
    # 使用する文字の判定
    if 'uppercase' in word_type:
        words = words + uppercase
    if 'lowercase' in word_type:
        words = words + lowercase
    if 'number' in word_type:
        words = words + number

    # パスワードを生成ループ
    for i in range(0, digit):
        # 配列で返ってくるので0番目の値を取得
        password = password + random.sample(words, 1)[0]

    return password


@respond_to('^パスワード生成s(.*)s(.*)$')
def response_pass(message, digit, param_type):
    # ユーザーID取得
    user_id = message.user['id']

    # パターンの切り分け
    if param_type == '数字':
        word_type = ['number']
    elif param_type == '大英数字':
        word_type = ['lowercase', 'number']
    elif param_type == '小英数字':
        word_type = ['lowercase', 'number']
    elif param_type == '英字':
        word_type = ['lowercase', 'uppercase']
    elif param_type == '大英字':
        word_type = ['uppercase']
    elif param_type == '小英字':
        word_type = ['lowercase']
    else:
        word_type = ['uppercase', 'lowercase', 'number']

    # パスワード生成
    password = make_password(int(digit), word_type)

    # ダイレクトメッセージでパスワードを送信
    slack = Slacker(slackbot_settings.API_TOKEN)
    slack.chat.post_message(user_id, password, as_user=True)

    message.send('パスワードをダイレクトメッセージに送信しました！')

```

**◆実行結果**
![Slackbotでパスワード生成](https://miyabi-knock.com/tools/wp-content/uploads/2019/10/Slackbot_password1.png)

パスワードはダイレクトメッセージの方に送信されています。

![Slackbotでパスワード生成2](https://miyabi-knock.com/tools/wp-content/uploads/2019/10/Slackbot_password2.png)

## 終わりに
今回紹介したように比較的簡単にSlackbotをパスワード生成ツールにすることができます。
ちょっとしたパスワードを作りたい場合にあると便利ですね。

パスワード生成サイトなどもありますが、自由にカスタマイズできるのが人の作った生成サイトにはないメリットです。
今回は英数字1パターンの表示のみでしたが複数パターンの表示をしたり、記号も使えるようにしたりなどいろいろカスタマイズしてみてください。

Slackbotの活用方法はブログでもまとめています。
[Slackbotの作り方マニュアル〜Python編〜](https://miyabikno-jobs.com/slackbot-manual-python/)