ポンコツエンジニアのごじゃっぺ開発日記。

いろいろポンコツだけど、気にするな。プログラム&ロボット大好きなポンコツが日々の記録を残していきます。 自動で収入を得られるサービスやシステムを作ることが目標!!

【GAS】Feedly APIを叩いてみたときのメモ

Googleリーダーが終了してから愛用しているFeedlyですが、最近APIを公開しているということを知ったので、ちょっと遊んでみました。そのメモを書いた記事です。

Feedlyとは

RSSリーダーで、使いやすすぎて神すぎて、Feedly Proプランに移行させてしまったくらい。めちゃくちゃおすすめなRSSリーダーです。

Feedly Cloud

そんなFeedlyがAPIを公開してくれています。

developer.feedly.com

特に、popularな記事を習得できたりもするので、そういうところで使いたいなって思っており、今回はまずは導入を試みてみました。

GAS

Google Apps Scriptの略で、ウェブブラウザ上でスクリプトを書いてサーバ上で動くもの。無料で定期実行だったりいろいろができるものですごい便利。無料というのがびっくりなサービスです。 Rubyとか そんな無料で遊べるGASを今回は使用します。

登録・導入

さて、はじめにAPIを使えるように登録を行います。 まずは、以下のURLからアクセスをして、refresh tokenだったりaccess tokenを習得することができます。

https://feedly.com/v3/auth/dev

上記URLからアクセスしてログインをすると、登録しているアカウントのメールアドレスに、トークン取得用のURLが届きます。 開くと、以下のような感じで、access tokenrefresh tokenが届きます。こちらはしっかりメモしておきましょう。 f:id:ponkotsu0605:20190930215234p:plain

リフレッシュトークンからアクセストークンの生成

さて、上の画像からもわかりますが、access tokenは1ヶ月しか有効期限がありません。一ヶ月ごとにトークンの生成をしてもいいのですが、めんどくさいですよね。そこで、refresh tokenからaccess tokenを生成する必要があります。 ドキュメントにも書いてありますが、refresh tokenからaccess tokenの生成はproに契約している人だけではありますが、ちょうど自分は有料会員だったので、こちらも試してみたいと思います。

Refreshing an access token

Authentication APIのRefreshing an access tokenという項目を利用します。

developer.feedly.com

ざっくりと説明すると、refresh_tokenを渡すことでaccess_tokenが返ってきます。

cliend_idとcliend_secret

APIのリクエストパラメータに必要なcliend_idcliend_secretですが、feedlydevを使いましょうと書いてあります。見つけるまでが大変だった。。

developer.feedly.com

GASでリクエストを投げるところを実装

では、さっそくリクエストを投げてみましょう。 /v3/auth/token に必要なパラメータをpostします。レスポンスはjsonでもらいます。という感じなリクエストです。

var baseUrl = 'https://cloud.feedly.com'
function getAccessToken() {
  var refreshToken = '[ここにrefresh tokenを貼り付ける]';

  var url = baseUrl + '/v3/auth/token'

  var data = {
    'client_id':'feedlydev',
    'client_secret':'feedlydev',
    'grant_type': 'refresh_token',
    'refresh_token': refreshToken,
  }
  var headers = {
    'Content-Type': 'application/json',
  };
  var options = {
    'method' : 'post',
    'headers' : headers,
    'payload' : JSON.stringify(data),
  };
  var response = JSON.parse(UrlFetchApp.fetch(url,options).getContentText());

  return response.access_token
}

refresh tokenを間違えると、 {"errorCode":403,"errorId":"ap13int-sv2.2019093006.371740","errorMessage":"bad refresh_token (check URL encoding)"} のような403のレスポンスが返ってくると思いますので、refresh tokenの再確認をお願いします。

他のAPIを叩いてみよう

access tokenの生成ができるようになったので、これで安心していろんなAPIが叩けますね。ということで、一つピックアップして叩いてみましょう。

Personal Collections API

一番基本的そうなAPIのPersonal Collections APIを今回はサンプルで叩いてみます。

developer.feedly.com

以下のようなプログラムを書いてみました。

