Подтвердить что ты не робот

Как получить более 20 результатов, т.е. 60 с помощью API google place с PHP?

Я разрабатываю приложение API google places, где моя цель - получить все доступные сведения о конкретном запросе. Но поскольку я знаю, что API google API возвращает только 20 результатов за раз. Но мне нужны все доступные детали места.

Если я ищу с ключевым словом поиска несколько раз, он всегда дает те же результаты. Поэтому я хочу знать, что есть способ получить разные результаты при каждом поиске с одним и тем же ключевым словом.

 <?php 
        $placeSearchURL = 'https://maps.googleapis.com/maps/api/place/textsearch/json?query=' . $query . '&sensor=true' . '&key=' . API_KEY;

        $placeSearchJSON = file_get_contents($placeSearchURL);
        $dataArray = json_decode($placeSearchJSON);
        $references = array();
        $detailsOfPlaces = array();

        if (isset($dataArray->status)) {
            switch ($dataArray->status) {
                case 'OK' :
                    foreach( $dataArray->results as $details) {
                        $references[] = $details->reference;
                    }
                    break;
                default:
                    echo "Something wrong";
            }
        }

        foreach ($references as $reference) {
            $placeDetailsURL = 'https://maps.googleapis.com/maps/api/place/details/json?reference=' . $reference . '&sensor=true&key=' . API_KEY;
            $placeDetails =file_get_contents($placeDetailsURL);
            $placeDetailsAsArray = json_decode($placeDetails);

            switch ($dataArray->status) {
                case 'OK' :
                    $detailsOfPlace['business_name'] = isset($placeDetailsAsArray->result->name) ? $placeDetailsAsArray->result->name : '';
                    $detailsOfPlace['address'] = isset($placeDetailsAsArray->result->formatted_address) ? $placeDetailsAsArray->result->formatted_address : '';                      

                    $detailsOfPlaces[] = $detailsOfPlace;
                    break;
                default:
                    echo "Something went wrong";
            }
        }

Это мой код. Он возвращает 20 результатов для каждого запроса. Может кто-нибудь, пожалуйста, скажите мне, какую настройку я должен был сделать, чтобы получить 60 результатов для каждого запроса.

Спасибо

4b9b3361

Ответ 1

Как говорит Крис Грин в своем ответе, вам придется использовать разбивку на страницы, чтобы получить более 20 результатов. Также, как и Крис Грин также заявляет, что вы берете адрес, который вам действительно не нужен, чтобы сделать другой вызов для ссылки на каждое место. Я предполагаю, что вам понадобится дополнительная информация, поэтому я просто создал 2 функции, реализующие то, что Крис говорит в своем ответе. Не проверено, поэтому могут быть некоторые ошибки, но вы можете почувствовать это.

<?php

    function getAllReferences($query, $maxResults= 60, $nextToken = false) {
        $references = array();
        $nextStr = "";
        if ($nextToken)
            $nextStr = "nextpage=$nextToken";
        $placeSearchURL = "https://maps.googleapis.com/maps/api/place/textsearch/json?query=$query&sensor=true&key=".API_KEY."&$nextStr";
        $placeSearchJSON = file_get_contents($placeSearchURL);
        $dataArray = json_decode($placeSearchJSON);
        if (isset($dataArray->status) &&$dataArray->status == "OK") {
            foreach( $dataArray->results as $details) {
                array_push($references, $details->reference);
            }
            if (!empty($dataArray->next_page_token) && count($references) < $maxResults ) {
                $nextArray = getAllReferences($query, $maxResults-20 , $dataArray->next_page_token);
                $references = array_merge($references, $nextArray);

            }
            return $references;
        }
    }

    function getPlaceFromReference($reference) {
        $placeDetailsURL = 'https://maps.googleapis.com/maps/api/place/details/json?reference=' . $reference . '&sensor=true&key='.API_KEY;
        $placeDetailsContent =file_get_contents($placeDetailsURL);
        $placeDetails = json_decode($placeDetailsContent);
        if ($placeDetails->status == "OK")
            return $placeDetails;
        else return false;
    }

    $references = getAllReferences("test");
    if (count($references) == 0)
        echo "no results";
    else {
        foreach ($references as $reference) {
            $placeDetails = getPlaceFromReference($reference);
            print_r($placeDetails);
        }
    }

Ответ 2

API Google Адресов может возвращать до 60 результатов для каждого поиска, если они доступны с разбивкой по трем страницам до 20 результатов. Если доступно более 20 результатов, вы можете получить доступ к дополнительным результатам, передав параметр next_page_token в pagetoken нового запроса на поиск.

Дополнительную информацию о результатах добавления см. в разделе Доступ к дополнительным результатам на странице "Поиск места" в документации.

Если вам нужны только места расположения, вы можете использовать Поиск радиолокационных мест в области поиска, чтобы вернуть до 200 мест.

EDIT: В вашем примере вам не нужно отправлять запрос сведений для каждого места, чтобы получить доступ к названию места и адресу. Эта информация возвращается в исходном ответе и может быть доступна, как показано ниже:

foreach($dataArray->results as $place) {
  echo '<p><b>' . $place->name . '</b>, ' . $place->formatted_address . '</p>';
}

Вы можете узнать, доступны ли дополнительные страницы для запроса поиска по соседству, возвращается next_page_token. Это можно проверить, как показано ниже:

if (isset($dataArray->next_page_token)) {
  //get next page
}

Если возвращается next_page_token, вы можете получить следующую страницу результатов, передав параметр next_page_token в pagetoken нового запроса на поиск или добавив его в конец вашего первоначального запроса. Ниже приведен пример и пример с использованием нового запроса:

$placeSearchURL = 'https://maps.googleapis.com/maps/api/place/textsearch/json?nextpage=' . $dataArray->next_page_token . '&sensor=true' . '&key=' . API_KEY;

Как documentation говорится:

Каждая страница результатов должна отображаться поочередно. Две или более страниц результатов поиска не должны отображаться в результате запрос.

Поэтому существует короткая задержка между тем, когда выдается next_page_token, и когда она станет действительной.