APIのレスポンスチェックを楽にするjqコマンドを使ってみよう

jq 雑記
この記事は約25分で読めます。

さて、前回cRULコマンドを紹介しました。今回はcURLと一緒に使うと抜群の効果を発揮してくれるjqコマンドのご紹介です。

正直個人的にはセットみたいなイメージです。

前回のcurl記事をご覧になっていない方は、以下のリンクからどうぞ。

Advertisements

そもそもjqコマンドって何?

JSONから簡単に値を抜き出したり、集計したり、整形して表示したりできるJSON用のgrepとかawkみたいなコマンドです。
APIでの取得を多用する現代においては、curlとセットでjqを利用すると非常に便利です。作ってくれた方、ありがたやぁあ。。

jqのインストール

以下の1行でOKです。(MacOSでhomebrewを使ってる前提です。)

brew install jq

curlでのレスポンスをデコードしてくれる?

compassのAPIをcurlコマンドで叩いてみましょう。compassのAPIは認証とか全くないので、テストするには楽です。docsは以下。

connpass - エンジニアをつなぐIT勉強会支援プラットフォーム
connpassはイベントやIT勉強会の開催、さらに参加者の集客に便利です。コミュニティやグループの運営やイベントの検索、事前決済もできます。

compassからのレスポンスが読めない

先ほどのdocに基づき、curlコマンドでkeyword=pythonとしてデータを取得してみましょう。

curl "https://connpass.com/api/v1/event/?keyword=python"

実行すると以下のような結果が返ってくると思います。全く読めません。。

