123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- #! /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 -----------
|