Java URL - 谷歌翻译请求返回403错误?

时间:2011-08-31 00:59:25

标签: java http http-status-code-403

我正在创建一个Java控制台应用程序,需要向Google Translate发送HTTP请求才能从上述网站获取翻译。

我的问题是,当我尝试使用openStream()从有效网址读取时收到403错误。

例如,使用Translator t = new Translator();创建此翻译器类的实例并调用t.translate("en", "ja", "cheese");,应返回程序在页面http://translate.google.com/#en|ja|cheese上找到的翻译,但它似乎会捕获IOException并返回:

http://translate.google.com/#en|ja|cheese Server returned HTTP response code: 403 for URL: http://translate.google.com/#en|ja|cheese

创建有效Google翻译网址的任何其他参数都会出现类似的错误。

403 error显然意味着我被拒绝了。这就是我想知道的。为什么我不能访问此页面,以及我必须做什么才能访问它?

我在网络浏览器中访问了该网站,并手动输入了我的程序尝试访问的地址,但它有效;我不确定为什么我的程序因此无法访问该页面?将地址键入或复制/粘贴到我的FireFox导航栏中可以正常工作;看,如果this是正确的,那么该网站可能希望我通过另一个页面上的链接访问该页面?如果那是我必须做的事情,我该怎么办

这是代码,因为我认为它可能会有所帮助..当我尝试从translationURL.openStream()返回的InputStream中的InputStreamReader创建BufferedReader时,似乎抛出异常:

import java.io.*;
import java.net.*;

public class Translator {

    private final String googleTranslate = "http://translate.google.com/#";

    public String translate( String from, String to, String item ) {

        String translation = googleTranslate + from + '|' + to + '|' + item;
        URL translationURL;

        try { translationURL = new URL(translation); }
        catch(MalformedURLException e) { return e.getMessage(); }

        BufferedReader httpin;
        String fullPage = "";
        System.out.println(translation);
        try {
            httpin = new BufferedReader(
                    new InputStreamReader(translationURL.openStream()));
            String line;
            while((line=httpin.readLine()) != null) { fullPage += line + '\n'; }
            httpin.close();
        } catch(IOException e) { return e.getMessage(); }

        int begin = fullPage.indexOf("<span class=\"\">");
        int end = fullPage.indexOf("</span>");

        return fullPage.substring(begin + 15, end);

    }

    public Translator() {}
}

我在Ubuntu Linux 11.04上的Eclipse(GALILEO)中测试此代码,该代码与Wubi一起安装,具有可靠且可靠的无线Internet连接。我也试过在命令行中运行它,但行为是一样的。 java -version让我这样:

java version "1.6.0_22" OpenJDK Runtime Environment (IcedTea6 1.10.2) (6b22-1.10.2-0ubuntu1~11.04.1) OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode)

3 个答案:

答案 0 :(得分:3)

他们正在查看用户代理字符串,并且可能他们不希望人们以编程方式执行此操作。

我确实让您的代码正常工作,但由于Google收取API访问费用,并且他们主动阻止不是浏览器的内容(基于用户代理字符串),我不会告诉您我是如何做到的。

谷歌搜索在Java中设置用户代理字符串将获得你想要的东西(事实上我在Stackoverflow上找到了答案)。

答案 1 :(得分:2)

通过告诉我浏览器不是正在运行的代码来欺骗“translate.google”。

URLConnection conn = url.openConnection();
// fake request coming from browser
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB;     rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 (.NET CLR 3.5.30729)");

答案 2 :(得分:0)

将引用添加到请求

    URL translateURL = new URL(url);
    HttpURLConnection connection = (HttpURLConnection) translateURL
            .openConnection();

    connection.setDoOutput(true);
    connection.setRequestProperty("X-HTTP-Method-Override", "GET");
    connection.setRequestProperty("referer", "accounterlive.com");