Googleリーダーが終了してから愛用しているFeedlyですが、最近APIを公開しているということを知ったので、ちょっと遊んでみました。そのメモを書いた記事です。
Feedlyとは
RSSリーダーで、使いやすすぎて神すぎて、Feedly Proプランに移行させてしまったくらい。めちゃくちゃおすすめなRSSリーダーです。
Feedly Cloud
そんなFeedlyがAPIを公開してくれています。
特に、popularな記事を習得できたりもするので、そういうところで使いたいなって思っており、今回はまずは導入を試みてみました。
GAS
Google Apps Scriptの略で、ウェブブラウザ上でスクリプトを書いてサーバ上で動くもの。無料で定期実行だったりいろいろができるものですごい便利。無料というのがびっくりなサービスです。 Rubyとか そんな無料で遊べるGASを今回は使用します。
登録・導入
さて、はじめにAPIを使えるように登録を行います。 まずは、以下のURLからアクセスをして、refresh tokenだったりaccess tokenを習得することができます。
https://feedly.com/v3/auth/dev
上記URLからアクセスしてログインをすると、登録しているアカウントのメールアドレスに、トークン取得用のURLが届きます。 開くと、以下のような感じで、access tokenとrefresh tokenが届きます。こちらはしっかりメモしておきましょう。
リフレッシュトークンからアクセストークンの生成
さて、上の画像からもわかりますが、access tokenは1ヶ月しか有効期限がありません。一ヶ月ごとにトークンの生成をしてもいいのですが、めんどくさいですよね。そこで、refresh tokenからaccess tokenを生成する必要があります。 ドキュメントにも書いてありますが、refresh tokenからaccess tokenの生成はproに契約している人だけではありますが、ちょうど自分は有料会員だったので、こちらも試してみたいと思います。
Refreshing an access token
Authentication APIのRefreshing an access tokenという項目を利用します。
ざっくりと説明すると、refresh_tokenを渡すことでaccess_tokenが返ってきます。
cliend_idとcliend_secret
APIのリクエストパラメータに必要なcliend_idとcliend_secretですが、feedlydevを使いましょうと書いてあります。見つけるまでが大変だった。。
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を今回はサンプルで叩いてみます。
以下のようなプログラムを書いてみました。
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でいろいろ遊んでみたいと思います!