Tag Clouds



트위터의 @Anywhere API 사용하기

PDF
oauth_diagram.png

위 다이어그램은 트위터에서 제공하는 OAuth API의 다이어그램입니다. OAuth는 외부(서드파티 애플리케이션)에서 계정을 인증할 수 있는 방법의 하나로써 사용자의 패스워드를 필요로 하지 않고 사용자의 데이터에 접근할 수 있게하는 토큰패싱 매커니즘입니다. 여러 서비스들이 이를 사용한 오픈 API를 제공하고 있습니다. 대표적으로 트위터에서 지원하고 있으며, Gmail도 OAuth API를 제공하겠다고 발표하여 이제는 오픈 ID의 개념으로 확산되고 있는 추세입니다. 외부에서 로그인을 필요로하는 정보를 취득하는 방법으로 계정 정보를 입력하는 절차를 거치는 것이 일반적이었습니다만, 제 3자에게 아이디와 비밀번호가 고스란히 노출되어 버리는 치명적인 단점이 있어 심각한 보안 문제를 야기할 수 있기 때문에 OAuth를 대안으로 삼고 있는듯 합니다. 최근 트위터는 OAuth API를 이용하는 서드파티 애플리케이션에 더 많은 혜택을 제공하는 방식으로 사용을 권장하고 있습니다.

얼마전에 트위터에서 발표한 @Anywhere는 자신의 사이트 또는 블로그에 트위터와 손쉽게 연동할 수 있게하는 자바스크립트 위젯 라이브러리입니다. 놀랍게도 서버를 거치지 않고 자바스크립트만으로 OAuth를 통해 인증하는 모습에 감탄하여 분석해 보았습니다. @Anywhere는 OAuth 2.0 API를 사용하더군요. 크로스-도메인 POST 요청이 일어나는 것을 확인해 보았더니 <iframe> 요소를 이용한 트릭입디다. 살짝 실망하고 더 파다보니 잡다한 자바스크립트 리소스들을 다수 호출하는 것도 마음에 들지 않더군요. 그래서 가벼운 OAuth 인증 라이브러리를 만들어 보려고 했습니다. 하지만 애초 목적과는 달리 @Anywhere의 API를 사용하는 재미에 흠뻑 빠져들고 말았습니다. 트위터의 @Anywhere 개발 문서에는 초심자를 위한 위젯 사용법만 나와있고 입맛대로 가지고 놀기에는 정보가 턱없이 부족해서 소스분석으로 알아낸 다소 불친절(?)한 명세들을 공개합니다. 위젯 생성관련 메서드는 이미 공개되어 있기 때문에 설명은 생략했고 자바스크립트만으로 서드파티 웹 애플리케이션을 개발할 수 있을 만한 REST API와 사용자 메서드들을 집중 공략했습니다. 대부분의 사용자 메서드는 통신이 발생하기 때문에 비동기식으로 작동하며 'is'로 시작하는 메서드가 아니면 jQuery처럼 체인 형식으로 작성할 수 있습니다.

Anywhere methods

  • twttr.anywhere : 초기화 arg1 = version or callback(client), arg2 = callback(client)
  • twttr.anywhere.config : 환경설정 arg1 = options
  • twttr.anywhere.signOut : 로그아웃

Client methods

  • client.signIn : 로그인
  • client.isConnected : 연결상태 확인
  • client.requireConnect : 연결 여부 확인
  • client.hovercards : 호버카드 생성
  • client.linkifyUsers : 트위터 사용자 링크 생성
  • client.tweetBox : 트위터 컨텐츠 입력창 생성
  • client.connectButton : 트위터 연결 버튼 생성
  • client.followButton : 팔로우 버튼 생성
  • client.one : EventProvider
  • client.trigger : EventProvider
  • client.bind : EventProvider
  • client.unbind : EventProvider

REST API methods

  • client.Base : 트위터 Base API
  • client.CurrentUser : 트위터 CurrentUser API
    • block
    • follow
    • notifications
    • report
    • statics
    • unblock
    • unfollow
  • client.DirectMessage : 트위터 DirectMessage API
    • send: DirectMessage
  • client.List : 트위터 List API
  • client.Place : 트위터 Place API
    • find: Place
    • nearby: Collection
  • client.SavedSearch : 트위터 SavedSearch API
  • client.SearchResult : 트위터 SearchResult API
  • client.Status : 트위터 Status API
    • favorite : Status
    • find : Status
    • publicTimeline : Collection
    • reply : Status
    • retweet : Status
    • search : Collection
    • unfavorite : Status
    • update : Status
  • client.User : 트위터 User API
    • current : CurrentUser
    • find : User
    • findAll : Collection
    • search : Collection

