I’m working in some automation and one of the things I needed to solve was a script to download JIRA attachments with Python, here’s how I did it.

Using the REST API of JIRA and some python modules:

We start defining the she-bang, author, modules and variables that we’ll need before:

#!/usr/bin/python
# miguel ortiz
# Requests module: http://docs.python-requests.org/en/latest/
# Documentation: <url>

# -----------------------------------  modules
import sys
import csv, json
import requests

# ---------------------------------- variables
myTicket = sys.argv[1] # Your ticket: ABC-123
user = 'miguel'     # JIRA user
pasw = 'mypassword' # JIRA password
jiraURL = 'https://yourinstance.jira.com/rest/api/latest/issue/'
fileName = 'my_attached_file' # In this case we'll be looking for a specific file in the attachments
attachment_final_url="" # To validate if there are or not attachments

Using ‘requests’ to perform the connection to JIRA:

def main() :
    print '\n\n [ You are checking ticket: ' + myTicket + ' ]\n'
    # Request Json from JIRA API
    r = requests.get('jiraURL+myTicket, auth=(user, pasw),timeout=5)

    # status of the request
    rstatus = r.status_code
    
    # If the status isn't 200 we leave
    if not rstatus == 200 :
        print 'Error accesing JIRA:' + str(rstatus)
        exit()
    else:
        rlinkdata = rlink.json()
        data = r.json()

Now we validate if there are attachments and if our desired attachment is present and then form the URL of the attachment to be downloaded:

 if not data['fields']['attachment'] :            
     status_attachment_name = 'ERROR: Nothing attached, attach a file named: ' + fileName
     attachment_final_url=""
    else:
        for i in data['fields']['attachment'] :
          if i['filename'] == fileName :
             attachment_final_url = i['content']
             status_attachment_name = 'OK: The desired attachment exists: ' + fileName
             attachment_name = False
             attachment_amount = False
             attachment_files = False
             break
          else :
            attachment_files = False
            status_attachment_name = 'ERROR: None of the files has the desired name ' 
            attachment_final_url=""
            attachment_name = True
            attachment_amount = True
            continue

Once we validated the file is present we download it (I’ve added UTF8 support because of my specific needs):

if attachment_final_url != "" :
        r = requests.get(attachment_final_url, auth=(user, pasw), stream=True)
        with open(fileName, "wb") as f: 
            f.write(r.content.decode('iso-8859-1').encode('utf8'))
        f.close()

if __name__ == "__main__" :
 main()

And that’s it.