これまでにPocketに登録したWebページの全URLを、Reeder 5のRead Laterに登録したい。
方法A(失敗)
最初にショートカットだけで動くモノを作ってみた。
ReederのRead Laterは空っぽではなく、Reederにだけ登録してPocketには登録していないページや、ReederとPocketの両方に登録したページなどが既に存在している。
なので、本来ならReeder側の方がアイテム数が多くなるはずなのだが、このショートカットを実行したところ、Pocket側のカウントが3,019なのに対してReeder側は2,886にしかならない。
それに、受け取った側のReederには、サイト名だけ表示されていてタイトルも本文のサニペットも表示されていないアイテムが多々あった。
そのタイトルもサニペットも表示されないアイテムをいくつか開いてみると、
- サーバーが見つからない(既にWebサイトが無くなっていてDNSにも登録されていない?)
- サーバーから応答が無い(DNSには登録されているが、もうサーバーは動いていない?)
- ページが見つからない(「そのページは存在しません。」「有効なページではありません。」など、HTTP 404 NOT FOUNDか?)
だった。
そこで、それら無効なページ抜きに有効なページだけを送るようにしようと思ったが、それはショートカットの仕組みだけでは無理そう。(例えば、HTTPレスポンスのステータス・コードを受け取る仕組みすら無さそう)
その辺りの処理をScriptableのRun Inline Scriptアクションでするショートカットも作ってみたが、そのアクションに許される時間がとてもシビアで安定して動くモノは作れなかった。(HTTPリクエストのタイムアウト設定が8秒だと必ずエラーになり、7.5秒でもしばらく処理を続けるとエラー、7秒でも数十分処理を続けてからエラー。7秒でも反応が遅いサイトには判定が厳しすぎる気がするので、これ以上縮める方向に進めるのは止めた。)
方法B(なんとかOkか?)
ショートカットをメインに使うのは諦めた。
代わりに、Scriptableをメインで使うことにした。
厄介な処理である「PocketからURL一覧をまとめてGet」や「Reeder 5のRead LaterにまとめてAdd」といった処理は、Scriptableからショートカットを呼び出してさせることにした。
Scriptableのスクリプト: Pocket to Read Later(Reeder5)
async function getFromShortcuts(shortcutName, input) { let cb = new CallbackURL("shortcuts://x-callback-url/run-shortcut") cb.addParameter("name", shortcutName) cb.addParameter("input", input) return await cb.open() } async function main() { const j = await getFromShortcuts("getItemsFromPocket", "") const a = JSON.parse(j.result) let items = []; if (typeof(a.items) == "string") { items[0] = a.items; } else { items = a.items; } let avlItems = [] let naServers = [] let nfPages = [] var req = new Request("http://example.com") req.timeoutInterval = 10 let c = 0 let avl = true for (const i of items) { avl = true req.url = i try { let result = await req.load() } catch(e) { // サーバーが見つからない・応答が無い avl = false naServers.push(i) } if (avl) { if (req.response.statusCode == "200") { avlItems.push(i) } else { // 404 not found & etc. nfPages.push(i) } } console.log(`${c = ++c} ${avlItems.length} ${naServers.length} ${nfPages.length}`) } let toShortcuts = {} toShortcuts.avlItems = avlItems toShortcuts.naServers = naServers toShortcuts.nfPages = nfPages const toShortcutsText = JSON.stringify(toShortcuts) const d = await getFromShortcuts("AddToReadLater", toShortcutsText) } main()
Scriptableから呼び出されるショートカット2つ
- getItemsFromPocket: https://www.icloud.com/shortcuts/f1da98ab6f004e918238aa5902ebc0ee
- AddToReadLater: https://www.icloud.com/shortcuts/a53f4ea46c9c414bba35b97f6502001c *2
処理は1.5時間ほどかかっただろうか?
- 読み込めたページ: 2,508
- サーバーが見つからない等: 188
- ページが見つからない等: 319
計3,015と4つ足りないが、まあいいか。
古いアイテムが上の方にあったりで、もしかしたら読み込んだURL一覧と逆順に追加した方が良いのかもしれないとも思った。
ただ、ショートカット・アプリだけで追加した上に、更にScriptableをメインに処理をしたもので追加したので、もう何がなんだか分からない。
今更、後の祭り。これで良しとする。
気になるのは、追加後のReederのRead Laterのアイテム数がぴったり3,000だったこと。3,000個までしか登録できないのかと思ったが、Safariのシェア・シートからのページ追加で3,001になり、ショートカット・アプリから一つ追加で3,002。偶然だったか?