やりたいこと
Organizationの「メンバー」ページで見られるユーザー名の一覧が欲しい。
たったこれだけ、しかも「たまぁに」一覧が欲しいだけ。
困ったこと
「ブラウザでページを表示して1つ1つコピペ」は面倒くさくてやりたくない。
Qiita Apiを使おうと思ってQiita API v2ドキュメント - Qiita Developerをみると・・・Organaizationの情報を取得できるAPIがない・・・。
ググると「Pythonでスクレイピング」というのもいくつか見かけたけれど、ただユーザーを取得したいだけなのでもっと気軽にパッとやりたい。
Organizationのユーザー一覧を取得する方法
- (なければ)jqコマンドをインストールする
- 以下の「{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がある
<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」を取得する。
{
"organization": {
// ...省略...
"paginatedMemberships": {...},
// ...省略...
"memberships": {
"edges": [
{
"node": {
"user": {
"urlName": "ここにユーザー名がある",
// ...省略...
jqコマンドだとこんな感じで書く
jq '.organization.memberships.edges[].node.user.urlName'
「paginatedMemberships」にもユーザー情報が格納されているものの、1ページ分の情報しかない。
ユーザー名さえ抜ければ良かったので今回は「memberships」をつかったものの
「paginatedMemberships」のほうが投稿記事数などもあって得られる情報は多い。
さいごに
「気軽にパッとやりたい」からはじまって、途中からほぼ意地で取得した。
Organizationの情報は、APIでは取得できないけれど
- OrganizationページのHTMLをじっとみつめる
-
type="application/json"
を探す - 欲しい情報を持っているJSONを根性で見つける
- jqコマンドで抜く
というやり方で取得することが可能であることを知った。