• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
hubotで快適BOT生活
 

hubotで快適BOT生活

on

  • 13,431 views

hubotの導入方法をインストール、スクリプトの書き方やサンプルコードを交えて解説します。元となった記事はこちらのURLから http://blog.fumiz.me/2012/08...

hubotの導入方法をインストール、スクリプトの書き方やサンプルコードを交えて解説します。元となった記事はこちらのURLから http://blog.fumiz.me/2012/08/05/hubot-matome/

Statistics

Views

Total Views
13,431
Views on SlideShare
12,542
Embed Views
889

Actions

Likes
65
Downloads
38
Comments
0

9 Embeds 889

http://blog.fumiz.me 594
http://namihira.hatenablog.com 199
https://twitter.com 83
http://localhost 5
https://www.chatwork.com 3
https://twimg0-a.akamaihd.net 2
http://twitter.com 1
http://cloud.feedly.com 1
https://cybozulive.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n

hubotで快適BOT生活 hubotで快適BOT生活 Presentation Transcript

  • 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 hTwitter 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/hubotpath.exists is now called `fs.exists`.Hubot> 無事、動きました
  • しかし、このままではコマンドを使えませんwww12395ue:miff% node_modules/hubot/bin/hubotpath.exists is now called `fs.exists`.Hubot> hubot pingHubot> hubot helpHubot> hubot dieHubot> ( ゚д゚ )
  • 手順3 コマンドを入れる本体同梱のコマンドをカレントディレクトリにコピーcp -R node_modules/hubot/src/scripts ./今度こそ動きましたwww12395ue:miff% node_modules/hubot/bin/hubotpath.exists is now called `fs.exists`.Hubot> hubot pingHubot> PONGHubot> hubot dieHubot> 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: listenEADDRINUSE使ってないポート番号を指定することで回避できます% 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でもOKscriptsディレクトリ下に.jsか.coffeeを置く
  • 基本的な書き方hello.coffee module.exports = (robot) -> robot.respond /who are you/i, (msg) -> msg.send "Im 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とhearrobot.respond /who are you/i, (msg) -> msg.send "Im 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のみ、メッセージの送信先チャンネルを 手動で設定する必要があるので注意です
  • 定期実行 croncron. 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 httptwitter. 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
  • スクレイピング requesttitle. coffeerequest = require requestcheerio = require cheeriomodule.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.brainplus.coffeemodule.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で保存したデータを永続化できる筈が、できませんでした今のところ原因は不明です
  • HTTPDmodule.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/c117b64ac3f7aeab3389hubotを使って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ライフを送ることを祈ります。