Google Places API - Ruby で結果の次のページを取得する方法
概要
Web アプリで Google Web Service API と RestClient gem を使用して、特定の文字列を持つビジネスを検索しています。たとえば、「自動車ディーラー」を渡すと、近くのすべての自動車ディーラーの結果が返されます。
現在、結果の最初のページを取得できます。すでに next_page_token を渡していますが、同じ結果が得られません。コードのどこで問題が発生したのかわかりません。本当に助かりました!
SEARCH_ENDPOINT = 'https://maps.googleapis.com/maps/api/place/textsearch/json'.freeze
DETAILS_ENDPOINT = 'https://maps.googleapis.com/maps/api/place/details/json'.freeze
def initialize(query)
@params = {
query: query,
fields: 'name,formatted_phone_number,formatted_address,website,place_id,types',
key: API_KEY
}
@results = []
end
def extract
loop do
page_token = @results.last&.dig('next_page_token')
page = fetch_page(page_token)
break if page.nil?
@results += page['results']
break if page['next_page_token'].nil?
# Add a delay to avoid OVER_QUERY_LIMIT errors (10 requests per second)
sleep(10)
end
@results = @results.map do |result|
result_details = fetch_place_details(result['place_id'])
result.merge(result_details)
end
upsert_businesses(clean_data(@results))
end
private
def fetch_page(page_token)
response = RestClient.get(SEARCH_ENDPOINT, params: @params.merge({page_token: page_token}))
return nil unless response.code == 200
JSON.parse(response.body)
end
def fetch_place_details(place_id)
response = RestClient.get(DETAILS_ENDPOINT, params: @params.merge({place_id: place_id}))
return {} unless response.code == 200
details = JSON.parse(response.body)['result']
details || {}
end
新しいページの応答を期待して、次のページのトークンを params に渡します。しかし、同じ結果が得られます。
解決策
次の行は毎回 page_token を消去していました。
page_token = @results.last&.dig('next_page_token')
また、page_token パラメータの正しい構文は (少なくとも Ruby では) pagetoken です。