User methods

  • user.data : 사용자 정보 arg1 = attribute, arg2 = value
  • user.block : 블락 arg1 = options
  • user.follow : 팔로 arg1 = options
  • user.unblock : 언블락 arg1 = options
  • user.unfollow : 언팔 arg1 = options
  • user.update : 트윗 arg1 = string, arg2 = params
  • user.directMessage, user.dm : DM 발송 arg1 = string, arg2 = callback(object)
  • user.notifications : 휴대폰 기기 알림 arg1 = mode, arg2 = options
  • user.report : 스팸 신고 arg1 = callback(options)
  • user.lists : 리스트 목록 호출 arg1 = callback(array)
  • user.subscriptions : 리스트 구독자 목록 호출 arg1 = options
  • user.memberships : 리스트 멤버 목록 호출 arg1 = callback(array)
  • user.timeline : 타임라인 목록 호출 arg1 = callback(array)
  • user.favorites : 즐겨찾기 목록 호출 arg1 = callback(array)
  • user.followers : 팔로어 목록 호출 arg1 = callback(array)
  • user.friends : 친구 목록 호출 arg1 = callback(array)
  • user.isBlocking : 블락 여부 확인 arg1 = screenName, arg2 = callback(boolean)
  • user.isFollowedBy : 맞팔 여부 확인 arg1 = screenName, arg2 = callback(boolean)
  • user.isFollowing : 팔로우 여부 확인 arg1 = screenName, arg2 = callback(boolean)
  • user.isFriend : 친구 여부 확인 arg1 = screenName, arg2 = callback(boolean)
  • user.isMutual : 관계 여부 확인 arg1 = screenName, arg2 = callback(boolean)

Examples

<script src="http://platform.twitter.com/anywhere.js?id=YOUR_API_KEY&v=1"></script>
<script type="text/javascript">
  twttr.anywhere(function(client) {
    var currentUser, screenName, profileImage, profileImageTag;

    if (client.isConnected()) {
      currentUser = client.currentUser;
      screenName = currentUser.data('screen_name');
      profileImage = currentUser.data('profile_image_url');
      profileImageTag = "<img src='" + profileImage + "'/>";

      $('#connect-placeholder').append("Logged in as " + profileImageTag + " " + screenName);
    } else {
      client("#connect-placeholder").connectButton();
    };
  });
</script>
var footer = $('#hovercard-footer');
client.User.find(screenName).dm('당신을 언팔하고 블록했습니다. 안녕히 계세욧!').unfollow({
    success: function() {
      footer.addClass("following");
    },
    error: function(result) {
      if (result.status == 403 && result.response.error.match(/already requested to follow/))
        footer.addClass("follow-pending");
      else if (result.status != 401)
        footer.addClass("follow-alert");
    }
  }).block({
    success: function() {
      footer.addClass("blocking")
        .removeClass("sms-setting-not-off")
        .addClass("sms-setting-off")
    },
    error: function() {
      footer.removeClass("not-following").addClass("following");
    }
  });

이곳에 트위터와 연동한 댓글들의 툴팁은 완전히 커스토마이즈 된 것입니다. 아직 몇몇 알아내지 못한 기능과 버그들이 있긴 하지만요. 변화가 느껴지지 않는 분들은 여기를 클릭하여 로컬-스토리지에 보관된 리소스 캐시를 수동으로 제거하세요.

* 댓글 및 툴팁 연동을 위한 Anywhere 클래스 생성
* 툴팁에 트위터 호버카드 타입 추가
* @Anywhere 자바스크립트 리소스를 로컬에서 호출하도록 수정
* @Anywhere OAuth 인증 후 호버카드 정보 및 액션 변경
* @Anywhere OAuth 인증 후 특정 대상 멘션 작성 기능 추가
* @Anywhere OAuth 인증 후 기본 댓글 작성을 트위터에 작성하는 기능 추가
* @Anywhere OAuth 인증 후 리트윗 작성 기능 추가
* Anywhere 클래스에 onSignIn, onSignOut, onInitialize 멀티플 콜백 추가


