Action logger

The Action Logger can be used to record a wide range of UI actions from multiple SW applications during the enactment of a routine.

../_images/1_action_logger.png

Operating System

OS

modules.events.systemEvents.detectSelectionWindowsExplorer()[source]

Log currently selected files in windows explorer

Every 0.8 seconds it queries File explorer to check for selection.

Returns:

selectedFile/selectedFolder event

modules.events.systemEvents.logHotkeys()[source]

Log hotkeys using ‘keyboard’ python package.

All supported hotkeys are store in ‘keys_to_detect’ dictionary.

Once a supported hotkey is detected, a new thread is started to handle the event.

Returns:

hotkeys event

modules.events.systemEvents.logPasteHotkey()[source]

Paste hotkey is handled separately for performance reasons. Once the hotkey is detected, a thread is started to handle the event.

Returns:

paste hotkey

modules.events.systemEvents.logProcessesMac()[source]

detects programs opened and closed on mac.

Works by querying list of open programs every 2 seconds and determining if something has been added or removed to that list.

Returns:

modules.events.systemEvents.logProcessesWin()[source]

Detects programs opened and closed on windows.

Works by querying list of open programs every 0.5 seconds and determining if something has been added or removed to that list.

Returns:

programOpen/programClose event

modules.events.systemEvents.logUSBDrives()[source]

logs insertion and removal of usb drives

Returns:

insertUSB event

modules.events.systemEvents.printerLogger()[source]

Watchfor activity at the installed printers (works also with network printers).

Returns:

printSubmitted event

modules.events.systemEvents.watchFolder()[source]

monitor file/folder changes on windows using system APIs

https://pythonhosted.org/watchdog/api.html#event-handler-classes

Returns:

file/folder changes event

modules.events.systemEvents.watchFolderMac()[source]

monitor file/folder changes on mac using system APIs

Returns:

file/folder changes event

modules.events.systemEvents.watchRecentsFilesWin()[source]

Log files and folders recently opened on Windows

Returns:

openFile/openFolder event

Clipboard

modules.events.clipboardEvents.logClipboard()[source]

Constantly monitors clipboard for changes. Detects ‘copy’ event. ‘paste’ event is detected by systemEvents.handleHotkey

Returns:

JSON containing clipboard event

Mouse

modules.events.mouseEvents.logMouse()[source]

Log mouse coordinates on click in excel

Deprecated since version 1.1.0: Not in use anymore.

Microsoft Office

Microsoft Office events are logged using native COM APIs on windows while Excel on macOS is logged using a custom JavaScript AddIn.

Note

For each office application there are two components in the code:

  • a function, triggered by the action logger and responsible for handling events

  • a class, which is the interface used to communicate with the application’s APIs

Excel

modules.events.officeEvents.excelEvents(status_queue, filepath=None)[source]

Handle excel events on windows using pythoncom.

Also manages exception in case excel instance fails to launch.

Parameters:
  • status_queue – queue to pring messages on GUI

  • filepath – optional path of excel file to open

modules.events.officeEvents.excelEventsMacServer(status_queue, excelFilepath=None)[source]

Handle excel events on macOS using xlwings.

The logging process is different on macOS. An excel Add-in in javascript is installed on excel and it sends data to a node.js server started by this function.

Parameters:
  • status_queue – queue to print messages on GUI

  • excelFilepath – optional path of excel file to open

Returns:

openWorkbook event

class modules.events.officeEvents.ExcelEvents[source]

Excel application object events

The parameters in each method of these class are passed automatically by the APIs when the event occurs.

https://docs.microsoft.com/en-us/office/vba/api/excel.application(object)

OnAfterCalculate()[source]

This event occurs after a calculation has been performed

Returns:

afterCalculate event

OnNewWorkbook(Wb)[source]

New workbook is created

Parameters:

Wb – workbook

Returns:

newWorkbook event

OnSheetActivate(Sh)[source]

Occurs when a worksheet is selected

Parameters:

Sh – worksheet

Returns:

selectWorksheet event

OnSheetBeforeDelete(Sh)[source]

Occurs when a worksheet is deleted

Parameters:

Sh – worksheet

Returns:

deleteWorksheet event

OnSheetBeforeDoubleClick(Sh, Target, Cancel)[source]

Triggered when double clicking on a cell

Parameters:
  • Sh – worksheet

  • Target – cell clicked

  • Cancel – true if event is canceled

Returns:

doubleClickCellWithValue/doubleClickEmptyCell event

OnSheetBeforeRightClick(Sh, Target, Cancel)[source]

Triggered when right clicking on a cell

