Class: InstacartApi::GraphqlClient

Inherits:
Object
  • Object
show all
Defined in:
lib/instacart_api/graphql_client.rb

Overview

Thin transport over Instacart's GraphQL endpoint.

Authentication is the logged-in session cookie (the __Host-instacart_sid cookie, plus its companions) captured from a real browser login — Instacart's login flow is bot-protected and can't be scripted, so the caller supplies the cookie string. Every request also needs the X-Client-Identifier: web header, without which the persisted-query resolver rejects the variables.

Constant Summary collapse

ENDPOINT =
URI("https://www.instacart.com/graphql")
DEFAULT_USER_AGENT =

A recent desktop Chrome UA; Instacart serves the web GraphQL API to it.

"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) " \
"AppleWebKit/537.36 (KHTML, like Gecko) " \
"Chrome/126.0.0.0 Safari/537.36"

Instance Method Summary collapse

Constructor Details

#initialize(session_cookie:, user_agent: DEFAULT_USER_AGENT) ⇒ GraphqlClient

Returns a new instance of GraphqlClient.



21
22
23
24
# File 'lib/instacart_api/graphql_client.rb', line 21

def initialize(session_cookie:, user_agent: DEFAULT_USER_AGENT)
  @session_cookie = session_cookie
  @user_agent = user_agent
end

Instance Method Details

#mutate(operation, variables) ⇒ Object

Run a persisted mutation (HTTP POST). Returns the data hash.



38
39
40
41
42
43
44
45
46
# File 'lib/instacart_api/graphql_client.rb', line 38

def mutate(operation, variables)
  request = Net::HTTP::Post.new(ENDPOINT)
  request.body = JSON.generate(
    operationName: operation,
    variables: variables,
    extensions: extensions(operation)
  )
  perform(request)
end

#query(operation, variables) ⇒ Object

Run a persisted query (HTTP GET). Returns the data hash.



27
28
29
30
31
32
33
34
35
# File 'lib/instacart_api/graphql_client.rb', line 27

def query(operation, variables)
  uri = ENDPOINT.dup
  uri.query = URI.encode_www_form(
    operationName: operation,
    variables: JSON.generate(variables),
    extensions: JSON.generate(extensions(operation))
  )
  perform(Net::HTTP::Get.new(uri))
end