Comments

Trackback : http://firejune.com/trackback/1623

  1. 노현우

    @firejune 블로깅 봤는데 참 어렵네요~ ^^;;;

    Posted by 노현우 at from Socialite.app | reply

     
     
  2. firejune

    @LuCiDuM 제가 봐도 어렵습니다. 쉽게 글로 작성한다는 건 참 어려운 일이에요. ㅠㅠ

    Posted by firejune at from firejune.com | reply

     
     
  3. 노현우

    @firejune 네.. 그런것 같아요~ ^^ 사실 IT쪽에 관심은 많은데 비전문가이다 보니 다른 글들을 봐도 잘 이해가 안되요~ 역시 컨버젼스의 시대인가... ㅜ.

    Posted by 노현우 at from Socialite.app | reply

     
     
  4. 이용혁

    @firejune 트위터 Anywhere사용시 현재 화면의 URL을 다시한번 호출하는 버그 없으셨나요..?

    Posted by 이용혁 at from web | reply

     
     
  5. firejune

    @skynle 인증 후에 콜백URL이 호출되면서 그런현상이 나타나더군요. 리퍼러 체크해서 컨텐츠 출력을 막아야 겠어요.

    Posted by firejune at from firejune.com | reply

     
     
  6. 이용혁

    @firejune 저는 리퍼러로 하다가 뭔짓이냐 싶어서 그냥 안쓰기로.. ㅎㅎ

    Posted by 이용혁 at from web | reply

     
     
  7. boxersb

    RT @firejune: 트위터의 @Anywhere API 사용하기 http://firejune.com/1623

    Posted by Kyoungtaek Koo at from web | reply

     
     
  8. Kangun.Lee

    RT @firejune: 트위터의 @Anywhere API 사용하기 http://firejune.com/1623

    Posted by Kangun.Lee at from twicca | reply

     
     
  9. Younjin Jeong

    @firejune ㅎㅎ 술자리는 즐거웠어? 많이 안마셨나보네 ㅎㅎ

    Posted by Younjin Jeong at from Osfoora for iPhone | reply

     
     
  10. firejune

    @YZCerberos 지루했다.

    Posted by firejune at from TwitBird | reply

     
     
  11. Younjin Jeong

    @firejune 그래도 나름 자리인데 한마디 하지 그랬어 ㅋㅋ

    Posted by Younjin Jeong at from Osfoora for iPhone | reply

     
     
  12. firejune

    @YZCerberos 술먹다가 OAuth 이용해서 할만한 서비스가 떠오름. "일괄 언팔 서비스" 도메인은 http://twiteeing.com ㅋㅋ

    Posted by firejune at from TwitBird | reply

     
     
  13. Younjin Jeong

    @firejune ㅋㅋㅋ 특정 문자열 검색해서 언팔해도 되고 맞팔 100% 만들 수도 있겠는걸.

    Posted by Younjin Jeong at from Osfoora for iPhone | reply

     
     
  14. firejune

    @YZCerberos 와 잘됀다~

    Posted by firejune at from TweetJune | reply

     
     
  15. Younjin Jeong

    @firejune ㅋㅋㅋㅋㅋ OAuth 는 이제 다 분석 했나봐? ㅎㅎ

    Posted by Younjin Jeong at from Osfoora for iPhone | reply

     
     
  16. firejune

    @YZCerberos 그거 졸라 트릭이야. 크로스-도메인-리퀘스트를 브라우저의 보안 구멍을 이용해서 스크립트로 구현한거랑 같아. 완전 야매임

    Posted by firejune at from web | reply

     
     
  17. KL

    @firejune Cross Site XHR 관련해서 잘 정리된 문서가 있어서 소개해 드립니다. :) http://www.slideshare.net/mehmetakin/ajax-world

    Posted by KL at from firejune.com | reply

     
     
  18. firejune

    @klkim 좋은 정보 감사합니다.

    Posted by firejune at from TweetJune | reply

     
     
  19. firejune

    @YZCerberos @Anywhere 원격 댓글 달기 테스트당.

    Posted by firejune at from TweetJune | reply

     
     
  20. firejune

    @YZCerberos 오 잘된다!!

    Posted by firejune at from TweetJune | reply

     
     
  21. geoguru

    RT @firejune: 트위터의 @Anywhere API 사용하기 http://firejune.com/1623

    Posted by geoguru at from Osfoora for iPhone | reply

     
     
  22. zziuni

    RT @firejune: 트위터의 @Anywhere API 사용하기 http://firejune.com/1623

    Posted by zziuni at from TweetDeck | reply

     
     
  23. Younjin Jeong

    멋져!!!! ㅋㅋㅋ RT @firejune: 트위터의 @Anywhere API 사용하기 http://firejune.com/1623

    Posted by Younjin Jeong at from Osfoora for iPhone | reply

     
     
  24. firejune

    @YZCerberos 댓글 갱신 테스트 ok?

    Posted by firejune at from TweetJune | reply

     
     
  25. Younjin Jeong

    @firejune 오겡 ㅋㅋ

    Posted by Younjin Jeong at from Osfoora for iPhone | reply

     
     
  26. SeungHeun,Noh

    @firejune 님이 정리한 깔끔한 @anywhere OAuth. 명 포스팅 http://firejune.com/1623

    Posted by SeungHeun,Noh at from web | reply

     
     
  27. 김주희(JooHee Kim)

    RT @firejune: 트위터의 @Anywhere API 사용하기 http://firejune.com/1623

    Posted by 김주희(JooHee Kim) at from web | reply

     
     
  28. __fury

    Twitter: 트위터의 @Anywhere API 사용하기: http://firejune.com/1623

    Posted by fury at from Topsy | reply

     
     
  29. avatar

    좋은 정보 감사합니다.

    Posted by OldMrDiary at reply edit

     
     
  30. avatar

    네 고맙습니다~

    Posted by 파이어준 at edit

     
     
  31. firejune

    @firejune @Anywhere 댓글 연동 테슷흐

    Posted by firejune at from TweetJune | reply

     
     
  32. Rhio.kim

    @firejune 테슷흐 잘 보여요 ;)

    Posted by Rhio.kim at from TweetDeck | reply

     
     
  33. firejune

    @Rhiokim 하핫 이제 조금 쓸만하 졌군요! 이제 리트윗만 하면 할당량 끝입니다. 후하핫

    Posted by firejune at from TweetJune | reply

     
     
  34. zziuni

    @firejune 같은 commant가 두개씩 보이는데요?

    Posted by zziuni at from TweetDeck | reply

     
     
  35. firejune

    @zziuni 로컬-스토리지에 리소스를 보관해서 갱신에 문제있어요. 제 홈에서 다음을 주소장에 입력해 주세요. javascript:new%20Storage(&#39;Include&#39;).remove();%20location.reload();%20void(0);

    Posted by firejune at from web | reply

     
     
  36. zziuni

    @firejune 해결됬습니다. 멋지군요! 의심병에 브라우저별로 체크. ㅎㅎ 다 잘됩니다.

    Posted by zziuni at from TweetDeck | reply

     
     
  37. Rhio.kim

    @firejune 최적의 CMS 솔루션을 만드시는 건가요? ㅋㅋㅋ

    Posted by Rhio.kim at from TweetDeck | reply

     
     
  38. Kyoungtaek Koo

    @Rhiokim @firejune 나도 내일 따라해봐야짓 ㅋㅋ

    Posted by Kyoungtaek Koo at from Twitter for iPhone | reply

     
     
  39. 성종천(JongCheon Seong)

    오... javascript로 별짓을 다할 수 있구나. 트위터 api까지 가능하다니... RT @firejune: 트위터의 @Anywhere API 사용하기 http://bit.ly/aZu0UE

    Posted by 성종천(JongCheon Seong) at from TweetDeck | reply

     
     
  40. avatar

    이런 이런.. Connect 버튼이 통채로 iframe으로 파지는군요.. 흐미 ;;

    Posted by boxersb at reply edit

     
     
  41. avatar

    그러게 말예요. 통신을 위한 iframe하고 위젯을 위한 iframe이 있어요. 위젯 종류별로 계속 추가 됨; 아이프레임을 아주 사랑하시는 듯;

    Posted by 파이어준 at edit

     
     
  42. firejune

    트위터 멘션 갱신 여부 테스트 @firejune

    Posted by firejune at from TweetJune | reply

     
     
  43. Rhee Chang-Woo

    @firejune 안녕하세요 트위터랑 연동 정말 되나요?

    Posted by Rhee Chang-Woo at from web | reply

     
     
  44. firejune

    @x1wins 되지요 ㅎㅎ; Rate limiting 우회하기 위해 6분마다 갱신된답니다.

    Posted by firejune at from TweetJune | reply

     
     
  45. Rhee Chang-Woo

    RT @firejune 트위터의 @Anywhere API 사용하기 http://firejune.com/1623 Good~~!!

    Posted by Rhee Chang-Woo at from web | reply

     
     
  46. otmakie

    @x1wins 사용

    Posted by mort at from web | reply

     
     
  47. Rhee Chang-Woo

    @firejune 님이 정리한 깔끔한 @anywhere OAuth. 명 포스팅 http://firejune.com/1623완전 좋아요

    Posted by Rhee Chang-Woo at from web | reply

     
     
  48. x1wins

    @firejune 님이 정리한 깔끔한 @anywhere OAuth. 명 포스팅 http://firejune.com/1623완전 좋아요

    Posted by Chang-Woo Rhee at from Topsy | reply

     
     
  49. trendspottor

    서핑하다가 찾은 트위터의 API 사용법입니다. 개발자들에겐 유용하겠네요. http://firejune.com/1623

    Posted by 김명수 at from Topsy | reply

     
     
  50. yangkun7

    트위터의 @Anywhere API 사용하기 http://bit.ly/c5Z3SP

    Posted by 양군 at from Topsy | reply

     
     
  51. avatar

    좋은 정보 감사히 보고 갑니다 ~ ^^

    Posted by birdieyj at reply edit

     
     
  52. avatar

    @birdieyj reply로 쓰는 것도 트위터로 가나요?

    Posted by birdieyj at edit

     
     
  53. agiletalk

    트위터의 @Anywhere API 사용하기 http://bit.ly/a24xFO 어.. 어렵다..

    Posted by chanju (전찬주) at from Topsy | reply

     
     
  54. teoland

    RT @firejune 트위터의 @Anywhere API 사용하기 http://firejune.com/1623

    Posted by Kim Taeyong at from Topsy | reply

     
     
  55. youngddang

    RT @teoland: RT @firejune 트위터의 @Anywhere API 사용하기 http://firejune.com/1623

    Posted by YI Back Youl at from Topsy | reply

     
     
  56. simboyz

    @firejune 매번 글 잘 보고있습니다. 이런 식의 댓글 완전 신기합니다!

    Posted by Han Seob Sim at from TweetJune | reply

     
     
  57. avatar

    글 감사히 보았습니다~

    Posted by neo at reply edit

     
     
  58. avatar

    로컬에서 제우스 돌려서 ANYWHERE 테스트해봤는데
    안되던데~~혹시 로컬에선 안되는걸까요~
    티스토리에선 되던데 ㅠ

    Posted by 이이잉 at reply edit

     
     
  59. sjyun75

    RT @firejune 트위터의 @Anywhere API 사용하기 http://firejune.com/1623

    Posted by sjyun75 at from Topsy | reply

     
     
  60. kokuryo80

    RT @firejune 트위터의 @Anywhere API 사용하기 http://firejune.com/1623

    Posted by 윤영재 at from Topsy | reply

     
     
  61. avatar

    좋은 정보 감사합니다.

    Posted by kinves at reply edit

     
     
  62. avatar

    http://twtkr.com/kinves 님이 작성하신 글
    좋은 정보 감사합니다.

    Tracked from  http://twtkr.com/kinves at

     
     
  63. livad83

    RT @firejune 트위터의 @Anywhere API 사용하기 http://firejune.com/1623

    Posted by Oh Jun Seock at from Topsy | reply

     
     
  64. sjgwack

    RT @firejune 트위터의 @Anywhere API 사용하기 http://firejune.com/1623

    Posted by 곽선정 at from web | reply

     
     
  65. avatar

    Unsafe JavaScript attempt to access frame with URL https://api.twitter.com/xd_receiver.html from frame with URL about:blank. Domains, protocols and ports must match. 이 문제는 어텋게 해결하셨나요? 도와주세요~

    Posted by spaceufo at reply edit

     
     
  66. avatar

    트윗전송에서 좌절 일초전입니다..

    Posted by arkuni at reply edit

     
     
  67. avatar

    captcha