show log include yunabe

勉強したことの復習を兼ねて、IT関係(主にネットワーク/サーバ)についてまとめてます。

HubotでAPIを利用して雑談したり、天気を教えて貰ったりする

概要

Hubotでは雑談、何かのアクション、情報の取得等様々なことをAPIを利用して実装することができます。
例えば今回はdocomoの自然対話で雑談、OpenWeatherMapで天気の取得を実装します。
・雑談BOT(docomo自然対話)
・天気取得BOT(OpenWeatherMap)
hubot実装については以下になります。
yunabe.hatenablog.com

雑談BOTの作成

APIトークンを取得する

docomoAPIを利用するため、ユーザ登録を行います。
| docomo Developer support | NTTドコモ

クライアントキーとシークレッドキーを取得する

ユーザ登録をしたあとサイトでクライアントキーとシークレッドキーとAPIキーを確認する。
f:id:yunabe_net:20181006124142p:plain

先ほど取得したAPIキーを使ってappIdを取得する

f:id:yunabe_net:20181006124507p:plain curlコマンドでもいいですが、postmanを使うとGUIで簡単にAPIを叩くことができます。
https://api.apigw.smt.docomo.ne.jp/naturalChatting/v1/registration?APIKEY=<apiKey>
appIdが返却されるので、メモをしておきます。

Hubotの変数にキーを記載します。

cd myhubot
vi bin/hubot

#docomo-API-Token
export HUBOT_DOCOMO_DIALOGUE_APPID="xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx"
export HUBOT_DOCOMO_DIALOGUE_API_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

coffeeスクリプトを作成する

vi scripts/docomo-chat.coffee

module.exports = (robot) ->
  status = {}

  robot.respond /(\S+)/i, (msg) ->

    message = msg.match[1]
    HUBOT_DOCOMO_DIALOGUE_API_KEY = process.env.HUBOT_DOCOMO_DIALOGUE_API_KEY
    HUBOT_DOCOMO_DIALOGUE_APPID   = process.env.HUBOT_DOCOMO_DIALOGUE_APPID
    url = 'https://api.apigw.smt.docomo.ne.jp/naturalChatting/v1/dialogue?APIKEY='+HUBOT_DOCOMO_DIALOGUE_API_KEY
    headers = {'Content-Type':'application/json'}

    d = new Date()
    appSendTime = d.getFullYear() + '-' + ('0' + (d.getMonth() + 1)).slice(-2) + '-' + ('0' + d.getDate()).slice(-2) + ' '\
                   + d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds()

    request = require('request');

    request.post
      url: url
      headers: headers
      json:
        language: "ja-JP"
        botId: "Chatting"
        appId: HUBOT_DOCOMO_DIALOGUE_APPID
        voiceText: message
        #clientData: {"option": {"mode":"dialog","t":"akachan"}}
        clientData: {"option": {"mode":"dialog","t":"kansai"}}
        appRecvTime: status['appRecvTime']
        appSendTime: appSendTime
      , (err, response, body) ->

        msg.send body.systemText.expression
        status =
          "appRecvTime": body.serverSendTime

スクリプトを作成したあとに再起動をかけます

bin/hubot restart

天気取得BOT

openweathermapをユーザの登録をしappIdを取得する

openweathermap.org
取得したキーを以下のスクリプトに記載します、今回以下のスクリプト2つを使ってTokyoの天気を取得します。

今日の天気の詳細をopenwether APIを使って取得する

vi scripts/open-weather.coffee

module.exports = (robot) ->

        send = (msg) ->
                request = robot.http("http://api.openweathermap.org/data/2.5/weather?q=Tokyo,jp&appid=<取得したappIdを記載する>&units=metric").get()

                stMessage = request (err, res, body) ->
                        json = JSON.parse body
                        weatherName = json['weather'][0]['main']
                        icon = json['weather'][0]['icon']
                        temp = json['main']['temp']
                        temp_max = json['main']['temp_max']
                        temp_min = json['main']['temp_min']
                        msg.send "気温:"+ temp + "℃ 最高気温:"  + temp_max+ "℃ 最低気温:" + temp_min + "℃\nhttp://openweathermap.org/img/w/" + icon + ".png"

        robot.hear /今日の天気/, (msg) ->
                send(msg)

明日と明後日の天気を取得する

vi scripts/livedoor-weather.coffee
エリアのcity部分は以下で調べられます、ちなみに今回は270000で東京になっています。
weather.livedoor.com

module.exports = (robot) ->
  robot.hear /(.*)の天気/i, (msg) ->
   switch msg.match[1]
      when '今日'
        day = 0
        agenda = "今日の東京の天気は"
      when '明日'
        day = 1
        agenda = "明日の東京の天気は"
      when '明後日'
        day = 2
        agenda = "明後日の東京の天気は"
      else
        day = 3
        agenda = "うーん、"
        break
    request = msg.http('http://weather.livedoor.com/forecast/webservice/json/v1?city=270000')
    .get()
    request (err, res, body) ->
      json = JSON.parse body
      if day == 3 then forecast = '今日/明日/明後日のどれかにして欲しいん' else forecast = json['forecasts'][day]['telop']
      msg.send agenda + forecast + "だよー"

起動しているデーモンを確認

forever list

デーモンプロセスを停止

forever stop 0

スクリプトを記載したらまた再起動をします

bin/hubot restart