Lösung/Skript zum automatischen Synchronisieren der Leseliste von Safari mit Read-it-Later-Diensten wie Pocket oder Evernote?

Die MacOSX-Kontextmenüs ermöglichen es mir, Pocket [früher später lesen] zu verwenden, um alle enormen Mengen an Inhalten zu archivieren und auch einige der enormen Mengen an Inhalten zu lesen, auf die ich täglich in meinem bevorzugten Browser stoße - Safari.

Unter iOS [iPad/iPhone] ist die native Funktion „Zur Leseliste hinzufügen“ für Safari jedoch die am engsten integrierte Option, wenn in vielen verschiedenen Apps wie Mail [alle Newsletter mit Links] auf eine URL „langgeklickt“ wird. Dies hat mir viel Kummer bereitet, da die Hälfte meiner Links in der Safari-Leseliste und die andere Hälfte in einem Read-it-later-Dienst wie Pocket gespeichert sind.

Die nahtlose Konsolidierung bei der Verwendung von iOS ist eine Herausforderung, wenn Sie vermeiden möchten, die Webseite zuerst in Safari zu öffnen und dann auf ein Bookmarklet zu klicken usw.

Webbasierte Trigger-Dienste wie „IFTTT“ sind nur dann sinnvoll, wenn der Inhalt bereits zu unterstützten Cloud-Diensten wie Pocket, Evernote usw. gelangt ist.

Eine konzeptionelle Lösung für dieses Problem könnte etwa darin bestehen, ein Skript auf meinem Mac auszuführen, das regelmäßig nach neuen Elementen in der Plist-Datei „Leseliste“ sucht und die URL extrahiert, wenn ein neues Element hinzugefügt wird [da iCloud syncs iOS und MacOSX Safari]. Vielleicht könnte Alfred oder ein anderer Automatisierungsdienst es dann in eine Tabelle in der Cloud bringen, die dann mit IFTTT und Pocket usw. synchronisiert werden kann.

Vielleicht ist dieses spezielle Design technisch nicht machbar oder völlig falsch, aber ich wäre wirklich dankbar, wenn jemand mit mehr Fachwissen oder Nous eine Implementierung oder eine ähnliche Lösung vorschlagen könnte.

TL;DR

Wie kann ich die URLs der Leseliste von Safari automatisch mit Pocket/Evernote usw. synchronisieren?

Es klingt gut, ich plane, Hazel zu verwenden, um zu überprüfen, ob sich plist geändert hat, und dann das Skript auszuführen.

Antworten (4)

Diese Idee hatte ich vor ein paar Monaten auch. Ich habe mit Ruby eine Lösung gefunden, die funktioniert.

Ich verwende diesen Kern, um die Plist-Datei der Safari-Leseliste zu analysieren: https://gist.github.com/andphe/3232343

Dann verwende ich den rubinroten Pocket-Edelstein, um jeden Gegenstand zu Pocket hinzuzufügen.

Am Ende habe ich mich für Pinboard anstelle von Pocket entschieden, und ich habe ein Arbeitsprojekt auf Github, das genau das tut, außer dass ich Pinboard verwende.

Der Beispielcode, von dem Sie profitieren würden, ist: https://github.com/prokizzle/pinboard_tools/blob/master/lib/srl_to_pinboard.rb

Was Sie idealerweise tun würden, um es automatisch zu machen, ist, dass Hazel die Plist-Datei der Safari-Leseliste auf Änderungen überwacht und dann das Ruby-Skript ausführt, wenn es kürzlich geändert wurde. Auf diese Weise gelangt jeder Artikel von SRL zu Ihrem bevorzugten Service zum späteren Lesen.

Hoffentlich hilft das.

Ich verwende den gleichen Bash-Befehl wie oben Neglectogram, aber ich habe ihn in einem etwas primitiven Skript verwendet, das ich geschrieben habe und das die Lösung "per E-Mail hinzufügen" von Pocket verwendet, wie in der anderen Antwort auf diesen Beitrag beschrieben. Ich gehe hier ins Detail, da es eine Nachfrage nach einer Lösung dafür zu geben scheint und ich möchte, dass sogar unerfahrene Benutzer dies verwenden können (wenn es richtig funktioniert).

Mein Skript konzentriert sich wie gewünscht speziell auf Evernote und Pocket, funktioniert aber mit jedem Dienst, der die gleiche Funktion zum Versenden Ihrer Inhalte per E-Mail hat.

Das Ergebnis ist wie gewünscht, wobei das Skript:

  • extrahiert alle Links in der Leseliste (BUG: nimmt alle Lesezeichen aus Safari, also habe ich vorübergehend alle meine Lesezeichen gelöscht und die Leseliste einfach verlassen, nicht ideal, ich weiß, aber es funktioniert).

  • Iteriert über jeden dieser Links und sendet sie einzeln an Pocket/Evernote/welchen Dienst auch immer.

So verwenden Sie das Skript selbst:

  • Öffnen Sie es einfach in einem beliebigen Texteditor und ersetzen Sie die E-Mail-Adressen durch die E-Mail-Adresse Ihres Pocket-/Evernote-Kontos, je nachdem, welchen Dienst Sie verwenden möchten, und die E-Mail-Adressen der Empfänger durch Evernote- oder Pocket-E-Mail-URLs. (Ändern Sie die Adressen in den Zeilen 11, 13 und 14 in Ihre eigenen).
  • Wenn Sie nur Pocket verwenden, müssen Sie die E-Mail-Adresse von Ihrem Pocket-Konto an add@getpocket.com senden
  • Wenn Sie Evernote verwenden, können Sie von jeder Ihrer E-Mail-Adressen AN Ihre spezifische Evernote-E-Mail-Adresse senden.

