无法从JAVA访问URL(ERROR 403) [英] Cannot access URL from JAVA (ERROR 403)

查看:62
本文介绍了无法从JAVA访问URL(ERROR 403)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用以下代码从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;
< span class =code-keyword> static final String TwitterClientID = xxxx;
static final String TwitterClientSecret = xxxxx;
static final 字符串 TwitterRedirectUri = https://twitter.com;

public static void main( String args []){
try {
< span class =code-keyword> new auth_4()。processTwitter();
} catch (Exception ex){
ex.printStackTrace();
}
}

public void processTwitter( ) throws 异常{
int millis =( int )System.currentTimeMillis()* - 1 ;
// int time =(int)millis / 1000;
int time =( int )((System.currentTimeMillis())/ 1000);
// 首先,我们对请求中使用的所有参数进行排序,并制定签名基本字符串。
字符串 signatureBaseString = GET& +
URLEncoder.encode(TwitterUri, UTF-8)+
& + oauth_callback%3D + URLEncoder.encode(TwitterRedirectUri, UTF-8)+
%26oauth_consumer_key%3D + URLEncoder.encode(TwitterClientID, UTF-8)+
< span class =code-string> %26oauth_nonce%3D + URLEncoder.encode( String .valueOf(millis), UTF-8)+
%26oauth_signature_method% 3D + URLEncoder.encode( HMAC-SHA1 UTF-8)+
< span class =code-string>%26oauth_timestamp%3D + URLEncoder.encode( String .valueOf(time), UTF-8)+
%26oauth_version%3D + URLEncoder.encode( 1.0 UTF-8);

System.out.println( 签名库: + signatureBaseString) ;

// 我们的签名密钥是(注意最后悬挂的&符号):
字符串 signingKey = TwitterClientSecret + &安培;;
String signature = null;
尝试 {
Mac mac = Mac.getInstance( HMACSHA1\" );
SecretKeySpec secret = new SecretKeySpec(signingKey.getBytes(),
< span class =code-string> HmacSHA1
);
mac.init(secret);
byte [] digest = mac.doFinal(signatureBaseString.getBytes());
// 然后我们使用复合签名密钥从签名基本字符串创建oauth_signature
signature = Base64.encodeBase64String(digest);
System.out.println( 生成的oauth_signature为: + signature);
} catch (Exception ex1){
ex1.printStackTrace();
System.exit( 0 );
}

// 现在我们只生成一个名为Authorization的HTTP标头使用请求的相关OAuth参数:
字符串 oAuthParameters = < span class =code-string> 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参数为 + oAuthParameters);

// 当Twitter.com收到我们的请求时,它将以oauth_token,oauth_token_secret回复
// 让我感到幸运!
网址url = 网址( https: //ton.twitter.com ..... / image.png);
HttpsURLConnection conn = null;
尝试 {
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);
// 在标题中设置oAuth参数
conn.setRequestProperty( 授权,oAuthParameters);
// 我应该在正文中设置一些内容吗?
String bodyParams =
oauth_callback = + URLEncoder .encode(TwitterRedirectUri, UTF-8
+ & oauth_consumer_key = + URLEncoder.encode(TwitterClientID, UTF-8
+ & ; oauth_nonce = + URLEncoder.encode( String .valueOf(millis), < span class =code-string> UTF-8

+ & oauth_signature = + URLEncoder.encode(签名, 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( body的参数是 + oAuthParameters);
OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), UTF-8);
writer.write(bodyParams);
writer.flush();
conn.connect();

// 获取响应
InputStream is = conn.getInputStream ();
BufferedReader rd = new BufferedReader( new InputStreamReader(is));
String 行;
StringBuffer dataBack = new StringBuffer();
while ((line = rd.readLine())!= null){
dataBack.append(line);
dataBack.append(' \ r');
}
rd.close();
} catch (例外e){
System.err.println( 并且爆炸!);
e.printStackTrace();
} 最后 {
如果(conn!= null){
conn.disconnect();
}
}

}

解决方案

参见 https://www.google.com/search?q=ERROR+403 [ ^ ]。它告诉您禁止下载引用的项目。


添加以下代码 -



conn.setRequestProperty( 用户代理,conn.getHeader( 用户代理));

I am trying to download an image from Twitter (https://ton.twitter.....) using the following code. I am getting ERROR 403 for the mentioned URL. But when i paste the link in browser(Mozilla/Chrome), i can view the image. What can be the issue. This is the code i have used.

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();
        }
    }

}

解决方案

See https://www.google.com/search?q=ERROR+403[^]. It is telling you that you are prohibited from downloading the referenced item.


add the following code-

conn.setRequestProperty("user-agent",conn.getHeader("user-agent"));


这篇关于无法从JAVA访问URL(ERROR 403)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