#! /usr/bin/env python3 # -*- coding: utf-8 -*- # vi:ts=4:et # Trello API Python CLI # License: MIT / WeKan Team try: # python 3 from urllib.parse import urlencode from urllib.request import urlretrieve except ImportError: # python 2 from urllib import urlencode import json import requests import sys # ------- TODO START ------------- # # - Check nested resources about how to recursively get all reactins etc: # https://developer.atlassian.com/cloud/trello/guides/rest-api/nested-resources/ # - Add checking status codes and stop/delay if errors in API. # If board is big, instead get small amount of board with paging of Trello REST API, # then have small delay, and then get more of that big amount of data, so that # there would not be timeouts with too much data # https://developer.atlassian.com/cloud/trello/guides/rest-api/status-codes/ # - Add batch requests, to get enough data at once: # https://developer.atlassian.com/cloud/trello/rest/api-group-batch/#api-batch-get # - Add rate limits with delays: # https://developer.atlassian.com/cloud/trello/guides/rest-api/rate-limits/ # - Use webhooks to receive data from Trello to WeKan, so that there would not be # need to repeatedly get same data again (no polling data), but instead get # changes pushed to WeKan with webhooks when they happen # https://developer.atlassian.com/cloud/trello/guides/rest-api/webhooks/ # https://developer.atlassian.com/cloud/trello/rest/api-group-webhooks/#api-webhooks-post # # ------- TODO END ------------- # ------- TRELLO SETTINGS START ------------- # # READ ABOVE TODO FIRST, BE CAREFUL WITH RATE LIMITS ETC. # # Keys and tokens: # - See API introduction: # https://developer.atlassian.com/cloud/trello/guides/rest-api/api-introduction/ # - Get developer API key and create token at top of https://trello.com/app-key # key = 'TRELLO-API-KEY-HERE' token = 'TRELLO-API-TOKEN-HERE' # # ------- TRELLO SETTINGS END ------------- arguments = len(sys.argv) - 1 if arguments == 0: print("=== Trello API Python CLI ===") print("License: MIT / WeKan Team") print("See settings in this api.py script for api key and token.") print("If *nix: chmod +x api.py => ./api.py users") print("Syntax:") print(" python3 api.py emoji # List all available emoji") print(" python3 api.py boards # List All Boards") print(" python3 api.py board BOARDID # Info of BOARDID") print(" python3 api.py card CARDID # Info of CARDID") print(" python3 api.py actions BOARDID # Actions of BOARDID") print(" python3 api.py reactions ACTIONID # Reactions of ACTIONID") print(" python3 api.py attachments CARDID # List attachments of CARDID") print(" python3 api.py download ATTACHMENTURL # Download file from attachment URL like https://.../image.png with streaming and minimal RAM usage") exit if arguments == 2: if sys.argv[1] == 'board': # ------- BOARD START ----------- #headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} headers = {'Accept': 'application/json'} boardid = sys.argv[2] print("=== ONE BOARD ===\n") listboard = 'https://api.trello.com/1/boards/' + boardid + '?key=' + key + '&token=' + token body = requests.get(listboard, headers=headers) data2 = body.text.replace('}',"}\n") print(data2) # ------- BOARD END ----------- if sys.argv[1] == 'card': # ------- CARD START ----------- headers = {'Accept': 'application/json'} cardid = sys.argv[2] print("=== ONE CARD ===\n") listcard = 'https://api.trello.com/1/cards/' + cardid + '?fields=all&key=' + key + '&token=' + token body = requests.get(listcard, headers=headers) data2 = body.text.replace('}',"}\n") print(data2) # ------- BOARD END ----------- if sys.argv[1] == 'actions': # ------- BOARD ACTIONS START ----------- headers = {'Accept': 'application/json'} boardid = sys.argv[2] print("=== ONE BOARD ACTIONS ===\n") listboardactions = 'https://api.trello.com/1/boards/' + boardid + '/actions?key=' + key + '&token=' + token body = requests.get(listboardactions, headers=headers) data2 = body.text.replace('}',"}\n") print(data2) # ------- BOARD ACTIONS END ----------- if sys.argv[1] == 'reactions': # ------- REACTIONS OF ACTIONID START ----------- headers = {'Accept': 'application/json'} actionid = sys.argv[2] print("=== REACTIONS OF ACTIONID ===\n") listreactions = 'https://api.trello.com/1/actions/' + actionid + '/reactionsSummary?key=' + key + '&token=' + token body = requests.get(listreactions, headers=headers) data2 = body.text.replace('}',"}\n") print(data2) # ------- REACTIONS OF ACTIONID END ----------- if sys.argv[1] == 'attachments': # ------- LIST CARD ATTACHMENTS START ----------- headers = {'Accept': 'application/json'} cardid = sys.argv[2] print("=== LIST CARD ATTACHMENTS ===\n") listcardattachments = 'https://api.trello.com/1/cards/' + cardid + '/attachments?key=' + key + '&token=' + token body = requests.get(listcardattachments, headers=headers) data2 = body.text.replace('}',"}\n") print(data2) # ------- LIST CARD ATTACHMENTS END ----------- if sys.argv[1] == 'download': # ------- DOWNLOAD BOARD ATTACHMENT START ----------- headers = {'Accept': 'application/json', 'Authorization': 'OAuth oauth_consumer_key="' + key + '", oauth_token="' + token + '"'} url = sys.argv[2] print("=== DOWNLOAD BOARD ATTACHMENT ===\n") local_filename = url.split('/')[-1] # NOTE the stream=True parameter below. Does streaming download with minimal RAM usage. with requests.get(url, stream=True, headers=headers) as r: r.raise_for_status() with open(local_filename, 'wb') as f: for chunk in r.iter_content(chunk_size=8192): # If you have chunk encoded response uncomment if # and set chunk_size parameter to None. #if chunk: f.write(chunk) print("filename: " + local_filename + "\n") # ------- DOWNLOAD BOARD ATTACHMENT END ----------- if arguments == 1: if sys.argv[1] == 'boards': # ------- LIST OF BOARDS START ----------- headers = {'Accept': 'application/json'} print("=== BOARDS ===\n") listboards = 'https://api.trello.com/1/members/me/boards?key=' + key + '&token=' + token body = requests.get(listboards, headers=headers) data2 = body.text.replace('}',"}\n") print(data2) # ------- LIST OF BOARDS END ----------- if sys.argv[1] == 'emoji': # ------- LIST OF EMOJI START ----------- headers = {'Accept': 'application/json'} print("=== LIST OF ALL EMOJI ===\n") listemoji = 'https://api.trello.com/1/emoji?key=' + key + '&token=' + token body = requests.get(listemoji, headers=headers) data2 = body.text.replace('}',"}\n") print(data2) # ------- LIST OF EMOJI END -----------