블로그 보관함

2014년 3월 18일 화요일

Twitter API 이용하기 #02 twitter.js (Server Script)

서버를 만들기 위해서는 nodeJS 구동 코드와 Twitter 에 정보를 요청하기 위한 API 가 필요하다. 각각의 코드는 외워서 Typing 할 것이 아니라 각각 홈페이지에서 가져오는 것이 바람직할 것이다.

NodeJS 홈페이지

NPM Twitter-API 홈페이지

또한 인증을 하는 방법과 url에 대해서는 dev.twitter.com 에서 검색을 해 보는 것이 좋을 것이다.

RequestToken 을 요청하는 부분과 AccessToken을 요청하는 부분들은 node-twitter-api 를 사용하면 내부적으로 처리가 되기 때문에 깊이 있는 공부를 하고 싶다면 node-twitter-api 사이트에서 내부 함수를 살펴보자.

생각을 해서 정리해야 하는 부분은 html로 데이터를 객체화 하여 넘겨주는 getUserTimeline이 되겠다. 코드를 읽어보면 그리 어렵지 않다는 것을 알 수 있다.
참 쉬죠잉




twitter.js  @NodeJS

var http = require('http');
var twitterAPI = require('node-twitter-api');
var reqTok, reqTokSec, accTok, accTokSec;
var pageMap = {};
var twitter = new twitterAPI({
    consumerKey: 'API Key',
    consumerSecret: 'API Key Secret',
    callback: '로컬호스트:포트번호/getAccessToken'
});
pageMap['/getRequestToken'] = function(req, res, urlObj){
  res.writeHead(200, {'Content-Type': 'text/plain;charset=UTF-8'});
  twitter.getRequestToken(function(error, requestToken, requestTokenSecret, results){
    if (error) {
        console.log("Error getting OAuth request token : " + error);
    } else {
      reqTok = requestToken;
      reqTokSec = requestTokenSecret;
      res.write('{');
      res.write('"reqTok":'+JSON.stringify(reqTok));
      res.write('}');
      res.end();
    }
  });
};
pageMap['/getAccessToken'] = function(req, res, urlObj){
  res.writeHead(200, {'Content-Type': 'text/html;charset=UTF-8'});
  var oauth_verifier = urlObj.query.oauth_verifier;
  twitter.getAccessToken(reqTok, reqTokSec, oauth_verifier, function(error, accessToken, accessTokenSecret, results) {
    if (error) {
        console.log(error);
    } else {
      accTok = accessToken;
      reqTokSec = accessTokenSecret;
      res.write('<html><head><title>redirect page</title><meta http-equiv="refresh" ');
      res.write('content="1;url=이동할 주소의 URL/test/main.html">');
      res.write('</head><body><p>move to main page</p></body></html>');
      res.end();
    }
  });
};
pageMap['/getUserTimeline'] = function(req, res, urlObj){
  res.writeHead(200, {'Content-Type': 'text/plain;charset=UTF-8'});
  twitter.getTimeline(
      'user_timeline',
      {screen_name: urlObj.query.screen_name},
      accTok,
      accTokSec,
      function(error, data) {
    if (error) {
        console.log(error);
    } else {
      console.log('hihi');
      res.write('[');
      var isFirst = true;
      data.forEach(function(item){
        isFirst || res.write(',');
        isFirst && (isFirst=false);
        res.write('{');
        res.write('"text":'+JSON.stringify(item.text));
        res.write(',"tw_date":'+JSON.stringify(item.created_at));
        res.write(',"rt_count":"'+item.retweet_count+'"');
        res.write(',"fv_count":"'+
            (item.retweeted_status?
                item.retweeted_status.favorite_count:'0')+'"');
        res.write('}');
      });
      res.write(']');
      res.end();
    }
  });
};
http.createServer(function (req, res) {
  res.setHeader("Access-Control-Allow-Origin", "*");  >> 서버에 요청하는 사람에게 정보제공 동의 헤더
  //res.end('Hello World\n');
  var urlObj = require('url').parse(req.url, true);
  try{
 var page = pageMap[urlObj.pathname];
 if(page){
 page(req, res, urlObj);
 }
  }catch(err){
 console.log(err);
  }
}).listen(포트번호, '호스트의 IP');
console.log('Server running at http://호스트IP:포트번호/');

댓글 없음:

댓글 쓰기