본문 바로가기

프로그램&DB/유용한팁

twitter API for PHP

twitter는 간단하면서도 강력한 소셜네트워크 서비스입니다.
프로그램 적으로 본다면 머 별거 없다고 생각하지만 twitter의 아이디어를 보면 정말 대단합니다.
간단한 글을 통해 모든 사람들과 팔로윙(Following,Follower)을통해 연결 된다는 생각 정말 간단하면서도 독창적입니다.
또한 거의 모든기능(회원가입 제외)을 API로 제공하고 있습니다.
http://twtkr.com/  을 봐도 알 수 있습니다. twtkr.com은 twitter가 영어라서 한글로 번역해놓은 사이트 입니다. twitter 사이트랑 똑 같습니다. 몇가지 기능을 더 제공하고 있지만 똑 같다고 보면 됩니다. 모두 twitter에서 제공하는 API를 사용하여 서비스 됩니다.

그럼 나의 사이트에서도 twitter API를 사용하고 싶어지죠...
그런 분들은 위하여... 초보자 분들입니다. 저 또한 초보자 이기 때문에 좀더 쉽고 필요한 기능만 설명하고자 합니다.
twtkr 같은 사이트를 만들려고 사용하지 않는 다면 기능은 거의 정해져 있습니다.
우선 Tistory2Tweet 와 같이 내가 또는 회원이 글을 쓰면 twitter에 같이 포스팅이 되는 기능.
내 Following 가져오기 Following된 글들 가져오기등... 

그럼 이런 서비스를 위해서는 무엇이 필요할까요??
지금부터 언급하는 내용은 PHP 기준입니다. 머 다른 언어도 거의 비슷합니다.
우선 PHP가 되야 하겠고 버전은 5.2 이상 권장입니다. 또한 CURL 이 되어야 합니다. phpinfo() 를 이용하여 자신의 환경을 살펴 보시길 바람니다.

Twitter.com에서는 API Doc을 제공합니다.
http://dev.twitter.com/
http://dev.twitter.com/pages/oauth_libraries#php
http://dev.twitter.com/pages/sign_in_with_twitter  - buttons
위 링크를 따라가서 가볍게 읽어 주세요. 그림도 있으니 간략하게만 이해해 주세요. 저도 영어가 딸려서 ㅡㅡㅋ

API을 이용을 편하게 하기 위해 많은 툴(Tools)들이 있습니다. 몇가지를 소개하면 아래와 같습니다.
http://github.com/abraham/twitteroauth
http://github.com/abraham/php-twitter
http://jdp.github.com/twitterlibphp
http://github.com/jmathai/twitter-async
http://code.google.com/p/oauth-php/
http://code.google.com/p/php-twitter/
http://twitter.slawcup.com/twitter.class.phps

이중에서 제가 쓸 툴은 twitter에서도 소개되고 있는 twitteroauth - @abraham's Twitter OAuth library for PHP 입니다.
사이트에서 파일을 받으시면 됩니다. 파일중 필요한것은 아래 파일 정도 입니다.
twitteroauth/OAuth.php
twitteroauth/twitteroauth.php
callback.php
clearsessions.php
config.php
redirect.php

정확히 목표를 정해 놓고 가는 것이 좋겠죠.
목표는 회원제 사이트에서 자신이 쓴글을 twitter에 같이 포스팅 하는 것입니다. Tistory2Twee 같은 기능을 구현 하고자 합니다.

$$ 그럼 처음으로 할일은 twitter에 서비스에 이용될 API KEY를 얻는 것입니다.
twitter에 가입은 필수 이고. http://twitter.com/apps/new 를 열어서 각 필드를 적당히 채워 줍니다.

Callback URL은 정확하게 적어 주세요. 
Save를 크릭하면 사용할 API가 생성 됩니다.

https://twitter.com/apps 를 보면 등록된 모든 API를 볼 수 있습니다.

해당 API(Application)을 클릭하면 API의 상세 항목을 볼 수 있습니다.

상세 항목중에서 필요한것은 Consumer Key 와 Consumer secret 입니다. 또한 API의 Callback URL도 필요합니다.

$$ 소스를 설명하기 앞서 간략하게 어떻게 동작 하는지 설명 하겠습니다.
각각의 회원이 글을 쓰면 각 회원 twitter로 포스팅하기 위해서는 각 회원의 twitter로그인 정보가 있어야 합니다. Tistory2Twee 에서도 한번은 twitter에 로그인을 해주어야 하죠..
twitteroauth를 이용하여 twitter에 로그인시 twitter 회원별로 정해진 oauth_token, oauth_token_secret 값을 알아와 디비에 저장을 합니다. 이 값만 있으면 다음부터는 twitter에 로그인 할 필요가 없습니다. 이 값을 이용하여 자동으로 로그인하는 효과를 볼 수 있는 거죠.
그럼 회원이 어떠한 글을 올리면 내부적 프로그램을 이용하여 자동으로 로그인을 하고 그 회원의 twitter에 글을 올리는 것입니다.

