2016-12-09 113 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)正在准备上传。

相关问题