Skip to content

Instantly share code, notes, and snippets.

@clochix
Created July 16, 2019 09:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save clochix/3f03ae72ff3e249cf804a4f01fe81d0d to your computer and use it in GitHub Desktop.
Save clochix/3f03ae72ff3e249cf804a4f01fe81d0d to your computer and use it in GitHub Desktop.
CozyExport: sample script to export data from Cozy
#!/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"
)
@clochix
Copy link
Author

clochix commented Jul 16, 2019

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é par nc 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

@Totokoutonio
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment