10秒目をつむったら…

javaでTwitterのOAuth認証を用いたつぶやきのポストを実現したいと考えています。アクセストークンとアクセストークンシークレットは取得できたのですがそれを用いてつぶやきをポストすることができません。OAuthのライブラリを使えばポストすることは出来たのですができればライブラリを使わずに実現したいと思っています。おそらくポストのやりかたがおかしいと思うのですが何が悪いのかわかりません。javaはあまり得意ではないためお見せするのも恥ずかしいソースですがおかしなところを指摘していただけるとありがたいです。ポストの部分を載せます。

String url="http://twitter.com/statuses/update.xml";

URL urlObj=new URL(url);
HttpURLConnecton urlCon=(HttpURLConnection)urlObj.openConnection();urlCon.setRequestMethod("POST");
urlCon.setDoOutput(true);
urlCon.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
urlCon.setRequestProperty("Authorization",header);

//変数headerには以下のような文字列が入っています
//OAuth oauth_nonce="****", oauth_signature_method="HMAC-SHA1", oauth_timestamp="****", oauth_consumer_key="****", oauth_token="****", oauth_signature="****", oauth_version="1.0"

String body="status=test";
PrintWriter pw=new PrintWriter(urlCon.getOutputStream());
pw.print(body);
pw.flush();
pw.close();

//ここでエラー
BufferedReader inStr=new BufferedReader(new InputStreamReader(urlCon.getInputStream()));

A 回答 (2件)

401ってことは確かに認証の問題ですね。



とりあえず,signature base stringは正しいですか。
OAuthの情報はRFC 5849に沿って,
・Consumer Key : dpf43f3p2l4k3l03
・Consumer Secret : kd94hf93k423kf44
・Access Token : nnch734d00sl2jdk
・Access Token Secret : pfkkdhi9sl3r4s00
・Timestamp : 137131202
・Nonce : chapoH
を利用してHMAC-SHA1の署名を作成するとして,
http://api.twitter.com/1/statuses/update.xml

status=test
をPOSTする場合,
・signature base string
・signature
はそれぞれどうなりますか。

こちらで試したところでは,

[oauth_versionを含める場合]
・signature base string
POST&http%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fupdate.xml&oauth_co
nsumer_key%3Ddpf43f3p2l4k3l03%26oauth_nonce%3DchapoH%26oauth_signature
_method%3DHMAC-SHA1%26oauth_timestamp%3D137131202%26oauth_token%3Dnnch
734d00sl2jdk%26oauth_version%3D1.0%26status%3Dtest
・signature
E0g7lPZHabrs4Ic7ZDoS/EWCLsA=

[oauth_versionを含めない場合]
・signature base string
POST&http%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fupdate.xml&oauth_co
nsumer_key%3Ddpf43f3p2l4k3l03%26oauth_nonce%3DchapoH%26oauth_signature
_method%3DHMAC-SHA1%26oauth_timestamp%3D137131202%26oauth_token%3Dnnch
734d00sl2jdk%26status%3Dtest
・signature
XQoeK8S6ch3MMQZHO1XaDGVh4/M=

となりました。signature base stringの改行は,便宜的なものなので削除してください。

もちろん,Consumer Key等はtwitterから提供されたものではないので送信はできませんが,
updateが実際に行えるコードの署名ルーチンに流して生成しているのでおそらく間違っていないと思います。
    • good
    • 0
この回答へのお礼

わざわざ試していただいてありがとうございます。私が作っていたSignature Base Stringの各要素の順番が間違っていたようで、示していただいた順番で試みた結果認証エラーが無くなり無事投稿することができました。本当にありがとうございました。

お礼日時:2010/05/16 21:49

エラーの詳細はなんでしょうか。


例外を送出したのであれば,その例外の情報を書いてください。
# 例外情報はバグを潰すための宝の山です。

で,urlCon.connect()が無いようですが。


ちなみに,twitter APIのendpointは現在,
http://api.twitter.com/1/
になっています。
SITE: POST statuses/update | dev.twitter.com
http://dev.twitter.com/doc/post/statuses/update

この回答への補足

回答ありがとうございます。以下が送出されたエラーです。

java.io.IOException: Server returned HTTP response code: 401 for URL: http://api.twitter.com/1/statuses/update.xml

認証に失敗しているのようで、ポストする内容やヘッダなどに問題があるのかと思っています。教えていただいたサイトも確認しているのですがどこに問題があるのか分かりませんでした。
教えていただいたurlCon.connect()も試してみましたが特にかわりありませんでした。
URLはどちらでも利用出来るようでしたので前述のものを使っていました。ご指摘いただいたURLでも同じ結果になりました。

補足日時:2010/05/15 21:05
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!