7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Qiita API v2 で記事取得する (Ruby)

Last updated at Posted at 2019-04-21

@koshi_life です。

DB検証用にある程度まとまったデータが欲しかったので、
Qiita API v2で過去記事を取得するコードをRubyで書いてみました。

前提

  • ruby v2.6

書いたコード

qiita_api_manager.rb
# coding: utf-8
require 'net/http'
require 'json'

class QiitaApiManager
  PER_PAGE = 100
  ACCESS_TOKEN = '<YOUR ACCESS TOKEN>'
  GET_ITEMS_URI = 'https://qiita.com/api/v2/items'

  def self.search(query, page: 1)
    puts "API Search Condition: query:'#{query}', page:#{page}"

    # リクエスト情報を作成
    uri = URI.parse (GET_ITEMS_URI)
    uri.query = URI.encode_www_form({ query: query, per_page: PER_PAGE, page: page })
    req = Net::HTTP::Get.new(uri.request_uri)
    req['Authorization'] = "Bearer #{ACCESS_TOKEN}"

    # リクエスト送信
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    res = http.request(req)

    # 次ページを計算 (API仕様 上限は100ページ)
    total_page = ((res['total-count'].to_i - 1) / PER_PAGE) + 1
    total_page = (total_page > 100) ? 100 : total_page
    next_page = (page < total_page) ? page + 1 : nil

    # API 残り使用回数、リセットされる時刻を表示
    puts "API Limit:#{res['rate-remaining']}/#{res['rate-limit']}, reset:#{Time.at(res['rate-reset'].to_i)}"

    # 返却 [HTTPステータスコード, 次ページ, 記事情報の配列]
    return res.code.to_i, next_page, JSON.parse(res.body)
  end
end

利用例

.rb
query = 'created:>=2019-04-01 created:<=2019-04-01' # 参考 検索時に利用できるオプション
status, next_page, items = QiitaApiManager.search(query)
items.each {|item| puts "[#{item['created_at']}] #{item['user']['id']} wrote '#{item['title']}'"}

出力結果

.txt
API Search Condition: query:'created:>=2019-04-01 created:<=2019-04-01', page:1
API Limit:644/1000, reset:2019-04-21 21:32:55 +0900
[2019-04-02T08:53:37+09:00] tech_kitara wrote 'ポート管理表+パラメータ表+Jinja2テンプレートから、L2SWのConfigを自動生成してみた'
[2019-04-02T08:51:20+09:00] takeshikondo wrote 'Django + GCP (GAE, Vision API, Translate API, Cloud Storage, Cloud Firestore) で画像アプリをデプロイする。 '
[2019-04-02T08:17:05+09:00] V_PG_N wrote '初めてのオリジナルWebサービス'
[2019-04-02T08:00:14+09:00] kai_kou wrote 'macOS Mojave 10.14.4のSafariがカスタムカラー設定に対応しているWebサイトでダークモードに対応したらしいので試してみた'
[2019-04-02T07:44:18+09:00] Mizu_e wrote 'Sass(Scss)  学習記録'
...

https://qiita.com/api/v2/docs#get-apiv2items
記事の一覧を作成日時の降順で返します。

4/1の作成日時を対象とした条件で記事検索をしてみましたが、
4/2 8時台(日本時刻)が入っているということは、日時検索条件はUTC時刻を元に行われるっぽいですね。推測です。(API仕様には記載なし)

参考

HEADER: date Sat, 21 Apr 2019 21:00:00 GMT
HEADER: content-type application/json; charset=utf-8
HEADER: transfer-encoding chunked
HEADER: connection close
HEADER: server nginx
HEADER: x-frame-options SAMEORIGIN
HEADER: x-xss-protection 1; mode=block
HEADER: x-content-type-options nosniff
HEADER: x-download-options noopen
HEADER: x-permitted-cross-domain-policies none
HEADER: referrer-policy strict-origin-when-cross-origin
HEADER: link <https://qiita.com/api/v2/items?page=1&query=created%3A%3E%3D2019-04-01+created%3A%3C%3D2019-04-01>; rel="first", <https://qiita.com/api/v2/items?page=2&query=created%3A%3E%3D2019-04-01+created%3A%3C%3D2019-04-01>; rel="next", <https://qiita.com/api/v2/items?page=3&query=created%3A%3E%3D2019-04-01+created%3A%3C%3D2019-04-01>; rel="last"
HEADER: total-count 314
HEADER: etag W/"xxxxxxxxxxxxx"
HEADER: cache-control max-age=0, private, must-revalidate
HEADER: rate-limit 1000
HEADER: rate-remaining 644
HEADER: rate-reset 1555849975
HEADER: vary Origin
HEADER: x-runtime 0.379955
HEADER: strict-transport-security max-age=2592000
HEADER: x-request-id xxxx-xxx-xxx-xxx-xxx
7
8
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
7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?