LoginSignup
24
15

More than 5 years have passed since last update.

【Qiita API】いいね!閲覧数の自動集計

Last updated at Posted at 2019-02-06

概要

Qiita APIを叩き、いいね数閲覧数を取得する。
Pythonで、出力結果をCSVファイルに保存する方法を実装しました。
GASで、集計結果のレコードを、スプレッドシートに追記する方法を実装しました。

cURL

cURLでAPIを叩いてみる。

1 . ユーザの管理画面より、アクセストークンを取得する。
スコープは、read_qiitawrite_qiitaにする。

2 . 公式ドキュメントより、認証中のユーザの記事の一覧を取得する。

cURL
curl -H 'Authorization: Bearer [アクセストークン]'\
         https://qiita.com/api/v2/authenticated_user/items
出力例
[
  {
    "rendered_body": "<h1>Example</h1>",
    "body": "# Example",
    "coediting": false,
    "comments_count": 100,
    "created_at": "2000-01-01T00:00:00+00:00",
    "group": {
      "created_at": "2000-01-01T00:00:00+00:00",
      "id": 1,
      "name": "Dev",
      "private": false,
      "updated_at": "2000-01-01T00:00:00+00:00",
      "url_name": "dev"
    },
    "id": "4bd431809afb1bb99e4f",
    "likes_count": 100,
    "private": false,
    "reactions_count": 100,
    "tags": [
      {
        "name": "Ruby",
        "versions": [
          "0.0.1"
        ]
      }
    ],
    "title": "Example title",
    "updated_at": "2000-01-01T00:00:00+00:00",
    "url": "https://qiita.com/yaotti/items/4bd431809afb1bb99e4f",
    "user": {
      "description": "Hello, world.",
      "facebook_id": "yaotti",
      "followees_count": 100,
      "followers_count": 200,
      "github_login_name": "yaotti",
      "id": "yaotti",
      "items_count": 300,
      "linkedin_id": "yaotti",
      "location": "Tokyo, Japan",
      "name": "Hiroshige Umino",
      "organization": "Increments Inc",
      "permanent_id": 1,
      "profile_image_url": "https://si0.twimg.com/profile_images/2309761038/1ijg13pfs0dg84sk2y0h_normal.jpeg",
      "team_only": false,
      "twitter_screen_name": "yaotti",
      "website_url": "http://yaotti.hatenablog.com"
    },
    "page_views_count": 100
  }
]

likes_countpage_views_countより、「いいね!」の数閲覧数を取得できる。
しかし、実際にcURLを叩いてみると、"page_views_count": nullが返ってくる。

3 . 閲覧数を取得するため、記事を取得するAPIを叩く。

cURL
curl -H 'Authorization: Bearer [アクセストークン]'\
         https://qiita.com/api/v2/items/[記事のID]
出力例
{
  "rendered_body": "<h1>Example</h1>",
  "body": "# Example",
  "coediting": false,
  "comments_count": 100,
  "created_at": "2000-01-01T00:00:00+00:00",
  "group": {
    "created_at": "2000-01-01T00:00:00+00:00",
    "id": 1,
    "name": "Dev",
    "private": false,
    "updated_at": "2000-01-01T00:00:00+00:00",
    "url_name": "dev"
  },
  "id": "4bd431809afb1bb99e4f",
  "likes_count": 100,
  "private": false,
  "reactions_count": 100,
  "tags": [
    {
      "name": "Ruby",
      "versions": [
        "0.0.1"
      ]
    }
  ],
  "title": "Example title",
  "updated_at": "2000-01-01T00:00:00+00:00",
  "url": "https://qiita.com/yaotti/items/4bd431809afb1bb99e4f",
  "user": {
    "description": "Hello, world.",
    "facebook_id": "yaotti",
    "followees_count": 100,
    "followers_count": 200,
    "github_login_name": "yaotti",
    "id": "yaotti",
    "items_count": 300,
    "linkedin_id": "yaotti",
    "location": "Tokyo, Japan",
    "name": "Hiroshige Umino",
    "organization": "Increments Inc",
    "permanent_id": 1,
    "profile_image_url": "https://si0.twimg.com/profile_images/2309761038/1ijg13pfs0dg84sk2y0h_normal.jpeg",
    "team_only": false,
    "twitter_screen_name": "yaotti",
    "website_url": "http://yaotti.hatenablog.com"
  },
  "page_views_count": 100
}

アクセストークンを設定しない場合、page_views_countnullになる。

Pythonで実装

1 . 認証中のユーザの記事の一覧を取得し、閲覧数を取得するため、記事を取得するAPIを叩く。

いいね!閲覧数の取得
import requests
import json

url = 'https://qiita.com/api/v2/authenticated_user/items'
headers = {"content-type": "application/json",
           "Authorization": "Bearer [アクセストークン]"}

res = requests.get(url, headers=headers)
list = res.json()

for item in list:
  item_id = item['id']
  title = item['title']
  likes_count = item['likes_count']

  url = 'https://qiita.com/api/v2/items/' + item_id
  res = requests.get(url, headers=headers)
  json = res.json()
  page_views_count = json['page_views_count']

  print(title, page_views_count, likes_count)
出力結果
【Django】Hello World 110 0
【JWT】 入門 187 3
【JS】setTimeoutを用いた、非同期処理入門 385 3

2 . 出力結果をCSVファイルに書き込む。

CSVファイルに書き込み
import requests
import json
import csv

url = 'https://qiita.com/api/v2/authenticated_user/items'
headers = {"content-type": "application/json",
           "Authorization": "Bearer [アクセストークン]"}

