2016-12-09 110 views
1

首先,我應該提及的是,我試圖在互聯網上查找2天或更長時間的修復,因此如果您想將我鏈接到另一篇文章,我已經最有可能已經看到了。現在的問題:嘗試訪問圖片網址時出現403錯誤

當我嘗試下載圖像,與一些鏈接我的代碼工作,並與一些它會給一個錯誤,例如,這個鏈接給出了一個錯誤(連同我嘗試從CDN所有其他鏈接.discordapp.com):https://cdn.discordapp.com/attachments/235200958974394368/256888406645145602/output.jpg

在你看代碼之前,我還應該提到它使用了一個外部api,但你仍然可能會理解它的大部分,而且我的URL總是一個圖片URL。

這是我的代碼:

try { 
    url = new URL(event.getMessage().getContent().substring(12)); 
    openConnection = url.openConnection(); 
    String userCredentials = "username:password"; 
    String basicAuth = "Basic " + new String(new Base64().encode(userCredentials.getBytes())); 
    openConnection.setRequestProperty ("Authorization", basicAuth); 
    openConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0"); 
    openConnection.setRequestProperty("Request Method", "POST"); 
// openConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
    openConnection.setRequestProperty("Content-Language", "en-US"); 
    openConnection.setUseCaches(false); 
    openConnection.setDoInput(true); 
    openConnection.setDoOutput(true); 
    if(openConnection.getContentLength() > 8000000) { 
     event.getChannel().sendMessage(event.getAuthor().getAsMention()+" file size is too big.").queue(); 
     check = false; 
    } 
} catch (Exception e) { 
    event.getChannel().sendMessage("Couldn't create a connection to the link, please recheck the link.").queue(); 
    check = false; 
    e.printStackTrace(); 
} 
if(check) { 
    BufferedImage img = null; 
    try { 
     InputStream in = new BufferedInputStream(url.openStream()); 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     byte[] buf = new byte[1024]; 
     int n = 0; 
     while (-1 != (n=in.read(buf))) 
     { 
      out.write(buf, 0, n); 
     } 
     out.close(); 
     in.close(); 
     byte[] response = out.toByteArray(); 
     img = ImageIO.read(new ByteArrayInputStream(response)); 
    } catch (Exception e) { 
     event.getChannel().sendMessage(event.getAuthor().getAsMention()+" couldn't read an image from this link.").queue(); 
     e.printStackTrace(); 
    } 
    JPEGImageWriteParam jpegParams = new JPEGImageWriteParam(null); 
    jpegParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
    jpegParams.setCompressionQuality(0.1f); 
    File file = new File("output.jpg"); 
    try { 
     final ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next(); 
     writer.setOutput(new FileImageOutputStream(file)); 
     writer.write(null, new IIOImage(img, null, null), jpegParams); 
     event.getChannel().sendFile(file, null).queue(); 
     file.delete(); 
    } catch (IOException e) { 
     event.getChannel().sendMessage("Couldn't create/send the output image.").queue(); 
     e.printStackTrace(); 
    } 
} 

這是錯誤的堆棧跟蹤(你也許可以忽略此行[23:21:06] [Fatal] [JDA]: One of the EventListeners had an uncaught exception,下的任何東西):

` java.io.IOException: Server returned HTTP response code: 403 for URL: https://cdn.discordapp.com/attachments/235200958974394368/256888406645145602/output.jpg 
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source) 
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source) 
at java.net.URL.openStream(Unknown Source) 
at discordBot.Jpegify.execute(Jpegify.java:73) 
at discordBot.Christina.onMessageReceived(Christina.java:163) 
at net.dv8tion.jda.core.hooks.ListenerAdapter.onEvent(ListenerAdapter.java:316) 
at net.dv8tion.jda.core.hooks.InterfacedEventManager.handle(InterfacedEventManager.java:64) 
at net.dv8tion.jda.core.handle.MessageCreateHandler.handleDefaultMessage(MessageCreateHandler.java:129) 
at net.dv8tion.jda.core.handle.MessageCreateHandler.handleInternally(MessageCreateHandler.java:51) 
at net.dv8tion.jda.core.handle.SocketHandler.handle(SocketHandler.java:38) 
at net.dv8tion.jda.core.requests.WebSocketClient.handleEvent(WebSocketClient.java:665) 
at net.dv8tion.jda.core.requests.WebSocketClient.onTextMessage(WebSocketClient.java:339) 
at com.neovisionaries.ws.client.ListenerManager.callOnTextMessage(ListenerManager.java:352) 
at com.neovisionaries.ws.client.ReadingThread.callOnTextMessage(ReadingThread.java:262) 
at com.neovisionaries.ws.client.ReadingThread.callOnTextMessage(ReadingThread.java:240) 
at com.neovisionaries.ws.client.ReadingThread.handleTextFrame(ReadingThread.java:965) 
at com.neovisionaries.ws.client.ReadingThread.handleFrame(ReadingThread.java:748) 
at com.neovisionaries.ws.client.ReadingThread.main(ReadingThread.java:110) 
at com.neovisionaries.ws.client.ReadingThread.run(ReadingThread.java:66) 
[23:21:06] [Fatal] [JDA]: One of the EventListeners had an uncaught exception 
[23:21:06] [Fatal] [JDA]: Encountered an exception: 
[23:21:06] [Fatal] [JDA]: java.lang.IllegalArgumentException: image == null! 
at javax.imageio.IIOImage.<init>(Unknown Source) 
at discordBot.Jpegify.execute(Jpegify.java:99) 
at discordBot.Christina.onMessageReceived(Christina.java:163) 
at net.dv8tion.jda.core.hooks.ListenerAdapter.onEvent(ListenerAdapter.java:316) 
at net.dv8tion.jda.core.hooks.InterfacedEventManager.handle(InterfacedEventManager.java:64) 
at net.dv8tion.jda.core.handle.MessageCreateHandler.handleDefaultMessage(MessageCreateHandler.java:129) 
at net.dv8tion.jda.core.handle.MessageCreateHandler.handleInternally(MessageCreateHandler.java:51) 
at net.dv8tion.jda.core.handle.SocketHandler.handle(SocketHandler.java:38) 
at net.dv8tion.jda.core.requests.WebSocketClient.handleEvent(WebSocketClient.java:665) 
at net.dv8tion.jda.core.requests.WebSocketClient.onTextMessage(WebSocketClient.java:339) 
at com.neovisionaries.ws.client.ListenerManager.callOnTextMessage(ListenerManager.java:352) 
at com.neovisionaries.ws.client.ReadingThread.callOnTextMessage(ReadingThread.java:262) 
at com.neovisionaries.ws.client.ReadingThread.callOnTextMessage(ReadingThread.java:240) 
at com.neovisionaries.ws.client.ReadingThread.handleTextFrame(ReadingThread.java:965) 
at com.neovisionaries.ws.client.ReadingThread.handleFrame(ReadingThread.java:748) 
at com.neovisionaries.ws.client.ReadingThread.main(ReadingThread.java:110) 
at com.neovisionaries.ws.client.ReadingThread.run(ReadingThread.java:66)` 

