在 API 请求中隐藏引荐来源网址标头



我需要向Google Translate Text-to-Speech API发出请求。我有一个已启用的密钥,但一直被无访问控制允许来源阻止。

我在这里发布了更多关于它的信息:

谷歌翻译API - 没有文本到语音的访问控制源

以下消息来源,http://weston.ruter.net/2009/12/12/google-tts/和请求谷歌文本到语音 API 说

如果 HTTP 请求包含引用,Google 会返回 404 错误 空字符串以外的标头。

给定如下请求:

    $.get('https://translate.google.com/translate_tts?key='+myKey+'&ie=utf-8&tl=en&q=Hello+world',
        function (returned_data) {

如何隐藏或删除引荐来源网址标头,以免被阻止?

这个消息来源说要把https://href.li/...放在前面。所以我把它改成:

$.get('https://href.li/?https://translate.google.com/translate_tts?key='+key+'&ie=utf-8&tl=zh-CN&q=你好',

并且仍然被阻止。


服务器端尝试:无响应。

此博客提供了一个服务器端脚本,该脚本将引用器设置为空字符串。他说:

这会从该接入点获取信息并立即将其吐出。但在它使用 file_get_contents 请求数据之前,Referer 标头设置为空字符串。

/

php/testPHP.php:

$qs = http_build_query(array("ie" => "utf-8","tl" => $_GET["tl"], "q" => $_GET["q"]));
$ctx = stream_context_create(array("http"=>array("method"=>"GET","header"=>"Referer: rn")));
$soundfile = file_get_contents("http://translate.google.com/translate_tts?".$qs, false, $ctx);
header("Content-type: audio/mpeg");
header("Content-Transfer-Encoding: binary");
header('Pragma: no-cache');
header('Expires: 0');
echo($soundfile);

索引.php(根):

<audio controls="controls" autoplay="autoplay" style="display:none;">
            <source src="/php/testPHP.php?translate_tts?tl=en&q=the%20brown%20fox%20jumped%20over%20the%20lazy%20dog." type="audio/mpeg" />
</audio>

tail -f apache 错误日志:

PHP 注意:未定义的索引:tl 在/Users/myname/Sites/app/melonJS-dev/testPHP.php 第 4 行,引用者:http://melon.localhost/

PHP 警告:file_get_contents(https://translate.google.com/translate_tts?ie=utf-8&q=the+brown+fox+jumped+over+the+lazy+dog):无法打开流:HTTP 请求失败!HTTP/1.0 404 未找到\r in/Users/myname/Sites/app/melonJS-dev/testPHP.php 第 6 行,引用:http://melon.localhost

tail -f 访问日志:显示传入的 tl 参数为 200:

获取 /testPHP.php?translate_tts?tl=en&q=the%20brown%20fox%20jumped%20over%20the%20lazy%20dog HTTP/1.1" 200 -


JSONP 尝试:所以我认为也许将返回对象包装在<script>中可以解决问题。我没有得到回应。

    $.ajax({
        url: 'https://translate.google.com/translate_tts?key='+key+'&ie=utf-8&tl=zh-CN&q=你好',
            type: 'GET',
            dataType: 'jsonp',
            error: function(xhr, status, error) {
            alert("error");
        },
        success: function(json) {
            alert("success");
        }
        });

HTML/JS 文本转语音尝试:404 块

.js:

    <script>
        $(function() {
            $('a.say').on('click', function(e) {
                e.preventDefault();
                var text = $('input[name="text"]').val();
                text = encodeURIComponent(text);
                console.log(text);
                //var url = 'https://translate.google.com/translate_tts?&ie=utf-8&tl=zh-CN&q=' + text;
                var url = 'https://translate.google.com/translate_tts?ie=UTF-8&q=' + text + '&tl=en';
                $('audio').attr('src', url).get(0).play();
            });
        });
    </script>

.html:

    <input type="text" name="text">
    <a href="#" class="say">Say it</a>
    <audio src="" class="speech" hidden></audio>

遵循本教程:https://www.youtube.com/watch?v=DOtkNxmg9QY

为什么你的 PHP 脚本失败:

如果你看看来自PHP的错误响应:

PHP Warning: file_get_contents(https://translate.google.com/translate_tts?ie=utf-8&q=the+brown+fox+jumped+over+the+lazy+dog)

您会注意到file_get_contents请求的 url 不包含 tl 参数。这会导致返回 404。您可以直接在浏览器中访问该页面:

https://translate.google.com/translate_tts?ie=utf-8&q=the+brown+fox+jumped+over+the+lazy+dog

以上返回 404 响应:(

https://translate.google.com/translate_tts?ie=utf-8&q=the+brown+fox+jumped+over+the+lazy+dog&tl=en

但是在我们添加一个漂亮的新闪亮tl=en参数后,它可以:)工作。

正如你在这个小提琴中看到的 - http://jsfiddle.net/patridge/h4Lvp/,您可以通过调用 setRequestHeader 来覆盖标头值。

但是,某些标头被阻止以被浏览器覆盖。

/*global jQuery*/
(function ($) {
    $.ajaxSetup({
        "beforeSend": function(xhr) {
            // Works fine.
            xhr.setRequestHeader("X-Requested-With", {
                toString: function() {
                    return "";
                }
            });
            // Logs error on Chrome (probably others) as "Refused to set unsafe header "Referer".
            xhr.setRequestHeader("Referer", {
                toString: function() {
                    return "";
                }
            });
        }
    });
}(jQuery));
jQuery(function () {
    $.ajax({
        url: "http://fiddle.jshell.net/",
        dataType: "html"
    }).done(function (data) {
        $("<div>").text("ajax success").appendTo("body");
    });
});

相关内容

  • 没有找到相关文章

最新更新