TwitterAPI2011. 2. 10. 10:41



Twitter4J 특정 버젼부터(잘 모르겠음..) userid/password를 통해서 로긴하는 방식이 사라지고 Oauth 인증 방식만 남아 있다.
OAuth 인증을 위해서는 제일 먼저 consumer key와 secret 정보를 twitter.com 으로부터 획득해야 한다.
그리고 나서 consumer key를 사용하여 Request Token, Access Token 등의 과정을 거쳐 twitter.com을 이용할 수 있다.

먼저 consumer key, secret 정보를 얻는 방법을 알아보자.
http://twitter.com/oauth_clients/new 에서 개발 중인 application 의 정보를 입력하여 consumer key, secret를 획득하여야 한다.
요구하는 정보를 입력 하면 아래와 같은 정보를 얻게 된다.

ekwangtwit by ekwang

easy twitter in development

created by Kwang Hee Lee – read and write access by default


  • XXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • XXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • http://twitter.com/oauth/request_token

  • http://twitter.com/oauth/access_token

  • http://twitter.com/oauth/authorize

성공했다면 Consumer key, Consumer secret 값을 꼭 저장 한다.

application name에 이미 존재한다는 경고를 계속 받을 것이다! 이미 많은 개발자들이 대부분의 twitter application 이름을 사용하였으니 자신의 application naming을 하도록 하자. (주의! "twitter" 라는 string이 포함되면 안된다.)

-끝- 
Posted by ekwang
TwitterAPI2010. 2. 5. 18:19
블로그를 방문해 주신 한 개발자 분으로 부터 아래와 같은 질문을 받았다.

twitter = new TwitterFactory().getInstance("아이디", "비밀번호");
Status status;
try {
status = twitter.updateStatus("Test msg1");
Log.e("Test","Successfully updated the status to [Test msg1].");
status = twitter.updateStatus("Test msg2");
Log.e("Test","Successfully updated the status to [Test msg2].");
} catch (TwitterException e) {
e.printStackTrace();
}

위와 같이 코드를 작성하고 updateStatus를 하고나서 메시지를 바꿔서 바로 다른 updateStatus를 하면 TwitterException : -1 이 발생합니다. (만약 3번째 updateStatus를 실행하면 잘 됩니다. 그러나 4번째는 문제발생...)
같은 소스를 일반 Java App로 만들어서 실행하면 문제가 없이 잘 돌아갑니다.

왜 안드로이드에서만 이런 문제가 발생할까요?

물론 답변을 할 수 없는 상태다. 나도 모르기 때문에;;

하지만 한가하던 터라 위와 관련된 내용을 좀 찾아보았다.
그전에, 내가 쓰고 있는 것은 Twitter4J-2.0.10 의 버젼 이었고 
위의 코드는 문제 없이 잘 동작 하였다.
Twitter4J-2.1.0 부터 문제가 발생한 것이다.

Project site(http://twitter4j.org/jira/browse/TFJ)를 검색해보니
많은 Android 개발자들이 Twitter4J 사용시 위와 같은 문제로 고민하고 있음을 알게 되었다.

다음은 검색 결과 중 주요 내용만 뽑아보았다.
31.  Yusuke Yamamoto   1월29일, 오후3시10분
Hi, 
I haven't managed to look into it yet. 
I have no idea why adding "Connection: close" to the request header doesn't work for the issue. 
http://java.sun.com/j2se/1.5.0/docs/guide/net/http-keepalive.html 
This can be a Dalvik/Harmony side issue as Miyuuu indicated. 
http://stackoverflow.com/questions/1440957/httpurlconnection-getrespo... 
Does any have any idea how to workaround the problem? 
I've just filed an Jira issue to track the problem. 
http://twitter4j.org/jira/browse/TFJ-296 
Thanks, 
-- 
Yusuke Yamamoto 
yus...@mac.com 

그렇다..
결론은 아직 해결이 되지 않았다 --;;

http client를 이용해서 server와 connection을 한 후 두번째 connection을 할 경우 fail이 발생을 한다.
android 의 경우 성능을 높이기 위해서 최초 연결이 된 경우 connection을 계속해서 유지하고 있도록 동작을 하고
이것 또한 Twitter4J가 위와 같은 exception이 발생하게 한다고 한다.
그래서 Twitter4J를 그냥 JVM에서 돌아가도록 하면 이런 문제는 또 발생하지 않는다.
DALVIK 에서 구동 될때만 문제가 생긴다는 것이다. (http://code.google.com/p/android/issues/detail?id=2800)


문제를 해결하기 위해서 여러 곳에서 움직임이 있는데
그중 하나만 관심을 가지고 지켜본다면 해결 된 때를 알 수 있을 것 같다.

Stackoverflow

Twitter4J

Twitter4J Group
http://groups.google.com/group/twitter4j/browse_frm/thread/4319a99a2a656275?tvc=1
Posted by ekwang
TwitterAPI2009. 11. 19. 10:02
Twitter4J를 이용하여 간단한 예제를 작성해보도록 하자.

오늘 살펴볼 예제는 
에 있는 첫번째 예제인
id, password 를 이용해 Twitter 인스턴스를 생성하고
updateStatus 메소드를 이용해서 입력한 스트링을 보내는 코드이다.

1. Updating status

You can update "What are you doing?" via Twitter.updateStatus() method.
See also twitter4j.examples.Update.java for detail. 


Twitter twitter = new Twitter(twitterID,twitterPassword);
Status status = twitter.updateStatus(latestStatus);
System.out.println("Successfully updated the status to [" + status.getText() + "].");


위의 예제를 간단한 Android application으로 만들어 보자.
결과 화면은 아래와 같다.


먼저 사용할 Twitter4J class를 import해준다.
import twitter4j.Twitter;
import twitter4j.Status;
import twitter4j.TwitterException;


3개의 EditText와 하나의 Button을 이용하여 위와 같은 화면을 구성할 수있다.
final EditText input_id = (EditText)findViewById(R.id.user_id);
final EditText input_pw = (EditText)findViewById(R.id.password);
final EditText input_text = (EditText)findViewById(R.id.input_text);
Button signin = (Button)findViewById(R.id.sign_in_button);

이후 Update Button에 OnClickListener를 붙여서 onClick 발생시 
signin.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v){
      //TODO : Below code will be inserted here
    }
});


