読者です 読者をやめる 読者になる 読者になる

ATNDのリマインダーをNodeで書いてみた

node.js Twitter OAuth

Node.jsの正式名称はNodeということらしいので、これからはNodeと表記しますね。

今日、「Node.jsの飲み会」というイベントをやるんですが、信頼のドタキャン率を誇るATNDで募集していたので、ATNDのアカウントをTwitterとひもづけてる人に対してTwitter経由でリマインダーを送るプログラムをNodeで書いてみました。

var request = require('request'),
    qs = require('querystring'),
    OAuth = require('oauth').OAuth,
    settings = require('./settings'),
    oauth = new OAuth(
      'https://api.twitter.com/oauth/request_token',
      'https://api.twitter.com/oauth/access_token',
      settings.oauth.consumer_key,
      settings.oauth.consumer_secret,
      '1.0a',
      null,
      'HMAC-SHA1'
    );

function getUsers(eventId, callback) {
  var params = {
    format: 'json',
    event_id: eventId
  }
  var url = 'http://api.atnd.org/events/users/?' + qs.stringify(params);

  request({uri: url}, function(err, res, body) {
    if (err) throw err;
    if (res.statusCode !== 200) throw new Error('ATND API returns NG');
    
    var event = JSON.parse(body).events[0];
    event.users.forEach(function(element, index, array) {
      callback(event, element);
    });
  });
}

function update(message) {
  oauth.post(
    'http://api.twitter.com/1/statuses/update.json',
    settings.oauth.access_token,
    settings.oauth.access_token_secret,
    { status: message },
    function(err, data) {
      err && console.log(err);
    }
  );
}

getUsers(13366, function(event, user) {
  if (user.status === 1 && user.twitter_id) {
    update('@' + user.twitter_id + ' 今日は「' + event.title + '」の日です!あなたは参加人数にカウントされておりますので、もし参加できない場合は今すぐキャンセルをお願いします。お会いできるのを楽しみにしています!' + event.event_url);
  }
});

これをapp.jsという名前で保存します。同じディレクトリにsettings.jsという名前で

module.exports.oauth = {
  consumer_key:         'your consumer key here',
  consumer_secret:      'your consumer secret here',
  access_token:         'your access token here',
  access_token_secret:  'your access token secret here'
}

という内容のファイル(それぞれのキーはTwitterAPIのページで取得してね)を作成して、あとは

$ node app.js

で、リマインダーをスパムのようにつぶやきます。

Github: https://github.com/meso/ATND-Reminder
もし要望があれば、これにWebインタフェースつけてこういったリマインダーを送るサービスでも作ろうかしら。