Parameters:
  • Sh – worksheet

  • Target – cell clicked

  • Cancel – true if event is canceled

Returns:

rightClickCellWithValue/rightClickEmptyCell event

OnSheetCalculate(Sh)[source]

Occurs when a calculation is performed

Parameters:

Sh – worksheet

Returns:

sheetCalculate event

OnSheetChange(Sh, Target)[source]

Occurs when a cell is edited

Parameters:
  • Sh – worksheet

  • Target – edited cell

Returns:

editCellSheet event

OnSheetDeactivate(Sh)[source]

Occurs when a worksheet is deselected

Parameters:

Sh – worksheet

Returns:

deselectWorksheet event

Occurs when a link is clicked

Parameters:
  • Sh – worksheet

  • Target – cell clicked

Returns:

followHiperlinkSheet event

OnSheetPivotTableAfterValueChange(Sh, TargetPivotTable, TargetRange)[source]

Occurs when values in a pivot table change.

Parameters:
  • Sh – worksheet

  • TargetPivotTable – target table

  • TargetRange – range modified

Returns:

pivotTableValueChangeSheet event

OnSheetSelectionChange(Sh, Target)[source]

Occurs when a cell or range of cells is selected

Parameters:
  • Sh – worksheet

  • Target – selected range

Returns:

getCell/getRange event

OnSheetTableUpdate(Sh, Target)[source]

Occurs when a table is updated

Parameters:
  • Sh – worksheet

  • Target – table

Returns:

worksheetTableUpdated event

OnWindowActivate(Wb, Wn)[source]

Triggers when excel windows is opened

Parameters:
  • Wb – workbook

  • Wn – window

Returns:

openWindow event

OnWindowDeactivate(Wb, Wn)[source]

Triggers when excel windows is closed

Parameters:
  • Wb – workbook

  • Wn – window

Returns:

closeWindow event

OnWindowResize(Wb, Wn)[source]

Triggers when excel windows is resized

Parameters:
  • Wb – workbook

  • Wn – window

Returns:

resizeWindow event

OnWorkbookActivate(Wb)[source]

workbook is activated (occurs when excel window is clicked and goes to foreground)

Parameters:

Wb – workbook

Returns:

activateWorkbook event

OnWorkbookAddinInstall(Wb)[source]

An AddIn is installed in excel

Parameters:

Wb – workbook

Returns:

addinInstalledWorkbook event

OnWorkbookAddinUninstall(Wb)[source]

An AddIn is uninstalled in excel

Parameters:

Wb – workbook

Returns:

addinUninstalledWorkbook event

OnWorkbookAfterSave(Wb, Success)[source]

This event is triggered after a workbook has been saved.

Parameters:
  • Wb – workbook

  • Success – boolean value to indicate if saving was succesful

Returns:

saveWorkbook event

OnWorkbookAfterXmlExport(Wb, Map, Url, Result)[source]

XML is exported from excel

Parameters:
  • Wb – workbook

  • Map

  • Url

  • Result – import result

Returns:

XMLExportWorkbook event

OnWorkbookAfterXmlImport(Wb, Map, Url, Result)[source]

XML is imported into excel

Parameters:
  • Wb – workbook

  • Map

  • Url

  • Result – import result

Returns:

XMLImportWorkbook event

OnWorkbookBeforeClose(Wb, Cancel)[source]

workbook is closed

Parameters:
  • Wb – workbook

  • Cancel – true if close is canceled

Returns:

closeWorkbook event

OnWorkbookBeforePrint(Wb, Cancel)[source]

Print action is triggered in a workbook

Parameters:
  • Wb – workbook

  • Cancel – true if print is canceled

Returns:

printWorkbook event

OnWorkbookBeforeSave(Wb, SaveAsUI, Cancel)[source]

This is triggered right before a workbook is saved

Parameters:
  • Wb – workbook

  • SaveAsUI – ‘save as’ dialog box displayed to user

  • Cancel – saving is canceled

Returns:

beforeSaveWorkbook event

OnWorkbookDeactivate(Wb)[source]

workbook is deactivated (occurs when excel window is not visible anymore)

Parameters:

Wb – workbook

Returns:

deactivateWorkbook event

OnWorkbookNewChart(Wb, Ch)[source]

A new chart is added to the open workbook

Parameters:
  • Wb – workbook

  • Ch – chart

Returns:

newChartWorkbook event

OnWorkbookNewSheet(Wb, Sh)[source]

New sheet is created

Parameters:
  • Wb – workbook

  • Sh – worksheet

Returns:

addWorksheet event

