-
-
Save clochix/3f03ae72ff3e249cf804a4f01fe81d0d to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash | |
######### | |
# | |
# Export every documents from a datatype | |
# | |
# Syntax: cozyexport claude.mycozy.cloud io.cozy.contacts | |
# | |
######## | |
cozyexport () | |
( | |
server='' | |
token='' | |
verbose='-s' | |
# Step 1: register app and get token | |
server=$(echo "$1" | sed 's/https:\/\///g') | |
if [ "$server" = "" ]; then | |
logerr "Usage: ${FUNCNAME[0]} URL [datatype]" | |
logerr " default datatype: io.cozy.files" | |
return 1 | |
fi | |
if [ "$#" -eq 1 ]; then | |
datatype="io.cozy.files" | |
else | |
datatype="${2}" | |
fi | |
scope="${datatype}:GET" | |
echo "Getting token for $server with scope $scope" | |
registration=$(curl -s -X POST -H "Host: ${server}" -H "Content-Type: application/json" -H "Accept: application/json" -d '{"redirect_uris": ["http://localhost:8080"],"client_name": "cozycli","software_id": "cozycli"}' https://${server}/auth/register | jq ".server=\"${server}\"") | |
state="$(cat /proc/sys/kernel/random/uuid)" | |
clientid="$(echo "$registration" | jq -r '.client_id')" | |
clientsecret="$(echo "$registration" | jq -r '.client_secret')" | |
registrationtoken="$(echo "$registration" | jq -r '.registration_access_token')" | |
url="$(curl -s -L -w "%{url_effective}" -o /dev/null "https://${server}/auth/authorize?client_id={$clientid}&response_type=code&scope=${scope}&state=${state}&redirect_uri=http%3A%2F%2Flocalhost:8080")" | |
echo "Open this URL in your browser" | |
echo "$url" | |
answer=$(mktemp) | |
chmod 600 "$answer" | |
nc -l -p 8080 -q 1 -c 'while read -r request remaining;do echo $request $remaining >> '${answer}';if [ "$remaining" = "" ];then break;fi;done;echo "HTTP/1.1 200 OK\n\nOK"'; | |
IFS=";" read -r code state2<<< $(sed -E "s/^.*&code=([^&]*)&state=(.*) .*$/\1;\2/" "$answer") | |
rm -f $answer | |
if [ "$state2" != "$state" ]; then | |
echo "Wrong state! Expected ${state}, got ${state2}" | |
fi | |
token=$(curl -s -X POST -H "Host: ${server}" -H "Content-Type: application/x-www-form-urlencoded" -H "Accept: application/json" -d "grant_type=authorization_code&code=${code}&client_id=${clientid}&client_secret=${clientsecret}" https://${server}/auth/access_token | jq -r '.access_token') | |
# Step 2: export the data | |
res=$(curl $verbose -H "Origin: https://${server}" -H "Authorization: Bearer ${token}" -H "Accept: application/json" "https://${server}/data/${datatype}/_all_docs?include_docs=true") | |
echo "$res" | |
# Step 3: revoke the tocken | |
res=$(curl $verbose -H "Origin: https://${server}" -H "Authorization: Bearer ${registrationtoken}" -X DELETE "https://${server}/auth/register/${clientid}") | |
echo "$res" | |
) | |
J'ai utilisé ce script pour récupéré les opérations Cozy-bank qui ce trouve sur io.cozy.bank-operations
. Mon but étant d'importé tout mes opérations dans un logiciel de comptabilité personnelle (Skrooge dans mon cas) et ce en gardant la catégorisation faite sur cozy-bank
C'est pas encore fini mais j'ai un fichier csv avec toute les info et qui est lu par Skooge. Il va maintenant falloir voir comment géré la catégorisation...
Pour jq
J'ai fait un fichier 'Cozy-Bank-cleaner.jq' :
[
.rows?[]?.doc? | select((.language != "javascript") and (.language != "query"))
| { ID: ._id, Compte: .account, Montant: .amount, date: .date, Info: .label, Info_Banque: .originalBankLabel, Cat_Cozy: .cozyCategoryId, Cat_Cozy2: .localCategoryId, Cat_Cozy3: .sourceCategoryId, Cat_auto: .automaticCategoryId, ID_Linox: .linoxId, Cat_Manual: .manualCategoryId, ID_VendorAccount: .vendorAccountId, ID_Vendor: .vendorId, }
| (.date|strptime("%Y-%m-%dT%H:%M:%Z")|strftime("%Y-%m-%d")) as $te | .date |= $te
]
La deuxièmement ligne me permet de sélectionner ce que je veux et de renommer les keys
et la 3eme ligne modifie le format des dates (uniquement YYYY-MM-DD)
Sortie en CSV
Pour la sorti csv j'ai préféré utiliser in2csv
(qui est dans csvkit
et présent dans les dépôt Debian depuis Buster)
Commande final
jq -f Cozy-Bank-cleaner.jq data.json | in2csv -f json > data-clean.csv
Ce script permet d’exporter tous les documents d’un type.
Il nécessite de disposer de l’utilitaire
nc
.Pour exporter tous vos contacts, utilisez
cozyexport moncozy.mycozy.cloud io.cozy.contacts
. Le script va afficher une URL à ouvrir dans votre navigateur. Cette URL vous demande d’autoriser l’application à se connecter à votre serveur. Une fois accepté, votre navigateur est redirigé vers un serveur web local émulé parnc
et va transmettre au script les clés pour envoyer des requêtes au serveur. Le script envoie alors une requête pour exporter tous les documents d’un type, puis révoque ses accès au serveur.Attention, la base de données utilisée par Cozy, CouchDB, stocke certains documents techniques comme les documents en base (ces documents sont les descriptions des « vues » permettant d'accéder aux documents selon certains critères. On pourra utiliser
jq
pour filtrer ces documents :jq -r '.rows?[]?.doc? | select((.language != "javascript") and (.language != "query"))' data.json