今回、QiitaのAPI v2を使用して人気の技術タグを取得し、railsのDBに保存していきます。こちらの画像のように人気のタグ上位100個をデータベースに保存していきます。タグの取得だけであれば認証不要でも問題ないそうです。ただし、1時間に60回以上APIを叩くと制限がかかるようなので気をつけてください。
参考URL
- https://qiita.com/api/v2/docs#%E3%82%BF%E3%82%B0
- https://ktmemo.herokuapp.com/post/8/
- https://qiita.com/tag1216/items/b0b90e30c7e581aa2b00
タグ用にモデルを作成
最初にタグを保存するためのモデルを作成していきます。SkillCategoryというモデル名にします。以下をコマンドで叩くとマイグレーションファイルが生成されます。技術タグ(Python,ruby)のカラムはNot NULLのuniqueで設定します。
rails g model SkillCategory tag_name:string
icon_url:string followers_count:integer items_count:integer
class CreateSkillCategories < ActiveRecord::Migration[6.0]
def change
create_table :skill_categories do |t|
t.string :tag_name, null: false, unique: true
t.string :icon_url
t.integer :followers_count
t.integer :items_count
t.timestamps
end
end
end
マイグレーションファイルを確認したら、rails db:migrateを実行。
rails db:migrate
schema.rbは以下のようになります。
schema.rb
create_table "skill_categories", force: :cascade do |t|
t.string "tag_name", null: false
t.string "icon_url"
t.integer "followers_count"
t.integer "items_count"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end
Qiita APIのタグ情報
/api/v2/tagsがタグ取得用のURIで以下の情報を取得できます。詳しくはQiita apiの公式ページをご確認ください。
- followers_count
- このタグをフォローしているユーザの数
- Example:
100
- Type: integer
- icon_url
- このタグに設定されたアイコン画像のURL
- Example:
"https://s3-ap-northeast-1.amazonaws.com/qiita-tag-image/9de6a11d330f5694820082438f88ccf4a1b289b2/medium.jpg"
- Type: null, string
- id
- タグを特定するための一意な名前
- Example:
"qiita"
- Type: string
- items_count
- このタグが付けられた記事の数
- Example:
200
- Type: integer
{"followers_count"=>128, "icon_url"=>"https://s3-ap-northeast-1.amazonaws.com/qiita-tag-image/33f7bc94654564c44e4d9f9a11513c27223a0db7/medium.jpg?1465429151", "id"=>"Microsoft", "items_count"=>593}
{"followers_count"=>300, "icon_url"=>"https://s3-ap-northeast-1.amazonaws.com/qiita-tag-image/20a2ec1b34c57bc5593a3a0b33520c713aa1b34b/medium.jpg?1479970375", "id"=>"ネットワーク", "items_count"=>589}
{"followers_count"=>203, "icon_url"=>"https://s3-ap-northeast-1.amazonaws.com/qiita-tag-image/43d617ffa96ca2d38a591bf12b7f689e9a0a3dfd/medium.jpg?1515775968", "id"=>"PHPUnit", "items_count"=>589}
{"followers_count"=>294, "icon_url"=>"https://s3-ap-northeast-1.amazonaws.com/qiita-tag-image/fcf5e589ece6308c73ee7a1155dfd1b0a8ea2436/medium.jpg?1438800208", "id"=>"関数型プログラミング", "items_count"=>588}
{"followers_count"=>355, "icon_url"=>"https://s3-ap-northeast-1.amazonaws.com/qiita-tag-image/6adc95ed7187649fc3fcc973ca4ca84e27bb8202/medium.jpg?1501235634", "id"=>"設計", "items_count"=>586}
seed.rbファイルを編集
seed.rbはデータベースに初期データを投入するためのコードを記述するファイルです。デフォルトのコメント部分を見ると例が書いてあります。今回、人気のタグ上位100個をデータベースに保存したいので、/api/v2/tagsをエンドポイントとして一番最初のページを取得するので変数pageに1を代入。取得する要素の数を100にしたいので変数PER_PAGEに100を代入。記事数が多い順にタグを取得したいのでsort=countとします。Net::HTTPは転送プロトコル HTTP を扱うライブラリで、今回はgetリクエストを使用します。JSON.parse()の引数にJSONデータを指定することで、オブジェクトデータに変換してくれます。parseをしたらfor文でループ、SkillCategory.create(この一文でQiita APIで取得したタグ情報をデータベースに保存してくれます。seed.rbファイルにコードを記述したらコマンドでrails db:seedを実行。
seed.rb
# This file should contain all the record creation needed to seed the database with its default values.
# The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup).
#
# Examples:
#
# movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }])
# Character.create(name: 'Luke', movie: movies.first)
PER_PAGE = "100"
page = "1"
url = "https://qiita.com/api/v2/tags?page=" + page + "&per_page=" + PER_PAGE + "&sort=count"
uri = URI.parse(url)
response = Net::HTTP.get(uri)
results = JSON.parse(response)
puts results
for result in results do
SkillCategory.create(tag_name: result["id"],icon_url: result["icon_url"],followers_count: result["followers_count"],items_count: result["items_count"])
end
rails consoleでタグ情報が保存されたか確認
実際のタグ情報がデータベースに保存されたかコンソールで確認します。SkillCategory.allを実行するとタグ情報の一覧を取得。これでデータベースのQiita APIを使用して取得したタグ情報をデータベースに保存できたことを確認しました。
rails c
SkillCategory.all
SkillCategory Load (3.2ms) SELECT "skill_categories".* FROM "skill_categories" LIMIT $1 [["LIMIT", 11]]
=> #<ActiveRecord::Relation [#<SkillCategory id: 1, tag_name: "Python", icon_url: "https://s3-ap-northeast-1.amazonaws.com/qiita-tag-...", followers_count: 75656, items_count: 41142, created_at: "2020-05-17 07:09:38", updated_at: "2020-05-17 07:09:38">, #<SkillCategory id: 2, tag_name: "JavaScript", icon_url: "https://s3-ap-northeast-1.amazonaws.com/qiita-tag-...", followers_count: 74618, items_count: 33950, created_at: "2020-05-17 07:09:38", updated_at: "2020-05-17 07:09:38">, #<SkillCategory id: 3, tag_name: "Ruby", icon_url: "https://s3-ap-northeast-1.amazonaws.com/qiita-tag-...", followers_count: 41587, items_count: 27051, created_at: "2020-05-17 07:09:38", updated_at: "2020-05-17 07:09:38">, #<SkillCategory id: 4, tag_name: "Rails", icon_url: "https://s3-ap-northeast-1.amazonaws.com/qiita-tag-...",
現在、nuxtとrailsで個人開発をしています。その過程で技術タグが必要になったので、Qiita APIを使用してみました。一年ぶりにrailsを触ると新しい発見が多い、おかげさまでおうち時間を満喫できています。