无法从JAVA访问URL(ERROR 403)

时间:2015-10-20 05:47:23

标签: java twitter

我正在尝试使用以下代码从Twitter(https://ton.twitter..。)下载图像。我收到了上述URL的ERROR 403。但是当我在浏览器(Mozilla / Chrome)中粘贴链接时,我可以查看图像。可能是什么问题。这是我用过的代码。

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
public class auth_4 {

//static final String TwitterUri = "https://api.twitter.com/oauth2/token";
static final String TwitterClientID = "xxxx";
static final String TwitterClientSecret = "xxxxx";
static final String TwitterRedirectUri = "https://twitter.com";

public static void main(String args[]){
    try{
        new auth_4().processTwitter();
    }catch(Exception ex){
        ex.printStackTrace();
    }
}

public void processTwitter() throws Exception {
    int millis = (int) System.currentTimeMillis() * -1;
    //int time = (int) millis / 1000;
    int time = (int)((System.currentTimeMillis())/1000);
    //First, we sort all the parameters used in our request and formulate a signature base string. 
    String signatureBaseString = "GET&" + 
    URLEncoder.encode(TwitterUri, "UTF-8")+ 
    "&" + "oauth_callback%3D"+ URLEncoder.encode(TwitterRedirectUri, "UTF-8")+ 
    "%26oauth_consumer_key%3D"+ URLEncoder.encode(TwitterClientID, "UTF-8")+ 
    "%26oauth_nonce%3D"+ URLEncoder.encode(String.valueOf(millis), "UTF-8")+ 
    "%26oauth_signature_method%3D"+ URLEncoder.encode("HMAC-SHA1", "UTF-8")+ 
    "%26oauth_timestamp%3D"+ URLEncoder.encode(String.valueOf(time), "UTF-8")+ 
    "%26oauth_version%3D" + URLEncoder.encode("1.0", "UTF-8");

    System.out.println("Signature Base: "+signatureBaseString);

    //Our signing key is (notice the dangling ampersand at the end):
    String signingKey = TwitterClientSecret + "&";
    String signature = null;
    try {
        Mac mac = Mac.getInstance("HmacSHA1");
        SecretKeySpec secret = new SecretKeySpec(signingKey.getBytes(),
                "HmacSHA1");
        mac.init(secret);
        byte[] digest = mac.doFinal(signatureBaseString.getBytes());
        //We then use the composite signing key to create an oauth_signature from the signature base string
        signature = Base64.encodeBase64String(digest);
        System.out.println("The resultant oauth_signature is: " +signature);
    } catch (Exception ex1) {
        ex1.printStackTrace();
        System.exit(0);
    }

    //Now we just generate an HTTP header called "Authorization" with the relevant OAuth parameters for the request:
    String oAuthParameters = "OAuth " +
            "oauth_callback=\""+ URLEncoder.encode(TwitterRedirectUri, "UTF-8") + "\""
            + ", oauth_consumer_key=\""+ URLEncoder.encode(TwitterClientID, "UTF-8") + "\""
            + ", oauth_nonce=\""+ URLEncoder.encode(String.valueOf(millis), "UTF-8") + "\""
            + ", oauth_signature=\""+ URLEncoder.encode(signature, "UTF-8") + "\""
            + ", oauth_signature_method=\""+ URLEncoder.encode("HMAC-SHA1", "UTF-8") + "\""
            + ", oauth_timestamp=\""+ URLEncoder.encode(String.valueOf(time), "UTF-8") + "\""
            + ", oauth_version=\"" + URLEncoder.encode("1.0", "UTF-8")+ "\"";
    System.out.println("oAuth Parameters are " +oAuthParameters);

    //When Twitter.com receives our request, it will respond with an oauth_token, oauth_token_secret
    //SO LET ME SEE IF I AM LUCKY!!!
    URL url = new URL("https://ton.twitter.com...../image.png");
    HttpsURLConnection conn = null;
    try {
        conn = (HttpsURLConnection) url.openConnection();
        conn.addRequestProperty("User-Agent","Mozilla/5.0");
        //System.setProperty("http.agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0"); 
        conn.setDoOutput(true);
        conn.setRequestMethod("GET");
        //Set the oAuth params in header
        conn.setRequestProperty("Authorization", oAuthParameters);
        //Shall I set something in body?
        String bodyParams = 
                "oauth_callback="+ URLEncoder.encode(TwitterRedirectUri, "UTF-8")
                + "&oauth_consumer_key="+ URLEncoder.encode(TwitterClientID, "UTF-8") 
                + "&oauth_nonce="+ URLEncoder.encode(String.valueOf(millis), "UTF-8")
                + "&oauth_signature=" + URLEncoder.encode(signature, "UTF-8")
                + "&oauth_signature_method="+URLEncoder.encode("HMAC-SHA1", "UTF-8") 
                + "&oauth_timestamp="+URLEncoder.encode(String.valueOf(time), "UTF-8")
                + "&oauth_version=" + URLEncoder.encode("1.0", "UTF-8");
        System.out.println("Parameters for body are " +oAuthParameters);
        OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
        writer.write(bodyParams);
        writer.flush();
        conn.connect();

        // Get Response
        InputStream is = conn.getInputStream();
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
        String line;
        StringBuffer dataBack = new StringBuffer();
        while ((line = rd.readLine()) != null) {
            dataBack.append(line);
            dataBack.append('\r');
        }
        rd.close();
    } catch (Exception e) {
        System.err.println("And blasted!");
        e.printStackTrace();
    } finally {
        if (conn != null) {
            conn.disconnect();
        }
    }

}

}

1 个答案:

答案 0 :(得分:0)

将用户代理的请求属性的代码更改为 -

conn.setRequestProperty("用户代理",conn.getHeader("用户代理&#34));