An open API service indexing awesome lists of open source software.

https://github.com/clointfusion/clointfusion

Cloint India Pvt. Ltd's (ClointFusion) Pythonic RPA (Automation) Platform
https://github.com/clointfusion/clointfusion

automation bots clointfusion-rpa-python-automation gui python python3 robotframework robots rpa software

Last synced: 8 months ago
JSON representation

Cloint India Pvt. Ltd's (ClointFusion) Pythonic RPA (Automation) Platform

Awesome Lists containing this project

README

          

## Welcome to , Made in India with ❤️


## Description

Cloint India Pvt. Ltd - Python functions for Robotic Process Automation shortly `RPA`.

# What is ClointFusion?

ClointFusion is an Indian firm based in Vadodara, Gujarat. ClointFusion is a Python-based RPA platform for developing Software BOTs. Using AI, we're working on Common Man's RPA.

#### Check out Project Status

![PyPI](https://img.shields.io/pypi/v/ClointFusion?label=PyPI%20Version)
![PyPI - License](https://img.shields.io/pypi/l/ClointFusion?label=License)
![PyPI - Status](https://img.shields.io/pypi/status/ClointFusion?label=Release%20Status)
![ClointFusion](https://snyk.io/advisor/python/ClointFusion/badge.svg)
![PyPI - Downloads](https://img.shields.io/pypi/dm/ClointFusion?label=PyPI%20Downloads)
![Libraries.io SourceRank](https://img.shields.io/librariesio/sourcerank/pypi/ClointFusion)
![PyPI - Format](https://img.shields.io/pypi/format/ClointFusion?label=PyPI%20Format)
![GitHub contributors](https://img.shields.io/github/contributors/ClointFusion/ClointFusion?label=Contributors)
![GitHub last commit](https://img.shields.io/github/last-commit/ClointFusion/ClointFusion?label=Last%20Commit)

![GitHub Repo stars](https://img.shields.io/github/stars/ClointFusion/ClointFusion?label=Stars&style=social)
![Twitter URL](https://img.shields.io/twitter/url?style=social&url=https%3A%2F%2Ftwitter.com%2FClointFusion)
![YouTube Channel Subscribers](https://img.shields.io/youtube/channel/subscribers/UCIygBtp1y_XEnC71znWEW2w?style=social)
![Twitter Follow](https://img.shields.io/twitter/follow/ClointFusion?style=social)

## Release Notes

- Click here for Release Notes

---

# Installation


> ### ClointFusion is now supported on Windows / Ubuntu / macOS* !

## Windows :

> ### Windows users can download EXE pre-loaded with Python 3.9 and ClointFusion package: Windows EXE
### OR

* ClointFusion is compatible with both Windows 10 and Windows 11.
* Installing on a Windows PC is a breeze.
* Make certain that Python 3.8 or Python 3.9 is installed.
* Then, from the command prompt, execute the following command.

```
pip install -U ClointFusion
```

## Ubuntu :
* Clointfusion requires sudo rights to install on Ubuntu.
* Additional Linux packages must be installed before Clointfusion can be installed.
* Make certain that Python 3.8 or Python 3.9 is installed.
* Then, from the command prompt, execute the following command.

```
sudo apt-get install python3-tk python3-dev
sudo pip3 install ClointFusion
```


# Importing


> ### ClointFusion can be accessed using one of two methods.

## Windows :

* ### Terminal : Opens a Python interpreter using the command " import ClointFusion as cf "

```
cf_py
```
* ### Code Editor or IDE : Import ClointFusion first, and then run the file in Python.

```
# cf_bot.py

import ClointFusion as cf

cf.browser_activate()
```
```
python cf_bot.py
```

## Ubuntu :

* ### Terminal : Opens a Python interpreter with the command " import ClointFusion as cf " and the required sudo privileges.

```
sudo cf_py
```
* ### Code Editor or IDE : Run the file with sudo permissions.

```
# cf_bot.py

import ClointFusion as cf

cf.browser_activate()
```
```
sudo python3 cf_bot.py
```


# Features


> ## ClointFusion's Voice-Guided, Fully Automated Self-Test.

When you import ClointFusion for the first time, or upgrade to a new version, you'll be prompted with the "ClointFusion Automated Self-Test," which highlights all of ClointFusion's 100+ features in action on your computer while also confirming ClointFusion's compatibility with your PC's settings and configurations.
Once you have successfully completed the self-test, you will receive an email with a self-test report.

Below is the speed up version of self-test.

[ Click here to watch the Self-Test in Action. ](https://user-images.githubusercontent.com/67296473/139620682-d63f6ee6-a3f5-4ca9-9ea9-23216e571e3e.mp4)



> ## DOST : Your friend in automation || Build RPA Bots without Code.

` DOST ` is an interactive Blockly based ``no-code`` BOT Builder platform built and optimized for ClointFusion-based BOT building. We feel that automation is important for people other than programmers. Using DOST, even a common man can create a BOT in minutes.

### Advantages of DOST

- Easy to Use.
- Build BOT in minutes.
- No prior Programming knowledge needed.

### Launch DOST client

> #### Windows
Open your favorite browser and go to Dost Website and start building bots.

Note : Make sure ClointFusion Tray is present or open terminal and type `cf_tray` to activate ClointFusion Tray menu.

> #### Ubuntu
Open your favorite terminal and type `sudo dost` and then type `python3 dost.py`.

- Want to change the chrome profile ?

- Use `python3 dost.py "Profile 1"`

**Build BOT with DOST:** [DOST Website](https://dost.clointfusion.com/)



> ## BOL : BOL - Your automation voice based assistant

` BOL ` is voice based automation assistant designed to execute BOTs build out of ClointFusion without any human computer interaction.

### Usage of BOL

Open your favorite terminal and type `bol` or `sudo bol` for ubuntu users. Within a moment, a personalized Virtual Assistant will be at your service.

***Note: `BOL` is currently in development stage. More functionalities are yet to be added.***



> ## WORK - The Work Hour Monitor

`WORK` is an intelligent application that detects each and every work you do in your PC and displays a detailed work report.

### Usage of WORK

Open your favorite terminal and type `cf_work`.
A detailed work report will be displayed.

***Note: All the information that is being collected by `WORK` is stored in a securely maintained database in your system.***



> ## WhatsApp Bot - Send bulk WhatsApp messages.

ClointFusion's "WhatsApp Bot" is an automated utility tool that allows you to send many customized messages to your contacts at once.

### Usage of WhatsApp Bot

Open your favorite terminal and type `cf_wm`, and give path of the excel,
or `cf_wm -e excel_path.xlsx`

[ Click here to watch the WhatsApp Bot in Action. ](https://user-images.githubusercontent.com/67296473/139722199-37036526-2b1c-4120-a12d-bde3df2eb0d7.mp4)


# ClointFusion in Action

## **Now access more than 100 functions (hit ctrl+space in your IDE)**

***TIP: You can find and inspect all of ClointFusion's functions using only one function i.e., `find()`. Just pass the partial name of the function.***

```
cf.find("sort")

cf.find("gui")

```
* ### 6 gui functions, to take any input from user:

| Function | Accepted Parameters | Description |
| :--------: | :----: | :----------- |
| cf.gui_get_any_input_from_user() | msgForUser="Please enter : ", password=False, multi_line=False, mandatory_field=True | Generic function to accept any input (text / numeric) from user using GUI. Returns the value in string format. |
| cf.gui_get_any_file_from_user() | msgForUser="the file : ", Extension_Without_Dot="*" | Generic function to accept file path from user using GUI. Returns the filepath value in string format.Default allows all files. |
| cf.gui_get_consent_from_user() | msgForUser="Continue ?" | Generic function to get consent from user using GUI. Returns the string 'yes' or 'no' |
| cf.gui_get_dropdownlist_values_from_user() | msgForUser=" ", dropdown_list=[], multi_select=True | Generic function to accept one of the drop-down value from user using GUI. Returns all chosen values in list format. |
| cf.gui_get_excel_sheet_header_from_user() | msgForUser=" " | Generic function to accept excel path, sheet name and header from user using GUI. Returns all these values in dictionary format. |
| cf.gui_get_folder_path_from_user() | msgForUser="the folder : " | Generic function to accept folder path from user using GUI. Returns the folder path value in string format. |



----

* ### 4 functions on Mouse Operations:

| Function | Accepted Parameters | Description |
| :--------: | :----: | :----------- |
| cf.mouse_click() | x=" ", y=" ", left_or_right="left", no_of_clicks=1 | Clicks at the given X Y Co-ordinates on the screen using ingle / double / triple click(s). Optionally copies selected data to clipboard (works for double / triple clicks) |
| cf.mouse_move() | x=" ", y=" " | Moves the cursor to the given X Y Co-ordinates |
| cf.mouse_drag_from_to() | x1=" ", y1=" ", x2=" ",y2=" ", delay=0.5 | Clicks and drags from X1 Y1 co-ordinates to X2 Y2 Co-ordinates on the screen |
| cf.mouse_search_snip_return_coordinates_x_y() | img=" ", wait=180 | Searches the given image on the screen and returns its center of X Y co-ordinates. |



----

* ### 6 functions on Window Operations (works only in Windows OS):

| Function | Accepted Parameters | Description |
| :--------: | :----: | :----------- |
| cf.window_show_desktop() | None | Minimizes all the applications and shows Desktop. |
| cf.window_get_all_opened_titles_windows() | window_title=" " | Gives the title of all the existing (open) windows. |
| cf.window_activate_and_maximize_windows() | windowName=" " | Activates and maximizes the desired window. |
| cf.window_minimize_windows() | windowName=" " | Activates and minimizes the desired window. |
| cf.window_close_windows() | windowName=" " | Close the desired window. |
| cf.launch_any_exe_bat_application() | pathOfExeFile=" " | Launches any exe or batch file or excel file etc. |



----

* ### 5 functions on Window Objects (works only in Windows OS):

| Function | Accepted Parameters | Description |
| :--------: | :----: | :----------- |
| cf.win_obj_open_app() | title, program_path_with_name, file_path_with_name=" ", backend="uia" | Open any windows application. |
| cf.win_obj_get_all_objects() | main_dlg, save=False, file_name_with_path=" " | Print or Save all the windows object elements of an application. |
| cf.win_obj_mouse_click() | main_dlg,title=" ", auto_id=" ", control_type=" " | Simulate high level mouse clicks on windows object elements. |
| cf.win_obj_key_press() | main_dlg,write, title=" ", auto_id=" ", control_type=" " | Simulate high level key-press on windows object elements. |
| cf.win_obj_get_text() | main_dlg, title=" ", auto_id=" ", control_type=" ", value = False | Read text from windows object element. |



----

* ### 8 functions on Folder Operations:

| Function | Accepted Parameters | Description |
| :--------: | :----: | :----------- |
| cf.folder_read_text_file() | txt_file_path=" " | Reads from a given text file and returns entire contents as a single list |
| cf.folder_write_text_file() | txt_file_path=" ", contents=" " | Writes given contents to a text file |
| cf.folder_create() | strFolderPath=" " | When you are making leaf directory, if any intermediate-level directory is missing, folder_create() method creates them. |
| cf.folder_create_text_file() | textFolderPath=" ", txtFileName=" " | Creates text file in the given path. |
| cf.folder_get_all_filenames_as_list() | strFolderPath=" ", extension='all' | Get all the files of the given folder in a list. |
| cf.folder_delete_all_files() | fullPathOfTheFolder=" ", file_extension_without_dot="all" | Deletes all the files of the given folder |
| cf.file_rename() | old_file_path='', new_file_name='', ext=False | Renames the given file name to new file name with same extension. |
|cf.file_get_json_details() | path_of_json_file='', section='' | Returns all the details of the given section in a dictionary |



----

* ### 28 functions on Excel Operations:

| Function | Accepted Parameters | Description |
| :--------: | :----: | :----------- |
| cf.excel_get_all_sheet_names() | excelFilePath=" " | Gives you all names of the sheets in the given excel sheet. |
| cf.excel_create_excel_file_in_given_folder() | fullPathToTheFolder=" ", excelFileName=" ", sheet_name="Sheet1" | Creates an excel file in the desired folder with desired filename |
| cf.excel_if_value_exists() | excel_path=" ", sheet_name="Sheet1", header=0, usecols=" ", value=" " | Check if a given value exists in given excel. Returns True / False |
| cf.excel_create_file() | fullPathToTheFile=" ", fileName=" ", sheet_name="Sheet1" | Create a Excel file in fullPathToTheFile with filename. |
| cf.excel_copy_paste_range_from_to_sheet() | excel_path=" ", sheet_name="Sheet1",
startCol=0, startRow=0, endCol=0,
endRow=0, copiedData=" " | Pastes the copied data in specific range of the given excel sheet. |
| cf.excel_get_row_column_count() | excel_path=" ", sheet_name="Sheet1", header=0 | Gets the row and column count of the provided excel sheet. |
| cf.excel_copy_range_from_sheet() | excel_path=" ", sheet_name="Sheet1", startCol=0, startRow=0, endCol=0, endRow=0 | Copies the specific range from the provided excel sheet and returns copied data as a list |
| cf.excel_split_by_column() | excel_path=" ", sheet_name="Sheet1",
header=0, columnName=" " | Splits the excel file by Column Name |
| cf.excel_split_the_file_on_row_count() | excel_path=" ", sheet_name = "Sheet1", rowSplitLimit=" ", outputFolderPath=" ", outputTemplateFileName ="Split" | Splits the excel file as per given row limit |
| cf.excel_merge_all_files() | input_folder_path=" ", output_folder_path=" " | Merges all the excel files in the given folder |
| cf.excel_drop_columns() | excel_path=" ", sheet_name="Sheet1",
header=0, columnsToBeDropped = " " | Drops the desired column from the given excel file |
| cf.excel_sort_columns() | excel_path=" ", sheet_name="Sheet1",
header=0, firstColumnToBeSorted=None, secondColumnToBeSorted=None, thirdColumnToBeSorted=None, firstColumnSortType=True, secondColumnSortType=True, thirdColumnSortType=True,
view_excel=False | A function which takes excel full path to excel and column names on which sort is to be performed |
| cf.excel_clear_sheet() | excel_path=" ",sheet_name="Sheet1",
header=0 | Clears the contents of given excel files keeping header row intact |
| cf.excel_set_single_cell() | excel_path=" ", sheet_name="Sheet1",
header=0, columnName=" ", cellNumber=0, setText=" " | Writes the given text to the desired column/cell number for the given excel file |
| cf.excel_get_single_cell() | excel_path=" ",sheet_name="Sheet1",
header=0, columnName=" ",cellNumber=0 | Gets the text from the desired column/cell number of the given excel file |
| cf.excel_remove_duplicates() | excel_path=" ",sheet_name="Sheet1",
header=0, columnName=" ", saveResultsInSameExcel=True, which_one_to_keep="first" | Drops the duplicates from the desired Column of the given excel file |
| cf.excel_vlook_up() | filepath_1=" ", sheet_name_1 = "Sheet1",
header_1 = 0, filepath_2=" ", sheet_name_2 = "Sheet1",
header_2 = 0, Output_path=" ", OutputExcelFileName=" ", match_column_name=" ", how='left', view_excel=False | Performs excel_vlook_up on the given excel files for the desired columns. Possible values for how are "inner","left", "right", "outer" |
| cf.excel_describe_data() | excel_path=" ",sheet_name="Sheet1", header=0, view_excel=False | Describe statistical data for the given excel |
| cf.excel_change_corrupt_xls_to_xlsx() | xls_file ='',xlsx_file = '', xls_sheet_name='' | Repair corrupt excel file |
| cf.excel_get_all_header_columns() | excel_path=" ",sheet_name="Sheet1",header=0 | Gives you all column header names of the given excel sheet |
| cf.excel_convert_to_image() | excel_file_path=" " | Returns an Image (PNG) of given Excel |
| cf.excel_split_on_user_defined_conditions() | excel_file_path, sheet_name="Sheet1", column_name='', condition_strings=None,output_dir='', view_excel=False | Splits the excel based on user defined row/column conditions |
| cf.excel_apply_format_as_table() | excel_file_path, table_style="TableStyleMedium21", sheet_name="Sheet1" | Applies table format to the used range of the given excel |
| cf.excel_convert_xls_to_xlsx() | xls_file_path='',xlsx_file_path='' | Converts given XLS file to XLSX |
| cf.isNaN() | value | Returns TRUE if a given value is NaN False otherwise |
| cf.convert_csv_to_excel() | csv_path=" ", sep=" " | Function to convert CSV to Excel |
| cf.excel_sub_routines() | None | Excel VBA Macros called from ClointFusion |
| cf.excel_to_colored_html() | formatted_excel_path=" " | Converts given Excel to HTML preserving the Excel format and saves in same folder as .html |



----

* ### 3 functions on Keyboard Operations:

| Function | Accepted Parameters | Description |
| :--------: | :----: | :----------- |
| cf.key_hit_enter() | write_to_window=" " | Enter key will be pressed once. |
| cf.key_press() | key_1='', key_2='', key_3='', write_to_window=" " | Emulates the given keystrokes. |
| cf.key_write_enter() | text_to_write=" ", write_to_window=" ", delay_after_typing=1, key="e" | Writes/Types the given text and press enter (by default) or tab key. |



----

* ### 5 functions on Screen-scraping Operations:

| Function | Accepted Parameters | Description |
| :--------: | :----: | :----------- |
|cf.scrape_save_contents_to_notepad() | folderPathToSaveTheNotepad=" ", switch_to_window=" ",X=0, Y=0 | Copy pastes all the available text on the screen to notepad and saves it. |
| cf.scrape_get_contents_by_search_copy_paste() | highlightText=" " | Gets the focus on the screen by searching given text using crtl+f and performs copy/paste of all data. Useful in Citrix applications. This is useful in Citrix applications |
| cf.screen_clear_search() | delay=0.2 | Clears previously found text (crtl+f highlight) |
| cf.search_highlight_tab_enter_open() | searchText=" ", hitEnterKey="Yes", shift_tab='No' | Searches for a text on screen using crtl+f and hits enter. This function is useful in Citrix environment. |
| cf.find_text_on_screen() | searchText=" ", delay=0.1, occurance=1, isSearchToBeCleared=False | Clears previous search and finds the provided text on screen. |



----

* ### 11 functions on Browser Operations:

| Function | Accepted Parameters | Description |
| :--------: | :----: | :----------- |
| cf.browser_activate() | url=" ", files_download_path='', dummy_browser=True,
open_in_background=False, incognito=False,
clear_previous_instances=False, profile="Default" | Function to launch browser and start the session. |
| cf.browser_navigate_h() | url=" " | Navigates to Specified URL. |
| cf.browser_write_h() | Value=" ", User_Visible_Text_Element=" " | Write a string on the given element. |
| cf.browser_mouse_click_h() | User_Visible_Text_Element=" ", element=" ",
double_click=False, right_click=False | Click on the given element. |
|cf.browser_locate_element_h() | selector=" ", get_text=False,
multiple_elements=False | Find the element by Xpath, id or css selection. |
| cf.browser_wait_until_h() | text=" ", element="t" | Wait until a specific element is found. |
| cf.browser_refresh_page_h() | None | Refresh the page. |
| cf.browser_quit_h() | None | Close the Helium browser. |
| cf.browser_hit_enter_h() | None | Hits enter KEY using Browser Helium Functions |
| cf.browser_key_press_h() | key_1=" ", key_2=" " | Type text using Browser Helium Functions and press hot keys |
| cf.browser_mouse_hover_h() | User_Visible_Text_Element=" " | Performs a Mouse Hover over the Given User Visible Text Element |



----

* ### 4 functions on Alert Messages:

| Function | Accepted Parameters | Description |
| :--------: | :----: | :----------- |
| cf.message_counter_down_timer() | strMsg="Calling ClointFusion Function in (seconds)", start_value=5 | Function to show count-down timer. Default is 5 seconds. |
| cf.message_pop_up() | strMsg=" ", delay=3 | Specified message will popup on the screen for a specified duration of time.|
| cf.message_flash() | msg=" ", delay=3 | Specified msg will popup for a specified duration of time with OK button. |
| cf.message_toast() | message,website_url=" ", file_folder_path=" " | Function for displaying Windows 10 Toast Notifications. Pass website URL OR file / folder path that needs to be opened when user clicks on the toast notification. |

----

* ### 3 functions on String Operations:

| Function | Accepted Parameters | Description |
| :--------: | :----: | :----------- |
| cf.string_remove_special_characters() | inputStr=" " | Removes all the special character. |
| cf.string_extract_only_alphabets() | inputString=" " | Returns only alphabets from given input string |
| cf.string_extract_only_numbers() | inputString=" " | Returns only numbers from given input string |



----

* ### Loads of miscellaneous functions related to emoji, capture photo, flash (pop-up) messages etc:

| Function | Accepted Parameters | Description |
| :--------: | :----: | :----------- |
| cf.clear_screen() | None | Clears Python Interpreter Terminal Window Screen |
| cf.print_with_magic_color() | strMsg:str=" ", magic:bool=False | Function to color and format terminal output |
| cf.schedule_create_task_windows() | Weekly_Daily="D", week_day="Sun", start_time_hh_mm_24_hr_frmt="11:00" | Schedules (weekly & daily options as of now) the current BOT (.bat) using Windows Task Scheduler. Please call create_batch_file() function before using this function to convert .pyw file to .bat |
| cf.schedule_delete_task_windows() | None | Deletes already scheduled task. Asks user to supply task_name used during scheduling the task. You can also perform this action from Windows Task Scheduler. |
| cf.show_emoji() | strInput=" " | Function which prints Emojis |
| cf.dismantle_code() | strFunctionName=" " | This functions dis-assembles given function and shows you column-by-column summary to explain the output of disassembled bytecode. |
| cf.ON_semi_automatic_mode() | None | This function sets semi_automatic_mode as True => ON |
| cf.OFF_semi_automatic_mode()| None | This function sets semi_automatic_mode as False => OFF |
| cf.email_send_via_desktop_outlook() | toAddress=" ", ccAddress=" ", subject=" ",htmlBody=" ", embedImgPath=" ", attachmentFilePath=" " | Send email using Outlook from Desktop email application |
| cf.download_this_file() | url=" " | Downloads a given url file to BOT output folder or Browser's Download folder |
| cf.pause_program() | seconds="5" | Stops the program for given seconds |
| cf.string_regex() | inputStr=" ", strExpAfter=" ",
strExpBefore=" ", intIndex=0 | Regex API service call, to search within a given string data |
| cf.ocr_now() | img_path=" " | Recognize and read the text embedded in images using Google's Tesseract-OCR |
| cf.update_log_excel_file() | message=" " | Given message will be updated in the excel log file of output folder |
| cf.create_batch_file() | application_exe_pyw_file_path=" " | Creates .bat file for the given application / exe or even .pyw BOT developed by you. This is required in Task Scheduler. |



# ClointFusion's Semi Automatic Mode

1. If you pass all the required parameters, function works silently. So, this is expert (Non-GUI) mode. This mode gives you more control over the function's parameters.
2. If you do not pass any parameter, GUI would pop-up asking you the required parameters. Next time, when you run the BOT, based upon your configuration, which you get to choose at the beginning of BOT run:
- If `Semi-Automatic mode` is OFF, GUI would pop-up again, showing you the previous entries, allowing you to modify the parameters.
- If `Semi-Automatic mode` in ON, BOT works silently taking your previous GUI entries.
- Toggle `Semi-Automatic mode` by using the following command

```
cf.ON_semi_automatic_mode # To turn ON semi automatic mode
cf.OFF_semi_automatic_mode # To turn OFF semi automatic mode
```

3. GUI Mode is for beginners. Anytime, if you are not getting how to use the function, just call an empty function (without parameters) and GUI would pop-up asking you for required parameters.



# BOTS made out of ClointFusion

### Outlook Email BOT implemented using ClointFusion


# We love your contribution

Contribute to us by giving a star, writing articles on `ClointFusion`, giving comments, reporting bugs, bug fixes, feature enhancements, adding documentation, and many other ways.

## Invitation to our Monthly Branded Hackathon

We also invite everyone to take part in our monthly branded event, the `ClointFusion Hackathon`, and stand a chance to work with us.

Checkout our Hackathon Website for more details here: [ClointFusion Hackathon](https://sites.google.com/view/clointfusion-hackathon
)


## Date ❤️ with ClointFusion

This an initiative for fast track entry into our growing workforce. For more details, please visit: [Date with ClointFusion](https://lnkd.in/gh_r9YB)

## Acknowledgements

We sincerely thanks to all it's dependent packages for the great contribution, which made `ClointFusion` possible!

Please find all the dependencies [here](https://openbase.com/python/ClointFusion/dependencies)

## Credits

#### ReadMe File Maintainer
fharookshaik, Intern @ ClointFusion. Incase of any queries reach him on

LinkedIn  
GitHub  

## Need help in Building BOTS?

Write us by clicking below


Gmail  

---

Disclaimer: We collect anonymous data on installation and usage statistics in order to improve our product and provide better services.