Oui, en utilisant l'API Trello et quelques autres outils.
Cette réponse repose sur HTTPie et jq , deux outils disponibles gratuitement qui peuvent être installés via pip et Homebrew si vous utilisez un Mac:
$ pip install httpie
$ brew install jq
En utilisant, HTTPie
nous pouvons interroger l'API Trello pour obtenir le flux d'action brut pour un tableau, puis nous pouvons utiliser jq
pour transformer ces données en quelque chose d'utile.
Commençons par quelque chose de "simple". La commande suivante nous donnera tous les commentaires faits sur la carte Trello Dev au mois d'avril 2013. Je vais l'expliquer dans une seconde:
http GET "https://api.trello.com/1/boards/4d5ea62fd76aa1136000000c/actions" "since==Apr 1 2013 EDT" "before==May 1 2013 EDT" "limit==1000" "filter==commentCard" | jq 'group_by(.data.card.id) | map({key: (.[0].data.card | "\(.name) (\(.id))"), value: map({date, member: .memberCreator.fullName, comment: .data.text}) }) | from_entries'
Si tout se passait comme prévu, nous devrions voir quelque chose comme ceci:
{
"Embed All The Things (516fcff9b998572923008fb2)": [
{
"comment": "Embed.ly now supports https better, so maybe we can upgrade to that version. http://embed.ly/embed/security/ssl",
"member": "Brett Kiefer",
"date": "2013-04-26T16:15:21.408Z"
},
{
"comment": "Embedding a Google Map would be nice.",
"member": "Michael Warkentin",
"date": "2013-04-24T18:39:12.155Z"
},
{
"comment": "Github issues / pull requests",
"member": "Michael Warkentin",
...
Cool. C'est un objet JSON unique et raisonnable que nous pouvons facilement analyser dans un certain nombre d'autres formats. Passons maintenant en revue afin que nous puissions le comprendre suffisamment pour le modifier en fonction de nos besoins.
http GET "https://api.trello.com/1/boards/4d5ea62fd76aa1136000000c/actions" "since==Apr 1 2013 EDT" "before==May 1 2013 EDT" "limit==1000" "filter==commentCard"
C'est la seule partie qui dépend de Trello. Nous faisons une demande contre l'API publique pour la carte avec id 4d5ea62fd76aa1136000000c
- je l'ai obtenu en allant sur https://trello.com/dev et en regardant l'id que Trello ajoute à l'URL complète ( https://trello.com/board/trello-development/4d5ea62fd76aa1136000000c
).
Les champs since
et before
sont explicites. Je précise un limit
de 1000
parce que c'est la plus grande réponse Trello permettra. Si votre forum a plus de mille commentaires dans la plage de dates pertinente, une solution de pagination plus compliquée serait requise ici. Je précise un filter
de commentCard
parce que je suis seulement intéressé ceux aux fins de cette réponse. Si vous voulez plus de types d'actions, spécifiez une liste séparée par des virgules comme filter==commentCard,updateCard:idList,createCard
. Les types d'actions valides peuvent être trouvés dans la référence de l'API Trello .
Si nous gérons cela seul, nous aurons beaucoup d'informations qui sont relativement difficiles à comprendre. Nous l'avons donc canalisé jq
pour le masser en quelque chose d'un peu plus utile.
jq 'group_by(.data.card.id) | map({key: (.[0].data.card | "\(.name) (\(.id))"), value: map({date, member: .memberCreator.fullName, comment: .data.text}) }) | from_entries'
Morceau par morceau, notre jq
script effectue les transformations suivantes, chacune transmettant son résultat à l'opérateur suivant:
group_by(.data.card.id)
- Trello nous donne juste un éventail d'actions. Nous transformons cela en un tableau de tableaux, où chaque sous-tableau ne contient que des actions pour une carte donnée. Fondamentalement
[[card1_action1, card1_action2...], [card2_action1, card2_action2...], ...]
map({key: KEY_EXPRESSION, value: VALUE_EXPRESSION}) | from_entries
- Nous ne voulons pas d'un tableau de tableaux; nous voulons juste un objet de la forme
{ card1: [action1, action2, ...], card2: [action1, action2, ...], ...}
. En transformant le tableau en un tableau de paires clé-valeur, nous pouvons utiliser from_entries
pour transformer cela en un objet. Cool.
- Voyons maintenant ce que j'ai appelé
KEY_EXPRESSION
ci-dessus:(.[0].data.card | "\(.name) (\(.id))")
- C'est assez simple. Nous prenons l'entrée de la carte de la première action (car elle devrait être la même pour toutes les actions, nous aurions pu en choisir une, mais la première semble être le bon choix). Ensuite, nous utilisons l'interpolation de chaîne (
\(...)
) pour construire quelque chose qui ressemble "name (id)"
.
VALUE_EXPRESSION
est map({date, member: .memberCreator.fullName, comment: .data.text})
- Nous aurions pu simplement utiliser
.
pour obtenir le tableau de toutes les actions inchangées. Mais comme les actions sont un peu laides, nous les massons en quelque chose d'utile en map
envoyant une requête ping au tableau et en l'appliquant {date, member: .memberCreator.fullName, comment: .data.text}
à chaque objet d'action individuel.
{date}
est le même que {date: date}
pour jq
.
- Tout le reste est assez explicite. Nous avons maintenant la date, le membre (juste son nom, mais il serait facile d'en obtenir plus) et le texte du commentaire.
Alors voilà. Euh, j'espère. Nous aurions pu faire ce massage de données dans n'importe quel langage de script, mais c'est exactement pour cela que jq
c'est conçu, c'est donc une bonne excuse pour apprendre un nouvel outil sympa. Consultez le manuel jq pour en savoir plus.
Maintenant, cela fonctionne parce que le Trello Dev Board est public. Mais que faire si nous voulons des données privées?
La bonne façon de procéder consiste à générer un jeton d'API. Le Guide de démarrage de l'API Trello contient une description détaillée de la procédure à suivre. Mais nous sommes pressés, alors nous allons le faire à la manière de l'homme paresseux ...
Connectez-vous à http://trello.com dans Chrome et ouvrez la console (Affichage> Développeur> Console JavaScript). Tapez $.cookie('token')
dans la fenêtre. Cela crachera quelque chose comme "uniquememberid/somegarbledstring"
. Copiez la partie entre les guillemets et modifiez la demande pour qu'elle ressemble à ceci:
http GET "https://api.trello.com/1/boards/THE_ID_OF_THE_PRIVATE_BOARD_YOU_WANT/actions" "Cookie:token=uniquememberid/somegarbledstring" "since==Apr 1 2013 EDT" "before==May 1 2013 EDT" "limit==1000" "filter==commentCard" | jq ...
La seule chose que nous avons modifiée est l'ajout de l'en- "Cookie:token=uniquememberid/somegarbledstring"
tête. Cela obligera Trello à utiliser le jeton. REMARQUE: ce jeton est très privé ... si vous le donnez à quelqu'un d'autre, il peut se connecter en tant que vous jusqu'à ce que vous le révoquiez sur la page de compte Trello . Alors, tu sais, fais attention. Ou passez par l'étape de génération de clé / jeton d'API.
Modifiez-les maintenant pour obtenir les données précises dont vous avez besoin au format souhaité.