$$ 그럼 먼저 twitteroauth의 환경 설정을 합니다.
config.php 파일을 열어서 CONSUMER_KEY, CONSUMER_SECRET, OAUTH_CALLBACK 을 정확하게 채워 줍니다. 

$$ 회원별 oauth_token, oauth_token_secret 값을 알아 와야 겠죠.
회원이 링크하는 버튼을 하나 만들어서 팝업으로 redirect.php 을 띄웁니다. 800x400정도면 되겠죠.
그럼 twitter에 로그인 하라는 폼이 나올것입니다. 이미 로그인 되어 있으면 아래와 같은 화면이 나타 납니다.

Allow을 눌러야 겠죠... 그럼 자동으로 위에서 등록 시켜 주었던 Callback URL(callback.php)로 정보들을 넘겨 줍니다. 
이 정보를 이용해서 oauth_token, oauth_token_secret 을 알아 내면 됩니다.

callback.php 파일을 살짝 바꿔주면 됩니다.

<?php
/**
 * @
 * Take the user when they return from Twitter. Get access tokens.
 * Verify credentials and redirect to based on response from Twitter.
 */

/* Start session and load lib */
session_start();
require_once('twitteroauth/twitteroauth.php');
require_once('config.php');

/* If the oauth_token is old redirect to the connect page. */
if (isset($_REQUEST['oauth_token']) && $_SESSION['oauth_token'] !== $_REQUEST['oauth_token']) {
  $_SESSION['oauth_status'] = 'oldtoken';
  header('Location: ./clearsessions.php');
}

/* Create TwitteroAuth object with app key/secret and token key/secret from default phase */
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);

/* Request access tokens from twitter */
$access_token = $connection->getAccessToken($_REQUEST['oauth_verifier']);

/* Save the access tokens. Normally these would be saved in a database for future use. */
$_SESSION['access_token'] = $access_token;

/* Remove no longer needed request tokens */
unset($_SESSION['oauth_token']);
unset($_SESSION['oauth_token_secret']);

/* If HTTP response is 200 continue otherwise send to connect page to retry */
if (200 == $connection->http_code) {
  /* The user has been verified and the access tokens can be saved for future use */
  $_SESSION['status'] = 'verified';
  
  // 이부분에 디비 작업을 하시면됩니다. 
  $up = mysql_query("update `member_db` set 
                          oauth_token='$access_token[oauth_token]', 
                          oauth_token='$access_token[oauth_token_secret]', 
                          user_id='$access_token[user_id]', 
                          screen_name='$access_token[screen_name]'
                     where user='$user' ");
  echo "<script>window.close()</script>";
  
  //echo "<a href='clearsessions.php'>Clear Sessions</a>";
  //header('Location: ./index.php');
} else {
  /* Save HTTP status for error dialog on connnect page.*/
  header('Location: ./clearsessions.php');
}
?>

$$ 그럼 oauth_token 이 등록된 회원이 글을 쓰면 Twitter에 글을 날려야 겠죠.
twitteroauth
 에 동봉된 test.php에 모든것이 있습니다.
글을 등록하는 로직 부분이 아래 부분을 추가 하면 됩니다. (예시 입니다. 응용하셔야 합니다.)

<?php
// 회원 디비에서 token값 가져오기 
$member = mysql_fetch_array(mysql_query("select * from `member_db` where user='$user' "));

// 포스팅할 글 줄이기
// twitter는 글자수가 140자로 제한 되어 있으므로 포스팅할 글자를 잘라 주어야 합니다.
// 링크주소까지 넣을 려면 약 100자 안팎으로 줄여야 겠죠.
// 링크주소는 http://bit.ly 등으로 줄이시면 됩니다. 이또한 API를 제공합니다.
$msg = str_cut($comment)." ".$short_url;

/* Start session and load lib */
session_start();
require_once('twitteroauth/twitteroauth.php');
require_once('config.php');

// token을 이용하여 twitter에 접근합니다.
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $member['oauth_token'], $member['oauth_token_secret']);

// 글($msg)을 포스팅합니다.
$connection->post('statuses/update', array('status' => $msg));
?>

알고 보면 간단 하죠.

// 자신의 글 가져오기
$connection->get('statuses/home_timeline');
// 친구(following)글 가져오기
$connection->get('statuses/friends_timeline');
// follow user id 가져오기
$connection->get('friends/ids');

test.php파일에 보시면 여러가지 예제가 있습니다. 
하나 하나씩 테스트 해보시면 될 것 같네요.
http://dev.twitter.com/doc/ 의 좌측 메뉴에 적용할 수 있는 모든 목록이 있습니다. 

ps. twitter callback은 xml과 json 파일 모두 지원합니다. 경우에 따라서는 atom, rss도 지원합니다. 사용하기 편한 것으로 사용하세요. 기본으로 받을 형식은twitteroauth/twitteroauth.php 파일에서 설정하시면됩니다.

ps. twitter API는 Request가 제한적입니다.  Request를 늘려주기 위해서 Request whitelisting 에 등록 해주면 됩니다. 

[출처] http://blog.yesyo.com/entry/twitter-API-for-PHP