GAS에서 Qiita API를 사용하여 View · 좋아요 · 주식 수 목록을 얻으십시오.

자신의 투고의 View·좋아·스탁수를 일람으로 알고 싶다



하나하나 열어 보지 않으면 View는 모르고 스톡 수는 어디에도 표시되지 않는다.
무슨 일인가 하는 것으로, 승인 욕구를 채우는 세상에 얼마나 공헌하고 있는지 알기 위해서 Qiita API 를 접해 보았습니다.

준비



Chrome 확장 "Restlet Client"에서 적당히 두드려 보는 등 확인.
아무래도 사용자 인증하지 않으면 page_views_count 는 잡히지 않는 모양.

액세스 토큰 발급



설정 -> 애플리케이션 에서 발행할 수 있습니다.

실천



1.GAS 준비



매일 정보를 업데이트 할 수 있으면 좋겠다고 GAS를 이용합니다.
스프레드시트에 목록을 출력하기로 결정합니다.

또한 업데이트 날짜와 시간을 내보려고 하는 것으로 라이브러리 Moment.js를 이용하기로 합니다.
날짜 및 시간 유용한 라이브러리 "Moment.js"를 Google Apps Script에서 사용하는 방법

먼저 스프레드시트에 포맷을 만듭니다.

.gs
  //カラム番号
  const COL_TITLE  = 1;
  const COL_LATEST = 2;
  const COL_PV     = 3;
  const COL_LIKE   = 4;
  const COL_STOCK  = 5;
  const COL_UPDATE = 7;

  var sheet = SpreadsheetApp.getActiveSheet();
  //シート初期化
  sheet.clear();
  sheet.getRange(1, COL_TITLE).setValue("タイトル");
  sheet.getRange(1, COL_LATEST).setValue("最終更新");
  sheet.getRange(1, COL_PV).setValue("ビュー");
  sheet.getRange(1, COL_LIKE).setValue("いいね");
  sheet.getRange(1, COL_STOCK).setValue("ストック");
  var now = Moment.moment();
  sheet.getRange(1, COL_UPDATE).setValue("【確認日時】" + now.format('YYYY/MM/DD HH:mm:ss'));

이미지


2. 자신의 투고 목록



우선은 자신의 투고 일람을 취득합니다.
GET /api/v2/authenticated_user/items
요청 헤더에서 액세스 토큰을 전달합니다.

.gs
  //定義
  const QIITA_TOKEN  = 'XXXXXXXX';
  const API_ENDPOINT = 'https://qiita.com/api/v2';
  const API_MY_ITEMS = '/authenticated_user/items';

...

  //APIヘッダ
  var headers = {'Authorization' : 'Bearer ' + QIITA_TOKEN};
  var params = {'headers' : headers};

  //投稿一覧取得API
  var paramstr = "?per_page=100&page=1"; //★投稿が100件を超えたらページネーションしないといけない
  var res = UrlFetchApp.fetch(API_ENDPOINT + API_MY_ITEMS + paramstr, params);
  var json = JSON.parse(res.getContentText());
  json.forEach(function(item, i){
    sheet.getRange(i + 2, COL_TITLE).setValue(item["title"]);
    var latest = Moment.moment(item["updated_at"]);
    sheet.getRange(i + 2, COL_LATEST).setValue(now.diff(latest, 'd') + "日前").setHorizontalAlignment("right");
  });

이런 식으로 얻을 수있었습니다.
제목과 업데이트 날짜를 스프레드시트에 씁니다.
(갱신일은 「○일 전」과 날짜 계산)

덧붙여 한 번에 취득할 수 있는 것이 최대 100건(디폴트는 20건)이므로, 그것을 넘는 경우는 재귀적으로 API를 실행할 필요가 있습니다.
우선 이번은 생략.

3. 페이지뷰



투고 일람으로부터는 page_views_count 가 돌아오지 않는다 (null) 때문에, 투고 1건 1건에 대해서 상세를 취득하지 않으면 안됩니다.
GET /api/v2/items/:item_id
또한 인증되지 않은 경우에도 null로 반환되므로 요청 헤더에서 액세스 토큰을 전달해야합니다.

.gs
  //定義
...
  const API_ITEM_DTL = '/items';

...

  json.forEach(function(item, i){
...
    //投稿ごと詳細取得API
    var resdtl = UrlFetchApp.fetch(API_ENDPOINT + API_ITEM_DTL + "/" + item["id"], params);
    var jsondtl = JSON.parse(resdtl.getContentText());

    sheet.getRange(i + 2, COL_PV).setValue(jsondtl["page_views_count"]);
    sheet.getRange(i + 2, COL_LIKE).setValue(jsondtl["likes_count"]);
  });
likes_count 는 투고 일람의 응답에서도 취할 수 있으므로 어느 쪽이든.

4. 스톡 수



재고 수는 게시물을 보유하고 있는 사용자 목록에서 건수를 취합니다.
GET /api/v2/items/:item_id/stockers

.gs
  //定義
...
  const API_ITEM_DTL = '/items';
  const API_STOCKER  = '/stockers';

...

  json.forEach(function(item, i){
...
    //投稿ごとのストックユーザー取得API
    var resdtl = UrlFetchApp.fetch(API_ENDPOINT + API_ITEM_DTL + "/" + item["id"] + API_STOCKER, params);
    var count = resdtl.getAllHeaders()['total-count'];

    sheet.getRange(i + 2, COL_STOCK).setValue(count);
  });

응답 헤더의 total-count에 건수가 들어갑니다.
(페이지 네이션 때도 여기를 잡으면 총 건수를 알 수 있다)

5.GAS의 정기 실행



완성되면 트리거에 등록하고 완료.
GAS 편리하구나.

참고



Qiita API v2를 사용하여 자신의 모든 게시물을 내보내는 Python 스크립트를 작성했습니다.
GAS에서 외부 API와 연계(1/3)
Google 스프레드시트에서 GET/POST 통신을 통해 콘텐츠 검색
Google Apps Script UrlFetchApp에서 Http Header 설정
GAS에서 Moment.js 라이브러리를 사용하여 매우 스마트하게 날짜와 시간의 차이를 얻는 방법
Qiita에서 재고한 기사의 경향과 대책

좋은 웹페이지 즐겨찾기