[PYTHON] Ich möchte Google Keep-Notizen in Bear importieren (Memo-App)

Motivation zum Schreiben:

Ich habe versucht, Bear zu verwenden, und es war ziemlich gut. Daher dachte ich, ich würde versuchen, die in Google Keep gespeicherten Notizen zu importieren (nicht nur Evernote).

Sie können überall problemlos Notizen machen, Codeteile einfügen, zwischen Geräten austauschen, über eine geeignete Suchfunktion verfügen und nach Möglichkeit eine Memo-App suchen, die sich nicht um Datenschutzrichtlinien kümmert (und nicht kostenlos ist). Ich möchte die Kontinuität der Dienste und Richtlinien hervorheben.

Oder Evernote-Flüchtlingstagebuch

Evernote https://evernote.com/intl/jp/ Evernote, das ich seit Jahren benutze, wurde durch das Textformat betont. Es war gut genug, um aufzuschreiben, was ich mir ausgedacht habe, und einen Clip eines Blogposts zu speichern (praktisch genug) Ich wollte auch ein Stück Code einfügen, deshalb dachte ich oft, ich könnte zumindest eine Markdown-kompatible Notation verwenden.

Es gab kein Problem mit der Begrenzung der Anzahl der Geräte, die mit dem kostenlosen Tarif verwendet werden können, da es gut war, wenn es mit Mac und iPhone verwendet werden konnte (ich hatte keine Lust, zum kostenpflichtigen Tarif zu wechseln, da es sich um Formatstress handelte. zum) Im Dezember letzten Jahres haben wir beschlossen, alle Daten zu exportieren und aus Evernote zurückzuziehen. Dabei haben wir die Änderung der Regeln genutzt, mit denen Evernote-Mitarbeiter die Notizen des Benutzers anzeigen können.

Kobito

http://kobito.qiita.com/ Ich habe gelegentlich (immer noch gelegentlich) technische Informationen organisiert, die ich später veröffentlichen möchte (auf Qiita). Als Markdown-Editor mit Echtzeitvorschau.

Ich habe einmal einen Artikel wie diesen geschrieben. kobitonote.py - Mit Kobito bearbeitete Elemente mit Evernote synchronisieren

Day One

http://dayoneapp.com/ Tagebuch App. MacOS-Version (4800 Yen), iOS-Version (600 Yen).

Ich benutze die alte Version (Day One Classic) unter MacOS (ich glaube es waren ungefähr 1200 Yen) und iOS seit ungefähr 4 Jahren.

Sie können Markdown verwenden. Die Suchfunktion (insbesondere Japanisch) ist jedoch nicht gut genug. (Übrigens suche ich oft nach Informationen wie "Wann bin ich zum Friseur gegangen?") Die in der Cloud gespeicherten Daten werden verschlüsselt, und Mitarbeiter greifen nur dann auf die verschlüsselten Dateien zu, wenn dies gesetzlich vorgeschrieben ist. Dies ist vorerst ein zufriedenstellendes Maß für den Schutz der Privatsphäre. Es ist schön, Ihr Tagebuch zu synchronisieren. Wenn Sie jedoch denselben Eintrag von mehreren Geräten aus bearbeiten und ein Konflikt vorliegt, wird dieser überschrieben (anstatt mehrere Versionen zu hinterlassen). Wenn Sie also ein Tagebuch von einem anderen Gerät aus schreiben Es wird durch Vorgänge wie Starten und Schreiben eines Eintrags und späteres Bearbeiten oder Speichern eines Tagebucheintrags im Bearbeitungsmodus abgedeckt, ohne ihn vorerst offen zu lassen.

Ich bin mit der Tagebuch-App nicht besonders unzufrieden (dank dieser App habe ich mir angewöhnt, ein Tagebuch zu schreiben), aber die Suchfunktion macht es als Memo-App noch einen Schritt weiter.

In der Cloud gespeicherte Daten werden nur dann verschlüsselt und verschlüsselt, wenn dies gesetzlich vorgeschrieben ist Private Notizen können am ersten Tag (ohne Evernote) geschrieben werden.

Memo an macOS angehängt

Um Evernote-Flüchtlinge zu retten oder sie im MacOS / iOS / iCloud-Lager einzusperren, Die mit macOS gelieferte Memo-App kann Evernote-Exportdateien (.enex) importieren. (Ich sagte, es einzuschließen, weil es keine Exportfunktion von der Memo-App gibt)

