2017 年 7 月の記事一覧です(2 件)

Cage The Elephant ( Unpeeled Live Video )

第59回グラミー賞において、最優秀ロック・アルバム賞を受賞したCage The Elephantの最新アルバム『Unpeeled』(アコースティック・ライブ・アルバム)が昨日発売されたんですが、それに先立ってアコースティックライブの公式MVが YouTubeにアップロードされています。これが最高なので是非視聴してみて下さい。以下代表的な曲を貼り付け。

Shake Me Down は往年のOasisを彷彿させます


Ain't No Rest For The Wicked はこのYouTubeで使われていることで知りました
SHUNSUKE NAKAMURA (中村俊輔) -Celtic (セルティック) -2005-2009- - YouTube
舌っ足らずなラップが最高です


Cigarette Daydreams はいつ聴いても泣ける


Cage The Elephant最高なんで他のアルバムも是非聴いてみて下さい

UNPEELED
UNPEELED
posted with amazlet at 17.07.29
CAGE THE ELEPHANT
RCA (2017-07-28)
売り上げランキング: 28,257

SlackでNHK『おはよう日本』キャスターの和久田アナ専用チャンネル作った

via GIFMAGAZINE

なぜ作った?

今の自分にとって一番必要なのは癒しだから


機能

  • インスタグラムで和久田アナのハッシュタグがついた画像を取得して #wakuda に流す
  • Google Custom Search APIで取得した和久田アナの画像を一時間に一度 #wakuda に流す
  • "img" "imgplz" などと発言するとGoogle Custom Search APIで取得した和久田アナの画像を #wakuda に流す

以下順序立てて説明


インスタの画像取得について

Zapierを利用、ザピエルと読むらしい。ZapierはIFTTTやmyThingsと同様に簡単にWebサービス同志を連携できるもの。今回はこのやり方を真似させて貰った
ZapierでSlackを佐野ひなこちゃんで埋め尽くす #apijp - @i2key のBlog
きっとPythonやなんかで自力で出来ないこともないだろうけど、簡単に出来るものがあるのならばそれを利用する。但しあまり更新されないし、人任せなところもあるのであまり期待せずに画像が流れてくるのを待っているところ


AWS Lambda Pythonを使った画像の定期投稿

Google Custom Search API、AWS Lambda Python、SlackのIncomingWebhooksを利用。流れ的には、先ずGoogle Custom Search APIを使い、画像URLをS3に保存。そしてスケジュールイベントでAWS Lambdaを起動させ、ランダムチョイスでひとつ画像URLを選択してSlackのIncomingWebhooks経由で投稿する。PythonでSlackのIncomingWebhooks(SlackのAPIと言えばいいのか)を操作するのに今回使用したのはslackwebというライブラリでこれがすごく簡単に投稿してくれる

Python 2.7.13 (default, Jan 31 2017, 21:53:31)
Type "copyright", "credits" or "license" for more information.

IPython 5.4.1 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: import slackweb

In [2]: slack = slackweb.Slack(url='https://hooks.slack.com/services/*****************')

In [3]: slack.notify(text="test")
Out[3]: u'ok'

Amazon API Gatewayを使ったbot的な画像投稿

Google Custom Search API、AWS Lambda Python、Amazon API Gateway、SlackのOutgoing Webhooksを利用。 定期投稿の場合はslackwebを使ったのだけど、Amazon API Gateway + Outgoing Webhooksの場合はAWS Lambdaでjsonなレスポンスを返してあげればSlackに投稿される。流れ的にはSlackの該当チャンネル上で任意の言葉を発言すると、Outgoing WebhooksがAmazon API GatewayのWebAPIを叩き、AWS Lambdaが起動する。AWS LambdaがS3にあるURLからランダムチョイスで選択しSlackに返信される。

以下適当なコード

from __future__ import print_function, unicode_literals
import random
from random import SystemRandom
from string import ascii_lowercase, digits
import boto3
from settings import config as cfg


def _random(farm):
    return random.choice(farm)


def _create_anchor(image):
    return image + '#' +  ''.join(SystemRandom().choice(digits+ascii_lowercase) for i in xrange(20))


def get_image_list(bucket, key):
    s3 = boto3.resource('s3')
    bucket = s3.Bucket(bucket)
    obj = bucket.Object(key)
    obj = obj.get()
    body = obj['Body'].read()
    return (body.decode('utf-8').split(','))


def lambda_handler(event, context):
    if not event['token'] == cfg['SLACK_TOKEN']:
        return ""
    msg = _create_anchor(_random(get_image_list(cfg['BUCKET'], cfg['KEY'])))
    payload = {"text": msg}

    return payload

Amazon API Gateway の APIキー認証

今回一番悩んで嵌った箇所がこれ(というか多分今もわかってないかも)。 API GatewayでAPIキー認証を行う場合APIキーはリクエストヘッダにキーを含める必要がある。 SlackからOutgoing Webhooks経由でAPI Gatewayを叩く際、キー認証を行うにはOutgoing Webhooksからのリクエストヘッダにキーを含めなくてはならない(?) それは出来そうにないのでOutgoing Webhooks経由ではAPI キー認証は出来ないということでいいのだろうか。なので現在はAPI GatewayのセキュリティはOpenにしてそのかわりOutgoing Webhooksに含まれるトークンをLambdaで受け取って認証している(トークンの認証に失敗すれはLambdaはなにもしないで終了)


画像取得について

Google Custom Search APIによる画像取得は現在1回/日しか実行していない。というのは毎回画像取得のLambdaを実行させても結果はあまり変わらない為。 また件数も50件しか取得していない。これは取得する件数を増やすと和久田ファン的に納得できないノイジーな画像が増えてくる為で仕方が無く50件におさえているのが実情。 投稿される画像はいつも似たような画像が多くなるのでそれも新鮮味が欠けてくるので悩ましいところ。


画像重複問題

Slackは1時間以内に同じURLを投げつけると警告を出してプレビューしてくれない模様

スクリーンショット 2017-07-19 21.09.18

和久田ファンとしては非常にゆゆしき問題なので、問題を回避すべく色々考えた結果、ランダムな文字列のアンカーをくっつけることにした

def _create_anchor(url):
       return url + '#' +  ''.join(SystemRandom().choice(digits+ascii_lowercase) for i in xrange(20))

画像URLを引数に取ることによってランダム文字列のアンカー付きのURLが返される。Slack側には違うURLと認識されるが、プレビュー時にはアンカーは無視されて正しい画像が展開される。一応これでうまくいっている。

その他

とりあえず一個前のブログ記事にもあるように、システムエンジニア職を辞めてしまい新しいことをやっているのだけど、思ってた以上に激流で日々ラフティングをやっているような気分。毎日ヘロヘロになっているのでこれさえあれば頑張れると思って残っている力を振り絞って作った。後悔はしていない。

以上です


PAGE TOP