Google Javascript API Photo getURL返回临时网址,无法找到photo_reference

时间:2018-06-11 08:33:43

标签: javascript angular google-maps-api-3

我在Angular 5中使用Google自动填充功能(在Maps Javascript API下)。

出于我的网站的目的,我检索一个地方的详细信息,其中包括任何可用的照片。对于照片,我将通过getURL()方法获取照片网址。

============

之前的作品

以前,我可以将数据库保存在数据库中,并使用相同的网址在以后检索照片。 URL的示例包括:

https://lh3.googleusercontent.com/p/AF1QipM3QnVu-6W-ZtoTry29MOzDt7vpWzPZAPZbBfqZ=w600-h500-k

https://lh3.googleusercontent.com/p/AF1QipPQ5imb4nzfK1TxG7KAFx2vEx1SoYXeQApA6SVX=w600-h500-k

https://lh4.googleusercontent.com/-l_W16EbIqzk/WS5E5R9_VbI/AAAAAAAAnD8/ajWr1IeY7solMudnxIV21vjqmxLt8CJOACLIB/w300-h250-k

============

现在情况

但是,最近几周,同样的getURL()方法返回过期的照片。我第一次检索照片时看到照片没问题。像往常一样,我将url保存到我的数据库中。但是,几天后,我无法检索相同的图像。示例包括:

https://maps.googleapis.com/maps/api/place/js/PhotoService.GetPhoto?1sCmRaAAAAiEX-USwjAvitgPnxuaW7stCrTkQMxyydpcmlg5IrEWnSUS5D3Z2D9evQ_n41Ght-8dr3cZtjvx4oINIEpqj4Z4fvaCyqv6xF0oPC_lw88P6FUQ7SXP2vElr61Zi568IdEhBWY_7xGFNHvdQyDqxZApR3GhS-IM17Pp8oMGlMK0FrXW310tsPCw&3u2000&4u1000&5m1&2e1&key=AIzaSyAbdivx4G0igYO5yr3vTUJcQF5s8lTdXho&callback=none&token=96678

https://maps.googleapis.com/maps/api/place/js/PhotoService.GetPhoto?1sCmRaAAAAkz5xG6DVQSbwHyBIQIshs2FedNARq6oG0Ea6gUxvljPdnHFJqcJniD0gkd2BZQ7-IPc6FPVlYYb7G0t8K_-8hVYizZl4HGy5V1QiE4sjdWLhyWX7MnJYEA61zoup_fbpEhDWYpcVACyQ6RKsqpyS-bQKGhQw8Tg2O8rcGJfaKI0jW3T7XKAYZg&3u2000&4u1000&5m1&2e1&key=AIzaSyAbdivx4G0igYO5yr3vTUJcQF5s8lTdXho&callback=none&token=20957

https://maps.googleapis.com/maps/api/place/js/PhotoService.GetPhoto?1sCmRaAAAAfLQZlWahAqUSlQA5y7-NTeYLMDim6M1L_ht3_qNCSL4dBeX2VWVdhzuJXeqGcKN30XAv3WZHtY2QUXaoKV5fVGSUld2IdOKfV0bv32kEFUdgMlqou9Ij5YVaJ15mfoVcEhB-6hiiaiPS3349mCZMYOPyGhTrEZUg0XGOuBW1rsrLlpmaO9nvqg&3u2000&4u1000&5m1&2e1&key=AIzaSyAbdivx4G0igYO5yr3vTUJcQF5s8lTdXho&callback=none&token=38662

============

可能是什么问题

从URL的构成来看,存在明显的差异。旧网址附带googleusercontent作为域名。而较新的照片以令牌结束。现在,我仍然可以检索旧照片,即使我可能在几个月前添加了它们。对于新照片,它会在几天后过期。

