Python
GoogleAppsScript

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


概要

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の実装では、トリガーを設定することで、自動で集計結果を取得できます。

間違い・指摘等があればコメントお願いします。


参考文献