🌐

GitHubのGraphQL APIにPythonを使ってアクセス

2021/03/15に公開

GraphQLを学ぶべく、GitHubのAPIを使って勉強しました。Pythonを使っています。

基本的な記述はこんな感じ。

query = """
query {
    viewer {
	name
	    repositories(last: 3) {
		nodes {
		    name
		}
	    }
	}
    }
"""

data = {'query': query}
# requestsモジュールを使ってPOSTします。
res = self.__post(self.endpoint, data)

しかしこの方法だと動的な値を与える事ができません。(今回で言う所のlast: 3の部分)
なので変数variablesを使います。

query = """
query ($number_of_repos:Int!){
    viewer {
	name
	    repositories(last: $number_of_repos) {
		nodes {
		    name
		}
	    }
	}
    }
"""

variables = {
    "number_of_repos": 3
}

data = {'query': query,
	'variables': variables}
# requestsモジュールを使ってPOSTします。
res = self.__post(self.endpoint, data)

こうする事で動的に変わる値を変数として与える事ができます。

mutationとの組み合わせ

GitHubのサンプル

query FindIssueID {
  repository(owner:"octocat", name:"Hello-World") {
    issue(number:349) {
      id
    }
  }
}

mutation AddReactionToIssue {
  addReaction(input:{subjectId:"MDU6SXNzdWUyMzEzOTE1NTE=",content:HOORAY}) {
    reaction {
      content
    }
    subject {
      id
    }
  }
}

まずはqueryで特定のissueIDを取得し、そのIDに対しリアクションをmutationするものとなります。
queryにはownerとnameの2つの値が必要なのですが、これもそのまま書くと不便なのでvariableを使います。

query = """
    query($owner:String!, $name:String!) {
      repository(owner: $owner, name: $name) {
	issue(number:349) {
	  id
	}
      }
    }
"""
variables = {
    "owner": "octocat",
    "name": "Hello-World"
}

data = {'query': query,
	'variables': variables}
# requestsモジュールを使ってPOSTします。
res = self.__post(self.endpoint, data)

queryの中できちんと($owner:String!, $name:String!)といった型を書いてあげないと失敗します。ちょっとここでハマりました。
そしてここで得たissueのidを使ってmutationを行い、リアクションを登録します。

query = """
    query($owner:String!, $name:String!) {
      repository(owner: $owner, name: $name) {
	issue(number:349) {
	  id
	}
      }
    }
"""
variables = {
    "owner": "octocat",
    "name": "Hello-World"
}

data = {'query': query,
	'variables': variables}

# requestsモジュールを使ってPOSTします。
res = self.__post(self.endpoint, data)

query = """
mutation($input:AddReactionInput!) {
  addReaction(input:$input) {
    reaction {
      content
    }
    subject {
      id
    }
  }
}
"""

variables = {
    "input": {
	# queryで入手したidをsubjectIdとして登録
	"subjectId": f"{res['data']['repository']['issue']['id']}",
	"content": "HOORAY"
    }
}

data = {'query': query,
	'variables': variables}
# requestsモジュールを使ってPOSTします。
res = self.__post(self.endpoint, data)

こんな感じです。実行したら無事にリアクションが登録されました。やったね!

Discussion