Techioz Blog

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 です。