Так, це за допомогою API Trello та кількох інших інструментів.
Ця відповідь покладається на HTTPie та jq , два вільно доступні інструменти, які можна встановити через pip та Homebrew, якщо ви використовуєте Mac:
$ pip install httpie
$ brew install jq
Використовуючи HTTPie
ми можемо запитувати API Trello, щоб отримати необроблений канал дій для дошки, тоді ми можемо використати, jq
щоб перетворити ці дані в щось корисне.
Почнемо з чогось "простого". Наступна команда дасть нам усі зауваження, зроблені на борту Dev Dev в квітні місяця 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 для дошки з id 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)
- Trello просто надає нам ряд дій. Ми перетворимо це на масив масивів, де кожен підмасив містить лише дії для даної карти. В основному
[[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))")
- Це досить просто. Ми беремо запис картки з першої дії (оскільки вона повинна бути однаковою для всіх дій, ми могли вибрати будь-яку, але перша здається розумним вибором). Тоді ми використовуємо рядкову інтерполяцію (
\(...)
), щоб побудувати щось схоже "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 для отримання додаткової інформації.
Зараз це працює, оскільки правління Dev Trevlo є загальнодоступним. Але що робити, якщо ми хочемо приватні дані?
Право спосіб зробити це , щоб генерувати маркер API. Trello API Керівництво по початку роботи має докладний runthrough про те , як це зробити. Але ми поспішаємо, тож ми зробимо це ледачим способом ...
Увійдіть до 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 . Тож, знаєте, будьте обережні. Або перейдіть через крок створення ключа / маркер API.
Тепер модифікуйте подалі, щоб отримати точні дані, які вам потрібні у потрібному форматі.