Quantcast
Channel: @blog.justoneplanet.info
Viewing all articles
Browse latest Browse all 46

緊急地震速報 by Extensionのサーバーを書き直す

$
0
0

そろそろOAuth認証にしておかないとまずいので書きなおすことにした。

■環境構築

必要なパッケージのインストール等をする。

sudo yum -y install openssl-devel gcc-c++ git make
git clone https://github.com/isaacs/nave.git ~/.nave
~/.nave/nave.sh install stable
~/.nave/nave.sh use stable
echo "~/.nave/nave.sh use stable" >> ~/.bash_profile
sudo curl https://npmjs.org/install.sh --insecure | sh

npm -g install forever
npm install twitter
npm install websocket

■実装

以下のようにした。

const PORT = 8080;
const FOLLOWING_ID = 16052553;
const CONSUMER_KEY    = "CONSUMER_KEY";
const CONSUMER_SECRET = "CONSUMER_SECRET";
const TOKEN_KEY       = "TOKEN_KEY";
const TOKEN_SECRET    = "TOKEN_SECRET";

var util            = require('util')
  , http            = require('http')
  , twitter         = require('twitter')
  , WebSocketServer = require('websocket').server
;

// build server
var server = http.createServer(function(request, response) {
  util.puts('[' + new Date() + ']Received request for ' + request.url);
  response.writeHead(404);
  response.end();
});
server.listen(PORT, function() {
  util.puts('[' + new Date() + ']Server is listening on port ' + PORT);
});
var wsServer = new WebSocketServer({
  "httpServer"            : server,
  "autoAcceptConnections" : true
});
wsServer.on(
  'connect',
  function(connection){
    util.puts('[' + new Date() + ']Connection accepted.');
    connection.sendUTF('{"status" : "accepted"}');
  }
);
setInterval(function () {wsServer.broadcastUTF("");}, 30 * 1000);

// build twitter connection
var twit = new twitter({
  "consumer_key"        : CONSUMER_KEY,
  "consumer_secret"     : CONSUMER_SECRET,
  "access_token_key"    : TOKEN_KEY,
  "access_token_secret" : TOKEN_SECRET
});
twit.stream('statuses/filter', {"follow" : FOLLOWING_ID}, function(stream) {
  stream.on('data', function(data) {
    if (data['user']['id'] === FOLLOWING_ID) {
      delete data['source'];
      delete data['contributors'];
      delete data['entities'];
      delete data['favorited'];
      delete data['lang'];
      delete data['truncated'];
      delete data['in_reply_to_status_id'];
      delete data['in_reply_to_status_id_str'];
      delete data['in_reply_to_user_id'];
      delete data['in_reply_to_user_id_str'];
      delete data['in_reply_to_screen_name'];
      delete data['user']['name'];
      delete data['user']['screen_name'];
      delete data['user']['url'];
      delete data['user']['description'];
      delete data['user']['protected'];
      delete data['user']['followers_count'];
      delete data['user']['friends_count'];
      delete data['user']['listed_count'];
      delete data['user']['created_at'];
      delete data['user']['favourites_count'];
      delete data['user']['utc_offset'];
      delete data['user']['time_zone'];
      delete data['user']['geo_enabled'];
      delete data['user']['verified'];
      delete data['user']['statuses_count'];
      delete data['user']['lang'];
      delete data['user']['contributors_enabled'];
      delete data['user']['is_translator'];
      delete data['user']['profile_background_color'];
      delete data['user']['profile_background_image_url'];
      delete data['user']['profile_background_image_url_https'];
      delete data['user']['profile_background_tile'];
      delete data['user']['profile_image_url'];
      delete data['user']['profile_image_url_https'];
      delete data['user']['profile_link_color'];
      delete data['user']['profile_sidebar_border_color'];
      delete data['user']['profile_sidebar_fill_color'];
      delete data['user']['profile_text_color'];
      delete data['user']['profile_use_background_image'];
      delete data['user']['default_profile'];
      delete data['user']['default_profile_image'];
      delete data['user']['following'];
      delete data['user']['follow_request_sent'];
      delete data['user']['notifications'];
      util.puts('[' + new Date() + ']EEW ' + data);
      wsServer.broadcastUTF(JSON.stringify(data));
    }   
  }); 
  stream.on('error' , function(err) {
    util.puts('[' + new Date() + ']Error::Stream' + err);
  }); 
});
setTimeout(
  function () {
    throw new Error('[' + new Date() + ']Error::for reboot');
  },  
  1000 * 60 * 60// 1 hour
);

■起動

以前はnohupとか使ってたが、ちゃんとforeverを使うようにする。

ulimit -n 32768
forever start -a --spinSleepTime=10000 -w --watchDirectory=./ -l /home/hoge/.forever/eew.log server.js

これでしばらくテストして上手く行けばリリースする。


Viewing all articles
Browse latest Browse all 46

Trending Articles