谷歌自定义搜索引擎返回'http'结果网址导致错误“拒绝加载脚本”

时间:2017-06-14 01:39:00

标签: google-chrome google-chrome-extension google-custom-search manifest.json

编辑: 我在将项目加载为chrome扩展程序时遇到此问题。我认为这可能是特定于Chrome扩展程序的问题。

当我尝试在Google自定义搜索引擎上搜索时,我会得到一个结果页面,但它是空白的。当我检查它时,我收到以下错误:

  

拒绝加载脚本   'http://clients1.google.com/complete/search?client=partner&hl=en&sugexp=gsno ... 208%3Avdsj6wr1edq&安培;类型= T&安培; DS = CSE&安培; CP = 1&安培; gs_id = 4和Q = M&安培;回调= google.sbox.p50'   因为它违反了以下内容安全策略指令:   “script-src'self''unsafe-eval'https://*.google.com”。

我认为这是因为脚本使用'http'。根据Google的内容安全政策,不接受“http”来源

  

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

我的HTML:

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

我的js文件。就我而言,它是call fact.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);
  })();
});

我的manifest.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,我需要做什么?

1 个答案:

答案 0 :(得分:0)

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

基本理念是将Google Custome搜索引擎与Google Custom Search API结合使用。以下是步骤/细节(如果您在我的问题中遇到了同样的问题,您应该已经创建了一个自定义搜索引擎并获得了cx的引擎ID,但我将包含如何创建一个的方向如果您已经这样做,请跳至步骤5)

  1. getting an account
  2. 定义自定义搜索引擎
  3. 点击&#34;设置&#34;在&#34;编辑搜索引擎&#34;
  4. 开启&#34;图片搜索&#34;如果你想让你的搜索引擎进行图像搜索
  5. 点击&#34;获取代码&#34;您应该看到这样的个人引擎ID cx

    var cx =&#39; MY_ENGINE_ID&#39;;

  6. 获取引擎ID后。 Create Google Custom Search API(您获得300.00美元的学分和365天的免费试用)

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

  8. 在API卡下单击&#34;转到API概述&#34;。
  9. 然后点击&#34;启用API&#34;
  10. 查找&#34;自定义搜索API&#34;然后启用它
  11. 现在,如果您点击&#34;凭据&#34;在&#34; API管理器下,您应该看到API密钥
  12. 我建议您限制密钥以防止未经授权的使用和配额被盗,限制您的密钥。
  13. 现在,您可以使用自定义引擎ID和自定义搜索API密钥,使用此page

    中指定的参数向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';
      [...]
    

    注意:如果将searchTerm传递给函数,最好将encodeURIComponentserachTerm一起打包。

    我从stackoverflow上提出的另一个问题中发现了这个想法。但我无法再找到它。如果有人请将该链接发布为评论。