谷歌自定义搜索引擎返回'http'结果网址导致错误"Refused to load the script"



>编辑:当我将项目加载为chrome扩展程序时,我遇到了这个问题。我认为这可能是一个特定于铬扩展程序的问题。

当我尝试在谷歌定制的搜索引擎上搜索时,我得到一个结果页面,但它是空白的。当我检查它时,出现以下错误:

拒绝加载脚本 "http://clients1.google.com/complete/search?client=partner&hl=en&sugexp=gsno...208%3Avdsj6wr1edq&types=t&ds=cse&cp=1&gs_id=4&q=m&callback=google.sbox.p50' 因为它违反了以下内容安全策略指令: "script-src 'self' 'unsafe-eval' https://*.google.com"。

我认为这是因为脚本使用的是"http"。根据谷歌的内容安全政策,不接受"http"来源

由于中间人攻击既微不足道又无法察觉 HTTP,这些来源将不被接受。- https://developer.chrome.com/extensions/contentSecurityPolicy#relaxing

我的网页:

<html>
<head>
<script src="fact.js"></script>
</head>
<body>
<div id="gcse-search-bar">
<gcse:search defaultToImageSearch="true"></gcse:search>
</div>  
</body>
</html>

我的 js 文件。就我而言,这是所谓的事实.js

document.addEventListener('DOMContentLoaded', function() {
(function() {
var cx = '016674471602576918208:vdsj6wr1edq';
var gcse = document.createElement('script');
gcse.type = 'text/javascript';
gcse.async = true;
gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(gcse, s);
})();
});

我的清单.json:

{
"manifest_version": 2,
"name": "my extension",
"content_security_policy": "script-src 'self' 'unsafe-eval' https://*.google.com; object-src 'self'",
"description": "my extension",
"version": "1.0",
"browser_action": {
"default_icon": "my.png",
"default_popup": "my.html"
},
"permissions": [
"activeTab",
"http://*/*", 
"https://*/*", 
"https://En.wikipedia.org/*",
"http://*.google.com/"
],
"content_scripts": [{
"js": ["fact.js"],
"matches": ["http://*/*", "https://*/*"]
}]
}

我需要做什么才能让返回结果使用 HTTPS 而不是 HTTP?

我仍在研究/阅读GCSE相关文档,希望找到解决我问题的方法。但是,与此同时,我想提供一种向Google自定义搜索提交请求的替代方法。

基本思想是使用Google Custome搜索引擎和Google Custom Search API。以下是步骤/详细信息(如果您遇到我在问题中发布的相同问题,您应该已经创建了一个自定义搜索引擎并获得引擎 ID 作为cx,但我将包括如何创建一个以防万一的说明。如果已跳至步骤 5

)
  1. 通过获取帐户定义自定义搜索引擎
  2. 点击"编辑搜索引擎"下的"设置">
  3. 如果您希望让搜索引擎进行图片搜索,请打开"图片搜索">
  4. 点击"获取代码" 您应该看到您的个人引擎 IDcx如下所示

    var cx = 'MY_ENGINE_ID';

  5. 获得引擎 ID 后。 创建 Google 自定义搜索 API(您将获得 300.00 美元的信用额度和 365 天的免费试用期)

  6. 完成注册步骤。完成后,您将进入主屏幕

  7. 在 API 卡片下,单击"转到 API 概述"。
  8. 然后点击"启用API">
  9. 找到"自定义搜索API",然后启用它
  10. 现在,如果您单击"API 管理器"下的"凭据",您应该会看到一个 API 密钥
  11. 我建议您限制您的密钥
  12. 以防止未经授权的使用和配额被盗,限制您的密钥。

现在,有了自定义引擎 ID 和自定义搜索 API 密钥,您就可以使用此页面上指定的参数向 Google 提交请求GET请求

这是一个例子

var searchUrl = 'https://www.googleapis.com/customsearch/v1?' + 
'key=YOUR_API_KEY' + 
'&cx=YOUR_SEARCH_ENGINE_ID' +
'&q=searchTerm' +
'&searchType=image' +
'&num=10';
var x = new XMLHttpRequest();
x.open('GET', searchUrl);
x.responseType = 'json';
[...]

注意:如果将serachTerm传递到函数中,则最好用encodeURIComponent包装searchTerm

我从堆栈溢出上提出的另一个问题中遇到了这个想法。但我再也找不到了。如果有人这样做,请将链接作为评论发布。

最新更新