API経由でpocketに投稿した記事を取得してみたけどRSSで十分だった

最近放置がちだったpocketを活用し始めました．Android端末で隙間時間にRSS消化して気になったものをpocketに投げておいて後でPCで読むという感じのブックマーク代わりな感じです．

ここに投稿したものを日毎に保存しておくと便利かもと試した記録です．

アプリケーション登録

まずはアプリケーション登録をする

Pocket: Developer API

記事が読めればいいので，permissionsは`Retrieve`
にした．登録すると，CONSUMER KEY が入手できる．

REQUEST TOKENを入手する

Pocket Developer
Program: Pocket Authentication API: Documentation

$ curl -H "Content-Type: application/json; charset=UTF-8" -X POST \
https://getpocket.com/v3/oauth/request \
-d '
{
"consumer_key" : "XXXX-XXXXXXXXXXXXXXXXXXXXXXXX",
"redirect_uri":"http://matoken.org/"
}
'

結果

code=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXX

アプリケーションをアカウントに紐付ける

ウェブブラウザで
`https://getpocket.com/auth/authorize?request_token=&redirect_uri=http://matoken.org/’
にアクセスしてアカウントにリクエストを許可する．urlは適当．

アクセストークンを入手する

$ curl -H "Content-Type: application/json; charset=UTF-8" -X POST \
https://getpocket.com/v3/oauth/authorize \
-d '
{
"consumer_key":"<CONSUMER_KEY>",
"code":"<REQUEST_TOKEN>"
}
'

結果

access_token=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXX&username=user%40example.com

投稿を取得する

Pocket Developer
Program: Pocket API: Retrieve

application/json で求める．とりあえず1件だけ(count'':1”)

$ curl -H "Content-Type: application/json; charset=UTF-8" -X POST \
https://getpocket.com/v3/get -d '
{
"consumer_key":"<CONSIMMER_KEY>",
"access_token":"<ACCESS_TOKEN>",
"count":1
}
' | jq
{
"status": 1,
"complete": 1,
"list": {
"2692971736": {
"item_id": "2692971736",
"resolved_id": "2692971736",
"given_url": "https://www.patreon.com/posts/29180933",
"given_title": "DUVET | 1041uuu on Patreon",
"favorite": "0",
"status": "0",
"time_added": "1565885008",
"time_updated": "1565885011",
"time_read": "0",
"time_favorited": "0",
"sort_id": 0,
"resolved_title": "",
"resolved_url": "https://www.patreon.com/posts/29180933",
"excerpt": "",
"is_article": "0",
"is_index": "0",
"has_video": "0",
"has_image": "0",
"word_count": "0",
"lang": "",
"domain_metadata": {
"name": "Patreon",
"logo": "https://logo.clearbit.com/patreon.com?size=800",
"greyscale_logo": "https://logo.clearbit.com/patreon.com?size=800&greyscale=true"
},
"listen_duration_estimate": 0
}
},
"error": null,
"search_meta": {
"search_type": "normal"
},
"since": 1565886741
}

application/x-www-form-urlencoded で求める．結果は同じでjson形式で帰ってくる．

$ curl -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" -X POST https://getpocket.com/v3/get -d \
"consumer_key=<CONSUMER_KEY>&access_token=<ACCES_TOKEN>&state=all&sort=oldest&detailType=symple&since=`date -d'1days ago' +%s`" | jq .

引数の意味はこんな感じ

state=all : 全ての投稿形式(既読未読の両方)

sort=oldest : 古いものから順に

detailType=simple : 基本的な情報

since=date -d'1days ago' +%s : 指定したUNIX
Time以降の記事を取得．取得する開始UNIX TimeをGNU coreutilsのdate
commandで過去1日(-d’1days ago’)時点のUNIX Time(+%s)を取得して指定

毎日前日分のpocket投稿titleとurlをDokuwikiに書き込み(Markdown形式)

$ sudo -u www-data crontab -l | grep wiki
0 0 1 * * mkdir -p /var/lib/dokuwiki/farm/wiki.matoken.org/data/pages/memo/`date +\%Y/%m`
2 0 * * * curl -s -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" -X POST https://getpocket.com/v3/get -d "consumer_key=87275-eea7fa53556961262450492d&access_token=27847a46-0ff9-f9a3-ea7f-31279b&state=all&sort=oldest&detailType=symple&since=`date -d'1days ago' +%s`" | jq -r '.list[] | [.given_title,.given_url] | @csv' | sed -e 's/^"/* [/' | sed -e 's/","/](/' | sed -e 's/"$/)/' | sed -e 's/^\[]/\[null]/' | sed '1s/^/\n/' >> /var/lib/dokuwiki/farm/wiki.matoken.org/data/pages/memo/`date +\%Y/\%m/\%F`.txt

1行目

0 0 1 * * : 毎月1日の00:00に実行

mkdir -p /var/lib/dokuwiki/farm/wiki.matoken.org/data/pages/memo/`date
+%Y/%m` : 月のディレクトリを掘る．%がエスケープされているのはcrontabの使用に合わせて．

1 0 * * * : 毎日 00:01 に実行

2行目

jq -r '.list[] | [.given_title,.given_url] | @csv' :
pocketからの結果からtitleとurlを抜き出してcsv形式で出力

sed -e 's/^"/* [/' | sed -e 's/","/](/' | sed -e 's/"$/)/' | sed -e 's/^\[]/\[null]/'
: markdownのリンクに変換

sed '1s/^/\n/' :
先頭行を空けないとmarkdownを認識しないようなので改行を入れる

/var/lib/dokuwiki/farm/wiki.matoken.org/data/pages/memo/`date +\%Y/\%m/\%F`.txt`
: 保存先，dokuwikiでは memo:2019:08:2019-08-16 のようになる

実はRSSで吐き出せる……

pocketのオプションのプライバシー管理の中にRSSフィードの項目が!

Pocket: プライバシー管理

これを公開にして「すべてのアイテムフィード」を取得すればやりたかったことが出来た……．

細かい制御をしたいならAPIのほうがいいと思いますが，今回自分がやりたかったのは毎日のバックアップだったので……．もう設定終わったからこれは見なかったことに．

$ rsstail -l -1 -n5 -H -u "http://getpocket.com/users/*sso1456706866592e34/feed/all"
Title: エロの秘密結社 ドシコルド EP.38　夢現のエモーション - 無料コミック ComicWalker
Link: https://comic-walker.com/viewer?tw=2&dlcl=ja&cid=KDCW_MF00000086010039_68&bs=1
Title: 次世代衛星向け「グリーン燃料」　月探査でも使用か　日米が開発競争
Link: https://sankei.com/life/news/190815/lif1908150010-n1.html
Title: ArchiveBox
Link: https://archivebox.io
Title: セキュリティ企業が管理する約2800万件の生体認証記録が流出していたことが判明
Link: https://gigazine.net/news/20190815-data-breach-biometric-security
Title: DUVET | 1041uuu on Patreon
Link: https://patreon.com/posts/29180933

環境

$ dpkg-query -W curl sed jq rsstail dokuwiki
curl 7.64.0-4
dokuwiki 0.0.20180422.a-2
jq 1.5+dfsg-2+b1
rsstail 1.8-1+b1
sed 4.7-1
$ lsb_release -dr
Description: Debian GNU/Linux 10 (buster)
Release: 10
$ uname -m
x86_64