當然任何幫助非常感謝,對不起,很長的帖子,這個問題只是真的讓我的神經...

回答

1

我想通了。你需要做一些事情。首先,您需要在URLConnection上設置用戶代理。然後你需要在URLConnection上打開連接。最後,在您之前從URL獲取流的地方,實際上您需要從URLConnection獲取getInputStream,因爲這是您設置用戶代理的地方。

這是我的代碼,它的工作原理。複製並粘貼到名爲Test.java的新文件中,然後嘗試運行它。注意我註釋掉了文件刪除,所以你實際上可以看到文件下載

現在使用它與你的活動和頻道一起取決於你,祝你好運。

import java.awt.image.BufferedImage; 
import java.io.BufferedInputStream; 
import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLConnection; 

import javax.imageio.IIOImage; 
import javax.imageio.ImageIO; 
import javax.imageio.ImageWriteParam; 
import javax.imageio.ImageWriter; 
import javax.imageio.plugins.jpeg.JPEGImageWriteParam; 
import javax.imageio.stream.FileImageOutputStream; 

public class Test { 
    public static void main(String[] args) throws MalformedURLException, IOException { 
     URL url = new URL("http://cdn.discordapp.com/attachments/235200958974394368/256888406645145602/output.jpg"); 
     URLConnection openConnection = url.openConnection(); 
     boolean check = true; 

     try { 

      openConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11"); 
      openConnection.connect(); 

      if (openConnection.getContentLength() > 8000000) { 
       System.out.println(" file size is too big."); 
       check = false; 
      } 
     } catch (Exception e) { 
      System.out.println("Couldn't create a connection to the link, please recheck the link."); 
      check = false; 
      e.printStackTrace(); 
     } 
     if (check) { 
      BufferedImage img = null; 
      try { 
       InputStream in = new BufferedInputStream(openConnection.getInputStream()); 
       ByteArrayOutputStream out = new ByteArrayOutputStream(); 
       byte[] buf = new byte[1024]; 
       int n = 0; 
       while (-1 != (n = in.read(buf))) { 
        out.write(buf, 0, n); 
       } 
       out.close(); 
       in.close(); 
       byte[] response = out.toByteArray(); 
       img = ImageIO.read(new ByteArrayInputStream(response)); 
      } catch (Exception e) { 
       System.out.println(" couldn't read an image from this link."); 
       e.printStackTrace(); 
      } 
      JPEGImageWriteParam jpegParams = new JPEGImageWriteParam(null); 
      jpegParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
      jpegParams.setCompressionQuality(0.1f); 
      File file = new File("output.jpg"); 
      try { 
       final ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next(); 
       writer.setOutput(new FileImageOutputStream(file)); 
       writer.write(null, new IIOImage(img, null, null), jpegParams); 
       // event.getChannel().sendFile(file, null).queue(); 
       // file.delete(); 
      } catch (IOException e) { 
       System.out.println("Couldn't create/send the output image."); 
       e.printStackTrace(); 
      } 
     } 
    } 

} 
+0

我嘗試了很多不同的「用戶代理」選項,包括你的現在,他們都沒有工作:\ – user619361

+0

現在看看並嘗試一下。我編輯它,它適用於我 –

+0

@Sid好了,現在很有道理.. 似乎Web服務器實際上檢查'用戶代理'屬性,並拒絕與403如果它丟失。 –

0

我很困惑,你是否想下來負載或負荷的圖像。 你的描述和你的SO標籤談論下載。 但是您的代碼,特別是setRequestProperty("Request Method", "POST")setDoOutput(true)正在準備上傳。

相關問題