res = requests.get(url, headers=headers)
list = res.json()


with open('qiita.csv', 'w') as f:
  for item in list:
    item_id = item['id']
    title = item['title']
    likes_count = item['likes_count']

    url = 'https://qiita.com/api/v2/items/' + item_id
    res = requests.get(url, headers=headers)
    json = res.json()
    page_views_count = json['page_views_count']

    print([title, page_views_count, likes_count])

    writer = csv.writer(f, lineterminator='\n')
    writer.writerow([title, page_views_count, likes_count])
qiita.csv
【Django】Hello World,110,0
【JWT】 入門,187,3
【JS】setTimeoutを用いた、非同期処理入門,385,3

GASで実装

定期実行するため、GASで実装する。

1 . 認証中のユーザの記事の一覧を取得し、閲覧数を取得するため、記事を取得するAPIを叩く。

いいね!閲覧数の取得
function myFunction() {
  var url = 'https://qiita.com/api/v2/authenticated_user/items'
  var option = {
    headers : {
      'Authorization' : 'Bearer [アクセストークン]'
    },
    method : 'get'
  }
  var res = UrlFetchApp.fetch(url, option)
  var list = JSON.parse(res.getContentText())

  for(var i=0; i<list.length; i++) {
    var item = list[i]

    var item_id = item['id']
    var title = item['title']
    var likes_count = item['likes_count']

    url = 'https://qiita.com/api/v2/items/' + item_id
    res = UrlFetchApp.fetch(url, option)
    var json = JSON.parse(res.getContentText())
    var page_views_count = json['page_views_count']

    Logger.log(title)
    Logger.log(likes_count)
    Logger.log(page_views_count)
  }
}
出力結果
【Django】Hello World
0.0
110.0
【JWT】 入門
3.0
187.0
【JS】setTimeoutを用いた、非同期処理入門
3.0
385.0

2 . 出力結果を集計したレコードを、スプレッドシートに追加する。

集計したレコードをスプレッドシートに追加
function myFunction() {
  var url = 'https://qiita.com/api/v2/authenticated_user/items'
  var option = {
    headers : {
      'Authorization' : 'Bearer [アクセストークン]'
    },
    method : 'get'
  }
  var res = UrlFetchApp.fetch(url, option)
  var list = JSON.parse(res.getContentText())

  var page_views_count = 0
  var likes_count = 0

  for(var i=0; i<list.length; i++) {
    var item = list[i]

    var item_id = item['id']
    likes_count += item['likes_count']

    url = 'https://qiita.com/api/v2/items/' + item_id
    res = UrlFetchApp.fetch(url, option)
    var json = JSON.parse(res.getContentText())
    page_views_count += json['page_views_count']
  }

  var spreadsheet = SpreadsheetApp.openById('[キー]')
  var sheet = spreadsheet.getSheetByName('[シート名]')
  sheet.appendRow([new Date(), list.length, likes_count, page_views_count])

}

実行結果は、以下のようになる。

スクリーンショット 2019-02-07 3.45.25.png

3 . 1日1回集計するトリガーを作成する。

スクリーンショット 2019-02-07 4.01.13.png

スクリーンショット 2019-02-07 4.02.38.png

4 . 各記事のいいね数閲覧数もまた、集計する。

記事毎の集計をスプレッドシートに追加
function myFunction() {  
  var url = 'https://qiita.com/api/v2/authenticated_user/items'
  var option = {
    headers : {
      'Authorization' : 'Bearer [アクセストークン]'
    },
    method : 'get'
  }
  var res = UrlFetchApp.fetch(url, option)
  var list = JSON.parse(res.getContentText())
  lest = list.reverse()  // 降順から昇順に変更

  var sum_likes_count = 0
  var sum_page_views_count = 0

  var now = new Date()
  var record_title = ['日付']
  var record_likes_count = [now]
  var record_page_views_count = [now]

  for(var i=0; i<list.length; i++) {
    var item = list[i]
    var item_id = item['id']
    var title = item['title']
    var likes_count = item['likes_count']

    url = 'https://qiita.com/api/v2/items/' + item_id
    res = UrlFetchApp.fetch(url, option)
    var json = JSON.parse(res.getContentText())
    var page_views_count = json['page_views_count']

    sum_likes_count += likes_count
    sum_page_views_count += page_views_count

    record_title.push(title)
    record_likes_count.push(likes_count)
    record_page_views_count.push(page_views_count)
  }
  var spreadsheet = SpreadsheetApp.openById('[キー]')
  var sheet = spreadsheet.getSheetByName('sum')
  sheet.appendRow([new Date(), list.length, sum_likes_count, sum_page_views_count])
  sheet = spreadsheet.getSheetByName('likes_count')
  sheet.getRange('1:1').clear()
  sheet.getRange(1,1,1,record_title.length).setValues([record_title])
  sheet.appendRow(record_likes_count)
  sheet = spreadsheet.getSheetByName('page_views_count')
  sheet.getRange('1:1').clear()
  sheet.getRange(1,1,1,record_title.length).setValues([record_title])
  sheet.appendRow(record_page_views_count)
}

記事毎のいいね数の集計は、以下のようになる。

スクリーンショット 2019-02-07 6.16.00.png

記事毎の閲覧数の集計は、以下のようになる。

スクリーンショット 2019-02-07 6.16.11.png

まとめ

PythonとGASで、いいね数・閲覧数を取得を実装しました。
GASの実装では、トリガーを設定することで、自動で集計結果を取得できます。
間違い・指摘等があればコメントお願いします。

参考文献

24
15
1

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
24
15