12時になったらお昼を告げるためSlackに「ごはんですよ」の画像を投稿させたい

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

こんにちは、おてらです。

最近色んな企業の間でSlackはよく使われていると思います。

ウチの社内でもSlackを使ってコミュニケーションを取りながら業務を行っています。

社内でもいくつかチームを使い分けているんですが、その内の1つにお昼休みの12:00になったら「ごはんですよ」と定期的にPOSTするコメントbotを導入していました。

するとメンバーの1人があの「ごはんですよ」の画像を投稿してきたので思い切ってそれを自動化してみようと思い、実際にやってみました。

概要及び参考資料

以下のQiitaで今回やりたいことがズバリまとめられていたのでこちらを参考にさせていただきました。

参考:Python + AWS Lambda + Slackで定期的にパピヨンの画像を投稿する

 

ほとんど(全く)同じですが構成図を。

2016-06-10_09h08_12

やってることは全く同じですが、Google Custom Search APIの利用手順などをもう少し深堀りしたいと思います。

Google Custom Search API

参考資料のQiitaで十分な説明がなされているので詳細は割愛しますが、このAPIは無料プランではクエリの数が100までという制限があります。

今回は1日1回SlackにPOSTするだけなので全く問題ないです。

APIキー取得までの流れ

まずGoogle Developers ConsoleからAPIキーを取得しましょう。
※APIを利用するにはGoogleにログインする必要がありますのでアカウントを保有していることが前提となります。

こちらのURLにアクセスします。

https://console.cloud.google.com/apis/

以下の画面が表示されたら「Custom Search API」を選択します。

※以下画像は全てクリックで拡大されます。

2016-06-09_18h31_25

 

続いてAPIを有効化します。

2016-06-09_18h32_33

 

「認証情報」から「認証情報を作成」⇒「APIキー」を選択します。

2016-06-09_18h35_26

 

サーバーキーを選択します。

2016-06-09_18h36_10

 

適当な名前をつけてキーを作成します。

2016-06-09_18h37_00

 

APIキーが作成されるのでコピーしておきましょう。

2016-06-09_18h37_35

 

作成したAPIキーが一覧に追加されたことが分かります。

2016-06-09_18h38_22

 

これでAPIキーの取得は完了です。

続いてカスタム検索エンジンを作成します。

Custom Search Engineの作成

Custom Search Engineのダッシュボードにアクセスします。

https://cse.google.com/cse/all

 

以下の画面が表示されたら「Add」をクリック。

2016-06-09_18h40_35

 

検索エンジン作成に必要な情報を入力していきます。

2016-06-09_18h42_17

 

作成したらコントロールパネルへ移動します。

2016-06-09_18h44_22

 

コントロールパネルでは、検索エンジンID(Custom Search Engine ID)を取得することが出来ますのでこれをメモしておきます。

Web全体から画像検索を行うので以下のように設定します。

  • 画像検索:ON
  • 検索するサイト:追加したサイトを重視して、ウェブ全体を検索する

 

2016-06-09_18h47_10

 

設定が出来たら画面右にあるプレビューとでも言いますが、設定した内容で検索をテスト出来るフィールドがありますのでそちらで「ごはんですよ」というキーワードで確認してみます。

2016-06-09_18h51_57

バッチリごはんですよの画像がヒットしました!!

 

これで検索エンジンの準備はOKです。

続いてSlackの準備です。

Slack

Slackは言わずと知れたチャットツールですが、カスタマイズ性の高さは非常にエンジニアの心をくすぐりますよね。

今回はIncoming WebHooksを使って投稿を行います。

Incoming WebHooksの準備

メッセージの投稿先となるSlackのチームのIncoming WebHooksの設定画面にアクセスします。

投稿先のチャンネルを指定し、「Add Incoming WebHooks integration」をクリックします。

2016-06-09_19h07_56

 

新たにWebHookのURLが発行されるのでこれをコピーしておきます。

2016-06-09_19h09_31

 

その他の項目はbotの名前だったり投稿時に表示されるアイコンの設定などが出来るので、必要に応じて「ご飯ですよBOT」などの名前にしたりして遊び心を取り入れてみてください。

 

これでSlackの準備はOKです。

最後にAWS Lambdaの準備です!

AWS Lambda

AWS Lamdaは実行させたいコードを書き、その契機となるタスクと組み合わせることでサーバレスでコードを実行することが出来るサービスです。

参考資料のQiitaにあったスクリプトを拝借して実装します。

 

スケジューリングタスクの登録

AWSマネジメントコンソールにログイン、Lambdaを選択し、新しいLambda Functionを作成します。

lambda-canary を利用します。

2016-06-09_19h13_09

 

登録するタスクの詳細設定を行っていきます。

Event source type CloudWatch Events – Schedule を選択します。
Rule name このルールの名前です。任意でOKですが、空白(スペース)は使えません。
Rule description このルールの説明。任意。
Schedule expression 今回はcron形式で、平日の12時で指定します。

 

2016-06-09_19h16_48

※追記

