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 から呼び出す.
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 参照で.
- 正式名称
- 画像 URL(サイズは standard_amazing 固定にしている)
- 詳細ページ URL
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
雰囲気
marvel-api に PR を投げた
クリエーター情報を取得する Hubot Script を書いていたらパッケージからエラーが返ってきて,実装されている marvel.creators.findByName
に不具合があることに気付いた.
デフォルトだとエラー情報が表示されなかったため,自分でデバッグしながら調査をして,パッチを PR したらマージしてもらえた.Node の知識なくて困ったけど,試行錯誤しながら学べたし良かった.あと Marvel 大好きだから絶対直そうという気持ちもあったw
Swagger の便利さを改めて感じた
Marvel Interactive Documentation は Swagger で実装されていて,Interactive と言ってる通り,全ての API を試せるため,超便利だった.今まで見た中で最高の Swagger Spec の事例なんじゃないかと思う.Swagger!
最近 Hubot で遊びまくってる
早く ChatOps 導入したいなぁ...!