ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스크립트로 트위터 불러오기
    개발 2011. 5. 24. 01:14
    며칠전 트위터 api를 이용하여 블로그 혹은 홈페이지에 붙이는 작업을 적은 적이 있는데, 개인은 그런 경우가 없겠지만 공공기관이나 혹은 보안을 요하는 곳에서는 외부로 연결되는 모든 연결을 막아놓는다는 것을 알았다.
    외부에서 들어오는 것 뿐만 아니라 외부로 나가는 것 포함해서 심지어는 80포트도 말이다.

    서버에서 외부로 연결할 수 없다면 소켓이나 기타 연결함수 등은 사용할 수 없다는 얘기다.
    방법을 생각해보다가 그러면 스크립트로 외부 api 를 호출해서 사용하면 되지 않을까? 라는 생각을 했다.
    서버 프로그래밍이 아니니 막힐 일도 없고 말이다.
    하지만, 이내 불가능하다는 것을 알았다.

    스크립트로 ajax를 이용하여 외부의 api를 호출하니 동작을 하지 않았다.
    생각을 해보니 그럴수도 있겠다는 생각이 들었다. 바로 '크로스도메인'.
    스크립트로는 크로스도메인 때문에 open api 라 할지라도 호출할 수 없다.
    그래서 다시 방법을 모색했다.

    <script type="text/javascript">
    //<![CDATA[
    function twitterCallback2(twitters) {
      var max = twitters.length;
      for (var i=0; i<twitters.length; i++){
        var screen_name = twitters[i].user.screen_name;
        var name = twitters[i].user.name;
        var profile_image_url = twitters[i].user.profile_image_url;
        var status = twitters[i].text.replace(/((https?|s?ftp|ssh)\:\/\/[^"\s\<\>]*[^.,;'">\:\s\<\>\)\]\!])/g, function(url) {
          return '<a href="'+url+'">'+url+'</a>';
        }).replace(/\B@([_a-z0-9]+)/ig, function(reply) {
          return  reply.charAt(0)+'<a href="http://twitter.com/'+reply.substring(1)+'">'+reply.substring(1)+'</a>';
        });
        //if(status.indexOf('@') == -1) continue;
            document.getElementById('status_txt'+k).innerHTML = status;
            document.getElementById('status_time'+k).innerHTML = relative_time(twitters[i].created_at);
      }
    }

    function relative_time(time_value) {
      var values = time_value.split(" ");
      time_value = values[1] + " " + values[2] + ", " + values[5] + " " + values[3];
      var parsed_date = Date.parse(time_value);
      var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
      var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
      delta = delta + (relative_to.getTimezoneOffset() * 60);

      if (delta < 60) {
        return '1분미만';
      } else if(delta < 120) {
        return '약1분전';
      } else if(delta < (60*60)) {
        return (parseInt(delta / 60)).toString() + '분전';
      } else if(delta < (120*60)) {
        return '약1시간전';
      } else if(delta < (24*60*60)) {
        return (parseInt(delta / 3600)).toString() + '시간전';
      } else if(delta < (48*60*60)) {
        return '약하루전';
      } else {
        return (parseInt(delta / 86400)).toString() + '일전';
      }
    }
    //]]>
    </script>

    <script type="text/javascript" src="http://twitter.com/statuses/user_timeline/admongdantes.json?callback=twitterCallback2&count=10"></script>


    완전한 소스는 아니지만, 트위터의 스크립트를 이용하여 특정의 위치에 트윗내용을 불러올 수 있다.
    이렇게 하면 서버에 영향을 받지 않고 스크립트 만으로도 트윗을 불러오는 것이 가능하다.

    이론상으로는 완벽하고 실제 테스트했을 때도 완벽했다.
    하지만, 실 서버에서는 트윗내용을 불러오지 못하는 경우가 발생했다.
    아예 못불러오는 것은 아니고 불러오지 못하는 경우가 불러오는 경우보다 휠씬 많았다.(즉, 불안정해서 사용할 수 없었다.)

    원인은 콜백함수인 twitterCallback2를 호출하지 못해서인데, 이유를 찾을 수 없었다. 늦게라도 호출이 되면 좋은데, 아예 호출을 하지 못했다. 스크립트 오류도 없었다. 그냥 되지 않았다. 난감하다.
    네트워크 지연일까? 그렇다면 해결방법은 무엇일까? 클라이언트에게는 뭐라고 설명하지?


    ==================================
    콜백함수가 호출되지 않았던 이유는 보안상 포트가 막혀있었다.
    모든 포트가 막혀있던 것은 아니었기 때문에, 일부는 되고 또 일부는 되지 않았다.


    반응형

    '개발' 카테고리의 다른 글

    게시판 페이징 만들기  (0) 2011.06.01
    Timer 를 이용한 스케쥴 관리  (0) 2011.05.31
    트위터 api를 이용하여 트윗목록 확인하기  (4) 2011.05.16
    JDOM을 이용한 RSS 파싱  (0) 2011.05.07
    php iconv 함수  (0) 2011.04.13

    댓글

Designed by Tistory.