我在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
============
现在情况
但是,最近几周,同样的getURL()方法返回过期的照片。我第一次检索照片时看到照片没问题。像往常一样,我将url保存到我的数据库中。但是,几天后,我无法检索相同的图像。示例包括:
============
可能是什么问题
从URL的构成来看,存在明显的差异。旧网址附带googleusercontent作为域名。而较新的照片以令牌结束。现在,我仍然可以检索旧照片,即使我可能在几个月前添加了它们。对于新照片,它会在几天后过期。
我知道有些解决方案需要使用photo_reference,但是,我无法找到通过我正在使用的JavaScript API检索photo_reference的方法。我尝试使用Places服务方法(新的google.maps.places.PlacesService),但它返回相同的getURL()方法,该方法检索与上面相同的临时URL。
=======================
因此我的问题是:
是否有人知道网址的更改是否有意或谷歌可能是错误?如果是这样的话,有没有办法获得一个永不过期的永久网址。
有没有人知道如何通过google javascript API检索photo_reference?
非常感谢您的帮助。
答案 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/