質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

3100閲覧

[java] Twitter Api リクエストトークンが取得できない(ステータスコード401)

homhom

総合スコア8

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2017/12/01 18:05

編集2017/12/01 23:07

###前提・実現したいこと
プログラミング初心者です。
javaでtwitterのapiを利用したいと思い、アクセストークンを取得するためにリクエストトークンを取得しようとしているのですが、ステータスコード401で例外に飛ばされてしまいます。
ココoauth1.0日本語ガイドTwitter公式サイトを見ながら書いてみました。

コードが汚くて申し訳ないです(例外処理は特に申し訳ないです・・・)
print文に"@"を入れているのは"スペース"が気になったからです。

#聞きたいこと・教えてほしいこと
このソースのどこに原因があるか、またその解決策を教えて頂きたいです。

###該当のソースコード:

java

1import java.net.URLEncoder; 2import java.util.Map; 3import java.util.TreeMap; 4import javax.crypto.Mac; 5import javax.crypto.spec.SecretKeySpec; 6import java.security.Key; 7import java.util.Base64; 8import java.net.URL; 9import java.net.HttpURLConnection; 10import java.io.BufferedReader; 11import java.io.InputStreamReader; 12 13public class Test{ 14 static final String consumer_key = "cuYoYMQQUo5rswmietK4VzW4q";//実行時にはちゃんと存在していたkeyとsecretです。 15 static final String consumer_secret = "hxbhMUgi0fQ0aLdL5FEKnEDY31CxqXdru32RAoFNBq2B71Uyf6"; 16 17 static final String oauth_callback = "https://www.google.co.jp/"; 18 19 static final String access_token_secret = ""; 20 21 static final String request_method = "POST"; 22 23 static final String request_url = "https://api.twitter.com/oauth/request_token"; 24 25 static final Map<String,String> parameter = new TreeMap<String,String>(); 26 27 public static void main(String arg[]){ 28 //まず必要なパラメータを入れる(signatureは後から入れる) 29 parameter.put("oauth_callback",oauth_callback); 30 parameter.put("oauth_consumer_key",consumer_key); 31 parameter.put("oauth_signature_method","HMAC-SHA1"); 32 parameter.put("oauth_timestamp",String.valueOf(System.currentTimeMillis() / 1000L)); 33 parameter.put("oauth_nonce",String.valueOf(Math.random())); 34 parameter.put("oauth_version","1.0"); 35 //signatureを作成して入れる 36 parameter.put("oauth_signature",getSignature(getKey(),getData())); 37 38 //上記で作成したパラメータを元に、httpヘッダ部分に追加する"Authorization"を作成 39 StringBuilder authorization = new StringBuilder(); 40 authorization.append("OAuth "); 41 for(Map.Entry<String,String> aut : parameter.entrySet()){ 42 authorization.append(encode(aut.getKey())); 43 authorization.append("="); 44 authorization.append("\""); 45 authorization.append(encode(aut.getValue())); 46 authorization.append("\""); 47 authorization.append(", ");//スペース有 48 } 49 authorization.deleteCharAt(authorization.length()-1); 50 authorization.deleteCharAt(authorization.length()-1); 51 System.out.println("\n----------------------Authorizationー-----------------------\n@" + authorization.toString() + "@\n"); 52 53 //リクエストトークンを取得する 54 try{ 55 URL url = new URL(request_url); 56 HttpURLConnection con = (HttpURLConnection) url.openConnection(); 57 con.setRequestMethod(request_method); 58 con.setDoInput(true); 59 con.setRequestProperty("Authorization",authorization.toString()); 60 con.connect(); 61 BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream())); 62 try{ 63 String str; 64 while((str = reader.readLine()) != null){ 65 System.out.println(str); 66 } 67 con.disconnect(); 68 reader.close(); 69 }catch(Exception e){ 70 e.printStackTrace(); 71 reader.close(); 72 } 73 }catch(Exception e){ 74 e.printStackTrace(); 75 } 76 } 77 78 //HMAC-SHA1変換で使用するキーを作成 79 public static String getKey(){ 80 String key = encode(consumer_secret) + "&" + encode(access_token_secret); 81 System.out.println("\n----------------------キー-----------------------\n@" + key + "@"); 82 return key; 83 } 84 85 //HMAC-SHA1変換で変化するデータを作成 86 public static String getData(){ 87 StringBuilder stData = new StringBuilder(); 88 for(Map.Entry<String,String> param : parameter.entrySet()){ 89 stData.append("&"); 90 stData.append(encode(param.getKey())); 91 stData.append("="); 92 stData.append(encode(param.getValue())); 93 } 94 stData.deleteCharAt(0); 95 String data = encode(request_method) + "&" + encode(request_url) + "&" + encode(stData.toString()); 96 System.out.println("\n----------------------データ-----------------------\n@" + data + "@"); 97 return data; 98 } 99 100 //作成したキーとデータを元にHMAC-SHA1 ーー> BASE64の順に変換してsignatureを作成 101 public static String getSignature(String key,String data){ 102 try{ 103 SecretKeySpec sk = new SecretKeySpec(key.getBytes(),"HmacSHA1"); 104 Mac mac = Mac.getInstance("HmacSHA1"); 105 mac.init(sk); 106 byte[] digest = mac.doFinal(data.getBytes()); 107 String signature = Base64.getEncoder().encodeToString(digest); 108 System.out.println("\n----------------------signature-----------------------\n@" + signature + "@"); 109 return signature; 110 }catch(Exception e){ 111 e.printStackTrace(); 112 } 113 return null; 114 } 115 116 public static String encode(String str){ 117 try{ 118 String encodedStr = URLEncoder.encode(str,"UTF-8"); 119 120 encodedStr = encodedStr.replace("*","%2a"); 121 encodedStr = encodedStr.replace("-","%2d"); 122 encodedStr = encodedStr.replace("+","%20"); 123 124 return encodedStr; 125 }catch(Exception e){ 126 e.printStackTrace(); 127 } 128 return null; 129 } 130} 131 132 133 134

###コマンドプロンプト

>java Test ----------------------キー----------------------- @hxbhMUgi0fQ0aLdL5FEKnEDY31CxqXdru32RAoFNBq2B71Uyf6&@ ----------------------データ----------------------- @POST&https%3A%2F%2Fapi.twitter.com%2Foauth%2Frequest_token&oauth_callback%3Dhtt ps%253A%252F%252Fwww.google.co.jp%252F%26oauth_consumer_key%3DcuYoYMQQUo5rswmiet K4VzW4q%26oauth_nonce%3D0.8824818570386344%26oauth_signature_method%3DHMAC%252dS HA1%26oauth_timestamp%3D1512149214%26oauth_version%3D1.0@ ----------------------signature----------------------- @TWNYJMy8kRE2kKelAzajo9pf4yo=@ ----------------------Authorizationー----------------------- @OAuth oauth_callback="https%3A%2F%2Fwww.google.co.jp%2F", oauth_consumer_key="c uYoYMQQUo5rswmietK4VzW4q", oauth_nonce="0.8824818570386344", oauth_signature="TW NYJMy8kRE2kKelAzajo9pf4yo%3D", oauth_signature_method="HMAC%2dSHA1", oauth_times tamp="1512149214", oauth_version="1.0"@ java.io.IOException: Server returned HTTP response code: 401 for URL: https://ap i.twitter.com/oauth/request_token at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0 (HttpURLConnection.java:1895) at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream( HttpURLConnection.java:1491) at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputS tream(HttpsURLConnectionImpl.java:236) at Test.main(Test.java:61)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

Twitter Application Managementでcall_backURLを指定していないことが原因でした。

投稿2017/12/02 11:19

homhom

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Twitter APIを使いたいとの事でしたら、
公式ページよりCreate New Appでアクセストークンを直接生成して使用すればよい話なのでは。

投稿2017/12/01 20:11

編集2017/12/01 21:50
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

homhom

2017/12/02 00:23

御回答有り難う御座います。 本当に仰るとおりなのですが、自分の書いたコードのどこに問題が有るのか気になってしまいます。 また、アクセストークンを直接(公式ページより)生成したとしても、タイムラインの取得やつぶやきの投稿時などに困ってしまう事になると思うので、もう少しねばってみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問