Feedly APIでデータを取得する
動機
FeedlyをProで年次契約しているが、2019/12/8 に次の更新が来る RSS読まなくなったので、年次課金までにProを廃止したい https://gyazo.com/d2ef5408ef413f95d94febdf2525349f
(オチ)Pro機能で使っていたのは、BOARD機能じゃなく記事のマーカーだった。そっちはバックアップせずに課金日前日に解約しちゃったので失われた。
BOARDの一覧はFeedly API使えば情報とれそう
まずAPI Tokenを取得する
登録しているメールアドレスにリンクが届くのでそこからトークンを表示する(254文字あった)
APIトークンを使って試しにデータを取ってくる
code:feedly.py
import os
import requests
from pprint import pprint
def main():
headers = {
'Authorization': f'OAuth {FEEDLY_TOKEN}',
}
pprint(res.json())
if __name__ == '__main__':
main()
こんなデータが取れた
code:output.json
{'cardDetails': {...},
'client': 'feedly',
'dropboxConnected': False,
'email': 'shimizukawa@gmail.com',
'evernoteConnected': True,
'evernotePartialOAuth': True,
'evernoteUserId': 'xxxx',
'facebookConnected': False,
'familyName': 'Shimizukawa',
'fullName': 'Takayuki Shimizukawa',
...
APIのtagsで情報を取ってみる
それっぽいのが取れた
code:tags.json
[{'actionTimestamp': 1514690373555,
'id': 'user/4e8ee926-933b-40ab-ba74-579cd8143f43/tag/anova',
'label': 'anova'},
{'actionTimestamp': 1512776825730,
'id': 'user/4e8ee926-933b-40ab-ba74-579cd8143f43/tag/bitwarden',
'label': 'bitwarden'},
{'actionTimestamp': 1514682409106,
'id': 'user/4e8ee926-933b-40ab-ba74-579cd8143f43/tag/blockchain',
'label': 'blockchain'},
...
tagsのidを使ったらコンテンツが取れる?
streamIdに指定できるのはcategoryId feedId tagIdのどれか。
Stream APIのstreamIdにtagを指定してコンテンツを取得する
code:shell
取れた
code:contents.txt
{'id': 'user/4e8ee926-933b-40ab-ba74-579cd8143f43/tag/anova',
'items': [{'actionTimestamp': 1514690373555,
'type': 'text/html'}],
'crawled': 1457271372954,
'engagement': 1303,
'fingerprint': '7016c0ae',
'id': 'YjBcwwRwUI3bmah3YicEktb9s+WkuCJ1ihcrZMZUMq8=_1534c247c9a:c749fd8:ae8aca10',
'title': 'GIGAZINE'},
'published': 1457269200000,
'summary': {'conjtent': '<p>おいしいものを食べたいが、とにかく忙しくて時間がない、という人でも「材料を入れて放置するだけ」で料理を完成させることができるのが「スロークッカー」です。火を使わないので鍋を放置して外出してもOKで、「家を出る前にセット→夜帰ってきたらご飯ができてる!」という働く人にとってはうれしいアイテム。長時間かけてゆっくり過熱するので野菜やお肉を驚異的な柔らかさに仕上げることが可能で、さらにAmazon1位にもなったツインバードのスロークッカーなら3000円程度で購入できるとのことなので、実際に買ってその威力を確かめてみました。<p><b><a '
'direction': 'ltr'},
'tags': [{'id': 'user/4e8ee926-933b-40ab-ba74-579cd8143f43/tag/anova',
'label': 'anova'},
{'id': 'user/4e8ee926-933b-40ab-ba74-579cd8143f43/tag/global.read',
'label': ''},
{'id': 'user/4e8ee926-933b-40ab-ba74-579cd8143f43/tag/global.unsaved',
'label': 'Unsaved'},
{'id': 'user/4e8ee926-933b-40ab-ba74-579cd8143f43/tag/cook',
'label': 'cook'}],
'title': '「材料を入れて放置」で驚異的な柔らかさの角煮などが完成、わずか3000円の超便利家電「スロークッカー」の威力を試してみました',
'unread': False,
'visual': {'url': 'none'}},
取れたデータを眺めてみると BOARDS の情報ってないんだな
とりあえずタグ別コンテンツ数をカウントしてみた
code:feedly-tag-count.py
def main():
headers = {
'Authorization': f'OAuth {FEEDLY_TOKEN}',
}
tags = res.json()
for tag in tags:
headers=headers)
contents = res.json()
try:
except KeyError as e:
print('error:', tag)
出力結果
code:output.txt
anova 7
bitwarden 1
blockchain 2
blogネタ 1
board game 1
book 15
book publishing 10
book-archbook 2
book-tstp 20
car 3
cook 7
DDD 7
dev 12
diet 1
doc service 17
English study 6
fintech 1
git 5
error: {'id': 'user/4e8ee926-933b-40ab-ba74-579cd8143f43/tag/global.saved', 'actionTimestamp': 1533684921334}
go 4
google home 1
google search index 1
hiring 6
IoT 1
IPv6-DSLite 3
ml 20
programming教育 20
pyconjp 2
python 20
python tutorial 3
Remote work 5
sake 8
sphinx 1
sphinx-todo 6
talk, presentation 1
tool 12
tv-drama 3
Web front 2
wsl 3
なんか 9
カーナビ 20
不動産 1
型クラス 1
子育て 12
採用・人事 3
教育・学習 10
確定申告 2
言語ランキング 4
音声アシスタント 3
これで取得したコンテンツをScrapboxに流し込めばよさそう。
欲しい情報は、タイトル、リンク、日付、タグ、キーワード、コンテンツの一部(先頭100文字くらいをtag除去)、 くらいかな。
BOARDSのタグ名をページ名にして同じページにそれらを突っ込めばよさそう。
現状のコードがこちら(scrapboxに書き込み処理がまだ)
練習しすぎて、API rate limit に遭遇してしまった。
requests.exceptions.HTTPError: 429 Client Error: Too Many Requests for url: https://cloud.feedly.com/v3/tags
翌日以降に実行して、成功
最終的なコード