OnWorkbookOpen(Wb)[source]

Workbook is opened

Parameters:

Wb – workbook

Returns:

openWorkbook event

__init__()[source]
filterNoneRangeValues(values)[source]

When a range of cells is selected, Target.Value is a Tuple of tuples containing the value of every selected cell Target.Value = ((None, None, None, None), (None, ‘prova’, None, None)). I’m interested only in cells with meaningful value, so I create a single list with all the tuples in Target.Value (by chaining the tuples using chain.from_iterable(list)) obtaining [None, None, None, None, None, ‘prova’, None, None] Now I remove the elements that are None by applying a filter operator to the previous list

Parameters:

values – tuple of values

Returns:

tuple of values without None values

getWorksheets(Sh, Wb)[source]

return list of active worksheet in workbook

Parameters:
  • Sh – worksheet

  • Wb – workbook

Returns:

list of active worksheet in workbook

Word

modules.events.officeEvents.wordEvents(filename=None)[source]

Handle word events on windows using pythoncom.

Parameters:

filename – optional name of file to open

class modules.events.officeEvents.WordEvents[source]

Application object events https://docs.microsoft.com/en-us/office/vba/api/word.application

OnDocumentBeforePrint(Doc, Cancel)[source]

Occurs when a document is printed

Parameters:
  • Doc – document

  • Cancel – true if event is canceled

Returns:

saveDocument event

OnDocumentBeforeSave(Doc, SaveAsUI, Cancel)[source]

Occurs when a document is saved

Parameters:
  • Doc – document

  • SaveAsUI – true if ‘save as’ dialog is displayed

  • Cancel – true if event is canceled

Returns:

saveDocument event

OnDocumentChange()[source]

Occurs when a document is changed

Returns:

changeDocument event

OnDocumentOpen(Doc)[source]

Occurs when a new document is opened

Parameters:

Doc – document

Returns:

openDocument event

OnNewDocument(Doc)[source]

Occurs when a new document is created

Parameters:

Doc – document

Returns:

newDocument event

OnWindowActivate(Doc, Wn)[source]

Occurs when window is activated

Parameters:
  • Doc – document

  • Wn – window

Returns:

activateWindow event

OnWindowBeforeDoubleClick(Sel, Cancel)[source]

Occurs when double clicking on document

https://docs.microsoft.com/en-us/office/vba/api/word.selection#properties

Parameters:
  • Sel – selection

  • Cancel – true if action is canceled

Returns:

doubleClickWindow event

OnWindowBeforeRightClick(Sel, Cancel)[source]

Occurs when right clicking on document

Parameters:
  • Sel – selection

  • Cancel – true if action is canceled

Returns:

rightClickWindow event

OnWindowDeactivate(Doc, Wn)[source]

Occurs when window is deactivated

Parameters:
  • Doc – document

  • Wn – window

Returns:

activateWindow event

__init__()[source]

PowerPoint

modules.events.officeEvents.powerpointEvents(filename=None)[source]

Handle powerpoint events on windows using pythoncom.

Parameters:

filename – optional name of file to open

class modules.events.officeEvents.PowerpointEvents[source]

Application object events https://docs.microsoft.com/en-us/office/vba/api/powerpoint.application

OnAfterPresentationOpen(Pres)[source]

Occurs when a presentation is opened

Parameters:

Pres – presentation

Returns:

savePresentation event

OnAfterShapeSizeChange(shp)[source]

Occurs when a shape in a presentation is resized

Parameters:

shp – shape

Returns:

shapeSizeChangePresentation event

OnNewPresentation(Pres)[source]

New presentation is created

Parameters:

Pres – presentation

Returns:

newPresentation event

OnPresentationBeforeClose(Pres, Cancel)[source]

Occurs when a presentation is closed

Parameters:
  • Pres – presentation

  • Cancel – true if event is canceled

Returns:

closePresentation event

OnPresentationBeforeSave(Pres, Cancel)[source]

Occurs when a presentation is saved

Parameters:
  • Pres – presentation

  • Cancel – true if event is canceled

Returns:

savePresentation event

OnPresentationNewSlide(Sld)[source]

A slide is added to an open presentation

Parameters:

Sld – slide

Returns:

newPresentationSlide event

OnPresentationPrint(Pres)[source]

Occurs when a presentation is printed

Parameters:

Pres – presentation

Returns:

printPresentation event

OnSlideSelectionChanged(SldRange)[source]

occurs when text selection on a slide changes

Parameters:

SldRange – range of slides

Returns:

SlideSelectionChanged event

OnSlideShowBegin(Wn)[source]

