Flytte Google Keep notater fra Gmail til G Suite med Python

Det oppstod nylig et behov for litt python scripting, noe jeg alltid har stor glede av.

Bakgrunnen er at jeg er midt en overgang mellom Gmail og G Suite (før Google Apps), flytter alle tjenestene mine ut fra Gmail og inn i et eget domene med G Suite. Jeg har inntrykk av at det er mindre invadering av privatliv, men jeg kan selvsagt ta feil.

Tjenestene jeg bruker er primært Disk, Epost, Keep, Kalender og Foto, men kontoen er også knyttet opp mot en del tredjeparter også. Et steg om gangen.

Google Keep vs Google Takeout

Når jeg har brukt Google Takeout til å hente ut datafiler fra for eksempel Google Kalender, var det i form av .ics-filer som med få tastetrykk importeres inn i G Suites Kalender. Epost gikk greit også ved å sende videre epost automatisk i en overgangsperiode og poppe ned det nyeste. Brukte også Takeout her for å hente ut en backup av alt.

Google Keep er noe jeg har brukt mye til lister og notater og samtidig samhandle med kona (handlelister ikke sant?). Jeg fikk hentet ut alle notatene med Takeout, men de kom ned i form av en HTML filer, en for hvert notat. Dette er ikke ideelt, men jeg kom jo på at jeg har litt script-erfaring som kan benyttes.

Google Keep har ikke et offisielt API, men noen har laget et uoffisielt API som jeg tok i bruk. Dette API-et lar meg koble til Google Keep med en G Suite eller Gmail bruker. Et eksempel under:

import gkeepapi

keep = gkeepapi.Keep()
success = keep.login('...', '...')

note = keep.createNote('Todo', 'Eat breakfast')
note.pinned = True
note.color = gkeepapi.node.ColorValue.Red
keep.sync()

Det finnes mange måte å snakke med Google Keep i dette API-et, les full dokumentasjon her.

Python og Beautiful Soup

Beautiful Soup er et flott bibliotek for å hente innhold ut fra HTML kilder, for eksempel alle de HTML filene som jeg nå har fra Google Takeout.

Python er et fint scriptspråk som kan brukes til det meste og har en fin lesbar kodeform. Biblioteker som trengs, kan hentes ned raskt med “pip” kommandoen som legger inn Beautiful Soup og det uoffisielle API-et. Her i Linux kommandolinje:

pip install beautifulsoup gkeepapi

Scriptet mitt måtte gjøre følgende:

  1.  Ta inn en HTML-fil som argument.
  2. Hente ut tittel på notat fra filnavnet.
  3. Hente ut det relevante innholdet fra notatet og ikke meta-data. I alle fall ikke noe jeg brydde meg med å bruke til noe. Det eneste måtte være etikettene på notatene og bruke de, men jeg ville først og fremst få scriptet til å gjøre den store jobben.
  4. Opprette et nytt notat på G Suite Keep.
  5. Gjenta for alle filer i en mappe.

Python gjør fint det første punktet, Beautiful Soup brukte jeg til to og tre, gkeepapi brukte jeg i nummer fire og til nummer fem løste jeg det med en for-løkke i bash når jeg hadde scriptet klart.

Det ferdige scriptet

#!/usr/bin/env python

"""Extract HTML content from file and post it to Google Keep
"""

import gkeepapi
import sys
from bs4 import BeautifulSoup as bs

keep = gkeepapi.Keep()
success = keep.login('user@host.net', 'password')

def post_note(title, content):
    # Post to Google Keep
    note = keep.createNote(title, content)
    keep.sync()

if __name__ == "__main__":
    # Read in the HTML file
    FILE = sys.argv[1]
    with open(FILE, 'r') as myfile:
        data=myfile.read()
    soup = bs(data, "html.parser")

    # Replace all <br> tags with endline \n
    for br in soup.find_all("br"):
        br.replace_with("\n")

    # Find the data in the HTML source
    title = soup.find('div', attrs={"class":"title"}).text
    content = soup.find('div', attrs={"class":"content"}).text
    post_note(title, content)

Kjør scriptet på alle HTML-filene

$ for f in *.html; do ./keep-api.py "$f" && sleep 1; done