Да, это так, используя API Trello и несколько других инструментов.
Этот ответ основан на HTTPie и jq , двух свободно доступных инструментах, которые можно установить через pip и Homebrew, если вы используете Mac:
$ pip install httpie
$ brew install jq
Используя HTTPie
запрос, мы можем запросить API-интерфейс Trello, чтобы получить необработанный канал действий для доски, а затем использовать его jq
для превращения этих данных во что-то полезное.
Давайте начнем с чего-то «простого». Следующая команда предоставит нам все комментарии, сделанные на форуме разработчиков Trello в апреле 2013 года. Я объясню это через секунду:
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'
Если все прошло по плану, мы должны увидеть что-то вроде этого:
{
"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",
...
Прохладно. Это единственный разумный объект JSON, который мы можем легко проанализировать в любом количестве других форматов. Теперь давайте пройдемся по этому, чтобы мы могли понять это достаточно хорошо, чтобы изменить его в соответствии с нашими потребностями.
http GET "https://api.trello.com/1/boards/4d5ea62fd76aa1136000000c/actions" "since==Apr 1 2013 EDT" "before==May 1 2013 EDT" "limit==1000" "filter==commentCard"
Это единственная часть, которая зависит от Trello. Мы делаем запрос к общедоступному API для форума с идентификатором 4d5ea62fd76aa1136000000c
- я получил это, перейдя по адресу https://trello.com/dev и посмотрев идентификатор, который Trello добавляет к полному URL ( https://trello.com/board/trello-development/4d5ea62fd76aa1136000000c
).
since
И before
поля самоочевидны. Я указать limit
из , 1000
потому что это самый большой отклик Trello позволит. Если ваша доска объявлений содержит более тысячи комментариев в соответствующем диапазоне дат, здесь потребуется более сложное решение для подкачки страниц. Я указать filter
из , commentCard
потому что я заинтересован только в тех , для целей этого ответа. Если вы хотите больше типов действий, укажите разделенный запятыми список, например filter==commentCard,updateCard:idList,createCard
. Действительные типы действий можно найти в справочнике по API Trello .
Если мы запустим это самостоятельно, мы получим много информации, которую относительно сложно понять. Таким образом, мы превращаем это в jq
массаж, чтобы сделать его более полезным.
jq 'group_by(.data.card.id) | map({key: (.[0].data.card | "\(.name) (\(.id))"), value: map({date, member: .memberCreator.fullName, comment: .data.text}) }) | from_entries'
Постепенно наш jq
скрипт выполняет следующие преобразования, каждый из которых передает свой результат следующему оператору:
group_by(.data.card.id)
- Трелло просто дает нам множество действий. Мы превращаем это в массив массивов, где каждый вложенный массив содержит только действия для данной карты. В принципе
[[card1_action1, card1_action2...], [card2_action1, card2_action2...], ...]
map({key: KEY_EXPRESSION, value: VALUE_EXPRESSION}) | from_entries
- Нам не нужен массив массивов; мы просто хотим объект формы
{ card1: [action1, action2, ...], card2: [action1, action2, ...], ...}
. Превратив массив в массив пар ключ-значение, мы можем использовать его from_entries
для превращения в объект. Прохладно.
- Теперь давайте посмотрим на то, что я назвал
KEY_EXPRESSION
выше:(.[0].data.card | "\(.name) (\(.id))")
- Это довольно просто. Мы берем запись карты с первого действия (поскольку она должна быть одинаковой для всех действий, мы могли бы выбрать любое, но первое кажется разумным выбором). Затем мы используем строку interpolation (
\(...)
) для создания чего-то похожего "name (id)"
.
VALUE_EXPRESSION
является map({date, member: .memberCreator.fullName, comment: .data.text})
- Мы могли бы просто использовать,
.
чтобы получить массив всех действий без изменений. Но поскольку действия довольно уродливы, мы превращаем их во что-то полезное, map
проверяя массив и применяя {date, member: .memberCreator.fullName, comment: .data.text}
к каждому отдельному объекту действия.
{date}
так же, как {date: date}
и jq
.
- Все остальное довольно очевидно. Теперь у нас есть дата, член (только их имя, но было бы легко получить больше) и текст комментария.
Так что у вас есть это. Э-э, надеюсь. Мы могли бы выполнять массивацию данных на любом языке сценариев, но это именно то, jq
для чего он был создан, так что это хороший повод для изучения нового крутого инструмента. Проверьте руководство JQ для получения дополнительной информации.
Теперь это работает, потому что Trello Dev Board является публичной. Но что, если нам нужны личные данные?
Право способ сделать это , чтобы генерировать маркер API. Руководство по началу работы с API Trello содержит подробное описание того, как это сделать. Но мы спешим, поэтому мы сделаем это как ленивец ...
Войдите на http://trello.com в Chrome и откройте консоль («Просмотр»> «Разработчик»> «Консоль JavaScript»). Введите $.cookie('token')
в окно. Это будет плевать что-то вроде "uniquememberid/somegarbledstring"
. Скопируйте часть между кавычками и измените запрос следующим образом:
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 ...
Единственное, что мы изменили - это добавление "Cookie:token=uniquememberid/somegarbledstring"
заголовка. Это заставит Trello использовать токен. ЗАМЕТЬТЕ, что этот токен является очень приватным ... если вы дадите его кому-то другому, они могут войти в систему как вы, пока вы не отзовете его на странице учетной записи Trello . Так что, знаете, будьте осторожны. Или пройдите этап генерации ключа / токена API.
Теперь измените, чтобы получить точные данные, которые вам нужны в нужном формате.