SlideShare a Scribd company logo
hubotで快適BOT生活
 hubotの導入とIRCでの活用方法のまとめ

                 miff
                 http://blog.fumiz.me/
最初に

       前半でhubot自体の説明をしていますが、


        そんなのわかっているという方は、


後半でIRCとの連携方法や基本的なコマンドの書き方を説明しているので


            そこだけ見て下さい
目次
第一章 hubotとは何か

第二章 hubotのインストールと起動

第三章 hubotとIRCの接続

第四章 スクリプトの書き方

第五章 具体的なスクリプトの例

おまけ noticeでメッセージを送る

最後に
第一章
hubotとは何か
hubotとは

github社が作ったBOTのフレームワーク



           http://hubot.github.com/
BOTとは

    呼びかけに反応する

    定型文を定期的に発言する

    単体テストの失敗を通知する

    今日の天気を調べる




   IRCなどの上でこういった定形処理を
 人に代わって行なってくれるソフトウェアです
BOTのフレームワーク
 対象サービスごとに様々なフレームワークが存在します
                      IRCなら……
IRCbot console http://www.enjoyxstudy.com/ircbotconsole/
                   http://search.cpan.org/~yappo/App-
   ikachan              Ikachan-0.02/bin/ikachan

   phenny             http://inamidst.com/phenny/



    とにかく沢山あります。それらと比べてhubotは?
BOTのフレームワーク
  サービス      BOTフレームワーク     コマンド

                         呼びかけに反応する
  Twitter     twittbot
                          定期的につぶやく


                          テストの結果を表示
              ikachan
                          今日の天気を表示
  IRC

プラットフォームごとに様々なBOT作成フレームワークがあります


                         twittbot http://twittbot.net/
BOTのフレームワーク
   サービス       BOTフレームワーク       コマンド

                              呼びかけに反応する
    Twitter     twittbot
                              定期的につぶやく


                              テストの結果を表示
                 ikachan
                              今日の天気を表示
    IRC

例えばtwittbotはTwitterと結合しているのでIRCのBOTは作れません
BOTのフレームワーク
  サービス      BOTフレームワーク    コマンド

                         呼びかけに反応する
  Twitter     twittbot
                         定期的につぶやく


                         テストの結果を表示
              ikachan
                         今日の天気を表示
   IRC

 それぞれのフレームワークは別の仕組みで動いているので、
一方に向けて作ったコマンドをもう一方で動かすこともできません
hubotを使うとどうなるか
サービス          Adapter           Scripts

                              呼びかけに反応する
          hubot-twitter   h
Twitter                   u   定期的につぶやく
                          b
                          o
                              テストの結果を表示
            hubot-irc     t
                              今日の天気を表示
IRC

プラットフォームとの接続部分とコマンドを本体から切り離す

 ことで多くのプラットフォームに対応可能となっています
多様なサービスに対応
          IRC

          Twitter

          Google Talk

          Skype


    加えて、新しいAdapterを作るのも簡単です
hubotは



 自由に拡張できる
 簡単に使える

 色々なサービスに対応可能
          そんなBOTのフレームワークです
第二章
hubotのインストールと起動
公式サイトを見ても
使い方がよくわからない
簡単に動かす方法を説明します、が

     hubotの動作には、次の3点が必要です

  Node.js
  CoffeeScript
  Redis
                           カンタン
インストール方法はWebで
            http://blog.fumiz.me/2012/07/26/hubot-irc-bot/
手順1 インストール
どこかのディレクトリにpackage.jsonを作る
{
    "name": "hubot-sample",
    "version": "0.0.1",
    "dependencies": {
      "hubot": "2.3.0"
    }
}


必要なモジュールをインストールする
% npm install
ディレクトリ構成はこんな感じになっている筈
% tree -L 2
.
¦-- node_modules
¦ `-- hubot
`-- package.json
手順2 実行
hubotコマンドを叩く
% node_modules/hubot/bin/hubot




すると……
www12395ue:miff% node_modules/hubot/bin/hubot
path.exists is now called `fs.exists`.
Hubot>


                         無事、動きました
しかし、このままではコマンドを使えません
www12395ue:miff% node_modules/hubot/bin/hubot
path.exists is now called `fs.exists`.
Hubot> hubot ping
Hubot> hubot help
Hubot> hubot die
Hubot> ( ゚д゚ )
手順3 コマンドを入れる
本体同梱のコマンドをカレントディレクトリにコピー
cp -R node_modules/hubot/src/scripts ./


