【问题标题】:403 Error When Trying To Access an Image URL尝试访问图像 URL 时出现 403 错误
【发布时间】:2017-04-25 11:10:39
【问题描述】:

首先,我应该提一下,我试图在互联网上找到一个修复 2 天或更长时间,所以如果你想将我链接到另一个帖子,我很可能已经看到它。现在解决问题:

当我尝试下载图像时,我的代码在某些链接中有效,而在某些链接中会出现错误,例如,此链接会出现错误(以及我从 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)`

当然,任何帮助都非常感谢,对于长篇文章感到抱歉,这个问题真的让我很紧张......

【问题讨论】:

    标签: java image url download


    【解决方案1】:

    我想通了。你需要做几件事。首先,您需要在 URLConnection 上设置用户代理。然后你需要在 URLConnection 上打开连接。最后,在您之前从 URL 获取流的地方,您实际上需要从 URLConnection 获取输入流,因为这是您设置用户代理的地方。

    这是我拥有的代码,它可以工作。将其复制并粘贴到名为 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();
                }
            }
        }
    
    }
    

    【讨论】:

    • 我现在尝试了很多不同的“用户代理”选项,包括你的,但都没有工作:\
    • 现在看看,试试看。我编辑了它,它对我有用
    • @Sid 好的,现在这很有意义.. 似乎 Web 服务器实际上检查了 User-Agent 属性,如果它丢失,则以 403 拒绝。
    • @SidSavara 它有效,非常感谢,我正要放弃这个东西。
    • @user619361 很高兴听到。您能否为我投票和/或标记为答案?
    猜你喜欢
    • 2016-04-19
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 2014-07-18
    • 2014-09-22
    • 1970-01-01
    • 2014-02-19
    • 2021-10-12
    相关资源
    最近更新 更多