風をいたみ岩打つ波のおのれのみくだけてものを思ふ頃かな
Advent Calendar 2022 100日目1の記事です。
I'm looking forward to 12/25,2022
私のAdvent Calendar 2022 一覧。
はじめに
Elixirを楽しんでいますか
この記事は、Elixirタグ付きで登録されている記事をElixirのプログラムで取得してみます。
もちろんElixirを使います。
プログラム
さっそくプログラムです。
どうぞ〜。
ファイル名はsample.exs
にしています。
Mix.install([:req], force: true)
tag = "Elixir"
Stream.iterate(1, &(&1 + 1))
|> Enum.reduce_while([], fn page, acc ->
IO.puts("page: #{page}")
%{body: body, status: 200, headers: headers} =
URI.encode_query(%{query: "tag:#{tag}", per_page: 100, page: page})
|> then(fn query -> "https://qiita.com/api/v2/items?#{query}" end)
|> Req.get!(pool_timeout: 50000, receive_timeout: 50000)
total_count =
headers
|> Enum.find(fn {key, _} -> key == "total-count" end)
|> elem(1)
|> String.to_integer()
if total_count > (page * 100) do
{:cont, body ++ acc}
else
{:halt, body ++ acc}
end
end)
|> Enum.sort_by(fn %{"likes_count" => likes_count} -> likes_count end, :desc)
|> Jason.encode!(pretty: true)
|> then(&File.write!("output.json", &1))
実行
上記の通り、sample.exs
を作ってみましょう。
実行してみましょう。
Elixirをインストールしていない方のためにDockerでの実行方法も書いておきます。
2022/04/17現在、約2,700件弱、Elixirタグの付いた記事がQiitaに登録されています。
そのため、page: 27
となったところでAPIコールは停止します。
この27回を前提にすると、APIの利用制限は以下のようになっておりますので、現時点では認証なしでもすべての記事を取得できます。
認証している状態ではユーザごとに1時間に1000回まで、認証していない状態ではIPアドレスごとに1時間に60回までリクエストを受け付けます。
Docker
docker pull hexpm/elixir:1.13.4-erlang-23.0.2-debian-bullseye-20210902
docker run --rm -w /app -v `pwd`:/app hexpm/elixir:1.13.4-erlang-23.0.2-debian-bullseye-20210902 mix local.hex --force && elixir sample.exs
Elixirインストールしているよ
elixir sample.exs
macOS Catalina 10.15.7
Elixir 1.13.1 (compiled with Erlang/OTP 24)
Wrapping up
この記事は、Elixirタグ付きで登録されている記事をElixirのプログラムで取得してみることを楽しんでみました。
区切りの私のAdvent Calendar 2022 100日目の記事はこんなところで終わります。
Enjoy Elixir
$\huge{Enjoy\ Elixir🚀}$
以上です。
I organize autoracex.
And I take part in NervesJP, fukuoka.ex, EDI, tokyo.ex, Pelemay.
I hope someday you'll join us.
We Are The Alchemists, my friends!
We appreciate this shoutout, Torifuku! pic.twitter.com/dThmJg4CYN
— ClickUp (@clickup) April 11, 2022