1
/
5

たいがーのインターンシップ体験記【23日目】 ~初めてのSlack bot~

今朝割った卵が双子でテンションが上がりました、たいがーです。レアな気がして、テンション上がりますよね。あれ、私だけですか…?

Slack botを作ってみることに。

前回までの課題で、Cloud Automatorのハンズオンの準備の自動化はほぼ終了したので、次から何をしようかという流れになっていました。

少し話し合い、Cloud AutomatorのSlackチャンネルにて、定期的に情報を流すためのSlack botを作成してみようとなりました!

とりあえず通知を送ってみる

とりあえず、InComing WebHooksを使って通知するところから始めていきます。

Slackのアプリケーションの設定から、通知を送信したいチャンネルを選択すると、Webhook URLが表示されます。そのURLを使って、POSTのリクエストを送信しますので、コピーしておきます。

PythonでJSONを書いていきます。

GitHubで社員さんにIssueを立てていただいたのですが、本文:何か面白い一言と書いていて、そこに一番力を注いだかもしれません…関西人にとって、怖すぎるフリです。笑

何とボケたかは…秘密です。笑

textに本文、usernameにSlackでの表示名、icon_emojiはiconを入れていきます。

import requests, json

WEB_HOOK_URL = '{Webhook URL}'
requests.post(WEB_HOOK_URL, data = json.dumps({
    'text': u'text',
    'username': u'tiger',
    'icon_emoji': u':tiger:',
}))

少しSlackが盛り上がってうれしかったです。笑

久しぶりにLambdaを触ると忘れていました

今後も使えるように別ファイルを用意する

一度通知を送ってみた時はすべてを指定しましたが、次はチャンネル、ユーザー名、アイコン、本文を別ファイルで指定、中でも本文はランダムで表示するように変更します。

とりあえず、別ファイルとしてYAMLファイルを作成します。

url: '{Webhook URL}'
name: 'tiger'
icon: ':tiger:'
text0: 'A'
text1: 'B'
text2: 'C'

このようにすることで、テキストのみランダムに表示されるようにします。

Pythonのコードも、これに合わせて書き換えていきます。0~2の整数をランダムにするためにどの関数を使うのかどうかで分からず、何度か出力することで、このような形でいけるとわかりました!

import json
import random
import requests
import yaml

with open('slack_config.yml',  'r') as yml:
    config = yaml.load(yml)

WEB_HOOK_URL = config['url']
requests.post(WEB_HOOK_URL, data = json.dumps({
    'text': config['text' + str(random.randrange(2))],
    'username': config['name'],
    'icon_emoji': config['icon'],
    }))

続いて、Lambdaで関数を作成していきます。

外部モジュールで詰まりました

とりあえずCloudWatch Eventsでするのではなく、手動で動かせるようにしていきます。

lambdaにはあらかじめ、このようなコードが入っています。

import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

ここから、先ほどのコードと合わせて、動作テスト用のコードを作っていきます。

import json
import random
import requests
import yaml

with open('slack_config.yml',  'r') as yml:
    config = yaml.load(yml, Loader=yaml.FullLoader)

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

def post_slack():
    WEB_HOOK_URL = config['url']
    requests.post(WEB_HOOK_URL, data = json.dumps({
        'text': config['text' + str(random.randrange(2))],
        'username': config['name'],
        'icon_emoji': config['icon'],
        'link_names':1
    }))

post_slack()

試しにテストをしてみます。requestsとyamlモジュールがimportできないと出てきました。

調べてみると、lambdaはzipファイルとしてアップロードしないとrequestsとyaml(Pythonの場合はPyyaml)を含む外部モジュールを使えないようです。

zipに圧縮してまとめるために、7-ZIPをインストールして、packageというファイルに格納し、そのファイルを圧縮していきます。

zipファイル化し、アップロードしてみます。しかし、まだrequestsとyamlモジュールがimportできないと出てきました。

zipファイルを作成した階層がいけなかったようです。packageファイルの中でzip化したものをアップロードするとうまくSlackに通知を送ることができました!

初めてのSlack bot

今回、初めてSlack botを作成しました!普段からSlackを使用するので、そこでもbotを作成してみたいなと思っています。ほかのところで使えるものも色々触ってみたいですが、ほかにどのようなものがあるのでしょうか…色々考えてみたいです!

Invitation from 株式会社サーバーワークス
If this story triggered your interest, have a chat with the team?
株式会社サーバーワークス's job postings

Weekly ranking

Show other rankings
Like Kana Kitagawa's Story
Let Kana Kitagawa's company know you're interested in their content