[PYTHON] Je souhaite importer des notes Google Keep dans Bear (application mémo)

Motivation pour l'écriture:

J'ai essayé d'utiliser Bear et c'était plutôt bien, alors j'ai pensé essayer d'importer les notes stockées dans Google Keep (pas seulement Evernote).

Vous pouvez facilement prendre des notes n'importe où, coller un morceau de code, le partager entre appareils, avoir une fonction de recherche appropriée et, si possible, rechercher une application de mémo qui ne se soucie pas de la politique de confidentialité (et plutôt que d'être gratuite) , Je veux souligner la continuité des services et des politiques)

Ou le journal des réfugiés Evernote

Evernote https://evernote.com/intl/jp/ Evernote, que j'utilise depuis des années, a été souligné par le format texte. C'était assez bien d'écrire ce que j'avais trouvé et de sauvegarder un extrait d'un article de blog (assez pratique) Je voulais aussi coller un morceau de code, alors j'ai pensé plusieurs fois que je pourrais au moins utiliser une notation compatible avec le démarquage.

Il n'y avait aucun problème avec la limite du nombre d'appareils pouvant être utilisés avec le plan gratuit car c'était bien s'il pouvait être utilisé avec Mac et iPhone (je n'avais pas envie de passer au forfait payant car c'était un stress de format. pour) En décembre de l'année dernière, nous avons décidé d'exporter toutes les données et de nous retirer d'Evernote, profitant du changement des règles qui permet aux employés d'Evernote de consulter les notes de l'utilisateur.

Kobito

http://kobito.qiita.com/ J'avais l'habitude d'organiser occasionnellement (encore occasionnellement) des informations techniques que je prévois de publier plus tard (sur Qiita). En tant qu'éditeur de démarques avec aperçu en temps réel.

J'ai déjà écrit un article comme celui-ci. kobitonote.py --Synchroniser les éléments de sauvegarde modifiés avec Kobito vers Evernote

Day One

http://dayoneapp.com/ Application de journal. Version macOS (4800 yens), version iOS (600 yens).

J'utilise l'ancienne version (Day One Classic) sur macOS (je pense que c'était autour de 1200 yens) et iOS depuis environ 4 ans maintenant.

Vous pouvez utiliser le démarque. Cependant, la fonction de recherche (en particulier en japonais) n'est pas suffisante. (Soit dit en passant, je recherche souvent des informations comme "quand est-ce que je suis allé chez le coiffeur") Les données stockées dans le cloud sont cryptées, et les employés n'ont pas accès aux fichiers cryptés sauf si la loi l'exige, ce qui est un niveau satisfaisant pour la protection de la vie privée pour le moment. C'est bien de synchroniser mon journal, mais si je modifie la même entrée à partir de plusieurs appareils et qu'il y a un conflit, il sera écrasé (plutôt que de laisser plusieurs versions), donc lors de l'écriture d'un journal à partir d'un autre appareil Il est couvert par des opérations telles que le lancement et l'écriture d'une entrée et son édition ultérieure, ou la sauvegarde d'une entrée de journal en mode édition sans la laisser ouverte pour le moment.

Je ne suis pas particulièrement insatisfait de l'application de journal (grâce à cette application, j'ai pris l'habitude d'écrire un journal), mais la fonction de recherche fait un pas de plus en tant qu'application de mémo.

Les données stockées dans le cloud sont cryptées et cryptées uniquement lorsque la loi l'exige Les notes privées peuvent être écrites le premier jour (sans Evernote).

Mémo attaché à macOS

Pour sauver les réfugiés Evernote, ou pour les enfermer dans le camp MacOS / iOS / iCloud, L'application mémo fournie avec macOS a la possibilité d'importer des fichiers d'exportation Evernote (.enex). (J'ai dit de le joindre car il n'y a pas de fonction d'exportation de l'application mémo)

C'est la norme du système d'exploitation et il se synchronise avec l'application mémo sur iOS, alors est-ce que ça va? J'ai pensé que c'était peu de temps. La fonction de recherche ne fonctionne pas du tout. Trop de notes? Non, je ne pense pas que ce soit le cas car il était possible de rechercher avec l'application iOS. Ne pas pouvoir effectuer de recherche n'a aucun sens en tant que mémo électronique, alors cherchez d'autres options.