今度こそ動きました
www12395ue:miff% node_modules/hubot/bin/hubot
path.exists is now called `fs.exists`.
Hubot> hubot ping
Hubot> PONG
Hubot> hubot die
Hubot> Goodbye, cruel world.
Hubot> %
% tree -L 2
.
¦-- node_modules
¦ `-- hubot
¦-- package.json
`-- scripts
    ¦-- google-images.coffee
    ¦-- help.coffee
    ¦-- httpd.coffee
    ¦-- maps.coffee
    ¦-- math.coffee
    ¦-- ping.coffee
    ¦-- pugme.coffee
    ¦-- roles.coffee
    ¦-- rules.coffee
    ¦-- storage.coffee
    ¦-- translate.coffee
    `-- youtube.coffee


  実行時のカレントディレクトリ下にあるscriptsディレクトリに
           入っているスクリプトが起動時に実行される仕組み
TIPS
起動時にこういうエラーが出る時はポートが既に使われています
Hubot> [Wed Aug 01 2012 02:18:37 GMT+0900 (JST)] ERROR Error: listen
EADDRINUSE

使ってないポート番号を指定することで回避できます
% export PORT=9999




           hubotでは、設定を環境変数で指定します
第三章
hubotとIRCの接続
プラットフォーム        Adapter           Scripts

                                呼びかけに反応する
            hubot-twitter   h
  Twitter                   u   定期的につぶやく
                            b
                            o
                                テストの結果を表示
              hubot-irc     t
                                今日の天気を表示
  IRC


   素の状態にAdapterを追加することでIRCに接続できます
hubotとhubot-irc、サンプルスクリプトを
   まとめたパッケージを作りました




  https://github.com/fumiz/hubot-ircbot-example
1. インストール


  パッケージをダウンロードしてモジュールをインストール
% git clone git://github.com/fumiz/hubot-ircbot-example.git
% cd hubot-ircbot-example
% npm install
2. 設定

同梱のrunhubot.shを編集してIRC接続用の設定を書きます




                            BOTの呼び名
3. 実行
% ./runhubot.sh




                  無事、IRCに接続できました
第四章
スクリプトの書き方
JavaScriptでもOK

scriptsディレクトリ下に.jsか.coffeeを置く
基本的な書き方
hello.coffee
 module.exports = (robot) ->
  robot.respond /who are you/i, (msg) ->
   msg.send "I'm hubot!"


  robot.hear /HELLO$/i, (msg) ->
   msg.send "hello!"


  robot.respond /who am I/i, (msg) ->
   msg.send "You are #{msg.message.user.name}"


  robot.respond /what is this (.*)/i, (msg) ->
   msg.send "This is #{msg.match[1]}"
respondとhear

robot.respond /who are you/i, (msg) ->
 msg.send "I'm hubot!"


robot.hear /HELLO$/i, (msg) ->
 msg.send "hello!"




                respond「呼ばれて答える」

                hear「チャンネル上の発言に反応する」
msgオブジェクト

robot.respond /who am I/i, (msg) ->
 msg.send "You are #{msg.message.user.name}"




  msgオブジェクトには、関数が呼び出された時の発言に関する
                        情報が入っています

    msg.send関数によって発言が行われたチャンネルに対して
                BOTに発言させることができます
正規表現とキャプチャ

robot.respond /what is this (.*)/i, (msg) ->
 msg.send "This is #{msg.match[1]}"




   第一引数に渡す正規表現にマッチした発言が行われた場合に
                  第二引数に渡す関数が実行されます

   正規表現でキャプチャした文字列は、msgオブジェクトから
                                取り出せます
基本的な書き方については以上です


後はnode.jsの豊富なライブラリを組み合わせることで、


 大抵の処理をBOTに行わせることができる筈です
第五章
具体的なスクリプトの例
ここで紹介するサンプルは、hubot+hubot-irc導入パッケージの
      scriptsディレクトリに入っています
    https://github.com/fumiz/hubot-ircbot-example




  cron.coffeeのみ、メッセージの送信先チャンネルを

      手動で設定する必要があるので注意です
定期実行 cron
cron. coffee
 cronJob = require('cron').CronJob


 module.exports = (robot) ->
  send = (room, msg) ->
   response = new robot.Response(robot, {user : {id : -1, name : room}, text : "none", done : false}, [])
   response.send msg


  # *(sec) *(min) *(hour) *(day) *(month) *(day of the week)
  new cronJob('0 0 * * * *', () ->
    currentTime = new Date
    send '#your-channel-name', "current time is #{new Date().currentTime.getHours()}:00."
  ).start()


       cronモジュールを使うことで処理の定期実行が可能です

       処理タイミングの指定方法は、通常のcronと同じです
              cronモジュール https://github.com/ncb000gt/node-cron/
                    参考 http://d.hatena.ne.jp/anatoo/20120204/1328368042
WEB API http
twitter. coffee
 module.exports = (robot) ->
  robot.respond /twitter (.*)/i, (msg) ->
   keyword = encodeURIComponent msg.match[1]
   request = msg.http('http://search.twitter.com/search.json')
                   .query(q: keyword)
                   .get()
   request (err, res, body) ->
    json = JSON.parse body
    msg.send json.results[0].text if json.results.length > 0


   msgオブジェクトのhttpメソッドを使うとHTTP通信できます

   bodyに取得結果のテキストが入っているのでそのまま使えます
                                                      ※)ただし、レスポンスがUTF-8の場合に限る
 httpで取得できるオブジェクトの実体
 https://github.com/technoweenie/node-scoped-http-client
                                         例で検索に引っかかったツイート         https://twitter.com/deep_hoge/status/231719844532350977
スクレイピング request
title. coffee
request = require 'request'
cheerio = require 'cheerio'


module.exports = (robot) ->
 robot.respond /title (.*)/i, (msg) ->
  url = msg.match[1]
  options =
    url: url
    timeout: 2000
    headers: {'user-agent': 'node title fetcher'}


  request options, (error, response, body) ->
    $ = cheerio.load body
    title = $('title').text().replace(/n/g, '')
    msg.send(title)

  msg.httpよりも高性能なrequestを使う方がリダイレクト時の処
 理などが入っており実用的
     cheerioを使うとjQueryと同じ感覚で要素を取得でき便利
     デフォルトではUTF-8しか処理できない
色んなエンコーディングも読むなら→ http://blog.fumiz.me/2012/07/28/node-js-scraping-with-multibyte-characters/
記憶 robot.brain
plus.coffee
module.exports = (robot) ->
 robot.hear /^(.+)++$/i, (msg) ->
  user = msg.match[1]


  if not robot.brain.data[user]
    robot.brain.data[user] = 0


  robot.brain.data[user]++
  robot.brain.save()


  msg.send robot.brain.data[user]


 robot.brain.dataにデータを保存しておけます
 robot.brain.saveで保存したデータを永続化できる筈が、できま
せんでした今のところ原因は不明です
HTTPD
module.exports = (robot) ->
 robot.router.get "/version", (req, res) ->
  res.end robot.version



  robot.routerを使うことでhttp経由での呼び出しを受付可能

  ブラウザや他のツールと組み合わせることで色々できそう




    hubot本体同梱のサンプル
                 https://github.com/github/hubot/blob/master/src/scripts/httpd.coffee
もっと沢山のサンプルが、hubot-scriptsにはあります
   https://github.com/github/hubot-scripts
おまけ
標準のhubot/hubot-ircでは、

   BOTにnoticeで発言させることができません。

しかし、BOTにnoticeで発言させたいこともありますよね?
というわけで
BOTにnoticeで発言させたければ、自分でパッチを当てましょう
   https://github.com/fumiz/hubot-irc/commit/
   a70f95bf0b784b2f402d86dc87258938fed38926



              module.exports = (robot) ->
               robot.hear /hi$/i, (msg) ->
                msg.notice "hi"
最後に
hubotはBOTのフレームワークであり、


   hubot-ircを併用することでIRCのBOTとして活用できます。


BOTとしての動作はJavaScriptもしくはCoffeeScriptで簡単に拡張でき

Node.jsの持つ豊富なモジュール群を活用して仕事を効率化できます。
参考文献
        hubot本家             http://hubot.github.com/


         hubot-irc          https://github.com/nandub/hubot-irc/


github社製ボットフレームワーク、hubotを
                            http://d.hatena.ne.jp/anatoo/20120204/1328368042
 IRCボットとして導入した話(修正あり




  hubot irc を使うHow To       http://qiita.com/items/c117b64ac3f7aeab3389

hubotを使ってircのルームに           http://chobie.hatenablog.com/entry/
     しゃべらせてみる               2012/02/26/125532

                            http://theprogrammingbutler.com/blog/archives/
  hubot Scripts Explained
                            2011/10/28/hubot-scripts-explained/
以上で、本スライドは終了です。

知りたいことは書いてあったでしょうか?

読んで頂きありがとうございました。

あなたが良いBOTライフを送ることを祈ります。

More Related Content

hubotで快適BOT生活

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n