Differences
This shows you the differences between two versions of the page.
| 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 gerardorourke | vendors: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 = (' | message = (' | ||
| + | logging.info(message) | ||
| + | </ | ||
| + | |||
| + | ===== Retrieve Activity and Case ID info for Activities in specific Date Range and only for certain Queue IDs ===== | ||
| + | |||
| + | <code python> | ||
| + | # Author Gerry O' | ||
| + | # Date: 05/06/2024 | ||
| + | # Version: 2.02 | ||
| + | |||
| + | # Example1 | ||
| + | # ' | ||
| + | # This will get Activities for yesterday (-d defaults to 1 and -r default to only get 1 days worth) | ||
| + | # | ||
| + | # Example2 | ||
| + | # ' | ||
| + | # Get Activities for Queue ID 1015 from today (-d 0), and go back 10 days. i.e. the last 10 days including today. | ||
| + | |||
| + | # Example3 ' | ||
| + | # 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 | ||
| + | import urllib3 | ||
| + | from datetime import datetime | ||
| + | from datetime import date | ||
| + | from datetime import timedelta | ||
| + | import logging | ||
| + | from logging.handlers import RotatingFileHandler | ||
| + | |||
| + | urllib3.disable_warnings() | ||
| + | |||
| + | # Initial Variables | ||
| + | loglevel = logging.DEBUG | ||
| + | logging.basicConfig(handlers=[logging.StreamHandler(sys.stdout), | ||
| + | RotatingFileHandler(' | ||
| + | backupCount=10)], | ||
| + | style=' | ||
| + | format=' | ||
| + | level=loglevel) | ||
| + | ece_username = ' | ||
| + | ece_password = ' | ||
| + | ece_host = ' | ||
| + | environment = ' | ||
| + | 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 = ' | ||
| + | activity_ids_searched = [] | ||
| + | activity_ids_with_attachments = [] | ||
| + | case_ids = [] | ||
| + | case_ids_closed = [] | ||
| + | error_counter = 0 | ||
| + | error_message = '' | ||
| + | startTime = datetime.now() | ||
| + | |||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | message = (' | ||
| + | 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(' | ||
| + | help=' | ||
| + | parser.add_argument(' | ||
| + | parser.add_argument(' | ||
| + | help=' | ||
| + | parser.add_argument(' | ||
| + | help=' | ||
| + | parser.add_argument(' | ||
| + | help=' | ||
| + | |||
| + | args = parser.parse_args() | ||
| + | if args.days: | ||
| + | endDate = date.today() - timedelta(days=args.days) | ||
| + | message = ('End Date set to: ' + endDate.strftime(' | ||
| + | logging.info(message) | ||
| + | elif args.days == 0: | ||
| + | endDate = date.today() | ||
| + | message = ('End Date set to: ' + endDate.strftime(' | ||
| + | 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 = ' | ||
| + | exit(1) | ||
| + | |||
| + | if args.dayrange: | ||
| + | startDate = endDate - timedelta(days=(args.dayrange - 1)) | ||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | |||
| + | if args.queue: | ||
| + | queueIds = args.queue | ||
| + | message = (' | ||
| + | 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 " | ||
| + | 'front of each queue ID.') | ||
| + | logging.info(message) | ||
| + | error_counter = error_counter + 1 | ||
| + | error_message = ' | ||
| + | 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 = ' | ||
| + | loginUser = ' | ||
| + | loginHeaders = {" | ||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | |||
| + | responseStatusCode = 0 | ||
| + | try: | ||
| + | response = requests.post(url=login_url, | ||
| + | responseHeaders = (response.headers) | ||
| + | responseStatusCode = (response.status_code) | ||
| + | except: | ||
| + | message = (' | ||
| + | logging.error(message) | ||
| + | |||
| + | if (responseStatusCode == 204): | ||
| + | # Get the X-egain-session Header value returned after successful (204) login. | ||
| + | global responseToken | ||
| + | responseToken = (responseHeaders[' | ||
| + | global eceHeaders | ||
| + | eceHeaders = {" | ||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | else: | ||
| + | message = (' | ||
| + | logging.error(message) | ||
| + | error_counter = error_counter + 1 | ||
| + | error_message = ' | ||
| + | sys.exit(1) | ||
| + | |||
| + | |||
| + | def logoutEce(): | ||
| + | logoutUrl = ' | ||
| + | responseStatusCode = 0 | ||
| + | try: | ||
| + | response = requests.delete(url=logoutUrl, | ||
| + | responseStatusCode = (response.status_code) | ||
| + | response_text = response.text | ||
| + | except: | ||
| + | message = (' | ||
| + | logging.error(message) | ||
| + | |||
| + | if (responseStatusCode == 204): | ||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | else: | ||
| + | message = (' | ||
| + | logging.error(message) | ||
| + | |||
| + | |||
| + | def listActivities(startDate, | ||
| + | global activity_ids_searched | ||
| + | global activity_ids_with_attachments | ||
| + | global activityCount | ||
| + | global currentPageNum | ||
| + | global pageSize | ||
| + | global retrievedData | ||
| + | global error_counter | ||
| + | |||
| + | startDateString = (startDate.strftime(' | ||
| + | endDateString = (endDate.strftime(' | ||
| + | currentPageNum = pageNum | ||
| + | retrievedData = False | ||
| + | listActivitiesUrl = ' | ||
| + | queueId) + '& | ||
| + | currentPageNum) + '& | ||
| + | message = (' | ||
| + | logging.debug(message) | ||
| + | |||
| + | # Attempt to Retrieve List of Activities | ||
| + | responseStatusCode = 0 | ||
| + | try: | ||
| + | response = requests.get(url=listActivitiesUrl, | ||
| + | responseStatusCode = (response.status_code) | ||
| + | responseText = response.text | ||
| + | except: | ||
| + | message = (' | ||
| + | logging.error(message) | ||
| + | |||
| + | if (responseStatusCode == 200): | ||
| + | try: | ||
| + | activityDict = json.loads(responseText) | ||
| + | activityCount = activityDict[' | ||
| + | # currentPageNum = activityDict[' | ||
| + | pageSize = activityDict[' | ||
| + | # Loop through the file and get each Activity id | ||
| + | for id in activityDict[' | ||
| + | activityId = str(id[' | ||
| + | # print(' | ||
| + | activity_ids_searched.append(activityId) | ||
| + | activityAttachmentsCount = id[' | ||
| + | # print(' | ||
| + | if (activityAttachmentsCount > 0): | ||
| + | activity_ids_with_attachments.append(activityId) | ||
| + | retrievedData = True | ||
| + | except Exception as e: | ||
| + | message = (' | ||
| + | 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 = (' | ||
| + | logging.info(message) | ||
| + | else: | ||
| + | message = (' | ||
| + | logging.error(message) | ||
| + | error_counter = error_counter + 1 | ||
| + | |||
| + | |||
| + | def getActivity(id, | ||
| + | message = (' | ||
| + | logging.debug(message) | ||
| + | activityUrl = ' | ||
| + | # Attempt to get Activity Id | ||
| + | response = requests.get(url=activityUrl, | ||
| + | |||
| + | # Store Response Values | ||
| + | responseStatusCode = (response.status_code) | ||
| + | responseText = response.text | ||
| + | |||
| + | # print (activityDict.keys()) | ||
| + | # print (activityDict[' | ||
| + | |||
| + | if (responseStatusCode == 200): | ||
| + | try: | ||
| + | activityDict = json.loads(responseText) | ||
| + | caseId = str(activityDict[' | ||
| + | if caseId not in case_ids: | ||
| + | case_ids.append(caseId) | ||
| + | if (writeActivitiesToFile): | ||
| + | fileName = ' | ||
| + | myFolder = rootFolder + folder | ||
| + | filePath = myFolder + '/' | ||
| + | # 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: "' | ||
| + | logging.info(message) | ||
| + | # Save the activity as a text file | ||
| + | text_file = open(filePath, | ||
| + | text_file.write(responseText) | ||
| + | text_file.close() | ||
| + | message = (' | ||
| + | logging.debug(message) | ||
| + | except Exception as e: | ||
| + | message = (' | ||
| + | logging.error(message) | ||
| + | logoutEce() | ||
| + | sys.exit(2) | ||
| + | else: | ||
| + | print(' | ||
| + | |||
| + | |||
| + | def getCase(id): | ||
| + | message = (' | ||
| + | logging.debug(message) | ||
| + | caseUrl = ' | ||
| + | # Attempt to get Activity Id | ||
| + | response = requests.get(url=caseUrl, | ||
| + | |||
| + | # Store Response Values | ||
| + | responseStatusCode = (response.status_code) | ||
| + | responseText = response.text | ||
| + | |||
| + | if (responseStatusCode == 200): | ||
| + | try: | ||
| + | caseDict = json.loads(responseText) | ||
| + | caseStatus = str(caseDict[' | ||
| + | if (caseStatus == ' | ||
| + | case_ids_closed.append(caseId) | ||
| + | if (writeActivitiesToFile): | ||
| + | fileName = ' | ||
| + | myFolder = rootFolder + ' | ||
| + | filePath = myFolder + '/' | ||
| + | # 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: "' | ||
| + | logging.info(message) | ||
| + | # Save the activity as a text file | ||
| + | text_file = open(filePath, | ||
| + | text_file.write(responseText) | ||
| + | text_file.close() | ||
| + | message = (' | ||
| + | logging.debug(message) | ||
| + | except Exception as e: | ||
| + | message = (' | ||
| + | logging.error(message) | ||
| + | logoutEce() | ||
| + | sys.exit(2) | ||
| + | else: | ||
| + | print(' | ||
| + | |||
| + | |||
| + | # get the Command line parameters | ||
| + | getArguments() | ||
| + | |||
| + | # Login | ||
| + | loginEce() | ||
| + | |||
| + | # Loop through queues provided | ||
| + | for queueId in queueIds: | ||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | listActivities(startDate, | ||
| + | if (retrievedData): | ||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | message = (' | ||
| + | logging.debug(message) | ||
| + | |||
| + | while ((currentPageNum * pageSize) < activityCount): | ||
| + | currentPageNum += 1 | ||
| + | message = (' | ||
| + | logging.debug(message) | ||
| + | time.sleep(delay) | ||
| + | listActivities(startDate, | ||
| + | |||
| + | message = (' | ||
| + | logging.debug(message) | ||
| + | message = (' | ||
| + | logging.debug(message) | ||
| + | message = (' | ||
| + | logging.debug(message) | ||
| + | message = (' | ||
| + | logging.debug(message) | ||
| + | |||
| + | if (retrieveActivities): | ||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | for activityId in activity_ids_searched: | ||
| + | message = (' | ||
| + | logging.debug(message) | ||
| + | time.sleep(delay) | ||
| + | getActivity(activityId, | ||
| + | |||
| + | message = (' | ||
| + | logging.debug(message) | ||
| + | message = (' | ||
| + | logging.debug(message) | ||
| + | |||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | for caseId in case_ids: | ||
| + | message = (' | ||
| + | logging.debug(message) | ||
| + | time.sleep(delay) | ||
| + | getCase(caseId) | ||
| + | |||
| + | message = (' | ||
| + | logging.debug(message) | ||
| + | message = (' | ||
| + | logging.debug(message) | ||
| + | |||
| + | # Logout | ||
| + | logoutEce() | ||
| + | |||
| + | # Print Summary At the end | ||
| + | message = ('#########################################' | ||
| + | logging.info(message) | ||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | |||
| + | if (retrieveActivities): | ||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | |||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | |||
| + | if (retrieveActivities): | ||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | endTime = datetime.now() | ||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | duration = endTime - startTime | ||
| + | message = (' | ||
| + | logging.info(message) | ||
| + | message = ('#########################################' | ||
| + | logging.info(message) | ||
| + | |||
| + | message = (' | ||
| logging.info(message) | logging.info(message) | ||
| </ | </ | ||