Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

qiita

stage1/qiita.livemd

qiita

Mix.install([
  {:req, "~> 0.3"},
  {:kino_vega_lite, "~> 0.1"},
  {:kino_explorer, "~> 0.1.11"},
  {:kino, "~> 0.10.0"}
])

Section

defmodule Qiita do
  @auth_header {"Authorization", "Bearer 1ad5804d4f290b6f015ebb122f70f530bb94299e"}
  def get_articles(page) do
    "https://qiita.com/api/v2/authenticated_user/items?page=#{page}&per_page=100"
    |> Req.get!(headers: [@auth_header])
    |> Map.get(:body)
  end

  def get_articles_cyclic(page) do
    IO.inspect("get page #{page}")
    :timer.sleep(1000)
    articles = get_articles(page)

    case articles do
      [] ->
        IO.inspect("stop")
        articles

      _ ->
        articles ++ get_articles_cyclic(page + 1)
    end
  end

  def get_all_articles() do
    get_articles_cyclic(1)
  end
end

all_articles = Qiita.get_articles(1)
# IO.inspect(articles)
Enum.count(all_articles)

# all_articles = Qiita.get_all_articles()
# Enum.count(all_articles)
qiita_df =
  all_articles
  |> Enum.map(fn item ->
    %{
      "title" => item["title"],
      "private" => item["private"],
      "created_at" => NaiveDateTime.from_iso8601!(item["created_at"]),
      "page_views_count" => item["page_views_count"],
      "likes_count" => item["likes_count"],
      "likes_rate" => item["likes_count"] / item["page_views_count"],
      "stocks_count" => item["stocks_count"],
      "stocks_rate" => item["stocks_count"] / item["page_views_count"],
      "tags" => item["tags"] |> Enum.map(& &1["name"]) |> Enum.join(","),
      "length" => item["body"] |> String.length()
    }
  end)
  |> Explorer.DataFrame.new()
  |> Explorer.DataFrame.select([
    "title",
    "private",
    "created_at",
    "page_views_count",
    "likes_count",
    "likes_rate",
    "stocks_count",
    "stocks_rate",
    "tags",
    "length"
  ])

Kino.DataTable.new(qiita_df)