Es ist ein Betriebssystemstandard und wird mit der Memo-App unter iOS synchronisiert. Ist das in Ordnung? Ich dachte, es wäre eine kurze Zeit. Die Suchfunktion funktioniert überhaupt nicht. Zu viele Notizen? Nein, ich glaube nicht, dass dies der Fall ist, da mit der iOS-App gesucht werden konnte. Als elektronisches Memo ist es völlig bedeutungslos, nicht suchen zu können. Suchen Sie daher nach anderen Optionen.

Google Keep

https://keep.google.com/ Eine Memo-App von Google. Verwendung mit einem Webbrowser. Es gibt auch eine iOS-App.

Ich mache mir Sorgen um die Privatsphäre des Memos (* in dem Sinne, dass es nicht angibt, dass es die Privatsphäre schützt). Es ist bequem, normal zu suchen. Sie können die Notizen in Google Text & Tabellen anzeigen. (Dies ist nützlich als Schreibwerkzeug)

Bear

bear-writer http://www.bear-writer.com/

Ich habe drei Monate damit verbracht, meine privaten Notizen mit Day One (Classic) und den Notizen, die ich mit Google Keep durchsuchen wollte, zu trennen, aber ich habe diesen Artikel gestern gelesen.

―― [Bär hat eine ziemlich gute Linie. Es ist ziemlich interessant, weil ich verschiedene Dinge rund um das Wesentliche der Innovation mache, wie zum Beispiel Markdown. --toukubo.com](http://toukubo.com/post/159021941846/bear%E3%81%A3%E3%81%A6%E3%82%A2%E3%83%97%E3%83%AA% E3% 81% 8C% E3% 81% 8B% E3% 81% AA% E3% 82% 8A% E8% 89% AF% E3% 81% 84% E7% B7% 9A% E3% 81% 84% E3% 81% A3% E3% 81% A6% E3% 82% 8Bmarkdown% E3% 81% A8% E3% 81% 8B% E3% 81% AE% E3% 82% A4% E3% 83% 8E% E3% 83% 99% E3% 83% BC% E3% 82% B7% E3% 83% A7% E3% 83% B3% E3% 81% AE% E6% 9C% AC% E8% B3% AA% E3% 81% AE% E5% 91% A8% E3% 82% 8A% E3% 81% A7% E8% 89% B2% E3% 80% 85% E3% 82% 84% E3% 81% A3% E3% 81% A6)

Vorerst habe ich die iOS-Version und die macOS-Version installiert.

Erstens ist das Design hervorragend. (Sie können Ihren Favoriten aus mehreren Themen auswählen) Sie können Ihr eigenes Format und Markdown für das Textformat verwenden. Es können gegenseitige Verknüpfungen zwischen Memos hergestellt werden (= kann wie ein Wiki verwendet werden). Evernote-Exportdateien (.enex) können importiert werden. Sie können auch rdf und md importieren. (Es scheint, dass Sie auch aus DayOne importieren können) ◎ Beim Importieren ist die Option "Escape Involuntary Tags" erforderlich. Denn wenn es ein # -Zeichen gibt, wird das Wort danach als Tag erkannt und Hunderte von bedeutungslosen Tags werden in der Tag-Liste aufgeführt. Tags sind Teil des Textes (keine Textattribute). Wenn Sie also die Tags löschen (obwohl Sie sie nur einzeln aus der Tag-Liste löschen können), wird die Tag-Notation im Text (wo Sie dachten, z. B. #! / Bin / sh) wird gelöscht. Es gibt keinen Stress beim Suchen. Die Datenschutzrichtlinie enthält ein Gefühl der Sicherheit. Es fällt jedoch häufig während der Synchronisation. (Für die Synchronisierung zwischen Geräten ist ein Pro-Konto (150 Yen pro Monat) erforderlich.)

Ich möchte Google Keep-Notizen in Bear importieren

Hier ist also das Hauptthema dieses Eintrags.

Importieren aus Google Keep ... Markieren Sie einzelne HTML-Dateien, die von [Google Takeout] exportiert wurden (https://takeout.google.com/settings/takeout/custom/keep), obwohl sie nicht direkt von Bear unterstützt werden Kann durch Konvertieren in importiert werden.

$ unzip takeout-yyyymmddThhmmssZ-001.zip

Eine HTML-Datei (1 Datei = 1 Memo) wird unter ./Takeout/Keep/ erweitert. Markieren Sie sie, indem Sie ein entsprechendes Skript schreiben und aus Bear importieren.

$ python html2md.py dir ./Takeout/Keep

Als Referenz füge ich unten html2md.py (ein geeignetes Skript, das ich verwendet habe) ein. (Erforderlich Klicken. Verwendung auf eigenes Risiko oder Bearbeitung / Verbesserung nach Belieben. Das gleiche Verzeichnis wie die HTML-Datei (im obigen Beispiel .. Eine große Anzahl von MD-Dateien kann in / Takeout / Keep / und darunter erstellt werden. Bear kann beim Importieren keine HTML-Dateien auswählen. Selbst wenn Sie alle auswählen, kann nur MD ausgewählt werden.

html2md.py


#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import click
import os
import sys
from bs4 import BeautifulSoup
from datetime import datetime
import time


def datetime_to_unixtime(dt):
    assert isinstance(dt, datetime)
    return time.mktime(dt.timetuple())


def touch(fname, atime=datetime.now(), mtime=datetime.now()):
    if not os.path.exists(fname):
        open(fname, 'a').close()
    os.utime(fname, (datetime_to_unixtime(atime), datetime_to_unixtime(mtime)))


def parse(fp):
    soup = BeautifulSoup(fp, 'lxml')

    note = soup.find('div', class_='note')

    title, timestamp, archived, content, labels = None, None, False, None, []

    for div in note.find_all('div'):
        class1 = div['class'][0]
        if class1 == 'heading':
            tstr = div.text.strip()
            timestamp = datetime.strptime(tstr, '%Y/%m/%d %H:%M:%S')
            # print 'TIMESTAMP (%s)' % timestamp
        elif class1 == 'archived':
            archived = True
            # print '+ARCHIVED'
        elif class1 == 'title':
            title = div.text.strip()
            # print 'TITLE (%s)' % title.encode('utf-8')
        elif class1 == 'content':
            contents = []
            for content in div.contents:
                if isinstance(content, unicode):
                    contents.append(content)
                else:
                    if content.name == 'br':
                        contents.append('\n')
                    else:
                        contents.append(content.text)
            content = ''.join(contents)
            # print 'CONTENT', content.encode('utf-8')
        elif class1 == 'labels':
            labels = [label.text for label in div.find_all('span', class_='label')]
            # print 'LABELS', labels
        else:
            # print class1, div
            pass

    return (title, timestamp, archived, content, labels)


@click.group()
def cli():
    pass


def conv(html_path):
    with open(html_path, 'r') as fp:
        (title, timestamp, archived, content, labels) = parse(fp)
        print 'TITLE:', title
        print 'TIMESTAMP:', timestamp
        # print 'ARCHIVED:', archived
        if archived:
            labels.append('archived')
        # print content
        labels.append('keep')
        print 'LABELS:', ' '.join(['#%s' % label for label in labels])
        # print

    if html_path.endswith('.html'):
        md_path = html_path.replace('.html', '.md')
    else:
        md_path = html_path + '.md'

    with open(md_path, 'w') as fp:
        def _tagify(label):
            if ' ' in label:
                return '\\#%s\\#' % label
            else:
                return '#%s' % label
        if title:
            fp.write(title.encode('utf-8'))
        fp.write('\n\n')
        fp.write(content.encode('utf-8'))
        fp.write('\n')
        fp.write('%s\n' % ' '.join([_tagify(label.encode('utf-8')) for label in labels]))

    touch(md_path, atime=timestamp, mtime=timestamp)


@cli.command()
@click.argument('html-path', type=click.Path('r'))
def one(html_path):
    assert os.path.exists(html_path)
    conv(html_path)


@cli.command()
@click.argument('html-dir', type=click.Path('r'), default='.')
def dir(html_dir):
    assert os.path.exists(html_dir) and os.path.isdir(html_dir)
    for path in os.listdir(html_dir):
        full_path = os.path.join(html_dir, path)
        conv(full_path)


if __name__ == '__main__':
    cli()

Recommended Posts

Ich möchte Google Keep-Notizen in Bear importieren (Memo-App)
Ich möchte einen DataFrame in MSSQL einfügen
Ich möchte eine Django-App auf Heroku hochladen
Ich möchte Pythons ungelöste Importwarnung mit vsCode entfernen
Ich möchte SUDOKU lösen
Ich möchte die Ausführungszeit aufzeichnen und ein Protokoll führen.
Ich möchte Shortcut-Übersetzungen wie die DeepL-App auch unter Linux verwenden
Ich möchte Google Form jeden Morgen um 5 Uhr automatisch beantworten
Ich möchte systemd grob verstehen
[Memo] Verwendung von Google MµG
Ich möchte Bilder kratzen und trainieren
Ich möchte ○○ mit Pandas machen
Ich möchte Yolos Anmerkung kopieren
Ich möchte mit Python debuggen
[Python-Memo] Ich möchte eine zweistellige Hexadezimalzahl aus einer Dezimalzahl erhalten
[Google Colab] Ich möchte mehrere Bilder nebeneinander in einer Kachel anzeigen