Ja, mit der Trello-API und einigen anderen Tools.
Diese Antwort basiert auf HTTPie und jq , zwei frei verfügbaren Tools, die über pip und Homebrew installiert werden können, wenn Sie einen Mac verwenden:
$ pip install httpie
$ brew install jq
Mit können HTTPie
wir die Trello-API abfragen, um den Rohaktions-Feed für ein Board zu erhalten, und jq
diese Daten dann in etwas Nützliches verwandeln.
Beginnen wir mit etwas "Einfachem". Der folgende Befehl gibt uns alle Kommentare, die im April 2013 im Trello Dev Board abgegeben wurden . Ich werde dies gleich erklären:
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'
Wenn alles nach Plan lief, sollten wir so etwas sehen:
{
"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. Dies ist ein einzelnes, vernünftiges JSON-Objekt, das wir problemlos in eine beliebige Anzahl anderer Formate analysieren können. Lassen Sie uns das jetzt durchgehen, damit wir es gut genug verstehen können, um es an unsere Bedürfnisse anzupassen.
http GET "https://api.trello.com/1/boards/4d5ea62fd76aa1136000000c/actions" "since==Apr 1 2013 EDT" "before==May 1 2013 EDT" "limit==1000" "filter==commentCard"
Dies ist der einzige Teil, der von Trello abhängt. Wir stellen eine Anfrage gegen die öffentliche API für das Board mit der ID 4d5ea62fd76aa1136000000c
- das habe ich erhalten, indem ich zu https://trello.com/dev gegangen bin und mir die ID angesehen habe, die Trello an die vollständige URL anhängt ( https://trello.com/board/trello-development/4d5ea62fd76aa1136000000c
).
Die Felder since
und before
sind selbsterklärend. Ich gebe ein limit
von an, 1000
weil dies die größte Antwort ist, die Trello zulässt. Wenn Ihr Board mehr als tausend Kommentare im relevanten Datumsbereich hat, wäre hier eine kompliziertere Paging-Lösung erforderlich. Ich gebe ein filter
von an, commentCard
weil ich nur für die Zwecke dieser Antwort an diesen interessiert bin. Wenn Sie weitere Aktionstypen wünschen, geben Sie eine durch Kommas getrennte Liste an filter==commentCard,updateCard:idList,createCard
. Gültige Aktionstypen finden Sie in der Trello-API-Referenz .
Wenn wir das alleine ausführen, erhalten wir viele Informationen, die relativ schwer zu verstehen sind. Also leiten wir es hinein, jq
um es in etwas Nützlicheres zu massieren.
jq 'group_by(.data.card.id) | map({key: (.[0].data.card | "\(.name) (\(.id))"), value: map({date, member: .memberCreator.fullName, comment: .data.text}) }) | from_entries'
Stück für Stück führt unser jq
Skript die folgenden Transformationen durch, wobei jede ihr Ergebnis an den nächsten Operator weiterleitet:
group_by(.data.card.id)
- Trello gibt uns nur eine Reihe von Aktionen. Wir verwandeln das in ein Array von Arrays, wobei jedes Sub-Array nur Aktionen für eine bestimmte Karte enthält. Grundsätzlich
[[card1_action1, card1_action2...], [card2_action1, card2_action2...], ...]
map({key: KEY_EXPRESSION, value: VALUE_EXPRESSION}) | from_entries
- Wir wollen kein Array von Arrays; Wir wollen nur ein Objekt der Form
{ card1: [action1, action2, ...], card2: [action1, action2, ...], ...}
. Indem wir das Array in ein Array von Schlüssel-Wert-Paaren from_entries
verwandeln, können wir daraus ein Objekt machen. Cool.
- Schauen wir uns nun an, was ich
KEY_EXPRESSION
oben genannt habe:(.[0].data.card | "\(.name) (\(.id))")
- Das ist ziemlich einfach. Wir nehmen den Karteneintrag aus der ersten Aktion (da er für alle Aktionen gleich sein sollte, hätten wir jeden auswählen können, aber der erste scheint die richtige Wahl zu sein). Dann verwenden wir String Interpolation (
\(...)
), um etwas zu konstruieren, das aussieht "name (id)"
.
VALUE_EXPRESSION
ist map({date, member: .memberCreator.fullName, comment: .data.text})
- Wir hätten einfach
.
das Array aller Aktionen unverändert lassen können. Da Aktionen jedoch etwas hässlich sind, massieren wir sie in etwas Nützliches, indem wir map
über das Array pingen und {date, member: .memberCreator.fullName, comment: .data.text}
auf jedes einzelne Aktionsobjekt anwenden .
{date}
ist das gleiche wie {date: date}
zu jq
.
- Alles andere ist ziemlich selbsterklärend. Wir haben jetzt das Datum, das Mitglied (nur den Namen, aber es wäre leicht, mehr zu bekommen) und den Text des Kommentars.
Da haben Sie es also. Hoffentlich. Wir hätten diese Datenmassage in jeder Skriptsprache durchführen können, aber genau dafür jq
wurde sie entwickelt. Es ist also eine gute Ausrede, ein cooles neues Tool zu erlernen. Weitere Informationen finden Sie im jq-Handbuch .
Das funktioniert jetzt, weil das Trello Dev Board öffentlich ist. Aber was ist, wenn wir private Daten wollen?
Der richtige Weg, dies zu tun, besteht darin, ein API-Token zu generieren. Das Trello API-Handbuch Erste Schritte enthält eine detaillierte Anleitung dazu. Aber wir haben es eilig, also machen wir es auf die Art des Faulen ...
Melden Sie sich in Chrome bei http://trello.com an und öffnen Sie die Konsole (Ansicht> Entwickler> JavaScript-Konsole). Tippe $.cookie('token')
in das Fenster. Dies wird so etwas zurückspucken "uniquememberid/somegarbledstring"
. Kopieren Sie den Teil zwischen den Anführungszeichen und ändern Sie die Anforderung so, dass sie ungefähr so aussieht:
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 ...
Das einzige, was wir geändert haben, ist das Hinzufügen des "Cookie:token=uniquememberid/somegarbledstring"
Headers. Dadurch wird Trello den Token verwenden. HINWEIS: Dieses Token ist sehr privat. Wenn Sie es einer anderen Person geben, kann sich diese Person grundsätzlich als Sie anmelden, bis Sie es auf der Trello-Kontoseite widerrufen . Also, weißt du, sei vorsichtig. Oder führen Sie den Schritt zur Generierung von API-Schlüsseln / Token durch.
Ändern Sie jetzt weg, um die genauen Daten zu erhalten, die Sie in dem gewünschten Format benötigen.