開発効率爆上がり curl + jq 入門講座

C302e84057a922dce0ecbe80207e3fcc?s=47 mu_zaru
October 08, 2020

開発効率爆上がり curl + jq 入門講座

配信動画はこちら
https://www.youtube.com/watch?v=-HohpQP-lwU

もし良かったらムーザルちゃんねるのチャンネル登録お願いします!
https://www.youtube.com/channel/UCLPHXwLp90A5R69Eltxo-sg

Twitter でもプログラミングネタをつぶやいているのでフォローお待ちしております。
ムー
https://twitter.com/mu_book
zaru
https://twitter.com/zaru

C302e84057a922dce0ecbe80207e3fcc?s=128

mu_zaru

October 08, 2020
Tweet

Transcript

  1. YouTube Live (2020.10.08 Thur. 21:00~)

  2. 話す人 現役のエンジニア二人 赤貝が好きな CTO と デザイン勉強中のエンジニア @mu_vpoe 最近の仕事は figma で画

    面設計をつくることで す。英語の勉強してる。 ムー zaru @zaru CTO, Love 赤貝, JavaScript, Firebase, Web Components. Twitter フォロー お願いします!
  3. 話すこと curl の魅力 curl の基本的な使い方 jq の基本的な使い方 curl の一歩進んだ使い方

  4. curl は便利で楽しい

  5. ipinfo.io 自分のグローバル IP アドレスやプロバイダなどの ネットワーク情報を確認できる ipinfo.io/xxx.xxx.xxx.xxx と後ろに IP アドレスを 付けると指定の

    IP 情報を取得できる
  6. qrenco.de QR コードを生成できるサービス

  7. wttr.in 各国の天気が見られる

  8. rate.sx ビットコインなどのレートが見れる

  9. asciitv.fr アスキーアートでスターウォーズ見れる

  10. ascii.live/nyan みんな大好き nyan-cat

  11. つまり curl は便利で楽しい

  12. jq で JSON

  13. JSON を取り扱う悩み

  14. JSON を返す API にアクセスしたら…見にくい!

  15. email キーはどんな階層構造なんだ…?

  16. そんな時に jq コマンド https://stedolan.github.io/jq/download/ ここからダウンロード&インストール

  17. jq コマンドに渡すとフォーマットしてくれる

  18. キーの階層構造リストを表示することもできる

  19. つまり jq は凄い

  20. curl の基本

  21. ページを取得する $ curl https://example.com $ curl -o ouput.html https://example.com コマンド

    普通に見るだけならオプションなしで URL を指定すれば OK ダウンロードしたい場合は -o もしくは --output オプション でファイル名を指定すれば保存することができる
  22. POST する $ curl -d "name=zaru" -d "hoge=piyo" https://example.com コマンド

    -X POST で明示的に POST メソッドを使えるが -d や --data でデータ送信をすると自動で POST になる デフォルトで Content-Type は application/x-www-form-urlencoded になる (<form> タグの enctype 属性の初期値)
  23. JSON を POST する $ curl -H "Content-Type: application/json" \

    -d '{ "key" : "value" }' https://example.com コマンド Content-Type を -H (Header) で application/json と明 示することで、受け取るサーバ側がパラメータを JSON と して認識する。
  24. JSON ファイル を POST する $ curl -H "Content-Type: application/json"

    \ -d @params.json https://example.com コマンド 大きな JSON を POST したい場合は JSON ファイルを指定 することもできる。curl では @ファイル名 を付けるとファ イルを読み込むことができる
  25. BASIC 認証 $ curl -u id:password https://example.com コマンド ↓BASIC 認証以外に

    Digest 認証などを通したい場合 $ curl --digest -u id:password https://example.com $ curl --any-auth -u id:password https://example.com コマンド
  26. API キーを指定する $ curl -H 'Authorization: Bearer xxxxx' https://example.com コマンド

    よくある API キーを Header に指定してねという時は、-H オプションで Header を書くことができる。Header の指定 方法は API によって異なる
  27. よく使うオプション -d / --data : POST したいパラメータ -H / --header

    : リクエスト Header を指定する -u : BASIC 認証の ID Password を指定する curl 基本のまとめ
  28. curl をブラウザから作る Chrome の DevTool にある Network から実際にブラウザでリクエス トしたものを curl

    コマンドにすることができる
  29. jq の基本

  30. 値アクセスは . jq 'セレクタ' コマンド jq コマンドにセレクタを渡すことで任意の情報にアクセスすることができる。 jq '.user.name' #=>

    "zaru" コマンド { "user": { "name": "zaru" } } json . ドットで key を接続することでオブジェ クトの値にアクセスすることができる
  31. 配列は [] jq '.users[]' #=> "zaru" "mu" jq '.users[0]' #=>

    "zaru" コマンド { "users": [ "zaru", "mu" ] } json [] で配列要素にアクセスができる。0から 始まるインデックス番号を指定することも できる
  32. 整形は | と {} jq '.users[] | { key: .name

    }' { "key": "zaru" } { "key": "mu" } コマンド { "users": [ { "id": 1, "name": "zaru", "profile_image": "https://example.com/zaru.png", "address": "北海道" }, { "id": 2, "name": "mu", "profile_image": "https://example.com/mu.png", "address": "沖縄" } ] } json | (パイプ)でデータを渡して連携 できる。 {} で指定フォーマット にすることもできる
  33. curl の一歩先

  34. Cookie を送信する $ curl -b 'key=val; key2=val2;' https://example.com コマンド -b

    または --cookie オプションで、セミコロン区切りの key-value を送信することができる
  35. Cookie を保存する $ curl -c cookie.txt https://example.com コマンド サーバから返される Set-Cookie

    のデータを -c オプション で指定したファイルに保存することができる。主にログイン 時のセッションキーを保存するのに使ったりする $ cat cookie.txt # Netscape HTTP Cookie File # https://curl.haxx.se/docs/http-cookies.html # This file was generated by libcurl! Edit at your own risk. localhost FALSE / FALSE 0 key value 保存される Cookie ファイルの中身
  36. 保存した Cookie を送信する $ curl -b cookie.txt https://example.com コマンド -b

    オプションにファイル名を指定すると(正確には = が含 まれていないと)、-c オプションで保存したファイル形式 の Cookie を送信できる。大量の Cookie を送りたかったり する時に便利。
  37. ファイルをアップロードする $ curl -F file_name=@sample.png https://example.com コマンド -F または --form

    オプションでファイル名とファイルパス を指定することで Content-Type multipart/form-data で POST することができる(<form> タグの enctype multipart/form-data と同じ)。
  38. jq の一歩先

  39. .. で再起検索 jq '.. | .name?' コマンド JSON の中にあるはずだが、どの階層にあるのかが分からな いけど、とりあえず見つけたい。という時に使う。

    .. で再起的に探してくれるので、パイプで指定のキーを付け る。存在しないオブジェクトもあるので ? で null を無視す る
  40. 階層構造を表示 jq '[path(..) | map(if type=="number" then "[]" else tostring

    end) | join(".") | split(".[]") | join("[]")] | unique | map("."+.) | .[]' コマンド 魔法すぎる感じですが… JSON の階層構造を良い感じに表示 してくれる。これを読み解ければ jq マスターが近い!
  41. curl 番外編

  42. レスポンス速度を計測 $ curl https://example.com -s -o /dev/null \ -w "%{time_total}\n"

    コマンド -w オプションで curl のいろんな情報を変数指定で表示す ることができる。 time_total がレスポンス時間。 また、余計な出力をなくしたいので -s または --silent オプ ションでダウンロード進捗を消し、 -o または --output オ プションでダウンロードした内容を /dev/null の闇に放り 投げる。
  43. ベンチマークする $ for i in {1..10}; do curl https://example.com \

    -s -o /dev/null -w "%{time_total}\n"; end | \ awk '{sum+=$1;print $1} END {print "AVG: " sum/NR} コマンド 10回のリクエストを送り、出力されたレスポンスタイムを awk で平均値をとるコマンド例 awk 自体の解説はまたの今度に… NR は組み込み変数で行数を表します
  44. レスポンスヘッダのみ表示 $ curl -I http://example.com/ コマンド -I もしくは --head オプションでレスポンスヘッダのみ表示

    することができる。レスポンスボディが大きくて見にくい時 に使う
  45. URL は動的に変えられる $ curl http://example.com/[1-100].jpg $ curl https://example.com/{hoge,piyo,fuga}.jpg コマンド 表現は限られるが、[n-m]

    で連番、 {n,m} で指定ワードで URL を生成して連続でリクエストすることができる
  46. ありがとうございました! 次回は... 未定! 質問感想など呟いていただけると嬉しいです! - ハッシュタグ #mu_zaru - ツイッター情報 @mu_vpoe

    , @zaru チャンネル登録 Good ボタン お願いします! ムーザルちゃんねる