LoginSignup
2
1

curlでQiitaOrganizationのユーザー一覧を取得する方法

Posted at

やりたいこと

Organizationの「メンバー」ページで見られるユーザー名の一覧が欲しい。
たったこれだけ、しかも「たまぁに」一覧が欲しいだけ。

困ったこと

「ブラウザでページを表示して1つ1つコピペ」は面倒くさくてやりたくない。
Qiita Apiを使おうと思ってQiita API v2ドキュメント - Qiita Developerをみると・・・Organaizationの情報を取得できるAPIがない・・・。
ググると「Pythonでスクレイピング」というのもいくつか見かけたけれど、ただユーザーを取得したいだけなのでもっと気軽にパッとやりたい。

Organizationのユーザー一覧を取得する方法

  1. (なければ)jqコマンドをインストールする
  2. 以下の「{OrganizationのURLになる部分}」を設定してからコマンドで取得する
$ curl https://qiita.com/organizations/{OrganizationのURLになる部分}/members | grep -o '{"organization":{"paginatedMemberships.*\/script' | sed -e 's/\<\/script//g' | jq '.organization.memberships.edges[].node.user.urlName'

株式会社オープントーンのOrganizationの場合はこんな感じ。

$ curl https://qiita.com/organizations/opentone/members | grep -o '{"organization":{"paginatedMemberships.*\/script' | sed -e 's/\<\/script//g' | jq '.organization.memberships.edges[].node.user.urlName'
"ot_RikuOta"
"TakayukiHatanaka"
"SJJ"
"chovin"
....

注意
Organizationのページ構成が変更になると、上記では対応できない可能性がある。

コマンドでやっていること

1. Organizationの「メンバー」ページのHTMLを取得する

curl {「メンバー」ページのURL}でまずはHTMLを取得する

2. JSONを抜き出す

「メンバー」ページには以下のようなJSONがある

HTMLの一部分
<script type="application/json" class="js-react-on-rails-component" data-component-name="OrganizationMembershipsIndexPage" data-dom-id="...">
    {"organization":{...}}
</script>

このJSONを抜くためにHTMLから「{"organization":{"paginatedMemberships」から「/script>」までを以下で抜き出す。

grep -o '{"organization":{"paginatedMemberships.*\/script'

そうすると以下のような文字列が抜ける。

{"organization":{"paginatedMemberships":...}}</script

最後にくっついている余計な</scriptを以下で削除する。

sed -e 's/\<\/script//g'

そうするとJSON形式の文字列になる。

3. jqコマンドでJSONを加工する

「organization」の中の「memberships」の中の「edges」配列ないから「user」の中の「urlName」を取得する。

JSONの大まかな構成
{
  "organization": {
    // ...省略...
    "paginatedMemberships": {...},
    // ...省略...
    "memberships": {
        "edges": [
            {
                "node": {
                    "user": {
                        "urlName": "ここにユーザー名がある",
    // ...省略...

jqコマンドだとこんな感じで書く

jq '.organization.memberships.edges[].node.user.urlName'

「paginatedMemberships」にもユーザー情報が格納されているものの、1ページ分の情報しかない。
ユーザー名さえ抜ければ良かったので今回は「memberships」をつかったものの
「paginatedMemberships」のほうが投稿記事数などもあって得られる情報は多い。

さいごに

「気軽にパッとやりたい」からはじまって、途中からほぼ意地で取得した。
Organizationの情報は、APIでは取得できないけれど

  1. OrganizationページのHTMLをじっとみつめる
  2. type="application/json"を探す
  3. 欲しい情報を持っているJSONを根性で見つける
  4. jqコマンドで抜く

というやり方で取得することが可能であることを知った。

2
1
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
2
1