CloudWatchのcronはUTCで解釈されるので日本時間から-9時間した時刻をcronに登録する必要がありました。

お昼の12時にPOSTさせるので、UTCで午前3時ですね。

 

タスクの登録

タスクを登録します。

Nameに分かりやすい名前を登録し、その他はデフォルトで構いません。

Lambda function codeに実行するコードを書くのですが、こちらはソースコードを拝借します。

2016-06-09_19h20_00

 

以下のソースコードを利用させてもらいました。

10,11,15行目の変数には取得した各情報を設定してください。

CUSTOM_SEARCH_API_KEY Google Custom Search APIキー
CUSTOM_ENGINE_ID カスタム検索エンジンID
URL_TEMPLATE WebHookのURL

あと、一番最後の行で検索ワードを指定できるようなので、今回はここを「ごはんですよ」としました。

#-*- coding:utf-8 -*-
from urlparse import urljoin
from urllib import urlencode
import urllib2 as urlrequest
import json
import random

# CUSTOM SEARCH API周りの設定
CUSTOM_SEARCH_API_KEY = "XXXXXXXXXXXXXXXXXXXXXXX"
CUSTOM_ENGINE_ID = "XXXXXXXXXXXXXXXXXXXXXXX"
URL_TEMPLATE = "https://www.googleapis.com/customsearch/v1?key={key}&cx={cx}&searchType=image&q={search_word}"

# SLACK周りの設定
SLACK_POST_URL = "https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

def post_image_to_slack(search_word):
    """
    google custom serachでimageのURLを取得し,ランダムでSLACKに投稿する
    """
    # urlを複数取得する
    urls = get_image_urls(search_word)

    # urlが取得できなかった場合は投稿しない
    if len(urls) == 0:
        return "no images were found."

    # urlをランダムに選択する
    url = random.choice(urls)

    # slack用のメッセージを作成
    post_msg = build_message(url)

    # slackに投稿
    return post(post_msg)

def get_image_urls(search_word):
    """
    GOOGLE CUSTOM SEARCH APIからキーワードで画像のURLを取得する
    """
    encoded_search_word = urlrequest.quote(search_word)
    url = URL_TEMPLATE.format(key=CUSTOM_SEARCH_API_KEY, cx=CUSTOM_ENGINE_ID, search_word=encoded_search_word)
    req = urlrequest.Request(url)
    res = urlrequest.build_opener(urlrequest.HTTPHandler()).open(req)
    data = json.load(res)

    if "items" not in data:
        return []

    links = []
    for item in data["items"]:
        links.append(item["link"])
    return links

def post(payload):
    """
    SlackにメッセージをPOSTする
    """
    payload_json = json.dumps(payload)
    data = urlencode({"payload": payload_json})
    req = urlrequest.Request(SLACK_POST_URL)
    response = urlrequest.build_opener(urlrequest.HTTPHandler()).open(req, data.encode('utf-8')).read()
    return response.decode('utf-8')

def build_message(url, **kwargs):
    """
    Slack用のメッセージを作成
    """
    post_message = {}
    post_message["text"] = url
    post_message.update(kwargs)
    return post_message


def lambda_handler(event, context):
    post_image_to_slack('ごはんですよ')

 

コードを登録する際に、AWSのRoleを設定する必要がありますが、こちらは「lambda_basic_execution」で良いかと思いますが、社内のポリシーに従って適切なRoleを設定しましょう。

最後に確認画面が表示されますが、ここで「Enable event source」にチェックが入ってないとスケジュールタスクが実行されないのでチェックの入れ忘れに注意してください。
※入れ忘れてももちろん後から設定可能です。

2016-06-09_19h20_42

これでLambdaにタスクが登録されました。

2016-06-09_21h50_16

 

このEvent sourceはCloudWatchを利用しているので、CloudWatchにルールが登録されています。

Event sourceのリンクをクリックして確認してみましょう。

CloudWatch

以下のようにCloudWatchのルールに先ほど作成したルールが追加されていますね。

2016-06-09_21h52_15

 

ルールをクリックするとサマリーが表示されます。

右上のアクションから編集を選択すると、スケジュールを変更することが出来ます。

2016-06-09_21h54_06

 

左にはイベントのスケジュールの設定、右側にはそのスケジュールで実行されるタスクの設定があります。

2016-06-09_21h55_32

 

スケジューリングを変更したい場合はここから変更すればOKです。

実行結果

スケジュールに設定した時刻になると、いよいよ「ごはんですよ」の画像が投稿されます!!
※以下は実行スケジュールをいじったので17:24に投稿されています。

2016-06-09_21h58_47

きたー!!ごはんですよにしいたけ味とかあったんだ!!!食欲増しそうですね!!

まとめ

今回も例によって先人の知恵をお借りしてやりたいことが叶いました。

サーバレスで、指定した時間にGoogle検索を行い、Slackに投稿する、「モノはないのに自動的に何かが起こる」というまさにクラウドならではですね。

 

みなさんもお昼になったらごはんですよでご飯を食べてみてはいかがですか^^

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

コメントを残す