15
14

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.

Google Apps ScriptからQiita APIを使って、Qiita:Teamのユーザーの投稿などを取得する

Last updated at Posted at 2016-06-17

Qiita:Teamのさまざまな統計情報などをQiita APIを使って得ることが出来ます。

前回はGoogle Apps ScriptからQiita APIを使って、Qiita:Teamの情報を得る方法(ユーザー一覧の入手) でQiita APIをGAS (Google Apps Script) から利用する手順と簡単な例としてユーザー一覧を取得しました。

今回は、ユーザーの投稿や投稿数を取得する方法を解説します。

Qiita APIの利用

Qiita APIを利用するための、アクセストークンの取得やGASでの設定などは、前回の投稿をご覧ください。今回もそこで解説したqiitaAPI()を利用します。

ユーザーの投稿の取得

ユーザーの投稿数は/api/v2/items(https://qiita.com/api/v2/docs#get-apiv2items) で取得できます。

自分のチームのURL (https経由) の/api/v2/itemsにGETアクセスすることで投稿一覧は得られます。パラメータを付けないと、該当のQiita:Teamの全ユーザーによる全投稿が得られますが、検索クエリを指定することでユーザーや投稿日などで絞り込むことも出来ます。

検索クエリはQiita:Teamで利用できる検索オプションが使えます。以下のようなオプションがあります。

項目 オプション
タイトルに「2015」を含んでいる title:2015
「Ruby」タグが付いている tag:Ruby
yaottiが作成した user:yaotti
2015-10-09以降に作成された created:>2015-10-09

利用可能なすべての検索オプションはヘルプに記載されています。

ここではユーザーごとの投稿を取得するため、user:検索オプションを用います。また、投稿日で絞り込みも行うため、created:オプションも指定します。

次のgetItems()では、ユーザーID (id) と投稿日の開始日 (startDate)、終了日 (endDate) で絞り込んで、その結果の投稿を取得しています。

getItems('yaotti', '2016-06-01', '2016-06-15')のように利用することを想定しています。これにより、ユーザーyaottiの2016年6月1日から2016年6月15日までの投稿が取得できます。

function getItems(id, startDate, endDate){
  /* ページネーションの設定として、1ページごと要素数は100、取得する要素は1ページ目のものとしています。 */
  var per_page = 100;
  var page = 1;
  var parameters = '?per_page=' + per_page + '&page=' + page;

  /* 検索クエリとして、IDと投稿日で絞り込みます。 */
  var queryString = 'user:' + id + '+created:>' + startDate + '+created:<' + endDate;
  
  queryString = 'query=' + encodeURI(queryString); // URLエンコーディング
  parameters += '&' + queryString; // ページネーションと合わせてパラメータを生成
  
  var response = qiitaAPI('https://チーム名.qiita.com/api/v2/items' + '?' + queryString, 'GET', '');
  var json = response.getContentText();
  var data = JSON.parse(json);
  
  var items = [];

  /* 最初のページの要素を取得 */
  for (i = 0; i < data.length; i++) {
    var item ={'id':data[i].id, 'created_at': data[i].created_at, 'userid': data[i].user.id}; // 例として、ID(投稿のID)と投稿日、ユーザーIDを取得しています
    items.push(item);
  }

  /* 総要素数を取得 */
  var headers = response.getHeaders();
  var total_count = headers['Total-Count'];

  /* 要素すべてを取得するために、2ページ目以降にアクセス */
  for (page = 2; total_count / per_page >= 1; page++) {
    var parameters = '?per_page=' + per_page + '&page=' + page + queryString;
    var response = qiitaAPI('https://チーム名.qiita.com/api/v2/items' + '?' + queryString, 'GET', '');
    var json = response.getContentText();
    var data = JSON.parse(json);
    var items = [];
  
    for (i = 0; i < data.length; i++) {
      var item ={'id':data[i].id, 'created_at': data[i].created_at, 'userid': data[i].user.id}; // ID(投稿のID)と投稿日、ユーザーIDを取得
      items.push(item);
    }
    total_count = total_count - per_page;
  }

  return items;
}

ここでは、例として、投稿IDと投稿日、ユーザーIDを取得していますが、その他にも/API/v2/itemsの解説にあるようなプロパティを取得できます。

ユーザーの投稿数の取得

単にユーザーの投稿数だけを取得したい場合には、APIにGETアクセスし得られるTotal-Countを取得します。

function getNumOfItemsPerId(id, startDate, endDate) {
  /* Total-Countを得られれば良いだけなので、ページネーションの設定として、1ページごと要素数は1、取得する要素は1ページ目のものとしています。 */
  var per_page = 1;
  var page = 1;
  var parameters = '?per_page=' + per_page + '&page=' + page;

  /* 検索クエリとして、IDと投稿日で絞り込みます。 */
  var queryString = 'user:' + id + '+created:>' + startDate + '+created:<' + endDate;
  
  queryString = 'query=' + encodeURI(queryString); // URLエンコーディング
  parameters += '&' + queryString; // ページネーションと合わせてパラメータを生成

  var response = qiitaAPI('https://チーム名.qiita.com/api/v2/items' + parameters, 'GET', '');

  var headers = response.getHeaders();
  return headers['Total-Count'];
  
}

このgetNumOfItemsPerId()を各ユーザーに対して呼び出すことで、ユーザーの期間ごとの投稿数などを把握できます。スプレッドシートで統計を取ったり、前の週の投稿数トップ10を週明けにSlackのチャンネルに投げるなどの応用ができます。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?