检测Google Maps API配额限制

13
有没有办法通过Javascript或HTTP请求来测试Google Maps Javascript API V3的配额是否已达到?获取用户显示的错误消息即可满足要求。我们启用了计费,并为Google Maps Javascript API v3设置了约10万个配额,但有时我们会超过它,有时甚至没有意识到。现在我们想使用像nagios这样的工具(可能使用phantomjs)监视我们的API访问,以获得即时警告。但我找不到任何关于如何测试是否超出配额的信息。

更新2

发现了一个类似的请求:如何检测在Google Maps中已达到每日25000次请求限制?
但只有对API控制台的引用。如果有人成功回退到使用Javascript静态地图,则我可以修改该脚本以适应我的情况。

更新

以下是Google Maps本地化配额错误消息的示例,它会显示给用户而不是地图。如果发生这种情况,我希望能够删除地图容器:

本地化配额消息示例


2
我们公司防止配额阈值的一种方法是只有用户点击一个模糊的地图图片上的“查看地图”按钮后才能查看地图 - 然后我们将图片从DOM中删除并在其位置初始化地图。 - lfender6445
一个模糊的地图是个好主意,肯定会对我们有所帮助。但这可能会给用户带来不便。我们尝试过使用静态地图,并在点击时加载地图。但静态地图有类似的配额限制,由于许可证问题,我们无法将图像存储在本地。而且总有可能出现突发事件,在清晨就消耗完我们的配额。 - Trendfischer
3个回答

5
我假设您想查看是否已超过 Google Maps API Web Services 请求限制。以下是官方文档的说明:
引用: 使用限额超出 如果您超出了使用限额,将会收到一个 OVER_QUERY_LIMIT 状态代码作为响应。 这意味着网站服务将停止提供正常响应,并切换到仅返回状态代码 OVER_QUERY_LIMIT,直到再次允许更多的使用量。这可能发生在以下情况下: • 如果错误是由于您的应用程序每秒发送了太多请求而收到的,则在几秒钟内即可发生。 • 如果错误是由于您的应用程序每天发送了太多请求而收到的,则在接下来的 24 小时内的任何时间都可能发生。服务的每日配额重置的时间因客户和每个 API 而异,并且随时间而变化。
收到带有状态代码 OVER_QUERY_LIMIT 的响应后,您的应用程序应确定已超过哪个使用限制。这可以通过暂停 2 秒并重新发送相同的请求来完成。如果状态代码仍为 OVER_QUERY_LIMIT,则表明您的应用程序每天发送太多请求。否则,您的应用程序每秒发送太多请求。
下面是一段示例代码:
url = "MAPS_API_WEBSERVICE_URL"
attempts = 0
success = False

while success != True and attempts < 3:
  raw_result = urllib.urlopen(url).read()
  attempts += 1
  # The GetStatus function parses the answer and returns the status code
  # This function is out of the scope of this example (you can use a SDK).
  status = GetStatus(raw_result)
  if status == "OVER_QUERY_LIMIT":
    time.sleep(2)
    # retry
    continue
  success = True

if attempts == 3:
  # send an alert as this means that the daily limit has been reached
  print "Daily limit has been reached"

引用自Google Maps文档:https://developers.google.com/maps/documentation/business/articles/usage_limits#limitexceeded

简而言之:发送请求,如果收到"OVER_QUERY_LIMIT"响应,请在两秒钟后再尝试。如果响应仍然相同,则表示已达到每日限制。


4
谢谢您的好回答,但它不是我要找的。Webservice-API与Google Maps API不同。例如,地理编码有自己的配额。如果我达到了它,我的地图仍会显示得非常好。 - Trendfischer

1

我想到了一种解决方案,基于观察到谷歌错误信息包含一个带有dismissButton类属性的元素。使用jQuery,可以这样实现:

var quota_exceeded = false;
$(document).ready( function() {
    setTimeout(check_quota, 1000);
    setTimeout(check_quota, 3000);
    setTimeout(check_quota, 10000);
});
function check_quota() {
    if (quota_exceeded) return;
    if (typeof($("button.dismissButton")[0]) === "undefined") return;
    quota_exceeded = true;
    // you can even hijack the box and add to Google's message
    $("button.dismissButton").parents("td").html(
        "We have exceeded our quota!!!!!<p>" +
        "<img src='https://c1.staticflickr.com/8/7163/6852688771_c90c9887c3.jpg'>" +
        "<p><button class='dismissButton'>OK</button>");
    $("button.dismissButton").click( function() {
        $("button.dismissButton").parentsUntil("div").parent().hide();
    });
}

对我来说看起来很不错,正是我在问题中寻找的东西。但是我无法再进行测试了,因为我们现在使用的是OSM而不是gmaps。如果另一个用户验证代码有效,我很乐意将其标记为被接受的答案。 - Trendfischer

0

对于Google Javascript Map,我使用以下代码:

var googleMapTryCount = 0;
var googleMapCheckInterval = setInterval(function () {
    googleMapTryCount++;
    if($(".dismissButton:visible").length == 1){
        gm_authFailure();
        clearInterval(googleMapCheckInterval);
    }

    if(googleMapTryCount >= 10) { 
        clearInterval(googleMapCheckInterval); 
    }
}, 1000);

function gm_authFailure(){
    console.log("gm_authFailure");
    //do something
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接