GitHub GraphQL API でIssuesを作成し、コメントを追加する

GitHubのGraphQL APIを利用して、Issuesの作成とコメント追加をしてみました。
2024.06.14

GitHubのGraphQL APIを利用して、Issuesの作成とコメント追加をしてみました。

おすすめの方

  • GitHub GraphQL APIについて知りたい方
  • GitHub GraphQL APIでIssuesを作成したい方
  • GitHub GraphQL APIでIssuesにコメントを追加したい方
  • GitHub GraphQL APIで変数を使いたい方

Issues作成時にラベルを付与する場合は、事前にラベルを作成しておき、ラベルIDを取得する

Issueの作成と同時にラベルを付与する場合は、ラベルIDを指定します。 ラベルIDを取得する方法は、次の記事を参考にしてください。

本記事では、3つあるラベルのうち、1つのラベルを付与してみます。

01_github_issues_label

GitHub GraphQL API でIssuesを作成するスクリプト

リポジトリIDを取得して、Issuesを作成し、IssueIdを取得します。 そのIssueIdを利用して、コメントを追加しています。

app.py

import requests
import json

ENDPOINT = "https://api.github.com/graphql"

GITHUB_TOKEN = "aaa"

GITHUB_REPOSITORY_OWNER = "xxx"
GITHUB_REPOSITORY_NAME = "yyy"

# 作成と同時にラベルを付与する場合は、ラベルIDを指定する
LABELS = [
    "LA_kwDOLfC6C88AAAABkSNoSg",  # aaa
]

def main():
    # リポジトリIDを取得する
    repository_id = get_repository_id(GITHUB_REPOSITORY_OWNER, GITHUB_REPOSITORY_NAME)

    # Issueを作成する
    issue_id = create_issue(
        repository_id,
        title="GitHub GraphQL API Test Issue",
        body="# Memo\n\nThis is a test issue created by GitHub GraphQL API.",
        labels=LABELS,
    )

    # Issueにコメントを追加する
    add_comment(issue_id, "This is a test comment.\n\n**Hello, world!**")

def get_repository_id(
    repository_owner,
    repository_name,
):
    query = """
        query getProjectLabels($repositoryOwner:String!, $repositoryName:String!) {
            repository(owner: $repositoryOwner, name: $repositoryName) {
                id
            }
        }
        """
    variables = {
        "repositoryOwner": repository_owner,
        "repositoryName": repository_name,
    }
    resp = requests.post(
        ENDPOINT,
        headers=get_headers(),
        data=json.dumps({"query": query, "variables": variables}),
    )
    body = resp.json()

    return body["data"]["repository"]["id"]

def create_issue(repository_id, title, body, labels=[]):
    mutation = """
        mutation CreateIssue($repositoryId: ID!, $title: String!, $body: String, $labelIds: [ID!]) {
            createIssue(input: {repositoryId: $repositoryId, title: $title, body: $body, labelIds: $labelIds}) {
                issue {
                    id
                    number
                    title
                    bodyText
                }
            }
        }
        """
    variables = {
        "repositoryId": repository_id,
        "title": title,
        "body": body,
        "labelIds": labels,
    }
    resp = requests.post(
        ENDPOINT,
        headers=get_headers(),
        data=json.dumps({"query": mutation, "variables": variables}),
    )
    body = resp.json()

    return body["data"]["createIssue"]["issue"]["id"]

def add_comment(issue_id, body):
    mutation = """
        mutation AddComment($issueId: ID!, $body: String!) {
            addComment(input: {subjectId: $issueId, body: $body}) {
                commentEdge {
                    node {
                        id
                        body
                    }
                }
            }
        }"""
    variables = {
        "issueId": issue_id,
        "body": body,
    }
    resp = requests.post(
        ENDPOINT,
        headers=get_headers(),
        data=json.dumps({"query": mutation, "variables": variables}),
    )
    body = resp.json()

def get_headers():
    return {
        "Authorization": f"bearer {GITHUB_TOKEN}",
    }

if __name__ == "__main__":
    main()

スクリプトを実行する

python create_issue.py

Issuesを作成できた

バッチリです。

11_github_issue

12_github_issue

参考