0

我有一个在 Manifest v2 下运行的 Google Chrome 扩展程序。以前,我能够与http://www.geoplugin.net/javascript.gp交谈并获得用户国家代码(例如美国、英国)。但是,Manifest v2 施加了一些限制,不允许与非 https 的、列入白名单的网站交谈。这意味着我不能再去服务器获取我的信息了。

我想继续拥有这个功能。我相信我最好的选择是利用 HTML5 地理位置将坐标转换为国家代码。我还没有看到这个的任何实现这有可能在合理范围内实现吗?我在网上找到的所有解决方案都建议与服务器通信,但我没有遇到过 https 解决方案。

我还尝试与“https://maps.googleapis.com/maps/api/geocode/”通信,但是,即使将它添加到 content_security_policy,我也无法查询 JSON。

只是好奇是否有人有我没有看到的解决方案/已经解决了这个问题

我在 jQuery 中使用了 RobW 的答案:

$.get('http://www.geoplugin.net/json.gp', function(result){
    var geoplugin = JSON.parse(result.replace(/^[^\{]+/, '').replace(/\);?$/, ''));
    console.log(geoplugin.geoplugin_countryCode);
});
4

1 回答 1

1

在 Chrome 扩展程序中,当 URL 在清单文件中列入白名单时,您可以执行跨域请求"permissions"

http://www.geoplugin.net/json.gp的输出(注意:json而不是javascript):

geoPlugin({
  "geoplugin_request":"x.x.x.x",
  "geoplugin_status":200,
  "geoplugin_city":"...",
  ...
})

这个输出格式不是 JSON,而是 JSONP。函数调用不相关。所以在解析之前去掉填充(geoPlugin(和):)

var xhr = new XMLHttpRequest();
xhr.onload = function() {
    var json = xhr.responseText.replace(/^[^\{]+/, '').replace(/\);?$/, '');
    json = JSON.parse(json);
    // Example, alert latitude and longitude
    alert(json.geoplugin_latitude + ', ' + json.geoplugin_longitude);
};
xhr.open('GET', 'http://www.geoplugin.net/json.gp');
xhr.send();

清单文件:

  ...
  "permissions": ["http://www.geoplugin.net/json.gp"],
  ...
于 2012-09-13T11:14:29.157 回答