Google Keep

https://keep.google.com/ Une application mémo créée par Google. À utiliser avec un navigateur Web. Il existe également une application iOS.

Je m'inquiète pour la confidentialité du mémo (* dans le sens où il ne précise pas qu'il protégera la vie privée) Il est pratique de rechercher normalement. Vous pouvez voir les notes de Google Docs. (Ceci est utile comme outil d'écriture)

Bear

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

J'ai passé trois mois à séparer les mémos privés avec Day One (Classic) et à rechercher des mémos avec Google Keep, mais j'ai lu cet article hier.

―― [l'ours a une très bonne ligne. C'est assez intéressant parce que je fais diverses choses autour de l'essence de l'innovation, comme la démarque. --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)

Pour le moment, j'ai installé la version iOS et la version macOS.

Tout d'abord, le design est excellent. (Vous pouvez choisir votre favori parmi plusieurs thèmes) Vous pouvez utiliser votre propre format et démarque pour le format de texte. Des liens mutuels entre mémos peuvent être créés (= peut être utilisé comme un wiki). Les fichiers d'exportation Evernote (.enex) peuvent être importés. Vous pouvez également importer des fichiers rdf et md. (Il semble que vous puissiez également importer depuis DayOne) ◎ L'option «Échapper aux balises involontaires» est requise lors de l'importation. Parce que, s'il y a un caractère #, le mot qui suit sera reconnu comme une balise et des centaines de balises sans signification seront répertoriées dans la liste des balises. Les balises font partie du texte (pas des attributs de texte), donc si vous supprimez les balises (bien que vous ne puissiez les supprimer qu'une par une de la liste des balises), la notation des balises dans le texte (là où vous pensiez que c'était, par exemple #! / Bin /) sh) est effacé. Il n'y a pas de stress dans la recherche. Il y a un sentiment de sécurité dans la politique de confidentialité. Cependant, il tombe souvent lors de la synchronisation. (Un compte Pro (150 yens par mois) est requis pour la synchronisation entre les appareils.)

Je souhaite importer des notes Google Keep dans Bear

Voici donc le sujet principal de cette entrée.

Importation depuis Google Keep… Markdown des fichiers HTML individuels exportés par Google Takeout, bien que non pris en charge directement depuis Bear Peut être importé en convertissant en.

$ unzip takeout-yyyymmddThhmmssZ-001.zip

Un fichier HTML (1 fichier = 1 mémo) sera développé sous ./Takeout/Keep/, alors marquez-le en écrivant un script approprié et importez-le depuis Bear.

$ python html2md.py dir ./Takeout/Keep

Pour votre référence, je vais coller html2md.py (un script approprié que j'ai utilisé) ci-dessous. (Obligatoire Cliquez. Utilisez à vos risques et périls, ou modifiez / améliorez comme vous le souhaitez. Le même répertoire que le fichier HTML (dans l'exemple ci-dessus, .. Un grand nombre de fichiers md peuvent être créés dans / Takeout / Keep / et ci-dessous). Bear ne peut pas sélectionner de fichiers HTML lors de l'importation, donc même si vous sélectionnez tout, seul md peut être récupéré)

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

Je souhaite importer des notes Google Keep dans Bear (application mémo)
Je veux INSÉRER un DataFrame dans MSSQL
Je souhaite télécharger une application Django sur heroku
Je souhaite supprimer l'avertissement d'importation non résolue de Python avec vsCode
Je veux résoudre SUDOKU
Je souhaite enregistrer l'heure d'exécution et conserver un journal.
Je souhaite utiliser la traduction de raccourcis comme l'application DeepL même sous Linux
Je souhaite répondre automatiquement au formulaire Google à 17 heures tous les matins
Je veux comprendre à peu près systemd
[Mémo] Comment utiliser Google MµG
Je veux gratter des images et les former
Je veux faire ○○ avec les Pandas
Je veux copier l'annotation de yolo
Je veux déboguer avec Python
[Mémo Python] Je souhaite obtenir un nombre hexadécimal à 2 chiffres à partir d'un nombre décimal
[Google Colab] Je souhaite afficher plusieurs images côte à côte dans une vignette