[Elixir] Qiita 자신의 기사 내보내기

소개



  • Qiita 여름 축제 2020 온라인 라이브 방송에 가입했습니다
  • 패널 토론에서 "있는 것이 편리하다 ~"라고 말했던 내보내기 문제를 Elixir을 사용하여 작성했습니다.
  • 최대 10,000건까지 내보낼 수 있습니다(아마)
  • 자신의 기사가 그리 많지 않기 때문에 정말로 움직일지 어떨지는 미확인
  • 2020/12/20 현재 내 기사는 약 140 건이므로 시도한 결과 페이지 네이션이 제대로 작동하는지 확인했습니다.


  • Elixir은 1.11.2-otp-23을 사용합니다.

    0. 설치 및 프로젝트 만들기


  • 먼저 Elixir을 설치합시다.
  • 앞에 된장입니다만 설치 등을 참고해 주세요

  • 설치가 끝나면 다음 명령으로 프로젝트를 만듭니다
  • $ mix new qiita_export
    $ cd qiita_export
    

    1. 종속성 해결



    mix.exs
      defp deps do
        [
          {:httpoison, "~> 1.6"}, # add
          {:jason, "~> 1.2"} # add
        ]
      end
    
    $ mix deps.get
    

    2. 소스 코드 작성



    lib/qiita/api.ex
    defmodule Qiita.Api do
      @token "secret"
      @per_page 100
      @headers [Authorization: "Bearer #{@token}", Accept: "Application/json; Charset=utf-8"]
    
      def items_count(id \\ "torifukukaiou") do
        HTTPoison.get("https://qiita.com/api/v2/users/#{id}")
        |> decode_response()
        |> Jason.decode!()
        |> Map.get("items_count")
      end
    
      def items_by_page(page) do
        "https://qiita.com/api/v2/authenticated_user/items?page=#{page}&per_page=#{@per_page}"
        |> HTTPoison.get(@headers)
        |> decode_response()
        |> Jason.decode!()
      end
    
      def max_page(items_count) when rem(items_count, @per_page) == 0 do
        div(items_count, @per_page) |> min(100)
      end
    
      def max_page(items_count) do
        (div(items_count, @per_page) + 1) |> min(100)
      end
    
      defp decode_response({:ok, %HTTPoison.Response{body: body, status_code: 200}}) do
        body
      end
    
      defp decode_response(_), do: raise("")
    end
    
  • token은 직접 로그인 한 후 htps : // 코 m / 세친 gs / 아 p ぃ 카치 온 s에서 가져옵니다

  • qiita_export.ex
    defmodule QiitaExport do
      @user_id "torifukukaiou"
      def run do
        max_page = Qiita.Api.items_count(@user_id) |> Qiita.Api.max_page()
    
        1..max_page
        |> Enum.each(fn page ->
          Qiita.Api.items_by_page(page)
          |> Enum.each(fn %{"body" => body, "title" => title} ->
            File.write!(filename(title), body)
          end)
        end)
      end
    
      defp filename(title) do
        title
        |> String.replace("/", "_") # ファイル名に使えない文字があったらここで調整
        |> Kernel.<>(".md")
      end
    end
    
  • ( .md 괜찮습니까? )

  • 3. 실행


    $ iex -S mix
    
    iex> QiitaExport.run
    :ok
    

    Wrapping Up



  • Qiita 여름 축제 2020 온라인 라이브 방송은 다양한 이야기를 듣고 흥미 롭습니다.
  • 솔직히 말해서, 내가 쓴 【매일 자동 갱신】 Qiita의 Elixir LGTM 랭킹!에서 Qiita 오리지널 티셔츠
  • 수상은 할 수 없었습니다만, 또 다음도 있는 것 같습니다 때문에 그때까지 정진을 계속해 가고 싶다고 생각하고 있습니다
  • 기사를 투고할 수 있었으므로 좋겠습니다! 요시


  • Enjoy!!!
  • 좋은 웹페이지 즐겨찾기