LoginSignup
0
0

【GitHub API】gist のスター数を取得する【stargazers を GitHub CLI(gh コマンド)で取得する】

Last updated at Posted at 2022-10-19

Get the number of stars for a "gist" repository

GitHub の HTML をスクレイピングせずに、gist に付いたスター数(「いいね」数、stargazers)を API を叩いて取得したい

マイクロ git とも言える、GitHub Gist をブログ記事の CMS のバックエンド(DB 替わり)に使おうと思い、各記事に付いたスター数を表示したかったのです。

しかし、GitHub API v3 の Gists エンドポイント には「星が付いているか、否か」の "/gists/{gist_id}/star" エンドポイントしかありませんでした。「github API "gist" how to get stargazers」でググっても、HTML をスクレイピングする方法ばかりで、レイアウト変更(クラス名変更)のたびに追随するのも大変です。

API で叩いて取得する方法がすぐにヒットしなかったので、自分のググラビリティとして。

Go 用のパッケージも作りました

ステータス・バッジの老舗である、天下の Shields.io も対応しました。

TL; DR (今北産業)

  1. GitHub API v4GraphQL API を使う。
  2. GraphQLViewer クエリ --> Gist オブジェクト --> stargazerCount フィールドを参照する。
  3. GitHub CLIgh コマンド であれば gh api graphql サブコマンドで GraphQL のリクエストができる。
#!/bin/bash

QUERY='
query {
  viewer {
    gist (name: "5b10b34f87955dfc86d310cd623a61d1" ) {
        stargazerCount
    }
  }
}
'
TEMPLATE='{{.data.viewer.gist.stargazerCount}}'

# 要 `gh auth login` 済み
gh api graphql -f query="${QUERY}" --template="${TEMPLATE}"

# Output:
# 2

TS; DR

#!/bin/bash
# shellcheck disable=SC2016

# 最初の 10 件の gist のスター数を取得する例
QUERY1='
query {
  viewer {
    gists (first: 10, orderBy: {field: CREATED_AT, direction: DESC} ) {
        nodes {
            createdAt
            description
            name
            pushedAt
            stargazers (first: 100) {
            totalCount
            edges {
                node {
                id
                }
            }
            }
            updatedAt
        }
    }
  }
}
'
TEMPLATE1='
  {{- range $repo := .data.viewer.gists.nodes -}}
    {{- printf "name: %s - stargazers: %v\n" $repo.name $repo.stargazers.totalCount -}}
  {{- end -}}
'

gh api graphql -f query="${QUERY1}" --paginate --template="${TEMPLATE1}"

echo "----------------------------------"

# 指定した gist ID のスター数を取得する例
QUERY2='
query {
  viewer {
    gist (name: "5b10b34f87955dfc86d310cd623a61d1" ) {
        name
        stargazerCount
    }
  }
}
'
TEMPLATE2='
    {{- printf "name: %s - stargazers: %v\n" .data.viewer.gist.name .data.viewer.gist.stargazerCount -}}
'

gh api graphql -f query="${QUERY2}" --paginate --template="${TEMPLATE2}"

# Output:
# name: 7101f542be23e5048198e2a27c3cfda8 - stargazers: 0
# name: d5b9800c636dd78defa4f15894d54d29 - stargazers: 0
# name: e915aa8c01dd438e3ffd79b05f15a4ff - stargazers: 0
# name: 83e82d243b9b3d9ffbf370010ad658c3 - stargazers: 0
# name: 9cbad9941ad797b8d75123e40f7fd4c8 - stargazers: 0
# name: 76857bc6339515d7144e00f17adb1090 - stargazers: 1
# name: 5fd419de98e58b650ad279d6c1266179 - stargazers: 1
# name: cb4dbde222fb494405bb522692235456 - stargazers: 1
# name: f15d018ceb6d2a2103c581b41530ad49 - stargazers: 0
# name: a821517a85992fe329489db2ce32bd56 - stargazers: 0
# ----------------------------------
# name: 5b10b34f87955dfc86d310cd623a61d1 - stargazers: 2

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0