Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
vendors:cisco:uc:ece:interactive-api-scripts [2024/05/28 09:20] – ↷ Page name changed from vendors:cisco:uc:ece:interactive-api to vendors:cisco:uc:ece:interactive-api-scripts gerardorourkevendors:cisco:uc:ece:interactive-api-scripts [2024/06/05 16:06] (current) – [ECE Purge Attachments by Queue ID and day range] gerardorourke
Line 959: Line 959:
 logging.info(message) logging.info(message)
 message = ('---------- Finished! ----------') message = ('---------- Finished! ----------')
 +logging.info(message)
 +</code>
 +
 +===== Retrieve Activity and Case ID info for Activities in specific Date Range and only for certain Queue IDs =====
 +
 +<code python>
 +# Author Gerry O'Rourke
 +# Date: 05/06/2024
 +# Version: 2.02
 +
 +# Example1
 +# 'ECE-Get-Activities_V2.0.py  -q 1015 -r 10'
 +# This will get Activities for yesterday (-d defaults to 1 and -r default to only get 1 days worth)
 +#
 +# Example2
 +# 'ECE-Get-Activities_V2.0.py  -d 0 -q 1015 -r 10'
 +# Get Activities for Queue ID 1015 from today (-d 0), and go back 10 days. i.e. the last 10 days including today.
 +
 +# Example3 'ECE-Get-Activities_V2.0.py  -d 1 -q 1015 -1 1023 -r 3'
 +# Get Activities for yesterday, the day before yesterday and the day before that, for queues 1015 AND 1023
 +# End date is "-d 1" - i.e. 1 day ago and range (-r) is 3 days   (-d 0)
 +
 +# Note this script should be improved - as the Case ID for each Activity can be retrieved from the Activity Search Response (and there is no need to get the Activity to find the Case ID)
 +
 +import time  # used when pausing script for X milliseconds
 +import json
 +import os  # check / creating folders
 +import argparse
 +import sys  # used for sys.exit and standard output
 +import requests  # used for http requests
 +import urllib3  #
 +from datetime import datetime
 +from datetime import date
 +from datetime import timedelta
 +import logging
 +from logging.handlers import RotatingFileHandler
 +
 +urllib3.disable_warnings()  # Suppress cert warnings
 +
 +# Initial Variables
 +loglevel = logging.DEBUG  # DEBUG, INFO
 +logging.basicConfig(handlers=[logging.StreamHandler(sys.stdout),
 +                              RotatingFileHandler('logs/ece-get-activities.log', maxBytes=10 * 1024 * 1024,
 +                                                  backupCount=10)],
 +                    style='{',
 +                    format='{asctime} - {levelname:8s} - {message}',
 +                    level=loglevel)
 +ece_username = 'my_username'
 +ece_password = 'my_pa$$w0rd'
 +ece_host = 'ece-webserver.mydomain.com'
 +environment = 'PRD'  # Do not have any spaces - set to 'LAB' or 'PROD'
 +delay = 333 / 1000  # Time to pause when retrieving HTTP Request loops - to reduce load on server, e.g. 200/1000 -> 4
 +# API Requests per second, 333/1000 -> 3 API requests per second, 500/100 => 2 API calls per second.
 +rootFolder = 'C:/eceScripts/ECE-Export-Activities/' + environment + '/'
 +activity_ids_searched = []
 +activity_ids_with_attachments = []
 +case_ids = []
 +case_ids_closed = []
 +error_counter = 0
 +error_message = ''
 +startTime = datetime.now()
 +
 +message = ('--------------- Starting! ---------------')
 +logging.info(message)
 +message = ('startTime: ' + startTime.strftime("%d/%m/%Y %H:%M:%S"))
 +logging.info(message)
 +message = ('Arguments supplied: ' + str(sys.argv))
 +logging.info(message)
 +
 +
 +def getArguments():
 +    global endDate
 +    global startDate
 +    global queueIds
 +    global retrieveActivities
 +    global writeActivitiesToFile
 +    global error_counter
 +    global error_message
 +
 +    parser = argparse.ArgumentParser()
 +    parser.add_argument('-d', '--days', type=int,
 +                        help='sets the end date, e.g. -d 180, sets the end dat as 180 days ago')
 +    parser.add_argument('-r', '--dayrange', type=int, default=1, help='by default only a single day')
 +    parser.add_argument('-q', '--queue', action='append',
 +                        help='Queue IDs, for multiple queue ID enter -q before each one')
 +    parser.add_argument('-a', '--activities', action='store_true',
 +                        help='Retrieve the Activities found (need to use this if we want to get Case info)')
 +    parser.add_argument('-w', '--write', action='store_true',
 +                        help='Write Activities out to file')
 +
 +    args = parser.parse_args()
 +    if args.days:
 +        endDate = date.today() - timedelta(days=args.days)
 +        message = ('End Date set to: ' + endDate.strftime('%Y-%m-%d') + 'T23:59:59')
 +        logging.info(message)
 +    elif args.days == 0:
 +        endDate = date.today()
 +        message = ('End Date set to: ' + endDate.strftime('%Y-%m-%d') + 'T23:59:59')
 +        logging.info(message)
 +    else:
 +        message = ('No date argument set. Enter the number of days from today, e.g. "-d 1", would be 1 day ago.')
 +        logging.error(message)
 +        error_counter = error_counter + 1
 +        error_message = 'Arguments not set correctly - please check log file for more information.'
 +        exit(1)
 +
 +    if args.dayrange:
 +        startDate = endDate - timedelta(days=(args.dayrange - 1))
 +        message = ('Start Date set to: ' + startDate.strftime('%Y-%m-%d') + 'T00:00:00')
 +        logging.info(message)
 +
 +    if args.queue:
 +        queueIds = args.queue
 +        message = ('Queue ID list: ' + str(queueIds))
 +        logging.info(message)
 +    else:
 +        message = (
 +            'No queue ID data set. This app COULD (if we wanted to!) be used to retrieve all activities for a date '
 +            'range but that is not what we want'
 +            'Hence you must enter at least 1 queue with the "-q" parameter. For multiple queues add a "-q" for in '
 +            'front of each queue ID.')
 +        logging.info(message)
 +        error_counter = error_counter + 1
 +        error_message = 'Arguments not set correctly - please check log file for more information.'
 +        exit(1)
 +
 +    if args.activities:
 +        retrieveActivities = True
 +    else:
 +        retrieveActivities = False
 +
 +    if args.write:
 +        writeActivitiesToFile = True
 +    else:
 +        writeActivitiesToFile = False
 +
 +
 +def loginEce():
 +    global error_counter
 +    global error_message
 +    login_url = 'https://' + ece_host + '/system/ws/v12/authentication/user/login?forceLogin=yes'
 +    loginUser = '{"userName":"' + ece_username + '","password":"' + ece_password + '"}'
 +    loginHeaders = {"Content-Type": "application/json"}
 +    message = ('Attempting to login...')
 +    logging.info(message)
 +
 +    responseStatusCode = 0
 +    try:
 +        response = requests.post(url=login_url, verify=False, headers=loginHeaders, data=loginUser, timeout=5)
 +        responseHeaders = (response.headers)
 +        responseStatusCode = (response.status_code)
 +    except:
 +        message = ('Issue Calling Login URL.')
 +        logging.error(message)
 +
 +    if (responseStatusCode == 204):
 +        # Get the X-egain-session Header value returned after successful (204) login.
 +        global responseToken
 +        responseToken = (responseHeaders['X-egain-session'])
 +        global eceHeaders
 +        eceHeaders = {"Accept": "application/json", "X-egain-session": responseToken}
 +        message = ('Login Successful!, X-egain-session value is: ' + str(responseToken))
 +        logging.info(message)
 +    else:
 +        message = ('Login Failed!, Status Code: ' + str(responseStatusCode))
 +        logging.error(message)
 +        error_counter = error_counter + 1
 +        error_message = 'Failed to log into ECE successfully. Please check log file for more information.'
 +        sys.exit(1)
 +
 +
 +def logoutEce():
 +    logoutUrl = 'https://' + ece_host + '/system/ws/v12/authentication/user/logout'
 +    responseStatusCode = 0
 +    try:
 +        response = requests.delete(url=logoutUrl, verify=False, headers=eceHeaders)
 +        responseStatusCode = (response.status_code)
 +        response_text = response.text
 +    except:
 +        message = ('Issue Calling Logout URL.')
 +        logging.error(message)
 +
 +    if (responseStatusCode == 204):
 +        message = ('Logged out successfully.')
 +        logging.info(message)
 +    else:
 +        message = ('Logout Failed!, Status Code: ' + str(responseStatusCode) + '\nError Response: ' + response_text)
 +        logging.error(message)
 +
 +
 +def listActivities(startDate, endDate, pageNum, queueId):
 +    global activity_ids_searched
 +    global activity_ids_with_attachments
 +    global activityCount
 +    global currentPageNum
 +    global pageSize
 +    global retrievedData
 +    global error_counter
 +
 +    startDateString = (startDate.strftime('%Y-%m-%d'))
 +    endDateString = (endDate.strftime('%Y-%m-%d'))
 +    currentPageNum = pageNum
 +    retrievedData = False
 +    listActivitiesUrl = 'https://' + ece_host + '/system/ws/v12/interaction/activity?type=email&queue=' + str(
 +        queueId) + '&$pagenum=' + str(
 +        currentPageNum) + '&lastModifiedDate=[' + startDateString + 'T00:00:00.000Z,' + endDateString + 'T23:59:59.999Z]'
 +    message = ('listActivitiesUrl: ' + listActivitiesUrl)
 +    logging.debug(message)
 +
 +    # Attempt to Retrieve List of Activities
 +    responseStatusCode = 0
 +    try:
 +        response = requests.get(url=listActivitiesUrl, verify=False, headers=eceHeaders, timeout=5)
 +        responseStatusCode = (response.status_code)
 +        responseText = response.text
 +    except:
 +        message = ('Issue Calling List Activity URL.')
 +        logging.error(message)
 +
 +    if (responseStatusCode == 200):
 +        try:
 +            activityDict = json.loads(responseText)
 +            activityCount = activityDict['paginationInfo']['count']
 +            # currentPageNum = activityDict['paginationInfo']['pagenum']
 +            pageSize = activityDict['paginationInfo']['pagesize']
 +            # Loop through the file and get each Activity id
 +            for id in activityDict['activity']:
 +                activityId = str(id['id'])  # get the Activity ID
 +                # print('activityId: ',activityId)
 +                activity_ids_searched.append(activityId)
 +                activityAttachmentsCount = id['attachments']['count' # Get the Attachments Count
 +                # print('activityAttachmentsCount: ', activityAttachmentsCount)
 +                if (activityAttachmentsCount > 0):
 +                    activity_ids_with_attachments.append(activityId)
 +                retrievedData = True
 +        except Exception as e:
 +            message = ('Error in listActivities Function. error:' + str(e))
 +            logging.error(message)
 +            error_counter = error_counter + 1
 +    elif (currentPageNum == 1 and responseStatusCode == 204):
 +        message = ('No Activities Content for that date range')
 +        logging.info(message)
 +    elif (responseStatusCode == 204):
 +        message = ('Completed search.')
 +        logging.info(message)
 +    else:
 +        message = ('Failed to list Activities, statusCode: ' + str(responseStatusCode))
 +        logging.error(message)
 +        error_counter = error_counter + 1
 +
 +
 +def getActivity(id, folder):
 +    message = ('Attempting to retrieve Activity Id: ' + id + '...')
 +    logging.debug(message)
 +    activityUrl = 'https://' + ece_host + '/system/ws/v12/interaction/activity/' + id + '?$attribute=all'
 +    # Attempt to get Activity Id
 +    response = requests.get(url=activityUrl, verify=False, headers=eceHeaders)
 +
 +    # Store Response Values
 +    responseStatusCode = (response.status_code)
 +    responseText = response.text
 +
 +    # print (activityDict.keys())
 +    # print (activityDict['activity'][0]['case']['id'])
 +
 +    if (responseStatusCode == 200):
 +        try:
 +            activityDict = json.loads(responseText)
 +            caseId = str(activityDict['activity'][0]['case']['id'])  # Get the Case Id
 +            if caseId not in case_ids:
 +                case_ids.append(caseId)
 +            if (writeActivitiesToFile):
 +                fileName = 'activityId-' + id + '-caseId-' + caseId + '.json'
 +                myFolder = rootFolder + folder
 +                filePath = myFolder + '/' + fileName
 +                # Check whether the specified path exists or not
 +                isExist = os.path.exists(myFolder)
 +                if not isExist:
 +                    # Create a new directory because it does not exist
 +                    os.makedirs(myFolder)
 +                    message = ('New directory: "' + myFolder + '" is created.')
 +                    logging.info(message)
 +                # Save the activity as a text file
 +                text_file = open(filePath, "w", encoding="utf-8")
 +                text_file.write(responseText)
 +                text_file.close()
 +                message = ('Saved Activity Id : ' + id + 'to file.')
 +                logging.debug(message)
 +        except Exception as e:
 +            message = ('Error in getActivity function. error: ' + str(e))
 +            logging.error(message)
 +            logoutEce()
 +            sys.exit(2)
 +    else:
 +        print('Failed to retrieve Activity')
 +
 +
 +def getCase(id):
 +    message = ('Attempting to retrieve Case Id: ' + id + '...')
 +    logging.debug(message)
 +    caseUrl = 'https://' + ece_host + '/system/ws/v12/interaction/case/' + id + '?$attribute=all'
 +    # Attempt to get Activity Id
 +    response = requests.get(url=caseUrl, verify=False, headers=eceHeaders)
 +
 +    # Store Response Values
 +    responseStatusCode = (response.status_code)
 +    responseText = response.text
 +
 +    if (responseStatusCode == 200):
 +        try:
 +            caseDict = json.loads(responseText)
 +            caseStatus = str(caseDict['case'][0]['status']['value'])  # Get the Case Id
 +            if (caseStatus == 'closed'):
 +                case_ids_closed.append(caseId)
 +            if (writeActivitiesToFile):
 +                fileName = 'caseId-' + id + '-' + caseStatus + '.json'
 +                myFolder = rootFolder + 'Cases'
 +                filePath = myFolder + '/' + fileName
 +                # Check whether the specified path exists or not
 +                isExist = os.path.exists(myFolder)
 +                if not isExist:
 +                    # Create a new directory because it does not exist
 +                    os.makedirs(myFolder)
 +                    message = ('New directory: "' + myFolder + '" is created.')
 +                    logging.info(message)
 +                # Save the activity as a text file
 +                text_file = open(filePath, "w", encoding="utf-8")
 +                text_file.write(responseText)
 +                text_file.close()
 +                message = ('Saved Case Id : ' + id + ' to file.')
 +                logging.debug(message)
 +        except Exception as e:
 +            message = ('Error in getCase function. error: ' + str(e))
 +            logging.error(message)
 +            logoutEce()
 +            sys.exit(2)
 +    else:
 +        print('Failed to retrieve Case')
 +
 +
 +# get the Command line parameters
 +getArguments()
 +
 +# Login
 +loginEce()
 +
 +# Loop through queues provided
 +for queueId in queueIds:
 +    message = ('QueueId: ' + str(queueId))
 +    logging.info(message)
 +    listActivities(startDate, endDate, 1, queueId)
 +    if (retrievedData):
 +        message = ('Activity Count: ' + str(activityCount))
 +        logging.info(message)
 +        message = ('PageSize: ' + str(pageSize))
 +        logging.info(message)
 +        message = ('Current Page Num: ' + str(currentPageNum))
 +        logging.debug(message)
 +
 +        while ((currentPageNum * pageSize) < activityCount):
 +            currentPageNum += 1
 +            message = ('Current Page Num: ' + str(currentPageNum))
 +            logging.debug(message)
 +            time.sleep(delay)
 +            listActivities(startDate, endDate, currentPageNum, queueId)
 +
 +message = ('Number of Activities Searched: ' + str(len(activity_ids_searched)))
 +logging.debug(message)
 +message = ('Number of Activity IDs with attachments: ' + str(len(activity_ids_with_attachments)))
 +logging.debug(message)
 +message = ('Activity Ids Searched: ' + str(activity_ids_searched))
 +logging.debug(message)
 +message = ('Activity Ids with attachments: ' + str(activity_ids_with_attachments))
 +logging.debug(message)
 +
 +if (retrieveActivities):
 +    message = ('Getting activityIds. This might take some time...')
 +    logging.info(message)
 +    for activityId in activity_ids_searched:
 +        message = ('Getting activityId: ' + str(activityId))
 +        logging.debug(message)
 +        time.sleep(delay)
 +        getActivity(activityId, 'Activities-All')
 +
 +    message = ('Number of case_ids: ' + str(len(case_ids)))
 +    logging.debug(message)
 +    message = ('case_ids: ' + str(case_ids))
 +    logging.debug(message)
 +
 +    message = ('Getting case_ids. This might take some time...')
 +    logging.info(message)
 +    for caseId in case_ids:
 +        message = ('Getting caseId: ' + str(caseId))
 +        logging.debug(message)
 +        time.sleep(delay)
 +        getCase(caseId)
 +
 +    message = ('Number of Closed case_ids: ' + str(len(case_ids_closed)))
 +    logging.debug(message)
 +    message = ('Closed case_ids: ' + str(case_ids_closed))
 +    logging.debug(message)
 +
 +# Logout
 +logoutEce()
 +
 +# Print Summary At the end
 +message = ('#########################################')
 +logging.info(message)
 +message = ('Filter StartDate: ' + startDate.strftime('%Y-%m-%d') + ' 00:00:00')
 +logging.info(message)
 +message = ('Filter EndDate: ' + endDate.strftime('%Y-%m-%d') + ' 23:59:59')
 +logging.info(message)
 +message = ('Number of Activities Searched: ' + str(len(activity_ids_searched)))
 +logging.info(message)
 +message = ('Number of Activity IDs with attachments: ' + str(len(activity_ids_with_attachments)))
 +logging.info(message)
 +
 +if (retrieveActivities):
 +    message = ('Number of case_ids: ' + str(len(case_ids)))
 +    logging.info(message)
 +    message = ('Number of Closed case_ids: ' + str(len(case_ids_closed)))
 +    logging.info(message)
 +
 +message = ('Activity Ids Searched: ' + str(activity_ids_searched))
 +logging.info(message)
 +message = ('Activity Ids with attachments: ' + str(activity_ids_with_attachments))
 +logging.info(message)
 +
 +if (retrieveActivities):
 +    message = ('case_ids: ' + str(case_ids))
 +    logging.info(message)
 +    message = ('Closed case_ids: ' + str(case_ids_closed))
 +    logging.info(message)
 +message = ('startTime: ' + startTime.strftime("%d/%m/%Y %H:%M:%S"))
 +logging.info(message)
 +endTime = datetime.now()
 +message = ('endTime: ' + endTime.strftime("%d/%m/%Y %H:%M:%S"))
 +logging.info(message)
 +duration = endTime - startTime
 +message = ('duration: ' + str(duration))
 +logging.info(message)
 +message = ('#########################################')
 +logging.info(message)
 +
 +message = ('--------------- Finished! ---------------')
 logging.info(message) logging.info(message)
 </code> </code>
  
  • vendors/cisco/uc/ece/interactive-api-scripts.1716884439.txt.gz
  • Last modified: 2024/05/28 09:20
  • by gerardorourke