p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000} span.s1 {font-variant-ligatures: no-common-ligatures}
{"results_start": 1, "results_returned": 10, "results_available": 10000, "events": [{"event_id": 194056, "title": "BPStudy#159\u301cWeb\u30b5\u30fc\u30d3\u30b9\u3067\u8d77\u696d\u3059\u308b", "catch": "\u682a\u5f0f\u4f1a\u793e\u30d3\u30fc\u30d7\u30e9\u30a6\u30c9\u304c\u4e3b\u50ac\u3059\u308bIT\u52c9\u5f37\u4f1a", "description": "<h3>zoom\u3092\u4f7f\u3063\u3066\u306e\u30ea\u30e2\u30fc\u30c8\u958b\u50ac\u3067\u3059\u3002zoom\u306eURL\u7b49\u306f\u3001\u53c2\u52a0\u8005\u306b\u30e1\u30fc\u30eb\u306b\u3066\u304a\u77e5\u3089\u305b\u3057\u307e\u3059\u3002</h3>\n<p>\u81ea\u5206\u3067Web\u30b5\u30fc\u30d3\u30b9\u3092\u958b\u767a\u3057\u3066\u8d77\u696d\u3059\u308b\u3002</p>\n<p>\u30d7\u30ed\u30b0\u30e9\u30de\u30fc\u306a\u30891\u5ea6\u306f\u601d\u3044\u3092\u5de1\u3089\u3057\u305f\u3053\u3068\u304c\u3042\u308b\u306e\u3067\u306f\u306a\u3044\u3067\u3057\u3087\u3046\u304b\u3002</p>\n<p>\u4eca\u56de\u306eBPStudy\u306fWeb\u30b5\u30fc\u30d3\u30b9\u3067\u8d77\u696d\u3057\u305f\u793e\u95772\u4eba\u306b\u767b\u58c7\u3044\u305f\u3060\u304d\u307e\u3059(\u3057\u304b\u30822\u4eba\u5171\u30d3\u30fc\u30d7\u30e9\u30a6\u30c9\u51fa\u8eab)\u3002</p>\n<p>\u304a2\u4eba\u306fWeb\u30b5\u30fc\u30d3\u30b9\u3067\u8d77\u696d\u3059\u308b\u307e\u3067\u306b\u3055\u307e\u3056\u307e\u306a\u53d6\u7d44\u307f\u3092\u3057\u3001\u8d77\u696d\u3057\

パッとみてお気づきの方もいるかもですが、\uとなっているので、utf-8でエンコードされてますね。ここでさっきinstallしたjqコマンドをくっつけると、あら不思議w 勝手にデコードしてくれます。

curl "https://connpass.com/api/v1/event/?keyword=python" | jq

【表示結果】

 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  116k  100  116k    0     0   150k      0 --:--:-- --:--:-- --:--:--  150k
{
  "results_start": 1,
  "results_returned": 10,
  "results_available": 10000,
  "events": [
    {
      "event_id": 194056,
      "title": "BPStudy#159〜Webサービスで起業する",
      "catch": "株式会社ビープラウドが主催するIT勉強会",
      "description": "<h3>zoomを使ってのリモート開催です。zoomのURL等は、参加者にメールにてお知らせします。</h3>\n<p>自分でWebサービスを開発して起業する。</p>\n<p>プログラマーなら1度は思いを巡らしたことがあるのではないでしょうか。</p>\n<p>今回のBPStudyはWebサービスで起業した社長2人に登壇いただきます(しかも2人共ビープラウド出身)。</p>\n<p>お2人はWebサービスで起業するまでにさまざまな取組みをし、起業し現在にいたります。</p>\n<p>もちろん起業はキャリアの1つでしかありません。しかしそのお2人の今に至るまでの考えや取り組みはプログラマーやこれから起業も視野に入れている人にきっと参考になるでしょう。</p>\n<h2>第1部 エンジニアがサービス開発で起業したときに陥りがちなポイント3選</h2>\n<h4>Anyflow株式会社 坂本蓮 氏 (Twitter: <a href=\"https://twitter.com/rensakamoto\" rel=\"nofollow\">@rensakamoto</a>)</h4>\n<p>(19:00-19:40)</p>\n<p>私は学生の時から振り返ると、20個以上のWebサービスやiPhoneアプリを個人や自分の会社でリリースしてきました。しかしその多くは失敗し、すでにクローズしています。</p>\n<p>サービス開発は楽しいものですが、それを事業として収益化するためには数多くのハードルが存在します。</p>\n<p>素人のサービス開発が好きな1エンジニアが、単なるサービス開発ではなく、事業を創る上で経験してきた失敗談や「あの時こういう発想でサービスを作っていたら..」といったノウハウを共有します!</p>\n<h5>自己紹介</h5>\n<p><a href=\"https://anyflow.co.jp/\" rel=\"nofollow\">Anyflow株式会社</a> 代表取締役CEO\n坂本 蓮</p>\n<p>1992年山梨県生まれ。中学生の時からプログラミングを始め、経済産業省主催のU-20/U-22プログラミングコンテストの受賞、KDDI∞Laboの採択、シリコンバレーでのインターンを経験。</p>\n<p>大学卒業後、株式会社サイバーエージェントに入社。サーバーサイドエンジニアとして、API基盤開発に従事するも1年で退職。その後Anyflow株式会社を創業。IncubateCamp 12th優勝、B Dash Camp 2019 優勝を踏まえグロービス、グローバル・ブレイン等から2.2億円の資金調達を実施。</p>\n<p>株式会社ビープラウドでは学生時代にインターンをさせていただいていました!\n<img src=\"https://coralcap.co/wp-content/uploads/2019/12/72693214_2586111418077943_7284869978375847936_o-1290x1290.jpg\" width=\"300\"></p>\n<h2>第2部 すぐに起業せずに僕がやってきたこと</h2>\n<h4>株式会社ゼンプロダクツ 清原弘貴 氏  (Twitter: <a href=\"https://twitter.com/hirokiky\" rel=\"nofollow\">@hirokiky</a>)</h4>\n<p>(19:45-20:25)</p>\n<p>「起業は若ければ若いほうが良い」と、思われがちだと思います。\nどこで聞いたのか分かりませんが、ともかく若いのが良く、自分たちにはもう出番がないように感じてしまいますね。</p>\n<p>僕、hirokiky自身もそう思っていましたが、この言葉は本当でしょうか?学生起業家以外には舞台がないのでしょうか?\nそうとは思いません。Amazonの起業はジェフ・ベゾスが30歳のときです。</p>\n<p>今回の話ではそんな「起業するまでの人生」と「経験がどうサービス開発と起業に活きるのか」に焦点をあてたいと思います。\n僕の話と弊社が開発中の <a href=\"https://shodo.ink\" rel=\"nofollow\">Shodo</a> というWebサービスを振り返りながら、みなさんと人生におけるどんな経験を活かしてお客様の課題を解決するサービスを開発できるかを考えたいと思います。</p>\n<p>僕の学生時代や前職での経験、コミュニティ活動についても振り返るので、あまり「翌日から役立つトーク」にならないかもしれません。\nですが、みなさんとこの思いを共有できると嬉しいです。</p>\n<h5>自己紹介</h5>\n<p>kyと呼んでください。</p>\n<p>Shodo https://shodo.ink 運営の株式会社ゼンプロダクツ代表取締役社長です。2011年から本格的にPythonを使っていて、2012年から2020年まで株式会社ビープラウドでWebアプリケーションの開発や <a href=\"https://pyq.jp\" rel=\"nofollow\">PyQ</a> の企画・開発をしていました。</p>\n<p>PyQには初期の企画から参加し、開発やマーケティングを含めてチームでサービス開発に打ち込んできました。\nその中である課題に出会い、趣味で開発していたWebサービスが <a href=\"https://shodo.ink\" rel=\"nofollow\">Shodo</a> として会社になりました(詳しくは発表内で話します)。</p>\n<p>WebフレームワークDjangoが好きで、日本で最大級のDjangoイベント<a href=\"https://djangocongress.jp\" rel=\"nofollow\">DjangoCongress JP</a>の主催をしたり、ライブラリーやアプリの開発もしています。</p>\n<p>共著書に『<a href=\"https://amazon.co.jp/dp/B07DN6LZH5/\" rel=\"nofollow\">Pythonプロフェッショナルプログラミング 第3版(2018 秀和システム刊)</a>』『<a href=\"https://amazon.co.jp/dp/B075H1PK45\" rel=\"nofollow\">Pythonエンジニア ファーストブック(2017 技術評論社刊)</a>』『<a href=\"https://amazon.co.jp/dp/4297111977/\" rel=\"nofollow\">自走プログラマー(2020 技術評論社刊)</a>』があります。</p>\n<ul>\n<li>ブログ: <a href=\"https://blog.hirokiky.org\" rel=\"nofollow\">Make組ブログ</a></li>\n<li>YouTube: <a href=\"https://youtube.com/channel/UCHIGmUhNrBXm2gYCOA4X6fA\" rel=\"nofollow\">hirokikyチャンネル</a></li>\n<li>Twitter: <a href=\"https://twitter.com/hirokiky\" rel=\"nofollow\">@hirokiky</a></li>\n</ul>\n<p><img src=\"https://media.shodousercontents.com/usericons/2/7eabf1c0-c75f-42d2-8073-5f3b3862600b.jpeg\" width=\"300\"></p>\n<h2>第3部 BPStudyラジオ</h2>\n<p>(20:25-21:00)</p>\n<p><a href=\"https://www.sli.do/\" rel=\"nofollow\">sli.do</a>でリスナーからの質問を受け付けます。</p>\n<p>イベントコード: 「bpstudy159」 を入力して、ページに進んでください。質問お待ちしています。</p>\n<h3>パーソナリティ</h3>\n<ul>\n<li>株式会社ゼンプロダクツ 清原弘貴 氏  (Twitter: <a href=\"https://twitter.com/hirokiky\" rel=\"nofollow\">@hirokiky</a>)</li>\n<li>Anyflow株式会社 坂本蓮 氏 (Twitter: <a href=\"https://twitter.com/rensakamoto\" rel=\"nofollow\">@rensakamoto</a>)</li>\n</ul>\n<h3>進行役</h3>\n<p>株式会社ビープラウド 佐藤治夫 氏 <a href=\"https://twitter.com/haru860\" rel=\"nofollow\">@haru860</a>)</p>\n<h5>進行役自己紹介</h5>\n<p><a href=\"https://www.beproud.jp/\" rel=\"nofollow\">株式会社ビープラウド</a>代表取締役社長。</p>\n<p><a href=\"https://bpstudy.connpass.com/\" rel=\"nofollow\">BPStudy</a>を2007年から主催し、毎月1回ずつ開催を続けている。</p>\n<p>IT勉強会支援プラットフォーム<a href=\"https://connpass.com/\" rel=\"nofollow\">Connpass</a>、Pythonオンライン学習サイト<a href=\"https://pyq.jp/\" rel=\"nofollow\">PyQ</a>企画・開発・運営。</p>",
      "event_url": "https://bpstudy.connpass.com/event/194056/",
      "started_at": "2020-11-27T19:00:00+09:00",
      "ended_at": "2020-11-27T21:00:00+09:00",
      "limit": 100,
      "hash_tag": "bpstudy",
      "event_type": "participation",
      "accepted": 40,
      "waiting": 0,
      "updated_at": "2020-11-10T09:58:10+09:00",
      "owner_id": 8,
      "owner_nickname": "haru860",
      "owner_display_name": "佐藤 治夫",
      "place": "オンライン",
      "address": "",
      "lat": null,
      "lon": null,
      "series": {
        "id": 1,
        "title": "BPStudy",
        "url": "https://bpstudy.connpass.com/"
      }
    },
    {
      "event_id": 192696,
      "title": "企業の財務データを可視化しよう",
      "catch": "ビジネスパーソンの日常業務で Python を活用する人のための勉強会",
      "description": "<h2>リモート開催</h2>\n<p><a href=\"https://gsuite.google.co.jp/intl/ja/products/meet/\" rel=\"nofollow\">Google Meet</a> を使ってリモート開催します。参加するのに Google のアカウントが必要です。接続用の URL は当日に bizpy slack の #dekiru-py-support チャンネルに書き込む予定になります。こちらの <a href=\"https://join.slack.com/t/bizpy/shared_invite/enQtNzYxMzkyODY4NTE4LTc3ZGI4ZmU1MzhlYzFmNTk0ZjVhNTA3MjcyZTFlN2FjYmFjNDg0N2Q5YmI2MDYyZjU3ZjFiZjJlYmU0MWIxZTQ\" rel=\"nofollow\">招待リンク</a> から <a href=\"http://bizpy.slack.com\" rel=\"nofollow\">bizpy.slack.com</a> にご参加ください。主催者や参加者同士でのコミュニケーションが取れるように設けている場なので質問があるときは自由にコメントしてもらってよいです。</p>\n<h2>概要</h2>\n<p><a href=\"https://colab.research.google.com/\" rel=\"nofollow\">Colaboratory</a>を使って上場企業の財務諸表を可視化します。</p>\n<h3>目的: データの処理と可視化方法を学ぶ</h3>\n<p>ビジネスにおいて、売上や債務などの財務データを把握することは非常に重要です。財務諸表を確認することで、経営の健全性の確認や競合との分析などが行えます。</p>\n<p>データを処理して可視化することで、数値データだけでは得られない情報を把握できます。</p>\n<h2>内容</h2>\n<p>次のような内容を考えています。詳細が決まった時点でまた更新します。</p>\n<p><a href=\"https://pandas.pydata.org\" rel=\"nofollow\">pandas</a> でデータを処理して、<a href=\"https://plotly.com/python/\" rel=\"nofollow\">plotly.py(Plotly Express)</a>でデータを可視化します。</p>\n<p><a href=\"https://colab.research.google.com/\" rel=\"nofollow\">Colaboratory</a>を利用して、テータ処理の課程を説明しながら、可視化するまでの工程を学びます。</p>\n<p>pandasの使い方を予習したい方は事前に <a href=\"https://colab.research.google.com/github/drillan/bizpy/blob/main/20201111/pandas.ipynb\" rel=\"nofollow\">pandasの資料</a> を参照してください。</p>\n<h2>対象とする参加者</h2>\n<p>ビジネスパーソンの日常業務を対象にしているため、次のような方々を想定しています。</p>\n<ul>\n<li>ビジネスパーソン/ノンプログラマーの方</li>\n<li>プログラミングを学び始めて経験の浅い方</li>\n<li>Python を使って日々の業務の一部を自動化したいと考えている方</li>\n<li>独学で Python を勉強していてプログラミングの相談をしたい方</li>\n<li>Python の入門本を読み終えて次に何を勉強していいか迷っている方</li>\n</ul>\n<p>Python 入門を終えたぐらいの方を対象としています。現職のプログラマー向けではありません。現職のプログラマーが参加されても構いませんが、メンターとして他の参加者へ教える側になっていただくこともあるかもしれません。</p>\n<p>コミュニティの雰囲気はこちらを参照してください。</p>\n<ul>\n<li><a href=\"https://docs.google.com/presentation/d/1mE3s50BaZ2MCICG1QPfPyIRKi7IDZObtstTRAi8G5JY/edit?usp=sharing\" rel=\"nofollow\">ビジネス Pythonを 学ぶ会 (bizpy)</a></li>\n</ul>\n<h2>参加条件</h2>\n<p>Googleアカウントが必要です。事前に<a href=\"https://colab.research.google.com/\" rel=\"nofollow\">Colaboratory</a>にアクセスできるか確認しておいてください。</p>\n<p>Colaboratoryをはじめて使うかたは事前に <a href=\"https://www.python.jp/train/experience/index.html\" rel=\"nofollow\">この記事</a> を参照して、使い方に慣れておくことをおすすめします。</p>\n<h1>補足</h1>\n<ul>\n<li>下のフィードに書き込んでも管理者へ通知は送られないので基本的に気付きません。右サイドバーの「イベントへのお問い合わせ」から質問をするようにお願いします。</li>\n</ul>\n<h4>Copyright</h4>\n<p>Camila Gurrea 氏の作品をイベント画像に使っています。</p>\n<ul>\n<li><a href=\"https://www.flickr.com/photos/150839837@N03/34929771892/\" rel=\"nofollow\">https://www.flickr.com/photos/150839837@N03/34929771892></li>\n</ul>",

長くてすみません。でもパイプでjqコマンド入れるだけで、デコードされるのは便利じゃないですか?

その他jqコマンドの使い方

jqはデコードしてくれるだけではありません。json自体を取り扱ってもくれます。というか、こっちがメインですw

compass APIのレスポンスは以下のような形に基本なっています。構造はそれぞれ提供されるサービスによりけりなので、今回のサンプルはcompassのレスポンスベースっていうことだけご了承ください(他のAPIでおんなじコマンド打って、希望の動作するかは構造次第なので、構造は自分で読み取ってねって意味です)

{
  "results_start": num,
  "results_returned": num,
  "results_available": num,
  "events": [
    {
      "event_id": num,
      "title": string,
      "catch": string,
      "description":string,
        "event_url": url,
      "started_at": datetime,
      "ended_at": datetime,
      "limit": num,
      "hash_tag": string,
      "event_type": "participation",
      "accepted": 40,
      "waiting": 0,
      "updated_at": "2020-11-10T09:58:10+09:00",
      "owner_id": 8,
      "owner_nickname": "haru860",
      "owner_display_name": "佐藤 治夫",
      "place": "オンライン",
      "address": "",
      "lat": null,
      "lon": null,
      "series": {
        "id": 1,
        "title": "BPStudy",
        "url": "https://bpstudy.connpass.com/"
      }
    },
以下同様に取得した数続く。。。
                   ]

指定の要素だけ取得する〜keyの指定とlistの皮むき〜

keyの指定方法は以下です。

.key_name

listの皮むき方法は以下([]の部分)です。

.key_name[]

では、サンプルでkeyword=python, eventsのtitleだけ全て抜き出したいとします。

curl "https://connpass.com/api/v1/event/?keyword=python" | jq '.events[].title'

返ってくる結果は以下のようになります。

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  116k  100  116k    0     0  97243      0  0:00:01  0:00:01 --:--:-- 97164
"BPStudy#159〜Webサービスで起業する"
"企業の財務データを可視化しよう"
"自動化大好きエンジニアLT会"
"【オンライン】Pythonデータ分析勉強会#24"
"みんなのPython勉強会#63"
"信玄パイ オンライン読書会 第4弾「Pythonによるファイナンス 第2版」#7"
"信玄パイ オンライン読書会 第4弾「Pythonによるファイナンス 第2版」#6"
"大垣開催!Web×IoT メイカーズチャレンジ 2020-21 【ハンズオン講習 & ハッカソン】"
"Sports Analyst Meetup #9"
"第3回『機械学習を用いた生物画像解析』"

取得した要素のtitleだけが全て抜き出せました。

例えば1つ目のtitleだけ取得したければ以下です。ここら辺はシンプルなlistの取り扱いです。

curl "https://connpass.com/api/v1/event/?keyword=python" | jq '.events[0].title'

jqで複数の要素を取得する場合

これもシンプルでjqないでパイプで繋いであげればOKです。例えば、タイトルとキャッチの2つを取り出したい場合は以下です。

curl "https://connpass.com/api/v1/event/?keyword=python" | jq '.events[] | .title, .catch' 

こんな感じに結果が返ってきます。期待通りに、タイトルとキャッチだけ取れてます。

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  116k  100  116k    0     0   100k      0  0:00:01  0:00:01 --:--:--  100k
"BPStudy#159〜Webサービスで起業する"
"株式会社ビープラウドが主催するIT勉強会"
"企業の財務データを可視化しよう"
"ビジネスパーソンの日常業務で Python を活用する人のための勉強会"
"自動化大好きエンジニアLT会"
"自動化による開発の効率化・品質向上を語り合うLT会"
"【オンライン】Pythonデータ分析勉強会#24"
"情報交換会3時間"
"みんなのPython勉強会#63"
"Pythonでみせる、つたえる。"
"信玄パイ オンライン読書会 第4弾「Pythonによるファイナンス 第2版」#7"
"信玄パイのオンライン読書会第4弾です。"
"信玄パイ オンライン読書会 第4弾「Pythonによるファイナンス 第2版」#6"
"信玄パイのオンライン読書会第4弾です。"
"大垣開催!Web×IoT メイカーズチャレンジ 2020-21 【ハンズオン講習 & ハッカソン】"
"micro:bitとRaspberry PiでIoT開発を学んで、ハッカソンで作品を作ろう!"
"Sports Analyst Meetup #9"
"現役スポーツアナリストとスポーツ分析に興味のある方々で情報共有をしましょう!"
"第3回『機械学習を用いた生物画像解析』"
"①バイオ×機械学習、②アカデミア→スタートアップへのキャリアパスについてご講演いただきます!

他にもまだまだ便利な機能があるので、気になる方はofficialのdocを読んでみてください。

jq

今回は紹介していませんが、map・reduce・uniqueなんかも非常に便利です。ほんと使えますよ。

まとめ

前回curlコマンド、今回jqコマンドと2回連続で黒い画面での作業の説明になりました。

少しは慣れましたか?苦手意識は不慣れだから出るものって個人的には思っていますので、ぜひ時間見つけて立ち上げる、そして簡単でもいいから使ってみる癖をつけるといいかもですね。

コメント