wtorek, sierpnia 02, 2022

Żenienie Todoist z Obsidian przy pomocy Pythona ;-)

Zawsze brakowało mi połączenia ToDo z miejscem gdzie mógłbym mieć notatki i żeby to było jeszcze przeszukiwalne ;-)

No JIRA tak prawie działa, ale przecież nie będę trzymał JIRAy na swoim komputerze, a do tego ile by mnie to w ogóle kosztowało.

Stąd spróbowałem pożenić prostym skryptem w Pythonie Todoista z Obsidianem :-)

Działa to tak, że jak uruchamia się skrypt to pobiera moje aktualne taski z Todoista, i jeśli są w odpowiednim projekcie to tworzy w odpowiednim katalogu Obsidiana pliki z danym taskiem, do tego dodaje do Obsidiana dokument ToDo z listą rzeczy do zrobienia.

Na razie używałem tego dziś i wydaje się pomagać :-)

Skrypt wygląda tak:

import urllib
import urllib.request
import json
import os.path

projectFilter = <ID PROJECT WORK>

token = "<TOKEN FOR TODOIST API>"

headers = {"Authorization":"Bearer "+token}

url = "https://api.todoist.com/rest/v1/tasks"

req = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(req)
jsonResponse = response.read()

tasks = json.loads(jsonResponse)

# print(json.dumps(tasks, indent=4, sort_keys=True))

pathToObsidian="<Obsidian Vault Location>"
path=pathToObsidian+"<Subfolder to keep tasks>"

content="# ToDo #\n-----\n"
for task in tasks:
projectId=task["project_id"]
if projectId!=projectFilter:
continue
title=task["content"]
# OK, for me it works in this way that when I'm adding stuff to Todoist using Python and Alfred my work tasks have [Work] in front, so I want to remove it
fName=title.replace("[Work]","").replace("/"," or ").strip()
desc=task["description"]
url=task["url"]
print(title)
print(json.dumps(task, indent=4, sort_keys=True))
try:
fName=path+"/"+fName+".md"
titleStr=title.replace("[Work]","").strip()
content=content+"* [["+titleStr+"]]\n"
if os.path.exists(fName):
continue
outF=open(fName,"w+")
outF.write("# "+titleStr+" #\n"+desc+"\n[In Todoist]("+url+")")
outF.close()
print("Success with "+title)
except:
print("Problem.....")
print("Problem with "+title)
outF=open(pathToObsidian+"/ToDo.md","w+")
outF.write(content)
outF.close()

Teraz wystarczy to dodać np. do crontaba i uruchamiać co np. 15 minut i mamy magię ;p
Brakuje tutaj dużo, np. zamiast używać nazwy pliku lepiej by było używać ID taska i tak dalej, ale to popełniłem wczoraj koło 2 w nocy ;p
A używałem dziś "w pracy" i działa ;-)



Podobne postybeta
Jak nie zapomnieć kupić biletu miesięcznego - revised ;-)
Python z urllib = najlepszy menadżer pobierania ;-)
Alfred + Todoist i wysyłanie tasków do projektu, a nie tylko do Inbox'a ;-)
Jak nie zapomnieć kupić biletu miesięcznego ;-)
Airly + Python + Oczyszczacz Powietrza = lepsze oddychanie ;-)