Web Analytics Made Easy -
StatCounter

めモらンだム・ヤード

自分用のアプリ設定やスクリプト類の備忘録・覚え書き(Memorandum) / 作った物のライセンスはCC BY-NC-SAで。 / 内容が古いまま、間違ったまま、書いている途中、途中で放置など、手入れはあまり行き届いていない庭 / 対象の仕様変更で動かなくなったもの多々。WorkFlowy向けは全滅したので削除 / 製作物のインストール及び使用は各自の責任で。使用によって、利用者および第三者に損害が発生したとしても、当方は一切責任を負いかねます

Pocketに登録したWebページURLをReeder 5のRead Laterに送るScriptableスクリプトとAppleショートカット

f:id:sorashima:20210327160642j:plain:w215
Pocketだと登録したページのタイトルが表示されないことがある。

f:id:sorashima:20210327160703j:plain:w371
そんなサイトも、ReederにビルトインなRead Laterサービスだとタイトルが表示される。

f:id:sorashima:20210327162345j:plain:w322
Instapaperでもタイトルは表示されるが、
f:id:sorashima:20210327162405j:plain:w265
Reederアプリ内だとUnreadカウントの上限が500なのが気になる*1


これまでに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つ


処理は1.5時間ほどかかっただろうか?

  • 読み込めたページ: 2,508
  • サーバーが見つからない等: 188
  • ページが見つからない等: 319

計3,015と4つ足りないが、まあいいか。

古いアイテムが上の方にあったりで、もしかしたら読み込んだURL一覧と逆順に追加した方が良いのかもしれないとも思った。
ただ、ショートカット・アプリだけで追加した上に、更にScriptableをメインに処理をしたもので追加したので、もう何がなんだか分からない。
今更、後の祭り。これで良しとする。

気になるのは、追加後のReederのRead Laterのアイテム数がぴったり3,000だったこと。3,000個までしか登録できないのかと思ったが、Safariのシェア・シートからのページ追加で3,001になり、ショートカット・アプリから一つ追加で3,002。偶然だったか?

*1:Instapaper の使い方 iPhone/iPadのSafariから4タップで記事を保存して後で読むには?に、「無料になった iPhone/iPad アプリ Instapaper は最高500個(PCでは無制限)の記事を端末に保存でき、」と書かれていた。それ絡みの制限なんだろう。

*2:追記: iCloudに保存したショートカットが読み込めなくなるという不具合が最近あったが、そのせいか?AddToReadLaterが読み込めなくなったので、バックアップし直した。

©︎ 2022 Sorashima