Occurs when slideshow begins

Parameters:

Wn – slideshowview https://docs.microsoft.com/en-us/office/vba/api/powerpoint.slideshowview

Returns:

slideshowBegin event

OnSlideShowEnd(Pres)[source]

Occurs when a slideshow ends

Parameters:

Pres – presentation

Returns:

slideshowEnd event

OnSlideShowNextClick(Wn, nEffect)[source]

Occurs when the next slide in a presentation is clicked during a slideshow

https://docs.microsoft.com/en-us/office/vba/api/powerpoint.effect#properties

Parameters:
Returns:

clickNextSlideshow event

OnSlideShowOnNext(Wn)[source]

Occurs when next slide is displayed during a slideshow

Parameters:

Wn – slideshowview https://docs.microsoft.com/en-us/office/vba/api/powerpoint.slideshowview

Returns:

nextSlideshow

OnSlideShowOnPrevious(Wn)[source]

Occurs when previous slide is clicked during a slideshow

https://docs.microsoft.com/en-us/office/vba/api/powerpoint.slideshowview.state

Parameters:

Wn – slideshowview https://docs.microsoft.com/en-us/office/vba/api/powerpoint.slideshowview

Returns:

previousSlideshow event

OnWindowActivate(Pres, Wn)[source]

Occurs when powerpoint window is activated

Parameters:
  • Pres – powerpoint presentation

  • Wn – window

Returns:

activateWindow event

OnWindowBeforeDoubleClick(Sel, Cancel)[source]

Occurs on right click on presentation

Parameters:
  • Sel – selection

  • Cancel – true if event is canceled

Returns:

doubleClickPresentation event

OnWindowBeforeRightClick(Sel, Cancel)[source]

Occurs on right click on presentation

Parameters:
  • Sel – selection

  • Cancel – true if event is canceled

Returns:

rightClickPresentation event

OnWindowDeactivate(Pres, Wn)[source]

Occurs when powerpoint window is deactivated

Parameters:
  • Pres – powerpoint presentation

  • Wn – window

Returns:

deactivateWindow event

__init__()[source]

Outlook

modules.events.officeEvents.outlookEvents()[source]

Handle outlook events using pythoncom

class modules.events.officeEvents.OutlookEvents[source]

https://stackoverflow.com/questions/49695160/how-to-continuously-monitor-a-new-mail-in-outlook-and-unread-mails-of-a-specific

OnItemSend(Item, Cancel)[source]

Occurs when a new message is sent

Parameters:
  • Item – message

  • Cancel – true if action is canceled

Returns:

sendMail event

OnMAPILogonComplete()[source]

Occurs when outlook checks for new mails

Returns:

logonComplete event

OnNewMailEx(receivedItemsIDs)[source]

Occurs when a new mail is received

Parameters:

receivedItemsIDs – id of received mail

Returns:

receiveMail event

OnQuit()[source]

Occurs when outlook quits

Returns:

quitOutlook event

OnReminder(Item)[source]

Occurs when there is a new reminder

Parameters:

Item – reminder item

Returns:

newReminder event

OnStartup()[source]

Occurs when outlook starts

Returns:

startupOutlook event

__init__()[source]

Browser

Note

Browser events are handled in the browser extension written in JavaScript.

In particular:

  • Browser application events (e.g. newTab, zoomTab, resizeWindow, …) are handled in extensions/browserLogger/background_script.js

  • Web page events (e.g. click, type, submit, …) are handled in extensions/browserLogger/content_script.js

Logging Server

The logging server was built using Flask. The server is launched when the user presses the Start Logger button in the GUI.

The selected browsers that needs to be enabled and the log file path are passed as parameters. At launch, the program checks if port 4444 is free on the system: in this case it starts listening for incoming requests.

The default route (/) is used to receive JSON payloads by every module containing data about an event and write them on the CSV file. This payload contains different fields depending on the type of recorded event. When the program is started, the CSV log file is created and the header is written.

modules.consumerServer.add_headers(response)[source]

Enable CORS, for browser extension

https://stackoverflow.com/a/35306327

modules.consumerServer.getServerStatus()[source]

Get server status for browser extension.

Returns status of each browser checkbox in GUI.

Returns:

true if browser checkbox in GUI is active

modules.consumerServer.runServer(status_queue)[source]

start server thread, executed by mainLogger

Parameters:

status_queue – queue to print messages in GUI

modules.consumerServer.writeLog()[source]

Route where json event is received and processed.

JSON event includes metadata about the event, such as the timestamp, category, application, concept:name and other information depending on the event type.

All this data is appended to the csv event log.