-
-
Save clochix/48a7537b248f4272fc2513cd9722817f to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash | |
######### | |
# | |
# Export bank operations | |
# | |
# Syntax: bankexport claude.mycozy.cloud | |
# | |
# Requirements: | |
# - curl | |
# - socat | |
# - jq | |
# | |
######## | |
bankexport () | |
( | |
server='' | |
token='' | |
verbose='-s' | |
# | |
# Check if required applications are available | |
# | |
if [ "$(type -t curl)" != "file" ]; then | |
echo "Please install curl" | |
return 1 | |
fi | |
if [ "$(type -t jq)" != "file" ]; then | |
echo "Please install jq" | |
return 1 | |
fi | |
if [ "$(type -t socat)" != "file" ]; then | |
echo "Please install socat" | |
return 1 | |
fi | |
if [ "$#" != "1" ]; then | |
echo "Syntax bankexport server" | |
return 1 | |
fi | |
# | |
# Step 1: register app and get token | |
# | |
server=$(echo "$1" | sed 's/https:\/\///g') | |
if [ "$server" = "" ]; then | |
echo "Usage: ${FUNCNAME[0]} URL" | |
return 1 | |
fi | |
scope="io.cozy.bank.accounts:GET%20io.cozy.bank.operations: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" | |
answer=$(socat -v TCP-LISTEN:8080,crlf,reuseaddr SYSTEM:'echo "OK"' 2>&1 | grep "^GET") | |
#nc -l -p 8080 -i 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<<< $(echo "$answer" | sed -E "s/^.*&code=([^&]*)&state=(.*) .*$/\1;\2/") | |
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 | |
# | |
curl $verbose -H "Origin: https://${server}" -H "Authorization: Bearer ${token}" -H "Accept: application/json" "https://${server}/data/io.cozy.bank.accounts/_all_docs?include_docs=true" > bank_accounts.json | |
curl $verbose -H "Origin: https://${server}" -H "Authorization: Bearer ${token}" -H "Accept: application/json" "https://${server}/data/io.cozy.bank.operations/_all_docs?include_docs=true" > bank_operations.json | |
echo 'Compte;Établissement;Libellé du compte' > bank_accounts.csv | |
echo 'Compte;Date;Montant;Libellé de l’opération' > bank_operations.csv | |
jq -r '.rows[].doc | select(.institutionLabel) | [._id, .institutionLabel, .label] | join(";")' bank_accounts.json | sort >> bank_accounts.csv | |
jq -r '.rows[].doc | select(.amount) | [.account, .date, (.amount|tostring), .label] | join(";")' bank_operations.json | sort >> bank_operations.csv | |
join --header -t';' -j1 bank_accounts.csv bank_operations.csv > bank_data.csv | |
# | |
# 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" | |
) | |
Hello,
Merci pour ce script qui comble un vrai manque comme ça a été dit. De mon côté, je suis sur MacOS et j'utilise zsh donc j'ai du faire quelques ajustements pour qu'il fonctionne correctement, voici la liste :
Sur la vérification des dépendances, type avec zsh fonctionne différemment et ne dispose pas du paramètre -t, j'ai donc utilisé -w et modifié le test par "type -w {exec} != "exec: command". Exemple : if [ "$(type -w jq)" != "jq: command" ]; then
J'ai du modifier la variable state state="$(cat /proc/sys/kernel/random/uuid)"
en state="$(uuidgen)"
car /proc/sys/kernel/random/uuid n'existe pas sous MacOS donc j'ai remplacé par uuidgen qui fait le job.
J'ai eu des erreurs sur la dernière commande join (ligne 81), sur les paramètres --header et -j qui n'existent pas chez moi. Du coup, j'ai modifié en : join -t';' -1 1 -2 1 bank_accounts.csv bank_operations.csv > bank_data.csv
J'ai aussi utilisé la méthode de @xavgra2 avec bankexport $1 à la fin
Et dernier point, plutôt que d'afficher l'url dans le terminal et de la copier/coller, j'ai modifié le script pour la lancer directement dans le navigateur par défaut avec un simple open $url
.
Encore merci !
Ok. ç'a a marché, puisque j'obtiens un "bank_operations.csv"... !
Par contre les fichiers "bank_data.csv" et "bank_accounts.csv" n'ont pas de données (seulement les en-têtes), et j'ai obtenu cet erreur sur le terminal :
jq: error (at bank_accounts.json:1): Cannot iterate over null (null)
En tout cas merci beaucoup, je vais pouvoir intégrer ça dans homebank :)