Sim, é, usando a API do Trello e algumas outras ferramentas.
Esta resposta depende do HTTPie e do jq , duas ferramentas disponíveis gratuitamente que podem ser instaladas via pip e Homebrew se você estiver usando um Mac:
$ pip install httpie
$ brew install jq
Usando HTTPie
podemos consultar a API do Trello para obter o feed de ações brutas de um quadro, podemos usar jq
para transformar esses dados em algo útil.
Vamos começar com algo "simples". O comando a seguir nos fornecerá todos os comentários feitos no Trello Dev Board no mês de abril de 2013. Vou explicar isso em um segundo:
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 tudo correu conforme o planejado, deveríamos ver algo assim:
{
"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",
...
Legal. Esse é um objeto JSON único e razoável que podemos analisar facilmente em qualquer número de outros formatos. Agora vamos passar por isso para que possamos entendê-lo bem o suficiente para modificá-lo para atender às nossas necessidades.
http GET "https://api.trello.com/1/boards/4d5ea62fd76aa1136000000c/actions" "since==Apr 1 2013 EDT" "before==May 1 2013 EDT" "limit==1000" "filter==commentCard"
Essa é a única parte que depende do Trello. Nós fazemos uma solicitação contra a API pública para o quadro com o ID 4d5ea62fd76aa1136000000c
- eu consegui isso em https://trello.com/dev e olhando o ID que o Trello anexa ao URL completo ( https://trello.com/board/trello-development/4d5ea62fd76aa1136000000c
).
Os campos since
e before
são auto-explicativos. Especifiquei um limit
de 1000
porque essa é a maior resposta que o Trello permitirá. Se seu quadro tiver mais de mil comentários no período relevante, uma solução de paginação mais complicada seria necessária aqui. Especifiquei um filter
de commentCard
porque só estou interessado naqueles para os fins desta resposta. Se você quiser mais tipos de ação, especifique uma lista separada por vírgula como filter==commentCard,updateCard:idList,createCard
. Tipos de ação válidos podem ser encontrados na referência da API do Trello .
Se executarmos isso sozinhos, obteremos muitas informações relativamente difíceis de entender. Então nós o colocamos jq
para massagear em algo um pouco mais útil.
jq 'group_by(.data.card.id) | map({key: (.[0].data.card | "\(.name) (\(.id))"), value: map({date, member: .memberCreator.fullName, comment: .data.text}) }) | from_entries'
Peça por peça, nosso jq
script está fazendo as seguintes transformações, cada uma canalizando seu resultado para o próximo operador:
group_by(.data.card.id)
- O Trello nos fornece uma série de ações. Transformamos isso em uma matriz de matrizes, onde cada sub-matriz contém apenas ações para um determinado cartão. Basicamente
[[card1_action1, card1_action2...], [card2_action1, card2_action2...], ...]
map({key: KEY_EXPRESSION, value: VALUE_EXPRESSION}) | from_entries
- Não queremos uma matriz de matrizes; nós apenas queremos um objeto do formulário
{ card1: [action1, action2, ...], card2: [action1, action2, ...], ...}
. Ao transformar a matriz em uma matriz de pares de valores-chave, podemos usá-la from_entries
para transformá-la em um objeto. Legal.
- Agora vamos ver o que eu chamei
KEY_EXPRESSION
acima:(.[0].data.card | "\(.name) (\(.id))")
- Isto é bastante simples. Tomamos a entrada do cartão desde a primeira ação (já que deve ser a mesma para todas as ações, poderíamos ter escolhido qualquer, mas a primeira parece ser a escolha sensata). Em seguida, usamos a interpolação de strings (
\(...)
) para construir algo parecido "name (id)"
.
VALUE_EXPRESSION
é map({date, member: .memberCreator.fullName, comment: .data.text})
- Poderíamos ter usado apenas
.
para manter inalterada a matriz de todas as ações. Mas, como as ações são meio feias, estamos massageando-as em algo útil, map
executando ping sobre o array e aplicando-o {date, member: .memberCreator.fullName, comment: .data.text}
a cada objeto de ação individual.
{date}
é o mesmo que {date: date}
para jq
.
- Tudo o resto é bastante auto-explicativo. Agora temos a data, o membro (apenas o nome, mas seria fácil obter mais) e o texto do comentário.
Então aí está. Er, espero. Poderíamos ter feito essa massagem de dados em qualquer linguagem de script, mas é exatamente para isso que jq
foi criado, por isso é uma boa desculpa para aprender uma nova ferramenta interessante. Confira o manual do jq para obter mais informações.
Agora, isso funciona porque o Trello Dev Board é público. Mas e se quisermos dados particulares?
A maneira correta de fazer isso é gerar um token de API. O Guia de introdução da API do Trello apresenta uma explicação detalhada de como fazer isso. Mas estamos com pressa, então vamos fazer do jeito do preguiçoso ...
Faça login no http://trello.com no Chrome e abra o console (Exibir> Desenvolvedor> JavaScript Console). Digite $.cookie('token')
na janela. Isso cuspirá algo como "uniquememberid/somegarbledstring"
. Copie a parte entre as aspas e modifique a solicitação para algo como isto:
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 ...
A única coisa que mudamos é adicionar o "Cookie:token=uniquememberid/somegarbledstring"
cabeçalho. Isso fará com que o Trello use o token. Observe que esse token é muito particular ... se você o der a outra pessoa, ele poderá efetuar login como você até você revogá-lo na página da conta do Trello . Então, tome cuidado. Ou siga a etapa de geração de chave / token da API.
Agora modifique para obter os dados precisos necessários no formato desejado.