kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Hubot で Marvel のキャラクター情報を取得する

Hubot で Marvel のキャラクター情報を返すスクリプトを書いていて,進捗を整理しておこうと思う.

ネタとしては前に API Gateway + Lambda を使って Slack Bot を作った話と似てるけど,今回は Webhook ではなくて Hubot Script で実現している.Marvel の情報を取得するのは前回と同じく Marvel API を活用する.さらに API をラップした GitHub - fiveisprime/marvel-api: Node.js wrapper for working with the official Marvel Comics API を Coffee から呼び出す.

kakakakakku.hatenablog.com

Marvel API Endpoint

API を使うと計6種類のリソースにアクセスすることができる.キャラクター情報だけじゃなく,アメコミのストーリー情報も取得できるし,リソース間の関係性も取得できる.とにかく Marvel 好きならたまらない API だと思う!

  • /characters
  • /comics
  • /creators
  • /events
  • /series
  • /stories

marvel.coffee

サンプルとして,キャラクター情報とクリエーター情報を返せるようにした.Hubot にキャラクター名を指定すると,characters なら name だし,creators なら firstName に完全一致でクエリを投げている.

  • hubot marvel characters iron man
  • hubot marvel creators gurihiru

Hubot から返す値としては以下の3点にしているが,API のレスポンスには他の情報も多くあるので,自由に変更できる.詳しくは Marvel Developer Portal - Interactive Documentation 参照で.

API を叩くためには API Keys が必要になるため,事前に取得した上で,環境変数に設定して使う.

  • HUBOT_MARVEL_API_PUBLIC_KEY
  • HUBOT_MARVEL_API_PRIVATE_KEY

もっと機能を追加して実用的になったら npm 登録したいと思ってるけど,現状としてはサンプルスクリプトとして公開している.

# Description:
#   Get Marvel infomation by "Marvel Comics API"
#
# Commands:
#   hubot marvel characters :name - Get Marvel character by name (e.g. Iron Man)
#   hubot marvel creators :name - Get Marvel creator by name (e.g. Gurihiru)
api = require('marvel-api')

module.exports = (robot) ->

  robot.respond /marvel characters (.+)$/i, (msg) ->
    characterName = msg.match[1]

    unless isSetPublicKey msg
      return
    unless isSetPrivateKey msg
      return

    client = getClient()
    client.characters.findByName characterName, (err, res) ->
      if err
        console.log err
        return
      if !res.data[0]?
        msg.send 'No character found.'
        return
      sendMarvel(msg, res.data[0])

  robot.respond /marvel creators (.+)$/i, (msg) ->
    creatorName = msg.match[1]

    unless isSetPublicKey msg
      return
    unless isSetPrivateKey msg
      return

    client = getClient()
    client.creators.findByName creatorName, (err, res) ->
      if err
        console.log err
        return
      if !res.data[0]?
        msg.send 'No creator found.'
        return
      sendMarvel(msg, res.data[0])

isSetPublicKey = (msg) ->
  if process.env.HUBOT_MARVEL_API_PUBLIC_KEY?
    return true
  msg.send '"HUBOT_MARVEL_API_PUBLIC_KEY" is not set.'
  return false

isSetPrivateKey = (msg) ->
  if process.env.HUBOT_MARVEL_API_PRIVATE_KEY?
    return true
  msg.send '"HUBOT_MARVEL_API_PRIVATE_KEY" is not set.'
  return false

getClient = ->
  api.createClient(
    publicKey: process.env.HUBOT_MARVEL_API_PUBLIC_KEY,
    privateKey: process.env.HUBOT_MARVEL_API_PRIVATE_KEY
  )

sendMarvel = (msg, obj) ->
  image_path = obj.thumbnail.path
  image_extension = obj.thumbnail.extension
  image_size = 'standard_amazing'

  msg.send obj.name || obj.fullName
  msg.send image_path + '/' + image_size + '.' + image_extension
  msg.send obj.urls[0].url

雰囲気

f:id:kakku22:20160217230507p:plain

marvel-api に PR を投げた

クリエーター情報を取得する Hubot Script を書いていたらパッケージからエラーが返ってきて,実装されている marvel.creators.findByName に不具合があることに気付いた.

デフォルトだとエラー情報が表示されなかったため,自分でデバッグしながら調査をして,パッチを PR したらマージしてもらえた.Node の知識なくて困ったけど,試行錯誤しながら学べたし良かった.あと Marvel 大好きだから絶対直そうという気持ちもあったw

github.com

Swagger の便利さを改めて感じた

Marvel Interactive Documentation は Swagger で実装されていて,Interactive と言ってる通り,全ての API を試せるため,超便利だった.今まで見た中で最高の Swagger Spec の事例なんじゃないかと思う.Swagger!

最近 Hubot で遊びまくってる

早く ChatOps 導入したいなぁ...!

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com