user_id EditText와 password EditText에 입력된 값으로 Twitter 객체를 생성하도록 해준다.
그 후 updateStatus 메소드를 이용하여 글을 올리고 결과를 Toast를 이용해 출력 한다.
Twitter twitter = new Twitter(username, password);
Status status;
try {
  status = twitter.updateStatus(update_text);
  Toast.makeText(getApplicationContext(), "Successfully updated the status to [" + status.getText() + "].",   Toast.LENGTH_LONG).show();
  } catch (TwitterException e) {
    Toast.makeText(getApplicationContext(), "Fail to update text [" + e + "].", Toast.LENGTH_LONG).show();
  }

위와 같은 간단한 코드 만으로 Twitter에 로그인 하고 글을 올리는 것이 가능한 application을 만들 수 있다.

프로젝트 파일을 압축해서 첨부하였으니 참고.
다음에는 자신의 timeline을 얻어와 list로 출력 하는 예제를 살펴볼 예정이다.

'TwitterAPI' 카테고리의 다른 글

[Twitter4J] OAuth support  (0) 2011.02.10
Twitter4J TwitterException -1 발생  (1) 2010.02.05
Twitter4J를 사용하기 위한 JAVA CLASSPATH 설정  (0) 2009.10.22
Posted by ekwang
TwitterAPI2009. 10. 22. 20:32

Window에서 Twitter4J API 사용을 위해서는
twitter4j-2.0.10 이하에 존재하는 jar 파일의 위치를 CLASSPATH 환경 변수 값에 등록을 해주어야 한다.
그래야 Twitter4j class 들을 import한 java파일을 javac를 이용하여 정상적으로 빌드 할 수 있다. 

즉, 아래의 jar파일들이 CLASSPATH 환경 변수에 포함되어야만
어떤 경로에서든 Twitter4j 를 import한 java파일이 빌드가 되는 것이다.
Twitter4J 의 jar파일이 아니더라도 빌드하고자 하는 파일의 import 에 새로운 class가 추가될 경우에는
필요한 jar파일들이 있는 경로를 CLASSPATH로 추가해 주어야 한다.

twitter4j-2.0.10\twitter4j-2.0.10.jar
twitter4j-2.0.10\twitter4j-2.0.10-javadoc.jar
twitter4j-2.0.10\twitter4j-2.0.10-sources.jar
twitter4j-2.0.10\lib\jdom.jar
twitter4j-2.0.10\lib\junit.jar
twitter4j-2.0.10\lib\logback-classic-0.9.6.jar
twitter4j-2.0.10\lib\logback-core-0.9.6.jar
twitter4j-2.0.10\lib\rome-0.9.jar
twitter4j-2.0.10\lib\slf4j-api-1.5.0.jar


아래와 같이 배치파일을 생성하여 CLASSPATH에 추가를 쉽게 한다.
setEvn.cmd 라는 파일을 생성하여 아래와 같이 코드를 넣자.(Window 환경용 임)

set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_03
for %%i in (D:\SFF\Twitter\Twitter4J\twitter4j-2.0.10\lib\*.jar) do set CLASSPATH=!CLASSPATH!;%%i
for %%i in (D:\SFF\Twitter\Twitter4J\twitter4j-2.0.10\*.jar) do set CLASSPATH=!CLASSPATH!;%%i
set CLASSPATH=%CLASSPATH%;.
set MEM_ARGS=-Xms10m -Xmx10m


위의 JAVA_HOME의 값과 같이 강조처리한 경로명에 대해서는
본인의 경로에 맞도로 변경을 하도록 한다.
setEnv.cmd를 cmd창에서 실행하면 아래와 같이 CLASSPATH값이 변경되었음을 확인 할 수 있다.

CLASSPATH=!CLASSPATH!;D:\SFF\Twitter\Twitter4J\twitter4j-2.0.10\twitter4j-2.0.10.jar;.


그리고 CLASSPATH에 현재경로를 알려주는 . 을 등록하지 않게되면
아래와 같은 Error를 보게 된니 반드시 . 경로(현재폴더를 지정하는 것임)도 추가 하도록 한다( set CLASSPATH=%CLASSPATH%;.)

D:\SFF\Project\Java>java t4j_Update
Exception in thread "main" java.lang.NoClassDefFoundError: t4j_Update


CLASSPATH가 정상적으로 설정되었다면
아래와 같이 컴파일 및 실행을 해볼 수 있다.(setEnv.cmd 는 이미 실행한 상태임)

  

 이 글은 스프링노트에서 작성되었습니다.

'TwitterAPI' 카테고리의 다른 글

[Twitter4J] OAuth support  (0) 2011.02.10
Twitter4J TwitterException -1 발생  (1) 2010.02.05
Twitter4J를 이용한 Android Twitter Application 예제 1  (5) 2009.11.19
Posted by ekwang