function requestFeedlyGetApi(accessToken, api) {
  var url = baseUrl + api
  var headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + accessToken,
  };
  var options = {
    'method' : 'get',
    'headers' : headers,
  };
  var response = JSON.parse(UrlFetchApp.fetch(url,options).getContentText());

  return response
}

function getPersonalCollectionsFeedly(accessToken) {
  return requestFeedlyGetApi(accessToken, '/v3/collections')
}

function feedlyTest() {
  var accessToken = getAccessToken();
  
  var result = getPersonalCollectionsFeedly(accessToken);
  console.log(result[0].id);
  console.log(result[0].label);
}

実行するメソッドは feedlyTest() になります。 先程実装した getAccessToken() を利用してアクセストークンを取得して、それを用いてAPIを叩いています。 これを実行することで、自分が登録しているFeedlyのカテゴリだったりを取得することができるので、ここから feedId だったりを取得することができます。(feedIdってどこから手に入れるんだろうってめっちゃ探した。。)

出力例

ちなみに上のconsole.logで出力された結果の例は以下のような感じです。

user/[ここにuser_idが入る]/category/ブログ
ブログ

ここで出力された配列の0番目には、 ブログ と自分がfeedly上で設定したカテゴリのものが出力されました。なので、この形でfeedIdが定義されているようです。

今回紹介したサンプルプログラム

だらだらとプログラムの部分部分を紹介しましたが、では結合するとどうなるのか?以下のようになります。

var baseUrl = 'https://cloud.feedly.com'
function getAccessToken() {
  var refreshToken = '[リフレッシュトークンを貼り付ける]';

  var url = baseUrl + '/v3/auth/token'

  var data = {
    'client_id':'feedlydev',
    'client_secret':'feedlydev',
    'grant_type': 'refresh_token',
    'refresh_token': refreshToken,
  }
  var headers = {
    'Content-Type': 'application/json',
  };
  var options = {
    'method' : 'post',
    'headers' : headers,
    'payload' : JSON.stringify(data),
  };
  var response = JSON.parse(UrlFetchApp.fetch(url,options).getContentText());

  return response.access_token
}

function requestFeedlyGetApi(accessToken, api) {
  var url = baseUrl + api
  var headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + accessToken,
  };
  var options = {
    'method' : 'get',
    'headers' : headers,
  };
  var response = JSON.parse(UrlFetchApp.fetch(url,options).getContentText());

  return response
}

function getPersonalCollectionsFeedly(accessToken) {
  return requestFeedlyGetApi(accessToken, '/v3/collections')
}
function searchFeedsFeedly(accessToken, text) {
  return requestFeedlyGetApi(accessToken, '/v3/search/feeds?query=' + encodeURIComponent(text))
}

function getFeedlyEntries(accessToken, entryId) {
  return requestFeedlyGetApi(accessToken, '/v3/entries/' + entryId)
}

function getFeedlyMixes(accessToken, feedId) {
  return requestFeedlyGetApi(accessToken, '/v3/mixes/contents?streamId=' + encodeURIComponent(feedId))
}

function feedlyTest() {
  var accessToken = getAccessToken();
  
  var result = getPersonalCollectionsFeedly(accessToken);
  console.log(result[0].id);
  console.log(result[0].label);
}

このような感じになります。 ついでに、以下のAPIも実装しておきました。

  • Entries API
  • Mixes API
  • Search API

このような感じで書くことができます。

さいごに

さて、今回はgasでfeedly APIを使用する導入部分を紹介しました。あとは、ここからいろんなAPIを駆使して楽しむことができるかと思います。 特に、feedly apiの目玉の記事のengagementというパラメータが取得できるのは夢が広がる要素なのかなと思います。

engagement

ちなみに、engagementは以下のような説明が書いてあります。

Optional integer an indicator of how popular this entry is. The higher the number, the more readers have read, saved or shared this particular entry

すなわち、記事(エントリ)の人気度を示すインジケータで、この数値が大きいほど、他の人がこの記事を読んだり、保存したり、共有したり、人気のある記事だということがわかります。

本当にさいごに

さいごになのにたくさん書いちゃいましたが、これからfeedly apiでいろいろ遊んでみたいと思います!