기존의 libtwitcurl이 토큰 및 인증 관련하여 제대로 작동하지 않던 문제에 대해서.
LR2Twit의 토큰 관련 기능들이 모두 먹통이라는 소식이 들려왔다.
아니 도대체 이게 무슨 날벼락인가 싶다가 라이브러리만 가져다 쓰던 libtwitcurl 소스를 직접 받아서 컴파일해보기로 했다.
1. Token Issue
먼저, 토큰을 받아오지 못하는 문제를 찾아보니, 다음과 같은 이슈가 있었다
https://code.google.com/p/twitcurl/issues/detail?id=48
글 그대로... URL에 http 프로토콜이 없으면 작동하지 않더라는 것이었다 -_-; 왜 그런가...
2. Status update Issue
여기까진 좋았는데, 컴파일을 하고 나니 이제는 status update가 "Could not authenticate with OAuth" 라는 에러메시지를 뿜으면서 되질 않는 것이다!
아니 왜 그 전에는 잘 되더니 컴파일 다시 하고 나니까 왜 안 되는 건데 왜 왜에에ㅔ에에엥에에
이참에 libtwitcurl의 구조도를 한번 살펴보았다.
개략적으로는 다음과 같다. (글로 설명하자니 좋을 게 없어 그냥 그림으로 그려봐씀.. 끼릭끼릭...)
무지 복잡하다.
statusUpdate라는 보기 좋게 생긴 편한 함수는 내부적으로 performPost를 호출한 후, 헤더와 post body를 만들고 CURL lib를 사용하지만 여기서는 문제가 되는 부분이 OAuth 부분이므로 getOAuthHeader을 살펴본다.
getOAuthHeader 내부에서는 buildOAuthRawDataKeyPairs로 std::map 구조체를 만들고, 이를 기반으로 getSignature로 oauth_signature을 생성하고 다시 buildOAuthRawDataKeyPairs를 호출하여 최종적인 인수들을 담은 std::map 구조체를 만든다.
패킷을 보니, 모든 데이터는 동일해도 시그네쳐가 다르길래 getSignature에 문제가 있음을 직감하고 좀 더 파헤쳐보니 Base String, secretSignKey 생성하는 부분이 보였다. 암호화부분에 문제가 있는지 확인을 해 보았으나 아무 문제가 없음을 확인하였다.
그럼 도대체 어디가 문제인가!!
Base String을 만드는 부분에서 URL이 인자로 들어간다.
그런데 기존 twitcurl lib에는 URL에 프로토콜이 명시되어 있지 않았다.
그래서 http 프로토콜을 명시해주니... 된다
에이시발
아니 왜 똑같은 코드인데 저 바이너리는 잘 돌아가고 내가 컴파일한 바이너리는 http 넣어야하고 으어ㅏ아ㅏ아아
그 외 중간에 Base String에 status 값을 넣기 위해 getStatusString 메서드도 넣긴 했는데 ... 뭐 그닥 중요하진 않은 것 같으니 패스.
코드는 깃허브(https://github.com/kuna/libtwitcurl)에 올려 놓았다.
twitpic 기능도 libtwitcurl에 추가하고 싶은데.. 요즘 시간이 없어서 쓸 일이 있기 전까지는 추가할 수 있으련지 잘 모르겠다 ;ㅅ;.
해당 기능을 구현해 놓은 게 있긴 한데 performPost2 메서드 만들어서 짜집어 넣으면 금방 구현할 수 있을 듯.. 하나 시간이 없으니 누구 능력자 하나 와서 코드 좀 짜놓고 가십시오