Hier ist das Skript, das ich unten geschrieben habe ... (Hinweis: Ich verwende Mac OS X, und als solches ist dies ein Bash-Skript und funktioniert möglicherweise nicht auf anderen Betriebssystemen.)

#!/bin/bash
# Script to export Safari's reading list into a text file, then import this into Pocket or Evernote (or any service with a "email in content" feature).

# First take all of Safari's Reading List items and place them in a text file.
/usr/bin/plutil -convert xml1 -o - ~/Library/Safari/Bookmarks.plist | grep -E  -o '<string>http[s]{0,1}://.*</string>' | grep -v icloud | sed -E 's/<\/{0,1}string>//g' > readinglistlinksfromsafari.txt

# Now loop over each of those URls within that text file and add them to pocket.
while IFS= read -r line
do
    echo $line
/usr/sbin/sendmail -i -f {{CHANGE THIS insert your pocket account email address here}} {{CHANGE THIS TO EITHER add@getpocket.com OR YOUR EVERNOTE EMAIL ADDRESS}} <<END
Subject: $line
From: {{ CHANGE THIS to your pocket account email if using Pocket, otherwise any of your email accounts will do.}}
To: add@getpocket.com {{ OR IF USING EVERNOTE YOUR EVERNOTE EMAIL ADDRESS}}

$line
END
done < readinglistlinksfromsafari.txt

Oben ist die Vorlage, die Sie ändern können, und unten ist das genaue Skript, das ich verwendet habe, komplett mit E-Mail-Adressen für Pocket, um als Beispiel zu dienen. (Bei Mavericks wird das ALL-Element in Bookmarks.plist an Pocket gesendet, dann auch Bookmark)

#!/bin/bash
# Script to export Safari's reading list into a text file, then import this into Pocket or Evernote (or any service with a "email in content" feature).

# First take all of Safari's Reading List items and place them in a text file.
/usr/bin/plutil -convert xml1 -o - ~/Library/Safari/Bookmarks.plist | grep -E  -o '<string>http[s]{0,1}://.*</string>' | grep -v icloud | sed -E 's/<\/{0,1}string>//g' > readinglistlinksfromsafari.txt

# Now loop over each of those URls within that text file and add them to pocket.
while IFS= read -r line
do
    echo $line
/usr/sbin/sendmail -i -f myemailaddress@gmail.com add@getpocket.com <<END
Subject: $line
From: myemailaddress@gmail.com
To: add@getpocket.com

$line
END
done < readinglistlinksfromsafari.txt

Ich hoffe, das funktioniert für Sie alle und Sie finden es hilfreich, da dies eines meiner ersten öffentlichen Skripte usw. ist. Bei Fragen lassen Sie es mich einfach wissen! Hier ist auch ein Link zum GitHub Gist.

https://gist.github.com/arcadia168/0bade46a6bb720395f56

Genießen!

Auch dieser Link kann ein wenig helfen. Es ist nicht perfekt, aber es ist eine Option. http://help.getpocket.com/customer/portal/articles/482759

Links verrotten. Wir bevorzugen Antworten, die die relevanten, nützlichen Daten hinter einem Link in den Antworttext kopieren. Weitere Informationen zu Link Rot und Stack Exchange finden Sie in diesem Artikel . Danke!

Vielleicht hat sich die Plist-Struktur seit diesem Beitrag geändert, aber ich fand das Grepping für https etwas verrauscht und gab eine beträchtliche Anzahl von URLs zurück, die keine legitimen Leselistenelemente waren. Ich habe dieses kleine Skript geschrieben, um alle Artikel in Pocket zu importieren

#!/usr/bin/env python3

import logging
import os
import plistlib
import requests
import sys
import webbrowser


CONSUMER_KEY = os.environ["POCKET_CONSUMER_KEY"]
BASE_URL = "https://getpocket.com"
REDIRECT_URL = "localhost"

logger = logging.getLogger(__name__)
urls = []


def extract_urls(node):
    children = node.get("Children", [])
    url = node.get("URLString")
    if url:
        urls.append(url)
    for child in children:
        extract_urls(child)


def read_plist():
    filename = os.path.expanduser("~/Library/Safari/Bookmarks.plist")
    with open(filename, 'rb') as handler:
        plist = plistlib.load(handler)
        extract_urls(plist)


def post(url, data):
    headers = {
        "x-accept": "application/json",
    }
    response = requests.post(url, data=data, headers=headers)
    error = response.headers.get("X-Error")
    if error:
        logger.error(f"{response.status_code}, {error}")
        response.raise_for_status()
    else:
        return response.json()


def request_code():
    payload = {
        "consumer_key": CONSUMER_KEY,
        "redirect_uri": REDIRECT_URL,
    }
    response = post(f"{BASE_URL}/v3/oauth/request", payload)
    return response["code"]


def request_access_token(code):
    payload = {
        "consumer_key": CONSUMER_KEY,
        "code": code,
    }
    response = post(f"{BASE_URL}/v3/oauth/authorize", payload)
    return response["access_token"]


def request_authorization(code):
    url = f"{BASE_URL}/auth/authorize?request_token={code}&redirect_uri={REDIRECT_URL}"
    webbrowser.open(url, new=2)


def authenticate_pocket():
    code = request_code()
    request_authorization(code)
    input("Press any key after authorizing app...")
    return request_access_token(code)


def add_item(url, token):
    payload = {
        "url": url,
        "consumer_key": CONSUMER_KEY,
        "access_token": token,
    }
    return post("https://getpocket.com/v3/add", payload)


def main():
    read_plist()
    access_token = authenticate_pocket()
    logger.info("Successfully authenticated with Pocket")
    for url in urls:
        add_item(url, access_token)
    logger.info(f"Added {len(urls)} urls to Pocket!")


if __name__ == '__main__':
    sys.exit(main())