我知道有些解决方案需要使用photo_reference,但是,我无法找到通过我正在使用的JavaScript API检索photo_reference的方法。我尝试使用Places服务方法(新的google.maps.places.PlacesService),但它返回相同的getURL()方法,该方法检索与上面相同的临时URL。

=======================

因此我的问题是

  1. 是否有人知道网址的更改是否有意或谷歌可能是错误?如果是这样的话,有没有办法获得一个永不过期的永久网址。

  2. 有没有人知道如何通过google javascript API检索photo_reference?

  3. 非常感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

Google说这是故意行为,用户唯一要“缓存”的是“ place_id”。

请参阅:https://issuetracker.google.com/issues/110711934

不幸的是,我认为要检索照片参考,将需要使用位置ID提出一个单独的“位置详细信息”请求。

答案 1 :(得分:0)

我通过编写服务器端函数来递归地遵循重定向路径并获得最终照片URL,从而解决了这一问题。长生不老药中的示例:

def follow(url) when is_binary(url) do
  case HTTPoison.get(url) do
    {:ok, %HTTPoison.Response{status_code: status_code, headers: headers}} when status_code > 300 and status_code < 400 ->
      case get_location_header(headers) do
        [url] when is_binary(url) ->
          follow(url)
        _ ->
          {:error, :no_location_header}
      end

    {:ok, %HTTPoison.Response{status_code: 200}} ->
      {:ok, url}

    reason ->
      {:error, reason}
  end
end

defp get_location_header(headers) do
  for {key, value} <- headers, String.downcase(key) == "location" do
    value
  end
end

所以我现在可以花很长时间 https://maps.googleapis.com/maps/api/place/js/PhotoService.GetPhoto?1sCm...网址,然后通过follow()运行该网址,该网址将返回图片本身的googleusercontent网址。

然后我将该URL传递到文件堆栈,以通过CDN复制和存储并提供服务...

有点疯狂的解决方法,但最终为我们解决了这个问题。

答案 2 :(得分:0)

这是一段代码,您可以在其中传递从 Google 地点服务 API 获取照片中获取的临时网址,并返回一个永久网址,您将其存储在数据库中以备后用。

<?php
function get_redirect_url($url){
    $redirect_url = null; 
 
    $url_parts = @parse_url($url);
    if (!$url_parts) return false;
    if (!isset($url_parts['host'])) return false; //can't process relative URLs
    if (!isset($url_parts['path'])) $url_parts['path'] = '/';
 
    $sock = fsockopen($url_parts['host'], (isset($url_parts['port']) ? (int)$url_parts['port'] : 80), $errno, $errstr, 30);
    if (!$sock) return false;
 
    $request = "HEAD " . $url_parts['path'] . (isset($url_parts['query']) ? '?'.$url_parts['query'] : '') . " HTTP/1.1\r\n"; 
    $request .= 'Host: ' . $url_parts['host'] . "\r\n"; 
    $request .= "Connection: Close\r\n\r\n"; 
    fwrite($sock, $request);
    $response = '';
    while(!feof($sock)) $response .= fread($sock, 8192);
    fclose($sock);
 
    if (preg_match('/^Location: (.+?)$/m', $response, $matches)){
        if ( substr($matches[1], 0, 1) == "/" )
            return $url_parts['scheme'] . "://" . $url_parts['host'] . trim($matches[1]);
        else
            return trim($matches[1]);
 
    } else {
        return false;
    }
 
}
 
function get_all_redirects($url){
    $redirects = array();
    while ($newurl = get_redirect_url($url)){
        if (in_array($newurl, $redirects)){
            break;
        }
        $redirects[] = $newurl;
        $url = $newurl;
    }
    return $redirects;
}
 
function get_final_url($url){
    $redirects = get_all_redirects($url);
    if (count($redirects)>0){
        return array_pop($redirects);
    } else {
        return $url;
    }
}

 echo get_final_url($temporary_google_url);
?>

来源:http://w-shadow.com/blog/2008/07/05/how-to-get-redirect-url-in-php/