Sì, lo è, utilizzando l'API Trello e alcuni altri strumenti.
Questa risposta si basa su HTTPie e jq , due strumenti disponibili gratuitamente che possono essere installati tramite pip e Homebrew se si utilizza un Mac:
$ pip install httpie
$ brew install jq
Utilizzando HTTPie
possiamo interrogare l'API di Trello per ottenere il feed di azioni non elaborate per una scheda, quindi possiamo usare jq
per trasformare quei dati in qualcosa di utile.
Cominciamo con qualcosa di "semplice". Il seguente comando ci fornirà tutti i commenti fatti sulla Trello Dev Board nel mese di aprile 2013. Lo spiegherò tra un secondo:
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'
Se tutto è andato secondo i piani, dovremmo vedere qualcosa del genere:
{
"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",
...
Freddo. Questo è un singolo oggetto JSON ragionevole che possiamo facilmente analizzare in qualsiasi numero di altri formati. Ora passiamo a quello in modo da poterlo capire abbastanza bene da modificarlo in base alle nostre esigenze.
http GET "https://api.trello.com/1/boards/4d5ea62fd76aa1136000000c/actions" "since==Apr 1 2013 EDT" "before==May 1 2013 EDT" "limit==1000" "filter==commentCard"
Questa è l'unica parte che dipende da Trello. Facciamo una richiesta contro l'API pubblica per la scheda con ID 4d5ea62fd76aa1136000000c
: l'ho ottenuta andando su https://trello.com/dev e guardando l'id che Trello aggiunge all'URL completo ( https://trello.com/board/trello-development/4d5ea62fd76aa1136000000c
).
I campi since
e before
sono autoesplicativi. Specifico a limit
of 1000
perché è la risposta più grande che Trello consentirà. Se la tua bacheca ha più di mille commenti nell'intervallo di date pertinente, qui sarebbe necessaria una soluzione di paging più complicata. Specifico a filter
of commentCard
perché sono interessato solo a quelli ai fini di questa risposta. Se vuoi più tipi di azioni, specifica un elenco separato da virgole come filter==commentCard,updateCard:idList,createCard
. Tipi di azioni validi sono disponibili nel riferimento API Trello .
Se lo gestiamo da solo, avremo molte informazioni che sono relativamente difficili da dare un senso. Quindi lo convogliamo jq
per massaggiarlo in qualcosa di un po 'più 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'
Pezzo per pezzo, la nostra jq
sceneggiatura sta effettuando le seguenti trasformazioni, ognuna delle quali invia il risultato all'operatore successivo:
group_by(.data.card.id)
- Trello ci dà solo una serie di azioni. Trasformiamo questo in un array di array, in cui ciascun array secondario contiene solo azioni per una determinata carta. Fondamentalmente
[[card1_action1, card1_action2...], [card2_action1, card2_action2...], ...]
map({key: KEY_EXPRESSION, value: VALUE_EXPRESSION}) | from_entries
- Non vogliamo una serie di array; vogliamo solo un oggetto del modulo
{ card1: [action1, action2, ...], card2: [action1, action2, ...], ...}
. Trasformando l'array in un array di coppie chiave-valore, possiamo usarlo from_entries
per trasformarlo in un oggetto. Freddo.
- Ora diamo un'occhiata a quello che ho chiamato
KEY_EXPRESSION
sopra:(.[0].data.card | "\(.name) (\(.id))")
- Questo è abbastanza semplice. Prendiamo l'entrata della carta dalla prima azione (dal momento che dovrebbe essere la stessa per tutte le azioni, avremmo potuto sceglierne una qualsiasi, ma la prima sembra una scelta sana). Quindi usiamo l'interpolazione di stringhe (
\(...)
) per costruire qualcosa che assomigli "name (id)"
.
VALUE_EXPRESSION
è map({date, member: .memberCreator.fullName, comment: .data.text})
- Avremmo potuto semplicemente usare
.
per mantenere invariata la matrice di tutte le azioni. Ma poiché le azioni sono un po 'brutte, le stiamo massaggiando in qualcosa di utile map
eseguendo il ping sull'array e applicando {date, member: .memberCreator.fullName, comment: .data.text}
a ogni singolo oggetto azione.
{date}
è lo stesso {date: date}
di jq
.
- Tutto il resto è piuttosto autoesplicativo. Ora abbiamo la data, il membro (solo il loro nome, ma sarebbe facile ottenerne di più) e il testo del commento.
Così il gioco è fatto. Ehm, si spera. Avremmo potuto massaggiare questi dati in qualsiasi linguaggio di scripting, ma questo è esattamente ciò jq
per cui è stato creato, quindi è una buona scusa per imparare un nuovo fantastico strumento. Consulta il manuale di jq per ulteriori informazioni.
Ora, questo funziona perché la Trello Dev Board è pubblica. E se volessimo i dati privati?
Il modo giusto per farlo è generare un token API. La Guida introduttiva dell'API Trello contiene una descrizione dettagliata di come eseguire questa operazione. Ma abbiamo fretta, quindi lo faremo alla maniera dei pigri ...
Accedi a http://trello.com in Chrome e apri la console (Visualizza> Sviluppatore> Console JavaScript). Digita $.cookie('token')
nella finestra. Questo sputerà qualcosa di simile "uniquememberid/somegarbledstring"
. Copia la parte tra virgolette e modifica la richiesta in modo che sia simile a questa:
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 ...
L'unica cosa che cambiamo è l'aggiunta "Cookie:token=uniquememberid/somegarbledstring"
dell'intestazione. Questo farà sì che Trello usi il token. NOTA che quel token è molto privato ... se lo dai a qualcun altro, può sostanzialmente accedere come te fino a quando non lo revoca nella pagina dell'account Trello . Quindi, sai, stai attento. Oppure passa attraverso la fase di generazione della chiave API / token.
Ora modifica via per ottenere i dati precisi di cui hai bisogno nel formato desiderato.