SlideShare ist ein Scribd-Unternehmen logo
1 von 54
Downloaden Sie, um offline zu lesen
モテる! Node.js でつくる
  Twitter ボット制作

         X


             Presented by @hecomi
introduction

はじめに
                 / ̄ ̄ ̄ ̄ ̄ ̄\ 

           /             \ 

                  _______ 

           /     /           \| 

           .′ j/  ,. -―――‐- .,   〉 

        /   j|:..//-∠、. . . . . /--. \{ 

         〈_/上|. / o  \/∨ o V/庁=、 

          \ |/ ┌──── ┐ ∨ソ/ 
    ___________

            )、_;,. !         | ;_/    
  /                 \

              ⌒ 介:. 、 ____,,ノイ{     <  のぉどじぇーえすって     |	
                                                      

               ⌒7⌒\/\/\'⌒ 
                           |  なにするです?        |
                / .:::::::::::::::::::::::::::::::::::::::::::::.\	
                 ,′ V/, ○∨  ∧ 

                                                      \___________/	
                   /.::::::::::::::   ´ ̄ ̄ ̄ ̄` 、:::::.\	
              j__,V/○ j  ′〉 

              {___,ノ  人__ク 
                                                           / .::::::::::::/   ____  \:::::::|	
               _,ノ\冖┘ へ. └冖 \_ 
                                                    ___/ .:::::::::::::∨   / \. . . . /^\ \,′	
           {丈____\/-―-\/___丈} 	
                                                      \:::::::::::::::::::::::|  // '⌒ |/∨ ⌒ |\__〉	
                                                                                      `  ――r┴‐| /  o      o│./┴┐	
  ___________
                
                                                                                              \⌒′ r――――┐ レ'  /	
 /                 \

                                     __	
                                                      >ヘ  |      │ ,<	
 <  よくわからないので      |	
                             ,... -―――‐/ \ー- 、  __	
                                           ^⌒T>乂__   ...ノ イ⌒^	
  |  おことわりするです      |

                           ./: : : : : : : : : :/    \__/ .‘,	
                         /: : ,---- ̄ ̄  ____    .‘,	
                                            ∠ニ=干‐ 厂}‐r‐厂}	
  \___________/	
                        /: : : : |    ., - ´   ,. -,l .\ ‘,__	
                                    { . . . │ |=イ.│|=イ	
                       /: : : : : : :.|   / ⌒     l____丿.⌒ヽ  /	
                            _,,..ノ\ . .│ | 八 |│/	
                      /: : : : : : :/  ./               | ./	
                               /. . . . . . \_|_j,′.〉 ̄	
                     /: : : : : :/   ./l    o     .__   o ∨	
                                                                                           \ . . . . . . . . . . . (__)ヘ	
                    ./: : : : : :‘,   ./.ヽ   ____|___|___ .|	
                   .,: : : : : : : :‘, _ -ー´   |           | .|	
    ___________
         {\. . . . . . . . . . ∧. . 〉	
                                                                                       
                                                                                            、::\___/::::}/	
                   l: : : : : : : : /       .|           | |	
  /                 \

                                                                                             \::::::::::::::::::::,′:/	
                   |: : : : : : : :\       ヽ          / ./	
 <  さーばさいどでじゃば     |	
                   |: : : ._------|ー‐―-、 _  .\______//	
                                      \::::::::::::/.::::,′	
                   |: :/       ̄ ̄ヽ _>ー――――‐ ´	
                     |  すくりぷとじっこうしたり?  |

                                                                                               {三三}ニニ}	
                   |/            ̄/: :|__\ <> |ヽ	
                  \___________/	
                               /: : : : : : └-\/.人	
                                            {___┐┐	
                               .|: : : :/: : : : : : : : : : : :‘,	
                                \:/: : : : : : : : : :○: : :‘,	
                                 /: : : : : : : : : : : : : : : :‘,	
                                〈: : : : : : : : : : : : : : : : : : |	
                                 `ー-...._: : : : : : : /l: :_/	
                                 .‘,: : :`ー---/ : ̄/	
                                  ‘,: : : : : :./: : : /	
                                   .‘,: : : : / : /	
                                    l ̄ ̄〉 ̄〉	
                                     ̄ ̄ ̄ ̄
本発表について
•  となってる人が多いと思うので…
•  実際に Node.js 環境を構築して、その上
   で Twitter ボットを動かしてみます。
 –  おうむ返しボット、特定のキーワードに反応
    するボット、人工無能ボットから、一歩進ん
    で形態素解析ボットを紹介します。
introduction

のぉどじぇーえす?

Node.js?
•  http://nodejs.jp/
•  サーバサイドで JavaScript を実行
 –  エンジンは v8
何が出来るの?
•  ブラウザの JavaScript で出来なそうな
   ことがサーバ上で出来ます
何が出来るの?
•  ブラウザの JavaScript で出来なそうな
   ことがサーバ上で出来ます
 –  ファイル操作とか

 var fs = require('fs');
 fs.writeFile('log.txt', ‘Hello, world!', function(err) {
     if (err) throw err;
     console.log('Success!');
 });
何が出来るの?
•  ブラウザの JavaScript で出来なそうな
   ことがサーバ上で出来ます
 –  http サーバ立てたりとか

 var http = require('http');
 http.createServer(function(req, res) {
      res.writeHead( 200, {'Content-Type': 'text/plain'} );
      res.write('Hello, world!n');
      res.end();
 }).listen(3000);
何が出来るの?
•  ブラウザの JavaScript で出来なそうな
   ことがサーバ上で出来ます
 –  http サーバ立てたりとか

 var http = require('http');
 http.createServer(function(req, res) {
      res.writeHead( 200, {'Content-Type': 'text/plain'} );
      res.write('Hello, world!');
      res.end();
 }).listen(3000);
install

