Tak, przy użyciu interfejsu API Trello i kilku innych narzędzi.
Ta odpowiedź opiera się na HTTPie i jq , dwóch swobodnie dostępnych narzędziach, które można zainstalować za pomocą pip i Homebrew, jeśli używasz komputera Mac:
$ pip install httpie
$ brew install jq
Za pomocą HTTPiemożemy wysłać zapytanie do interfejsu API Trello w celu uzyskania surowego kanału akcji dla tablicy, a następnie możemy użyć jqdo przekształcenia tych danych w coś użytecznego.
Zacznijmy od czegoś „prostego”. Poniższe polecenie da nam wszystkie komentarze na forum deweloperów Trello w kwietniu 2013 roku. Wyjaśnię to za chwilę:
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'
Jeśli wszystko poszło zgodnie z planem, powinniśmy zobaczyć coś takiego:
{
"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",
...
Chłodny. Jest to jeden rozsądny obiekt JSON, który możemy łatwo przeanalizować w dowolnej liczbie innych formatów. Teraz przejdźmy przez to, abyśmy mogli zrozumieć go wystarczająco dobrze, aby zmodyfikować go do naszych potrzeb.
http GET "https://api.trello.com/1/boards/4d5ea62fd76aa1136000000c/actions" "since==Apr 1 2013 EDT" "before==May 1 2013 EDT" "limit==1000" "filter==commentCard"
To jedyna część, która zależy od Trello. Zgłaszamy żądanie dotyczące publicznego interfejsu API dla płyty o identyfikatorze 4d5ea62fd76aa1136000000c- dostałem to, wchodząc na https://trello.com/dev i patrząc na identyfikator Trello dołącza do pełnego adresu URL ( https://trello.com/board/trello-development/4d5ea62fd76aa1136000000c).
sinceI beforepola są oczywiste. I Podaj limitod 1000bo to największa odpowiedź Trello pozwoli. Jeśli Twoja tablica ma więcej niż tysiąc komentarzy w odpowiednim zakresie dat, wymagane byłoby tutaj bardziej skomplikowane rozwiązanie stronicowania. I Podaj filterof commentCardbo jestem zainteresowany tylko te, dla celów niniejszej odpowiedzi. Jeśli chcesz uzyskać więcej typów akcji, podaj listę rozdzielaną przecinkami, np filter==commentCard,updateCard:idList,createCard. Prawidłowe typy akcji można znaleźć w dokumentacji interfejsu API Trello .
Jeśli uruchomimy to samo, otrzymamy wiele informacji, których stosunkowo trudno zrozumieć. Więc wpuszczamy go, jqaby wmasować w coś nieco bardziej użytecznego.
jq 'group_by(.data.card.id) | map({key: (.[0].data.card | "\(.name) (\(.id))"), value: map({date, member: .memberCreator.fullName, comment: .data.text}) }) | from_entries'
Kawałek po kawałku, nasz jqskrypt dokonuje następujących transformacji, z których każda przekazuje swój wynik do następnego operatora:
group_by(.data.card.id)
- Trello po prostu daje nam szereg działań. Przekształcamy to w tablicę tablic, w której każda podgrupa zawiera tylko akcje dla danej karty. Gruntownie
[[card1_action1, card1_action2...], [card2_action1, card2_action2...], ...]
map({key: KEY_EXPRESSION, value: VALUE_EXPRESSION}) | from_entries
- Nie chcemy tablicy tablic; chcemy tylko obiektu formy
{ card1: [action1, action2, ...], card2: [action1, action2, ...], ...}. Przekształcając tablicę w tablicę par klucz-wartość, możemy użyć, from_entriesaby przekształcić ją w obiekt. Chłodny.
- Teraz spójrzmy na to, co nazwałem
KEY_EXPRESSIONpowyżej:(.[0].data.card | "\(.name) (\(.id))")
- To jest dość proste. Pobieramy kartę z pierwszej akcji (ponieważ powinna być taka sama dla wszystkich akcji, mogliśmy wybrać dowolną, ale pierwsza wydaje się rozsądnym wyborem). Następnie używamy interpolacji łańcuchowej (
\(...)) do skonstruowania czegoś, co wygląda "name (id)".
VALUE_EXPRESSION jest map({date, member: .memberCreator.fullName, comment: .data.text})
- Mogliśmy po prostu
.uzyskać niezmienioną tablicę wszystkich działań. Ale ponieważ akcje są trochę brzydkie, masujemy je w coś użytecznego, mappingując tablicę i stosując się {date, member: .memberCreator.fullName, comment: .data.text}do każdego pojedynczego obiektu akcji.
{date}jest taka sama jak {date: date}do jq.
- Wszystko inne jest dość oczywiste. Mamy teraz datę, członka (tylko ich nazwisko, ale łatwiej byłoby uzyskać więcej) i tekst komentarza.
Więc masz to. Mam nadzieję, że tak. Moglibyśmy wykonać takie masowanie danych w dowolnym języku skryptowym, ale właśnie po to jqzostało stworzone, więc jest to dobra wymówka, aby nauczyć się nowego, fajnego narzędzia. Więcej informacji znajdziesz w instrukcji jq .
To działa, ponieważ Zarząd Trello Dev jest publiczny. Ale co jeśli chcemy prywatnych danych?
Prawo sposób to zrobić, aby wygenerować token API. Przewodnik po interfejsie API Trello zawiera szczegółowe omówienie tego, jak to zrobić. Ale spieszymy się, więc zrobimy to tak, jak leniwy człowiek ...
Zaloguj się do http://trello.com w Chrome i otwórz konsolę (Widok> Deweloper> Konsola JavaScript). Wpisz $.cookie('token')w oknie. To wypluje coś takiego "uniquememberid/somegarbledstring". Skopiuj część między cytatami i zmodyfikuj żądanie, aby wyglądało mniej więcej tak:
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 ...
Jedyne, co zmieniliśmy, to dodanie "Cookie:token=uniquememberid/somegarbledstring"nagłówka. Spowoduje to, że Trello użyje tokena. UWAGA: ten token jest bardzo prywatny ... jeśli podasz go komuś innemu, może on zasadniczo zalogować się jako ty, dopóki go nie odwołasz na stronie konta Trello . Więc bądź ostrożny. Lub przejdź przez etap generowania klucza / tokenu API.
Teraz zmodyfikuj, aby uzyskać potrzebne dane w żądanym formacie.