无法从JAVA访问URL(ERROR 403) [英] Cannot access URL from JAVA (ERROR 403)
本文介绍了无法从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屋!
查看全文