いんすとーる
インストールしよう
•  Windows 環境下(http://nodejs.org/)




                 クリックしてインストールするだけ
インストールしよう
•  Mac / Linux 環境下
  –  バージョン管理も含めて nave がオススメ
    •  https://github.com/isaacs/nave
インストールしよう
•  node.js と npm のインストール
 $   mkdir ~/.nave
 $   cd ~/.nave
 $   git clone git://github.com/isaacs/nave.git
 $   ~/.nave/nave/nave.sh use latest
 $
 $   curl https://npmjs.org/install.sh | sh


•  ちなみに結構コンパイル時間かかります
•  参考
 –  naveを使ったnode.jsインストールと、最近のnpmの使い方 - ラシウラ
 –  http://d.hatena.ne.jp/bellbind/20110530/1306764093
インストールしよう
•  インストールされたか確認
 –  Windows の人はコマンドプロンプト上で
 $ node –v
 v0.8.9
 $ npm –v
 V1.1.61


•  これで OK!
Hello, world!

はろーわーるど
対話コンソール
$ node
> console.log('Hello, world!'); // これを打つ
Hello, world!
undefined
> (Ctrl+D 押下)
$
ファイル
$ cat helloworld.js
console.log('Hello, world!');
$ node helloworld.js
Hello, world!
おまけ:ブラウザ
// helloworld.js
var http = require('http');
http.createServer(function(req, res) {
     res.writeHead(200, {'Content-Type': 'text/plain'});
     res.write('Hello, world!n');
     res.end();
}).listen(3000);

$ node helloworld
Make twitter bot!

ついったーぼっとせいさく
Consumer Key / Access Token
1.  適当な Twitter アカウントを作成
2.  Twitter の開発者サイトより
    1.  Consumer Key / Consumer Secret
    2.  Access Token / Access Token Secret
 を取得する※
                                    開発者サイト:
                                        https://dev.twitter.com/



•  ※参考:
 –  twitterアクセストークンなどの取得方法(WordPress更新通知用)
 –  http://musilog.net/webdesign/my-works/twitter-oauth-wp-to-twitter.php
Twitter モジュール導入
•  npm でインストール
 $ mkdir twitter_bot
 $ cd twitter_bot
 $ npm install twitter
 npm http GET https://registry.npmjs.org/twitter
 npm http 200 https://registry.npmjs.org/twitter
 npm http GET https://registry.npmjs.org/twitter/-/
 twitter-0.1.18.tgz
 npm http 200 https://registry.npmjs.org/twitter/-/
 twitter-0.1.18.tgz
 …(ry


•  依存関係も含めて必要なモジュールをイ
   ンストールしてくれます
npm
•  npm は node package manager の略
•  package 数は 15006 個!(2012/09/22   現在)
•  使い方
  –  npm install hoge
    •  実行したディレクトリ下に node_modules ディレ
       クトリを作成してそこにモジュールを展開
    •  実行したディレクトリ下のみで使用できる
  –  npm install -g hoge
    •  どのディレクトリからでも使える
Twitter で はろーわーるど
•  早速使ってみましょう!
 var twitter = require('twitter');             モジュールのロード


 var bot = new twitter({
     consumer_key          :   'xxxxxxxxxx',
     consumer_secret       :   'xxxxxxxxxx',      さきほど取得した
     access_token_key      :   'xxxxxxxxxx',      各キーを入力
     access_token_secret   :   'xxxxxxxxxx'
 });                                              Twitter に Hello, world!
                                                  とつぶやく。

 bot.updateStatus('Hello, world!', function (data) {       つぶやいたら呼ばれる
     console.log(data);                                    コールバック関数。
 });                                                       data には Twitter から
                                                           返ってきた JSON が
                                                           入っている。
結果
$ node twitter
{ entities: { hashtags: [], user_mentions: [], urls: [] },
  retweet_count: 0,
  id_str: '249420311064358913',
  place: null,
  in_reply_to_user_id: null,
  favorited: false,
  in_reply_to_status_id_str: null,
  coordinates: null,
  created_at: 'Sat Sep 22 08:10:10 +0000 2012',
  in_reply_to_user_id_str: null,
  contributors: null,
  user:
…(ry
Streaming API を利用
•  twitter モジュールの説明:
   –  https://github.com/jdub/node-twitter


•  stream 接続
   bot.stream('user', function(stream) {
     stream.on('data', function(data) {
       console.log(data); // ズラーッと TL の情報が表示される
     });
   });

※ ローカル環境の Linux 機で試してみると $ node bot とコマンドを実行してもすぐ終了してしまう場合がありま
す。原因は分かる方いらっしゃいましたら @hecomi まで教えて下さい m(_ _)m
色んなボットを作ってみよう!
•  例として3つ紹介します
 –  おうむ返しボット
 –  特定のキーワードに反応するヤツ
 –  人工無脳
おうむ返しボット
var BOT_ID = 'hecomiroid';               この ID をミスるとループしまくるので注意!
bot.stream('user', function(stream) {
  stream.on('data', function(data) {
    if ( !('text' in data) ) {
                                                   Streamin API 接続直後は
      console.error('[ERROR] invalid data');       following ID 一覧が降ってき
      return;                                      たりするので、そういったゴミ
    }                                              を除外。
    var twUserId = data.user.screen_name
      , replyStr = data.text.replace(new RegExp('^@' + BOT_ID + ' '), '')
      , isMention = (data.in_reply_to_user_id !== null)
    ;                                                            @の部分を除去
    if (!isMention || twUserId === BOT_ID) return;
    bot.updateStatus('@' + id + ' ' + text, function (data) {
      console.log(data);
    });                          他人から自分へのつぶやき以外は除外
  });
});
特定のキーワードに反応するヤツ
var BOT_ID = 'hecomiroid';
bot.stream('user', { track: 'Vim' }, function(stream) {
  stream.on('data', function(data) {        自分の TL に加えて、検索ワー
    if ( !('text' in data) ) {              ドを追加できる
      console.error('[ERROR] invalid data');
      return;
    }
    if (data.user.screen_name === BOT_ID) return;
    var twStr = data.user.name + 'さんが、"' + data.text + '"って呟いた';
    bot.updateStatus(twStr, function (data) {
      console.log(data);
    });
  });
});
人工無脳
var printf = require('printf');   // npm install printf
var BOT_ID = 'hecomiroid';
var replyMap = {
            'こんにち(は|わ)'           :   'ちょりーっす!',
            'おやすみ(なさい)?'          :   'いい夢見ろよ',
            'うー'                  :   '(」・ω・)」うー!(/・ω・)/にゃー!',
            '(.*?)なう'             :   '%sするのが許されるのは小学生までだよねー!'
};

bot.stream('user', function(stream) {
  stream.on('data', function(data) {                               キーワードと返信する文章を
    if ( !('text' in data) ) {                                     正規表現で書いて
      console.error('[ERROR] invalid data');
      return;                                                      引っ掛かったら返事をつぶやく
    }
    if (data.user.screen_name === BOT_ID) return;
    for (var regex in replyMap) {
      if ( new RegExp(regex).test(data.text) ) {
        var replyStr = printf(replyMap[regex], RegExp.$1);
        var tweetStr = printf('@%s %s', data.user.screen_name, replyStr);
        bot.updateStatus(tweetStr, function (data) {
          console.log(data);
        });
        return;
      }
    }
});
できた!
•  というわけで Twitter ボットが出来まし
   た。

•  最後に、もう一歩進んだボット制作を紹
   介して終わりにします。
Make more interesting bot!

もういっぽふみこんでみる
もっと色々やりたい
•  色んな(JavaScriptには無い)プログラ
   ムやライブラリと連携してもっと面白い
   ことをつぶやかせたい、と思いません
   か?
もっと色々やりたい
•  色んな(JavaScriptには無い)プログラ
   ムやライブラリと連携してもっと面白い
   ことをつぶやかせたい、と思いません
   か?
•  それ、簡単にできます!
もっと色々やりたい
•  色んな(JavaScriptには無い)プログラ
   ムやライブラリと連携してもっと面白い
   ことをつぶやかせたい、と思いません
   か?
•  それ、簡単にできます!
•  例として MeCab を使った形態素解析ボッ
   トを作ってみようと思います。
•  簡単な方法と大変な方法の2つを紹介し
   ます。
MeCab のインストール
•  MeCab: Yet Another Part-of-Speech and
   Morphological Analyzer
  –  http://mecab.googlecode.com/svn/trunk/mecab/
     doc/index.html#download
•  Windows ならインストーラ
  –  インストール後は環境変数へ登録
•  mac なら
  –  brew install mecab mecab-ipadic
•  Linux なら
  –  sudo aptitude install mecab mecab-ipadic-utf8
① 簡単な方法
•  コンソール上で実行して結果をパース
var exec = require('child_process').exec;

exec('ls', function(err, stdout, stderr) {
  console.log(stdout);
});



•  こんな風にコマンドの実行結果を文字列
   で受け取ることができますので、後はパ
   ースすれば OK です。
MeCab の結果をパース
var exec = require('child_process').exec
  , fs   = require('fs')
  , TMP_TXT_FILE_NAME = '__tmp__.txt';

function parse(str, callback) {
                                                                         (ちなみに
  fs.writeFile(TMP_TXT_FILE_NAME, str, function(err) {                     echo ‘hogehoge’ | mecab
    if (err) callback(err, null);                                         を利用しても OK です。ファイルに
    exec('mecab ' + TMP_TXT_FILE_NAME, function(err, stdout, stderr) {    一時書きだしたのは windows 環境
                                                                          での文字化けを避けているからです)
      if (err) callback(err, null);
      var mecabResultArr = []
        , mecabResultStr = stdout.split('n')
      ;                                                                    解析する文章を
      for (var i in mecabResultStr) {                                      一時ファイルに書き出す
        var wordInfoArr = [];
            if (mecabResultStr[i].indexOf('EOS') === 0) break;
            /([^s]+)s+([^s]+)/.test(mecabResultStr[i]);
        wordInfoArr.push(RegExp.$1);                                        MeCab を実行して
        wordInfoArr = wordInfoArr.concat(RegExp.$2.split(','));
        mecabResultArr.push(wordInfoArr);                                   結果をパースする
      }
      exec('rm ' + TMP_TXT_FILE_NAME, function(err, stdout, stderr) {
        if (err) callback(err, null);
        callback(null, mecabResultArr);
      });                                                                  一時ファイルを削除
    });
  });
}

parse('すもももももももものうち', function(err, result) { console.log(result); });
結果
$ node mecab
[ [ 'すもも', '名詞', '一般', '*', '*', '*', '*', 'すもも', 'スモモ', 'スモモ' ],
  [ 'も', '助詞', '係助詞', '*', '*', '*', '*', 'も', 'モ', 'モ' ],
  [ 'もも', '名詞', '一般', '*', '*', '*', '*', 'もも', 'モモ', 'モモ' ],
  [ 'も', '助詞', '係助詞', '*', '*', '*', '*', 'も', 'モ', 'モ' ],
  [ 'もも', '名詞', '一般', '*', '*', '*', '*', 'もも', 'モモ', 'モモ' ],
  [ 'の', '助詞', '連体化', '*', '*', '*', '*', 'の', 'ノ', 'ノ' ],
  [ 'うち', '名詞', '非自立', '副詞可能', '*', '*', '*', 'うち', 'ウチ', 'ウチ'
] ]
別の JS から使えるようにする
var exec = require('child_process').exec
  , fs   = require('fs')
  , TMP_TXT_FILE_NAME = '__tmp__.txt';            module.exports すると別のファイルからこの
                                                  関数を使えるようになる
module.exports = function(str, callback) {
  fs.writeFile(TMP_TXT_FILE_NAME, str, function(err) {
    if (err) callback(err, null);
    exec('mecab ' + TMP_TXT_FILE_NAME, function(err, stdout, stderr) {
      if (err) callback(err, null);
      var mecabResultArr = []
        , mecabResultStr = stdout.split('n')
      ;
      for (var i in mecabResultStr) {
        var wordInfoArr = [];
            if (mecabResultStr[i].indexOf('EOS') === 0) break;
            /([^s]+)s+([^s]+)/.test(mecabResultStr[i]);
        wordInfoArr.push(RegExp.$1);
        wordInfoArr = wordInfoArr.concat(RegExp.$2.split(','));
        mecabResultArr.push(wordInfoArr);
      }
      exec('rm ' + TMP_TXT_FILE_NAME, function(err, stdout, stderr) {
        if (err) callback(err, null);
        callback(null, mecabResultArr);
      });
    });
  });
}
別の JS から使う
var parse = require('./parse.js');

parse('すもももももももものうち', function(err, result) {
    console.log(result);
});
形態素分析ボット

    (おうむ返しボットを改造)
•  つぶやく部分を以下のように変更すると
   形態素解析ボットが出来ます
parse(mentionStr, function(err, mecabResult) {
  var replyStr = '';
  mecabResult.forEach(function(wordInfoArr) {
    replyStr += printf('%s[%s] ', wordInfoArr[0], wordInfoArr[1]);
  });
  var tweetStr = printf('@%s %s', data.user.screen_name, replyStr);
  bot.updateStatus(tweetStr, function (data) {
    console.log(data);
  });
});
② 大変な方法
•  C/C++ でモジュールを書く
   –  面倒ですが作れば速いです
•  v8 のお作法に従って書けばOK
•  詳しく解説しようとすると時間足りない
   ので、詳細は以下をご参照下さい m(_ _)m

•  node.js の mecab addon 作った - 凹みTips※
   –  http://d.hatena.ne.jp/hecomi/20120611/1339347112
※ ここでは node-waf をコンパイルツールとして使っていますが、最近は node-gyp に置き換わったみたいです。
Summary

おわりに
まとめ
•  Node.js の環境を整えました
•  Twitter に呟くボットを作ってみました
•  一歩踏み込んだ処理をするボットを作っ
   てみました
Appendix

おまけ
おまけ - ネストを浅く
•  非同期処理を繰り返すとネストがどんど
   ん深くなっていきます
var exec   = require('child_process').exec;

exec('echo hoge', function(err, stdout, stderr) {
  console.log(stdout);
  exec('echo fuga', function(err, stdout, stderr) {
    console.log(stdout);
    exec('echo piyo', function(err, stdout, stderr) {
      console.log(stdout);
    });
  });
});



•  これを解決する方法は色々ありますが、
   async.js あたりがおすすめです。
おまけ - ネストを浅く
var exec = require('child_process').exec
  , async = require('async');

async.series([
  function(next) {
     exec('echo hoge', function(err, stdout, stderr) {
       console.log(stdout);
       next(null);
     });
  },
  function(next) {
     exec('echo fuga', function(err, stdout, stderr) {
       console.log(stdout);
       next(null);
     });
  },
  function(next) {
     exec('echo piyo', function(err, stdout, stderr) {
       console.log(stdout);
       next(null);
     });
  }
]);
おまけ - ネストを浅く
•  async.js には他にもパラで処理したり、
   引数を次々と渡して行ったりと色んなパ
   ターンで書けます。

•  参考:
 –  async.jsでフロー制御 - すぎゃーんメモ
 –  http://d.hatena.ne.jp/sugyan/
    20110605/1307240191
おまけ - ネストを浅く
•  非同期処理を繰り返すとネストがどんど
   ん深くなっていきます
var exec   = require('child_process').exec;

exec('echo hoge', function(err, stdout, stderr) {
  console.log(stdout);
  exec('echo fuga', function(err, stdout, stderr) {
    console.log(stdout);
    exec('echo piyo', function(err, stdout, stderr) {
      console.log(stdout);
    });
  });
});



•  これを解決する方法は色々ありますが、
   async.js あたりがおすすめです。
おまけ - 例外処理
•  例外が処理されないと Node.js は…
おまけ - 例外処理
•  例外が処理されないと Node.js は…


 _人人人人人人_

 > 突然の死 <

  ̄^Y^Y^Y^Y^Y^ ̄
 します。
おまけ - 例外処理
•  なので以下のようなコードで例外を補足
   して処理してあげます。
process.on('uncaughtException', function (err) {
    console.log('uncaughtException => ' + err);
});




•  参考
  –  node.jsの最低限の例外処理 - motsatのブログ
  –  http://d.hatena.ne.jp/bellbind/20110530/1306764093
おわり

end

Weitere ähnliche Inhalte

Ähnlich wie モテる! Node.js でつくる twitter ボット制作

【TDDBC2.1】やる夫で学ぶTDD
【TDDBC2.1】やる夫で学ぶTDD【TDDBC2.1】やる夫で学ぶTDD
【TDDBC2.1】やる夫で学ぶTDDKohki Miki
 
UnityとnodeとMMDと
UnityとnodeとMMDとUnityとnodeとMMDと
UnityとnodeとMMDとsters
 
やる夫で学ぶマーケティング
やる夫で学ぶマーケティングやる夫で学ぶマーケティング
やる夫で学ぶマーケティングlogch admin
 
オブジェクト指向プログラミング再入門
オブジェクト指向プログラミング再入門オブジェクト指向プログラミング再入門
オブジェクト指向プログラミング再入門Ryo Miyake
 
やるおがtriphone HMMを作るようです
やるおがtriphone HMMを作るようですやるおがtriphone HMMを作るようです
やるおがtriphone HMMを作るようですShinya Shimizu
 
蜘蛛の巣から抜け出すには?
蜘蛛の巣から抜け出すには?蜘蛛の巣から抜け出すには?
蜘蛛の巣から抜け出すには?Hayato Tominaga
 
Dodai projectの紹介
Dodai projectの紹介Dodai projectの紹介
Dodai projectの紹介Osamu Habuka
 
201005 Debian/つくらぐ勉強会 lightning talk
201005 Debian/つくらぐ勉強会 lightning talk 201005 Debian/つくらぐ勉強会 lightning talk
201005 Debian/つくらぐ勉強会 lightning talk Hideki Yamane
 
BigDataの集め方
BigDataの集め方BigDataの集め方
BigDataの集め方Mahito Ogura
 
kvm-clock に時間を尋ねるのは 間違っているだろうか
kvm-clock に時間を尋ねるのは間違っているだろうかkvm-clock に時間を尋ねるのは間違っているだろうか
kvm-clock に時間を尋ねるのは 間違っているだろうかTakaaki Fukai
 
出張ヒストリア ブループリントを書くにあたって大切なこと
出張ヒストリア ブループリントを書くにあたって大切なこと出張ヒストリア ブループリントを書くにあたって大切なこと
出張ヒストリア ブループリントを書くにあたって大切なことhistoria_Inc
 
モダンでもなく reactでもなく フロントエンドでもなく 開発でもない話
モダンでもなく reactでもなく フロントエンドでもなく 開発でもない話モダンでもなく reactでもなく フロントエンドでもなく 開発でもない話
モダンでもなく reactでもなく フロントエンドでもなく 開発でもない話Tomoo Amano
 
Rubyで和暦をよみとる
Rubyで和暦をよみとるRubyで和暦をよみとる
Rubyで和暦をよみとるTakashi Ota
 
IronRuby on Silverlight っておいしいの?
IronRuby on Silverlight っておいしいの?IronRuby on Silverlight っておいしいの?
IronRuby on Silverlight っておいしいの?terurou
 
OCamlでJavaScriptが幸せ
OCamlでJavaScriptが幸せOCamlでJavaScriptが幸せ
OCamlでJavaScriptが幸せSachirou Inoue
 
ゆとりがErlangを始めるようです
ゆとりがErlangを始めるようですゆとりがErlangを始めるようです
ゆとりがErlangを始めるようですsleepy_yoshi
 
FFRK cocos2d xレイヤーの最適化
FFRK cocos2d xレイヤーの最適化FFRK cocos2d xレイヤーの最適化
FFRK cocos2d xレイヤーの最適化dena_study
 
Android開発環境構築
Android開発環境構築Android開発環境構築
Android開発環境構築s_taichan
 

Ähnlich wie モテる! Node.js でつくる twitter ボット制作 (20)

【TDDBC2.1】やる夫で学ぶTDD
【TDDBC2.1】やる夫で学ぶTDD【TDDBC2.1】やる夫で学ぶTDD
【TDDBC2.1】やる夫で学ぶTDD
 
UnityとnodeとMMDと
UnityとnodeとMMDとUnityとnodeとMMDと
UnityとnodeとMMDと
 
やる夫で学ぶマーケティング
やる夫で学ぶマーケティングやる夫で学ぶマーケティング
やる夫で学ぶマーケティング
 
オブジェクト指向プログラミング再入門
オブジェクト指向プログラミング再入門オブジェクト指向プログラミング再入門
オブジェクト指向プログラミング再入門
 
やるおがtriphone HMMを作るようです
やるおがtriphone HMMを作るようですやるおがtriphone HMMを作るようです
やるおがtriphone HMMを作るようです
 
蜘蛛の巣から抜け出すには?
蜘蛛の巣から抜け出すには?蜘蛛の巣から抜け出すには?
蜘蛛の巣から抜け出すには?
 
Dodai projectの紹介
Dodai projectの紹介Dodai projectの紹介
Dodai projectの紹介
 
201005 Debian/つくらぐ勉強会 lightning talk
201005 Debian/つくらぐ勉強会 lightning talk 201005 Debian/つくらぐ勉強会 lightning talk
201005 Debian/つくらぐ勉強会 lightning talk
 
Dev camp25 lt
Dev camp25 ltDev camp25 lt
Dev camp25 lt
 
BigDataの集め方
BigDataの集め方BigDataの集め方
BigDataの集め方
 
kvm-clock に時間を尋ねるのは 間違っているだろうか
kvm-clock に時間を尋ねるのは間違っているだろうかkvm-clock に時間を尋ねるのは間違っているだろうか
kvm-clock に時間を尋ねるのは 間違っているだろうか
 
出張ヒストリア ブループリントを書くにあたって大切なこと
出張ヒストリア ブループリントを書くにあたって大切なこと出張ヒストリア ブループリントを書くにあたって大切なこと
出張ヒストリア ブループリントを書くにあたって大切なこと
 
モダンでもなく reactでもなく フロントエンドでもなく 開発でもない話
モダンでもなく reactでもなく フロントエンドでもなく 開発でもない話モダンでもなく reactでもなく フロントエンドでもなく 開発でもない話
モダンでもなく reactでもなく フロントエンドでもなく 開発でもない話
 
Rubyで和暦をよみとる
Rubyで和暦をよみとるRubyで和暦をよみとる
Rubyで和暦をよみとる
 
IronRuby on Silverlight っておいしいの?
IronRuby on Silverlight っておいしいの?IronRuby on Silverlight っておいしいの?
IronRuby on Silverlight っておいしいの?
 
OCamlでJavaScriptが幸せ
OCamlでJavaScriptが幸せOCamlでJavaScriptが幸せ
OCamlでJavaScriptが幸せ
 
ゆとりがErlangを始めるようです
ゆとりがErlangを始めるようですゆとりがErlangを始めるようです
ゆとりがErlangを始めるようです
 
FFRK cocos2d xレイヤーの最適化
FFRK cocos2d xレイヤーの最適化FFRK cocos2d xレイヤーの最適化
FFRK cocos2d xレイヤーの最適化
 
レシピの作り方入門
レシピの作り方入門レシピの作り方入門
レシピの作り方入門
 
Android開発環境構築
Android開発環境構築Android開発環境構築
Android開発環境構築
 

Mehr von hecomi

HoloLens x iPad
HoloLens x iPadHoloLens x iPad
HoloLens x iPadhecomi
 
HoloLens x Graphics 入門
HoloLens x Graphics 入門HoloLens x Graphics 入門
HoloLens x Graphics 入門hecomi
 
ゲーム x リアル - Mont Blanc Pj. & LITTAI -
ゲーム x リアル - Mont Blanc Pj. & LITTAI - ゲーム x リアル - Mont Blanc Pj. & LITTAI -
ゲーム x リアル - Mont Blanc Pj. & LITTAI - hecomi
 
ガジェットやサービスを組み合わせて出来る生活の紹介とその考察 - おうちハックナイト/ 野生のおうちハック セッション 1
ガジェットやサービスを組み合わせて出来る生活の紹介とその考察 - おうちハックナイト/ 野生のおうちハック セッション 1ガジェットやサービスを組み合わせて出来る生活の紹介とその考察 - おうちハックナイト/ 野生のおうちハック セッション 1
ガジェットやサービスを組み合わせて出来る生活の紹介とその考察 - おうちハックナイト/ 野生のおうちハック セッション 1hecomi
 
おうちハック勉強会2
おうちハック勉強会2おうちハック勉強会2
おうちハック勉強会2hecomi
 
ハッピーおうちハッキング - 第2回おうちハック勉強会 キーノートトーク
ハッピーおうちハッキング - 第2回おうちハック勉強会 キーノートトークハッピーおうちハッキング - 第2回おうちハック勉強会 キーノートトーク
ハッピーおうちハッキング - 第2回おうちハック勉強会 キーノートトークhecomi
 
手の形状とか距離とか分かるスクリーン作ってみた@透明ごっちゃ煮技術交流会
手の形状とか距離とか分かるスクリーン作ってみた@透明ごっちゃ煮技術交流会手の形状とか距離とか分かるスクリーン作ってみた@透明ごっちゃ煮技術交流会
手の形状とか距離とか分かるスクリーン作ってみた@透明ごっちゃ煮技術交流会hecomi
 
第5回 ニコニコ学会β 研究してみたマッドネス Mont Blanc Pj.(レゴへのプロジェクションマッピング)
第5回 ニコニコ学会β 研究してみたマッドネス Mont Blanc Pj.(レゴへのプロジェクションマッピング)第5回 ニコニコ学会β 研究してみたマッドネス Mont Blanc Pj.(レゴへのプロジェクションマッピング)
第5回 ニコニコ学会β 研究してみたマッドネス Mont Blanc Pj.(レゴへのプロジェクションマッピング)hecomi
 
Oculus Rift meets Mixed Reality World (裏 Ocufes #1)
Oculus Rift meets Mixed Reality World (裏 Ocufes #1)Oculus Rift meets Mixed Reality World (裏 Ocufes #1)
Oculus Rift meets Mixed Reality World (裏 Ocufes #1)hecomi
 
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京hecomi
 
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目hecomi
 

Mehr von hecomi (11)

HoloLens x iPad
HoloLens x iPadHoloLens x iPad
HoloLens x iPad
 
HoloLens x Graphics 入門
HoloLens x Graphics 入門HoloLens x Graphics 入門
HoloLens x Graphics 入門
 
ゲーム x リアル - Mont Blanc Pj. & LITTAI -
ゲーム x リアル - Mont Blanc Pj. & LITTAI - ゲーム x リアル - Mont Blanc Pj. & LITTAI -
ゲーム x リアル - Mont Blanc Pj. & LITTAI -
 
ガジェットやサービスを組み合わせて出来る生活の紹介とその考察 - おうちハックナイト/ 野生のおうちハック セッション 1
ガジェットやサービスを組み合わせて出来る生活の紹介とその考察 - おうちハックナイト/ 野生のおうちハック セッション 1ガジェットやサービスを組み合わせて出来る生活の紹介とその考察 - おうちハックナイト/ 野生のおうちハック セッション 1
ガジェットやサービスを組み合わせて出来る生活の紹介とその考察 - おうちハックナイト/ 野生のおうちハック セッション 1
 
おうちハック勉強会2
おうちハック勉強会2おうちハック勉強会2
おうちハック勉強会2
 
ハッピーおうちハッキング - 第2回おうちハック勉強会 キーノートトーク
ハッピーおうちハッキング - 第2回おうちハック勉強会 キーノートトークハッピーおうちハッキング - 第2回おうちハック勉強会 キーノートトーク
ハッピーおうちハッキング - 第2回おうちハック勉強会 キーノートトーク
 
手の形状とか距離とか分かるスクリーン作ってみた@透明ごっちゃ煮技術交流会
手の形状とか距離とか分かるスクリーン作ってみた@透明ごっちゃ煮技術交流会手の形状とか距離とか分かるスクリーン作ってみた@透明ごっちゃ煮技術交流会
手の形状とか距離とか分かるスクリーン作ってみた@透明ごっちゃ煮技術交流会
 
第5回 ニコニコ学会β 研究してみたマッドネス Mont Blanc Pj.(レゴへのプロジェクションマッピング)
第5回 ニコニコ学会β 研究してみたマッドネス Mont Blanc Pj.(レゴへのプロジェクションマッピング)第5回 ニコニコ学会β 研究してみたマッドネス Mont Blanc Pj.(レゴへのプロジェクションマッピング)
第5回 ニコニコ学会β 研究してみたマッドネス Mont Blanc Pj.(レゴへのプロジェクションマッピング)
 
Oculus Rift meets Mixed Reality World (裏 Ocufes #1)
Oculus Rift meets Mixed Reality World (裏 Ocufes #1)Oculus Rift meets Mixed Reality World (裏 Ocufes #1)
Oculus Rift meets Mixed Reality World (裏 Ocufes #1)
 
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
 
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
 

Kürzlich hochgeladen

SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 

Kürzlich hochgeladen (10)

SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 

モテる! Node.js でつくる twitter ボット制作

  • 1. モテる! Node.js でつくる Twitter ボット制作 X Presented by @hecomi
  • 3.                  / ̄ ̄ ̄ ̄ ̄ ̄\ 
            /             \ 
                   _______ 
            /     /           \| 
            .′ j/  ,. -―――‐- .,   〉 
         /   j|:..//-∠、. . . . . /--. \{ 
          〈_/上|. / o  \/∨ o V/庁=、 
           \ |/ ┌──── ┐ ∨ソ/ 
    ___________
             )、_;,. !         | ;_/    
  /                 \
               ⌒ 介:. 、 ____,,ノイ{     <  のぉどじぇーえすって     | 
                ⌒7⌒\/\/\'⌒ 
  |  なにするです?        |
               / .:::::::::::::::::::::::::::::::::::::::::::::.\                  ,′ V/, ○∨  ∧ 
  \___________/             /.::::::::::::::   ´ ̄ ̄ ̄ ̄` 、:::::.\               j__,V/○ j  ′〉 
               {___,ノ  人__ク 
            / .::::::::::::/   ____  \:::::::|                _,ノ\冖┘ へ. └冖 \_ 
         ___/ .:::::::::::::∨   / \. . . . /^\ \,′            {丈____\/-―-\/___丈}           \:::::::::::::::::::::::|  // '⌒ |/∨ ⌒ |\__〉           `  ――r┴‐| /  o      o│./┴┐  ___________
                     \⌒′ r――――┐ レ'  /  /                 \
                         __                    >ヘ  |      │ ,< <  よくわからないので      |                 ,... -―――‐/ \ー- 、  __                    ^⌒T>乂__   ...ノ イ⌒^  |  おことわりするです      |
               ./: : : : : : : : : :/    \__/ .‘,             /: : ,---- ̄ ̄  ____    .‘,                     ∠ニ=干‐ 厂}‐r‐厂}  \___________/            /: : : : |    ., - ´   ,. -,l .\ ‘,__                        { . . . │ |=イ.│|=イ           /: : : : : : :.|   / ⌒     l____丿.⌒ヽ  /                 _,,..ノ\ . .│ | 八 |│/          /: : : : : : :/  ./               | ./                  /. . . . . . \_|_j,′.〉 ̄         /: : : : : :/   ./l    o     .__   o ∨                \ . . . . . . . . . . . (__)ヘ        ./: : : : : :‘,   ./.ヽ   ____|___|___ .|       .,: : : : : : : :‘, _ -ー´   |           | .|    ___________
         {\. . . . . . . . . . ∧. . 〉                             、::\___/::::}/       l: : : : : : : : /       .|           | |  /                 \
                  \::::::::::::::::::::,′:/       |: : : : : : : :\       ヽ          / ./ <  さーばさいどでじゃば     |       |: : : ._------|ー‐―-、 _  .\______//                   \::::::::::::/.::::,′       |: :/       ̄ ̄ヽ _>ー――――‐ ´  |  すくりぷとじっこうしたり?  |
                    {三三}ニニ}       |/            ̄/: :|__\ <> |ヽ  \___________/                   /: : : : : : └-\/.人                     {___┐┐                  .|: : : :/: : : : : : : : : : : :‘,                   \:/: : : : : : : : : :○: : :‘,                    /: : : : : : : : : : : : : : : :‘,                   〈: : : : : : : : : : : : : : : : : : |                    `ー-...._: : : : : : : /l: :_/                    .‘,: : :`ー---/ : ̄/                     ‘,: : : : : :./: : : /                      .‘,: : : : / : /                       l ̄ ̄〉 ̄〉                        ̄ ̄ ̄ ̄
  • 4. 本発表について •  となってる人が多いと思うので… •  実際に Node.js 環境を構築して、その上 で Twitter ボットを動かしてみます。 –  おうむ返しボット、特定のキーワードに反応 するボット、人工無能ボットから、一歩進ん で形態素解析ボットを紹介します。
  • 6. Node.js? •  http://nodejs.jp/ •  サーバサイドで JavaScript を実行 –  エンジンは v8
  • 7. 何が出来るの? •  ブラウザの JavaScript で出来なそうな ことがサーバ上で出来ます
  • 8. 何が出来るの? •  ブラウザの JavaScript で出来なそうな ことがサーバ上で出来ます –  ファイル操作とか var fs = require('fs'); fs.writeFile('log.txt', ‘Hello, world!', function(err) {    if (err) throw err;    console.log('Success!'); });
  • 9. 何が出来るの? •  ブラウザの JavaScript で出来なそうな ことがサーバ上で出来ます –  http サーバ立てたりとか var http = require('http'); http.createServer(function(req, res) {     res.writeHead( 200, {'Content-Type': 'text/plain'} );     res.write('Hello, world!n');     res.end(); }).listen(3000);
  • 10. 何が出来るの? •  ブラウザの JavaScript で出来なそうな ことがサーバ上で出来ます –  http サーバ立てたりとか var http = require('http'); http.createServer(function(req, res) {     res.writeHead( 200, {'Content-Type': 'text/plain'} );     res.write('Hello, world!');     res.end(); }).listen(3000);
  • 12. インストールしよう •  Windows 環境下(http://nodejs.org/) クリックしてインストールするだけ
  • 13. インストールしよう •  Mac / Linux 環境下 –  バージョン管理も含めて nave がオススメ •  https://github.com/isaacs/nave
  • 14. インストールしよう •  node.js と npm のインストール $ mkdir ~/.nave $ cd ~/.nave $ git clone git://github.com/isaacs/nave.git $ ~/.nave/nave/nave.sh use latest $ $ curl https://npmjs.org/install.sh | sh •  ちなみに結構コンパイル時間かかります •  参考 –  naveを使ったnode.jsインストールと、最近のnpmの使い方 - ラシウラ –  http://d.hatena.ne.jp/bellbind/20110530/1306764093
  • 15. インストールしよう •  インストールされたか確認 –  Windows の人はコマンドプロンプト上で $ node –v v0.8.9 $ npm –v V1.1.61 •  これで OK!
  • 17. 対話コンソール $ node > console.log('Hello, world!'); // これを打つ Hello, world! undefined > (Ctrl+D 押下) $
  • 18. ファイル $ cat helloworld.js console.log('Hello, world!'); $ node helloworld.js Hello, world!
  • 19. おまけ:ブラウザ // helloworld.js var http = require('http'); http.createServer(function(req, res) {     res.writeHead(200, {'Content-Type': 'text/plain'});     res.write('Hello, world!n');     res.end(); }).listen(3000); $ node helloworld
  • 21. Consumer Key / Access Token 1.  適当な Twitter アカウントを作成 2.  Twitter の開発者サイトより 1.  Consumer Key / Consumer Secret 2.  Access Token / Access Token Secret  を取得する※ 開発者サイト: https://dev.twitter.com/ •  ※参考: –  twitterアクセストークンなどの取得方法(WordPress更新通知用) –  http://musilog.net/webdesign/my-works/twitter-oauth-wp-to-twitter.php
  • 22. Twitter モジュール導入 •  npm でインストール $ mkdir twitter_bot $ cd twitter_bot $ npm install twitter npm http GET https://registry.npmjs.org/twitter npm http 200 https://registry.npmjs.org/twitter npm http GET https://registry.npmjs.org/twitter/-/ twitter-0.1.18.tgz npm http 200 https://registry.npmjs.org/twitter/-/ twitter-0.1.18.tgz …(ry •  依存関係も含めて必要なモジュールをイ ンストールしてくれます
  • 23. npm •  npm は node package manager の略 •  package 数は 15006 個!(2012/09/22 現在) •  使い方 –  npm install hoge •  実行したディレクトリ下に node_modules ディレ クトリを作成してそこにモジュールを展開 •  実行したディレクトリ下のみで使用できる –  npm install -g hoge •  どのディレクトリからでも使える
  • 24. Twitter で はろーわーるど •  早速使ってみましょう! var twitter = require('twitter'); モジュールのロード var bot = new twitter({ consumer_key : 'xxxxxxxxxx', consumer_secret : 'xxxxxxxxxx', さきほど取得した access_token_key : 'xxxxxxxxxx', 各キーを入力 access_token_secret : 'xxxxxxxxxx' }); Twitter に Hello, world! とつぶやく。 bot.updateStatus('Hello, world!', function (data) { つぶやいたら呼ばれる console.log(data); コールバック関数。 }); data には Twitter から 返ってきた JSON が 入っている。
  • 25. 結果 $ node twitter { entities: { hashtags: [], user_mentions: [], urls: [] }, retweet_count: 0, id_str: '249420311064358913', place: null, in_reply_to_user_id: null, favorited: false, in_reply_to_status_id_str: null, coordinates: null, created_at: 'Sat Sep 22 08:10:10 +0000 2012', in_reply_to_user_id_str: null, contributors: null, user: …(ry
  • 26. Streaming API を利用 •  twitter モジュールの説明: –  https://github.com/jdub/node-twitter •  stream 接続 bot.stream('user', function(stream) { stream.on('data', function(data) { console.log(data); // ズラーッと TL の情報が表示される }); }); ※ ローカル環境の Linux 機で試してみると $ node bot とコマンドを実行してもすぐ終了してしまう場合がありま す。原因は分かる方いらっしゃいましたら @hecomi まで教えて下さい m(_ _)m
  • 27. 色んなボットを作ってみよう! •  例として3つ紹介します –  おうむ返しボット –  特定のキーワードに反応するヤツ –  人工無脳
  • 28. おうむ返しボット var BOT_ID = 'hecomiroid'; この ID をミスるとループしまくるので注意! bot.stream('user', function(stream) { stream.on('data', function(data) { if ( !('text' in data) ) { Streamin API 接続直後は console.error('[ERROR] invalid data'); following ID 一覧が降ってき return; たりするので、そういったゴミ } を除外。 var twUserId = data.user.screen_name , replyStr = data.text.replace(new RegExp('^@' + BOT_ID + ' '), '') , isMention = (data.in_reply_to_user_id !== null) ; @の部分を除去 if (!isMention || twUserId === BOT_ID) return; bot.updateStatus('@' + id + ' ' + text, function (data) { console.log(data); }); 他人から自分へのつぶやき以外は除外 }); });
  • 29. 特定のキーワードに反応するヤツ var BOT_ID = 'hecomiroid'; bot.stream('user', { track: 'Vim' }, function(stream) { stream.on('data', function(data) { 自分の TL に加えて、検索ワー if ( !('text' in data) ) { ドを追加できる console.error('[ERROR] invalid data'); return; } if (data.user.screen_name === BOT_ID) return; var twStr = data.user.name + 'さんが、"' + data.text + '"って呟いた'; bot.updateStatus(twStr, function (data) { console.log(data); }); }); });
  • 30. 人工無脳 var printf = require('printf'); // npm install printf var BOT_ID = 'hecomiroid'; var replyMap = { 'こんにち(は|わ)' : 'ちょりーっす!', 'おやすみ(なさい)?' : 'いい夢見ろよ', 'うー' : '(」・ω・)」うー!(/・ω・)/にゃー!', '(.*?)なう' : '%sするのが許されるのは小学生までだよねー!' }; bot.stream('user', function(stream) { stream.on('data', function(data) { キーワードと返信する文章を if ( !('text' in data) ) { 正規表現で書いて console.error('[ERROR] invalid data'); return; 引っ掛かったら返事をつぶやく } if (data.user.screen_name === BOT_ID) return; for (var regex in replyMap) { if ( new RegExp(regex).test(data.text) ) { var replyStr = printf(replyMap[regex], RegExp.$1); var tweetStr = printf('@%s %s', data.user.screen_name, replyStr); bot.updateStatus(tweetStr, function (data) { console.log(data); }); return; } } });
  • 31. できた! •  というわけで Twitter ボットが出来まし た。 •  最後に、もう一歩進んだボット制作を紹 介して終わりにします。
  • 32. Make more interesting bot! もういっぽふみこんでみる
  • 33. もっと色々やりたい •  色んな(JavaScriptには無い)プログラ ムやライブラリと連携してもっと面白い ことをつぶやかせたい、と思いません か?
  • 34. もっと色々やりたい •  色んな(JavaScriptには無い)プログラ ムやライブラリと連携してもっと面白い ことをつぶやかせたい、と思いません か? •  それ、簡単にできます!
  • 35. もっと色々やりたい •  色んな(JavaScriptには無い)プログラ ムやライブラリと連携してもっと面白い ことをつぶやかせたい、と思いません か? •  それ、簡単にできます! •  例として MeCab を使った形態素解析ボッ トを作ってみようと思います。 •  簡単な方法と大変な方法の2つを紹介し ます。
  • 36. MeCab のインストール •  MeCab: Yet Another Part-of-Speech and Morphological Analyzer –  http://mecab.googlecode.com/svn/trunk/mecab/ doc/index.html#download •  Windows ならインストーラ –  インストール後は環境変数へ登録 •  mac なら –  brew install mecab mecab-ipadic •  Linux なら –  sudo aptitude install mecab mecab-ipadic-utf8
  • 37. ① 簡単な方法 •  コンソール上で実行して結果をパース var exec = require('child_process').exec; exec('ls', function(err, stdout, stderr) { console.log(stdout); }); •  こんな風にコマンドの実行結果を文字列 で受け取ることができますので、後はパ ースすれば OK です。
  • 38. MeCab の結果をパース var exec = require('child_process').exec , fs = require('fs') , TMP_TXT_FILE_NAME = '__tmp__.txt'; function parse(str, callback) { (ちなみに fs.writeFile(TMP_TXT_FILE_NAME, str, function(err) {   echo ‘hogehoge’ | mecab if (err) callback(err, null); を利用しても OK です。ファイルに exec('mecab ' + TMP_TXT_FILE_NAME, function(err, stdout, stderr) {  一時書きだしたのは windows 環境  での文字化けを避けているからです) if (err) callback(err, null); var mecabResultArr = [] , mecabResultStr = stdout.split('n') ; 解析する文章を for (var i in mecabResultStr) { 一時ファイルに書き出す var wordInfoArr = []; if (mecabResultStr[i].indexOf('EOS') === 0) break; /([^s]+)s+([^s]+)/.test(mecabResultStr[i]); wordInfoArr.push(RegExp.$1); MeCab を実行して wordInfoArr = wordInfoArr.concat(RegExp.$2.split(',')); mecabResultArr.push(wordInfoArr); 結果をパースする } exec('rm ' + TMP_TXT_FILE_NAME, function(err, stdout, stderr) { if (err) callback(err, null); callback(null, mecabResultArr); }); 一時ファイルを削除 }); }); } parse('すもももももももものうち', function(err, result) { console.log(result); });
  • 39. 結果 $ node mecab [ [ 'すもも', '名詞', '一般', '*', '*', '*', '*', 'すもも', 'スモモ', 'スモモ' ], [ 'も', '助詞', '係助詞', '*', '*', '*', '*', 'も', 'モ', 'モ' ], [ 'もも', '名詞', '一般', '*', '*', '*', '*', 'もも', 'モモ', 'モモ' ], [ 'も', '助詞', '係助詞', '*', '*', '*', '*', 'も', 'モ', 'モ' ], [ 'もも', '名詞', '一般', '*', '*', '*', '*', 'もも', 'モモ', 'モモ' ], [ 'の', '助詞', '連体化', '*', '*', '*', '*', 'の', 'ノ', 'ノ' ], [ 'うち', '名詞', '非自立', '副詞可能', '*', '*', '*', 'うち', 'ウチ', 'ウチ' ] ]
  • 40. 別の JS から使えるようにする var exec = require('child_process').exec , fs = require('fs') , TMP_TXT_FILE_NAME = '__tmp__.txt'; module.exports すると別のファイルからこの 関数を使えるようになる module.exports = function(str, callback) { fs.writeFile(TMP_TXT_FILE_NAME, str, function(err) { if (err) callback(err, null); exec('mecab ' + TMP_TXT_FILE_NAME, function(err, stdout, stderr) { if (err) callback(err, null); var mecabResultArr = [] , mecabResultStr = stdout.split('n') ; for (var i in mecabResultStr) { var wordInfoArr = []; if (mecabResultStr[i].indexOf('EOS') === 0) break; /([^s]+)s+([^s]+)/.test(mecabResultStr[i]); wordInfoArr.push(RegExp.$1); wordInfoArr = wordInfoArr.concat(RegExp.$2.split(',')); mecabResultArr.push(wordInfoArr); } exec('rm ' + TMP_TXT_FILE_NAME, function(err, stdout, stderr) { if (err) callback(err, null); callback(null, mecabResultArr); }); }); }); }
  • 41. 別の JS から使う var parse = require('./parse.js'); parse('すもももももももものうち', function(err, result) { console.log(result); });
  • 42. 形態素分析ボット
 (おうむ返しボットを改造) •  つぶやく部分を以下のように変更すると 形態素解析ボットが出来ます parse(mentionStr, function(err, mecabResult) { var replyStr = ''; mecabResult.forEach(function(wordInfoArr) { replyStr += printf('%s[%s] ', wordInfoArr[0], wordInfoArr[1]); }); var tweetStr = printf('@%s %s', data.user.screen_name, replyStr); bot.updateStatus(tweetStr, function (data) { console.log(data); }); });
  • 43. ② 大変な方法 •  C/C++ でモジュールを書く –  面倒ですが作れば速いです •  v8 のお作法に従って書けばOK •  詳しく解説しようとすると時間足りない ので、詳細は以下をご参照下さい m(_ _)m •  node.js の mecab addon 作った - 凹みTips※ –  http://d.hatena.ne.jp/hecomi/20120611/1339347112 ※ ここでは node-waf をコンパイルツールとして使っていますが、最近は node-gyp に置き換わったみたいです。
  • 45. まとめ •  Node.js の環境を整えました •  Twitter に呟くボットを作ってみました •  一歩踏み込んだ処理をするボットを作っ てみました
  • 47. おまけ - ネストを浅く •  非同期処理を繰り返すとネストがどんど ん深くなっていきます var exec = require('child_process').exec; exec('echo hoge', function(err, stdout, stderr) { console.log(stdout); exec('echo fuga', function(err, stdout, stderr) { console.log(stdout); exec('echo piyo', function(err, stdout, stderr) { console.log(stdout); }); }); }); •  これを解決する方法は色々ありますが、 async.js あたりがおすすめです。
  • 48. おまけ - ネストを浅く var exec = require('child_process').exec , async = require('async'); async.series([ function(next) { exec('echo hoge', function(err, stdout, stderr) { console.log(stdout); next(null); }); }, function(next) { exec('echo fuga', function(err, stdout, stderr) { console.log(stdout); next(null); }); }, function(next) { exec('echo piyo', function(err, stdout, stderr) { console.log(stdout); next(null); }); } ]);
  • 49. おまけ - ネストを浅く •  async.js には他にもパラで処理したり、 引数を次々と渡して行ったりと色んなパ ターンで書けます。 •  参考: –  async.jsでフロー制御 - すぎゃーんメモ –  http://d.hatena.ne.jp/sugyan/ 20110605/1307240191
  • 50. おまけ - ネストを浅く •  非同期処理を繰り返すとネストがどんど ん深くなっていきます var exec = require('child_process').exec; exec('echo hoge', function(err, stdout, stderr) { console.log(stdout); exec('echo fuga', function(err, stdout, stderr) { console.log(stdout); exec('echo piyo', function(err, stdout, stderr) { console.log(stdout); }); }); }); •  これを解決する方法は色々ありますが、 async.js あたりがおすすめです。
  • 51. おまけ - 例外処理 •  例外が処理されないと Node.js は…
  • 52. おまけ - 例外処理 •  例外が処理されないと Node.js は… _人人人人人人_
 > 突然の死 <
  ̄^Y^Y^Y^Y^Y^ ̄ します。
  • 53. おまけ - 例外処理 •  なので以下のようなコードで例外を補足 して処理してあげます。 process.on('uncaughtException', function (err) { console.log('uncaughtException => ' + err); }); •  参考 –  node.jsの最低限の例外処理 - motsatのブログ –  http://d.hatena.ne.jp/bellbind/20110530/1306764093