LoginSignup
5
1

More than 1 year has passed since last update.

AdventCalendar2022タグがついた記事をQiita API v2を使わせていただいて取得することを楽しむ(Elixir)

Last updated at Posted at 2022-03-14

このたびはぬさも取りあへずたむけ山もみぢのにしき神のまにまに(菅公)

Advent Calendar 2022 73日目1の記事です。
I'm looking forward to 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
私のAdvent Calendar 2022 一覧


はじめに

Elixirを楽しんでいますか:bangbang::bangbang::bangbang:

AdventCalendar2022タグがついた記事を取得してみます。

AdventCalendar2022タグ

@kaizen_nagoya さんの記事である事実を知りました。

AdventCalendar2022タグが付いた記事の数が、AdventCalendar2021タグが付いた記事の数を超えたそうです。

Qiita API v2

Qiita API v2AdventCalendar2022タグがついた記事を取得してみます。
もちろん、Elixirで書きます。

GET /api/v2/items APIを使います。

adventcalendar2022.exs
Mix.install([:req])

Stream.iterate(1, &(&1 + 1))
|> Enum.reduce_while([], fn page, acc ->
  IO.puts(page)
  encoded_query = URI.encode_query(%{query: "tag:AdventCalendar2022", page: page, per_page: 100})

  %{body: body, headers: headers} =
    Req.get!("https://qiita.com/api/v2/items?#{encoded_query}",
      finch_options: [pool_timeout: 50000, receive_timeout: 50000]
    )

  total_count = headers |> Map.new() |> Map.get("total-count") |> String.to_integer()
  new_acc = body ++ acc

  {if(Enum.count(new_acc) >= total_count, do: :halt, else: :cont), new_acc}
end)
|> IO.inspect()

実行

Elixirは1.12 or laterをインストールしておいてください。

elixir adventcalendar2022.exs

結果は、Listで得られます。
List内の各要素は以下のようなMapです。
先頭のMapのみすべてのキーを書いています。

[
%{
  "body" => "**月見ればちぢにものこそ悲しけれわが身ひとつの秋にはあらねど**\n\nAdvent Calendar 2022 72日目[^1]の記事です。\nI'm looking forward to 12/25,2022 ...",
  "coediting" => false,
  "comments_count" => 0,
  "created_at" => "2022-03-13T22:48:32+09:00",
  "group" => nil,
  "id" => "e29ccaffa405ebdbc4c1",
  "likes_count" => 3,
  "page_views_count" => nil,
  "private" => false,
  "reactions_count" => 0,
  "rendered_body" => "<p><strong>月見ればちぢにものこそ悲しけれわが身ひとつの秋にはあらねど</strong></p>\n<p>Advent Calendar 2022 72日目<sup><a href=\"#fn-1\" id=\"fnref-1\">1</a></sup>の記事です。<br>\nI'm looking forward to 12/25,2022 ...",
  "tags" => [
    %{"name" => "Elixir", "versions" => []},
    %{"name" => "40代駆け出しエンジニア", "versions" => []},
    %{"name" => "autoracex", "versions" => []},
    %{"name" => "AdventCalendar2022", "versions" => []}
  ],
  "team_membership" => nil,
  "title" => "thenを読んでみる、見様見真似でマクロを書いて楽しむ(Elixir)",
  "updated_at" => "2022-03-14T22:11:45+09:00",
  "url" => "https://qiita.com/torifukukaiou/items/e29ccaffa405ebdbc4c1",
  "user" => %{
    "description" => "",
    "facebook_id" => "",
    "followees_count" => 437,
    "followers_count" => 137,
    "github_login_name" => nil,
    "id" => "torifukukaiou",
    "items_count" => 343,
    "linkedin_id" => "",
    "location" => "",
    "name" => "",
    "organization" => "",
    "permanent_id" => 131808,
    "profile_image_url" => "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/profile-images/1616590306",
    "team_only" => false,
    "twitter_screen_name" => "torifukukaiou",
    "website_url" => "https://www.torifuku-kaiou.tokyo/"
  }
},
%{...},
...
]

Enumモジュールでいろいろ整形したり、likes_countで並び替えたり、Enum.reduce/3で作者ごとのlikes_count数を集計したり、いろいろ楽しめます。

PATCH /api/v2/items/:item_idと組み合わせれば、記事の自動更新ができます。

そうだ!
以下を書きます。

  • LGTM数順に記事を並べる自動更新される記事
  • これを題材にEnumモジュールの連載を書こうとおもいます。

楽しみます。


Wrapping up :lgtm::lgtm::lgtm::lgtm::lgtm:

今回は、AdventCalendar2022タグが付いた記事の数が、AdventCalendar2021タグが付いた記事の数を超えたことを記念? して、Qiita API v2からAdventCalendar2022タグが付いた記事を取得するプログラムを作ってみました。
もちろんプログラミング言語は、Elixirを使いました。

Enjoy Elixir:bangbang::bangbang::bangbang:
$\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!

  1. @kaizen_nagoya さんの「「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 1日目 Most Breakthrough Generator」から着想を得て、模倣いたしました。

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