Repository files navigation

symphony-api-client-python

Overview

This Symphony bot client is written in an event handler architecture. The client keeps polling a datafeed and responds to different types of Real Time Events it receives.

To build a functional bot which responds to different types of incoming messages from datafeed (Connection, IM, Chat Room, etc....), the respective type of listener needs to be implemented by inheriting the interfaces in the listeners folder. Currently ConnectionListener, imListener, RoomListener interfaces are provided.

Environment Setup

This client is compatible with Python 3.6 or above

Create a virtual environment by executing the following command (optional): python -m venv ./venv

Activate the virtual environment (optional): source ./venv/bin/activate

Install dependencies required for this client by executing the command below. pip install -r requirements.txt

Getting Started

1 - Prepare the service account

The Python client operates using a Symphony Service Account, which is a type of account that applications use to work with Symphony APIs. Please contact with Symphony Admin in your company to get the account.

The client currently supports two types of Service Account authentications, they are Client Certificates Authentication and RSA Public/Private Key Pair Authentication.

2 - Implement the event listeners

As an example, the roomListenerTestImp has been implemented to respond with "Hello World", to a chat room in which there is an incoming message. To respond to other types of events, respective Listeners need to be implemented.

3.1 - Run bot with RSA Public/Private Key Pair

RSA Public/Private Key Pair is the recommended authentication mechanism by Symphony, due to its robust security and simplicity.

To run the bot using the RSA Public/Private Key Pair, a rsa_config.json should be provided. In our example, the json file resides in the resources folder but it can be anywhere.

An example main_RSA.py has been provided to illustrate how all components work together.

Notes: Most of the time, the port numbers do not need to be changed.

An example of json has been provided below. (The "botRSAPath" ends with a trailing "/")

{
"sessionAuthHost": "MY_ENVIRONMENT.symphony.com",
"sessionAuthPort": 443,
"keyAuthHost": "MY_ENVIRONMENT.symphony.com",
"keyAuthPort": 443,
"podHost": "MY_ENVIRONMENT.symphony.com",
"podPort": 443,
"agentHost": "MY_ENVIRONMENT.symphony.com",
"agentPort": 443,
"botRSAPath":"./sym_api_client_python/resources/",
"botRSAName": "bot_private_key.pem",
"botUsername": "YOUR_BOT_USERNAME",
"botEmailAddress": "YOUR_BOT_EMAIL_ADDRESS",
"appCertPath": "",
"appCertName": "",
"appCertPassword": "",
"proxyURL": "",
"proxyPort": "",
"proxyUsername": "",
"proxyPassword": "",
"authTokenRefreshPeriod": "30"
}

Example main class (using RSA)

Adjust the following paths in the sample to match your configuration

  • "sym_api_client_python/logs/example.log"
  • "sym_api_client_python/resources/config.json"

Example Main Class:

import logging
from sym_api_client_python.configure.configure import SymConfig
from sym_api_client_python.auth.rsa_auth import SymBotRSAAuth
from sym_api_client_python.clients.sym_bot_client import SymBotClient
from sym_api_client_python.listeners.\
im_listener_test_imp import IMListenerTestImp
from sym_api_client_python.listeners.\
room_listener_test_imp import RoomListenerTestImp
def configure_logging():
logging.basicConfig(
filename='sym_api_client_python/logs/example.log',
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filemode='w', level=logging.DEBUG
)
logging.getLogger("urllib3").setLevel(logging.WARNING)
def main():
print('Python Client runs using RSA authentication')
# Configure log
configure_logging()
# RSA Auth flow: pass path to rsa_config.json file
configure = SymConfig('sym_api_client_python/resources'
'/rsa_config.json')
configure.load_rsa_config()
auth = SymBotRSAAuth(configure)
auth.authenticate()
# Initialize SymBotClient with auth and configure objects
bot_client = SymBotClient(auth, configure)
# Initialize datafeed service
datafeed_event_service = bot_client.get_datafeed_event_service()
# Initialize listener objects and append them to datafeed_event_service
# Datafeed_event_service polls the datafeed and the event listeners
# respond to the respective types of events
im_listener_test = IMListenerTestImp(bot_client)
datafeed_event_service.add_im_listener(im_listener_test)
room_listener_test = RoomListenerTestImp(bot_client)
datafeed_event_service.add_room_listener(room_listener_test)
# Create and read the datafeed
print('Starting datafeed')
datafeed_event_service.start_datafeed()
if __name__ == "__main__":
main()

3.2 - Run bot with Certificates

To run the bot using the Client Certificates Authentication, a config.json should be provided. In our example, the json file resides in the resources folder but it can be anywhere.

An example main_certificate.py has been provided to illustrate how all components work together.

Notes: Most of the time, the port numbers do not need to be changed.

An example of json has been provided below. (The "botCertPath" ends with a trailing "/")

{
"sessionAuthHost": "MY_ENVIRONMENT-api.symphony.com",
"sessionAuthPort": 443,
"keyAuthHost": "MY_ENVIRONMENT-api.symphony.com",
"keyAuthPort": 443,
"podHost": "MY_ENVIRONMENT.symphony.com",
"podPort": 443,
"agentHost": "MY_ENVIRONMENT.symphony.com",
"agentPort": 443,
"botCertPath": "./sym_api_client_python/resources/certificates/",
"botCertName": "my_bot_cert.p12",
"botCertPassword": "YOUR_PASSWORD",
"botEmailAddress": "YOUR_BOT_EMAIL_ADDRESS",
"appCertPath": "",
"appCertName": "",
"appCertPassword": "",
"proxyURL": "",
"proxyPort": 8080,
"proxyUsername": "",
"proxyPassword": "",
"authTokenRefreshPeriod": "30"
}

Run with Example main class (using certificates)

Once the certificates are provided and example listeners are implemented, let's run the bot by executing following command:

python3 main_certificate.py.

Change the paths to both log, and config.json

  • "sym_api_client_python/logs/example.log"
  • "sym_api_client_python/resources/config.json"

Example Main Class:

import logging
from sym_api_client_python.configure.configure import SymConfig
from sym_api_client_python.auth.auth import Auth
from sym_api_client_python.clients.sym_bot_client import SymBotClient
from sym_api_client_python.listeners.im_listener_test_imp import \
IMListenerTestImp
from sym_api_client_python.listeners.room_listener_test_imp import \
RoomListenerTestImp
def configure_logging():
logging.basicConfig(
filename='sym_api_client_python/logs/example.log',
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filemode='w', level=logging.DEBUG)
logging.getLogger("urllib3").setLevel(logging.WARNING)
def main():
print('Python Client runs using certificate authentication')
# Configure log
configure_logging()
# Certificate Auth flow: Pass in path to config file
configure = SymConfig('sym_api_client_python/resources/config.json')
configure.load_cert_config()
auth = Auth(configure)
auth.authenticate()
# Initialize SymBotClient with auth and configure objects
bot_client = SymBotClient(auth, configure)
# Initialize datafeed service
datafeed_event_service = bot_client.get_datafeed_event_service()
# Initialize listener objects and append them to datafeed_event_service
# Datafeed_event_service polls the datafeed and the event listeners
# respond to the respective types of events
im_listener_test = IMListenerTestImp(bot_client)
datafeed_event_service.add_im_listener(im_listener_test)
room_listener_test = RoomListenerTestImp(bot_client)
datafeed_event_service.add_room_listener(room_listener_test)
# create data feed and read datafeed continuously in while loop.
print('starting datafeed')
datafeed_event_service.start_datafeed()
if __name__ == "__main__":
main()

4 - Interacting with the joke bot!

The joke bot shows how a Symphony chat bot application works. In general, a chat bot application keeps polling the datafeed API for new messages, then it sends the messages to listeners to handle, depending on the message type.

To interact with the joke bot, try /bot joke

Symphony REST API offer a range of capabilities for application to integrate, visit the official documentation for more information.

Release Notes

0.1.13

  • Rewrite clients to use python sessions.
  • Moved over requests to sessions for consistent headers, proxies and truststore
  • Fixed auth using sessionAuth for both sessionAuth and keyAuth
  • Fixed functions that pre-populated payload to accept params
  • Datafeed now utilizes session user to determine userId
  • Update to ProxyURL. No longer prepend http://
  • Changed config.json for Proxy to mirror Java SDK

0.1.12

  • The updates in this release may break your existing bot implementation. Please ensure you review and test against this client prior to deployment in Production.
  • Extensively renamed client libraries to follow PEP8 Python standard. Naming now follows "snake_case" convention.
  • Bug fixes.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

symphony-api-client-python

Overview

This Symphony bot client is written in an event handler architecture. The client keeps polling a datafeed and responds to different types of Real Time Events it receives.

To build a functional bot which responds to different types of incoming messages from datafeed (Connection, IM, Chat Room, etc....), the respective type of listener needs to be implemented by inheriting the interfaces in the listeners folder. Currently ConnectionListener, imListener, RoomListener interfaces are provided.

Environment Setup

This client is compatible with Python 3.6 or above

Create a virtual environment by executing the following command (optional): python -m venv ./venv

Activate the virtual environment (optional): source ./venv/bin/activate

Install dependencies required for this client by executing the command below. pip install -r requirements.txt

Getting Started

1 - Prepare the service account

The Python client operates using a Symphony Service Account, which is a type of account that applications use to work with Symphony APIs. Please contact with Symphony Admin in your company to get the account.

The client currently supports two types of Service Account authentications, they are Client Certificates Authentication and RSA Public/Private Key Pair Authentication.

2 - Implement the event listeners

As an example, the roomListenerTestImp has been implemented to respond with "Hello World", to a chat room in which there is an incoming message. To respond to other types of events, respective Listeners need to be implemented.

3.1 - Run bot with RSA Public/Private Key Pair

RSA Public/Private Key Pair is the recommended authentication mechanism by Symphony, due to its robust security and simplicity.

To run the bot using the RSA Public/Private Key Pair, a rsa_config.json should be provided. In our example, the json file resides in the resources folder but it can be anywhere.

An example main_RSA.py has been provided to illustrate how all components work together.

Notes: Most of the time, the port numbers do not need to be changed.

An example of json has been provided below. (The "botRSAPath" ends with a trailing "/")

{
"sessionAuthHost": "MY_ENVIRONMENT.symphony.com",
"sessionAuthPort": 443,
"keyAuthHost": "MY_ENVIRONMENT.symphony.com",
"keyAuthPort": 443,
"podHost": "MY_ENVIRONMENT.symphony.com",
"podPort": 443,
"agentHost": "MY_ENVIRONMENT.symphony.com",
"agentPort": 443,
"botRSAPath":"./sym_api_client_python/resources/",
"botRSAName": "bot_private_key.pem",
"botUsername": "YOUR_BOT_USERNAME",
"botEmailAddress": "YOUR_BOT_EMAIL_ADDRESS",
"appCertPath": "",
"appCertName": "",
"appCertPassword": "",
"proxyURL": "",
"proxyPort": "",
"proxyUsername": "",
"proxyPassword": "",
"authTokenRefreshPeriod": "30"
}

Example main class (using RSA)

Adjust the following paths in the sample to match your configuration

  • "sym_api_client_python/logs/example.log"
  • "sym_api_client_python/resources/config.json"

Example Main Class:

import logging
from sym_api_client_python.configure.configure import SymConfig
from sym_api_client_python.auth.rsa_auth import SymBotRSAAuth
from sym_api_client_python.clients.sym_bot_client import SymBotClient
from sym_api_client_python.listeners.\
im_listener_test_imp import IMListenerTestImp
from sym_api_client_python.listeners.\
room_listener_test_imp import RoomListenerTestImp
def configure_logging():
logging.basicConfig(
filename='sym_api_client_python/logs/example.log',
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filemode='w', level=logging.DEBUG
)
logging.getLogger("urllib3").setLevel(logging.WARNING)
def main():
print('Python Client runs using RSA authentication')
# Configure log
configure_logging()
# RSA Auth flow: pass path to rsa_config.json file
configure = SymConfig('sym_api_client_python/resources'
'/rsa_config.json')
configure.load_rsa_config()
auth = SymBotRSAAuth(configure)
auth.authenticate()
# Initialize SymBotClient with auth and configure objects
bot_client = SymBotClient(auth, configure)
# Initialize datafeed service
datafeed_event_service = bot_client.get_datafeed_event_service()
# Initialize listener objects and append them to datafeed_event_service
# Datafeed_event_service polls the datafeed and the event listeners
# respond to the respective types of events
im_listener_test = IMListenerTestImp(bot_client)
datafeed_event_service.add_im_listener(im_listener_test)
room_listener_test = RoomListenerTestImp(bot_client)
datafeed_event_service.add_room_listener(room_listener_test)
# Create and read the datafeed
print('Starting datafeed')
datafeed_event_service.start_datafeed()
if __name__ == "__main__":
main()

3.2 - Run bot with Certificates

To run the bot using the Client Certificates Authentication, a config.json should be provided. In our example, the json file resides in the resources folder but it can be anywhere.

An example main_certificate.py has been provided to illustrate how all components work together.

Notes: Most of the time, the port numbers do not need to be changed.

An example of json has been provided below. (The "botCertPath" ends with a trailing "/")

{
"sessionAuthHost": "MY_ENVIRONMENT-api.symphony.com",
"sessionAuthPort": 443,
"keyAuthHost": "MY_ENVIRONMENT-api.symphony.com",
"keyAuthPort": 443,
"podHost": "MY_ENVIRONMENT.symphony.com",
"podPort": 443,
"agentHost": "MY_ENVIRONMENT.symphony.com",
"agentPort": 443,
"botCertPath": "./sym_api_client_python/resources/certificates/",
"botCertName": "my_bot_cert.p12",
"botCertPassword": "YOUR_PASSWORD",
"botEmailAddress": "YOUR_BOT_EMAIL_ADDRESS",
"appCertPath": "",
"appCertName": "",
"appCertPassword": "",
"proxyURL": "",
"proxyPort": 8080,
"proxyUsername": "",
"proxyPassword": "",
"authTokenRefreshPeriod": "30"
}

Run with Example main class (using certificates)

Once the certificates are provided and example listeners are implemented, let's run the bot by executing following command:

python3 main_certificate.py.

Change the paths to both log, and config.json

  • "sym_api_client_python/logs/example.log"
  • "sym_api_client_python/resources/config.json"

Example Main Class:

import logging
from sym_api_client_python.configure.configure import SymConfig
from sym_api_client_python.auth.auth import Auth
from sym_api_client_python.clients.sym_bot_client import SymBotClient
from sym_api_client_python.listeners.im_listener_test_imp import \
IMListenerTestImp
from sym_api_client_python.listeners.room_listener_test_imp import \
RoomListenerTestImp
def configure_logging():
logging.basicConfig(
filename='sym_api_client_python/logs/example.log',
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filemode='w', level=logging.DEBUG)
logging.getLogger("urllib3").setLevel(logging.WARNING)
def main():
print('Python Client runs using certificate authentication')
# Configure log
configure_logging()
# Certificate Auth flow: Pass in path to config file
configure = SymConfig('sym_api_client_python/resources/config.json')
configure.load_cert_config()
auth = Auth(configure)
auth.authenticate()
# Initialize SymBotClient with auth and configure objects
bot_client = SymBotClient(auth, configure)
# Initialize datafeed service
datafeed_event_service = bot_client.get_datafeed_event_service()
# Initialize listener objects and append them to datafeed_event_service
# Datafeed_event_service polls the datafeed and the event listeners
# respond to the respective types of events
im_listener_test = IMListenerTestImp(bot_client)
datafeed_event_service.add_im_listener(im_listener_test)
room_listener_test = RoomListenerTestImp(bot_client)
datafeed_event_service.add_room_listener(room_listener_test)
# create data feed and read datafeed continuously in while loop.
print('starting datafeed')
datafeed_event_service.start_datafeed()
if __name__ == "__main__":
main()

4 - Interacting with the joke bot!

The joke bot shows how a Symphony chat bot application works. In general, a chat bot application keeps polling the datafeed API for new messages, then it sends the messages to listeners to handle, depending on the message type.

To interact with the joke bot, try /bot joke

Symphony REST API offer a range of capabilities for application to integrate, visit the official documentation for more information.

Release Notes

0.1.13

  • Rewrite clients to use python sessions.
  • Moved over requests to sessions for consistent headers, proxies and truststore
  • Fixed auth using sessionAuth for both sessionAuth and keyAuth
  • Fixed functions that pre-populated payload to accept params
  • Datafeed now utilizes session user to determine userId
  • Update to ProxyURL. No longer prepend http://
  • Changed config.json for Proxy to mirror Java SDK

0.1.12

  • The updates in this release may break your existing bot implementation. Please ensure you review and test against this client prior to deployment in Production.
  • Extensively renamed client libraries to follow PEP8 Python standard. Naming now follows "snake_case" convention.
  • Bug fixes.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

symphony-api-client-python

Overview

This Symphony bot client is written in an event handler architecture. The client keeps polling a datafeed and responds to different types of Real Time Events it receives.

To build a functional bot which responds to different types of incoming messages from datafeed (Connection, IM, Chat Room, etc....), the respective type of listener needs to be implemented by inheriting the interfaces in the listeners folder. Currently ConnectionListener, imListener, RoomListener interfaces are provided.

Environment Setup

This client is compatible with Python 3.6 or above

Create a virtual environment by executing the following command (optional): python -m venv ./venv

Activate the virtual environment (optional): source ./venv/bin/activate

Install dependencies required for this client by executing the command below. pip install -r requirements.txt

Getting Started

1 - Prepare the service account

The Python client operates using a Symphony Service Account, which is a type of account that applications use to work with Symphony APIs. Please contact with Symphony Admin in your company to get the account.

The client currently supports two types of Service Account authentications, they are Client Certificates Authentication and RSA Public/Private Key Pair Authentication.

2 - Implement the event listeners

As an example, the roomListenerTestImp has been implemented to respond with "Hello World", to a chat room in which there is an incoming message. To respond to other types of events, respective Listeners need to be implemented.

3.1 - Run bot with RSA Public/Private Key Pair

RSA Public/Private Key Pair is the recommended authentication mechanism by Symphony, due to its robust security and simplicity.

To run the bot using the RSA Public/Private Key Pair, a rsa_config.json should be provided. In our example, the json file resides in the resources folder but it can be anywhere.

An example main_RSA.py has been provided to illustrate how all components work together.

Notes: Most of the time, the port numbers do not need to be changed.

An example of json has been provided below. (The "botRSAPath" ends with a trailing "/")

{
"sessionAuthHost": "MY_ENVIRONMENT.symphony.com",
"sessionAuthPort": 443,
"keyAuthHost": "MY_ENVIRONMENT.symphony.com",
"keyAuthPort": 443,
"podHost": "MY_ENVIRONMENT.symphony.com",
"podPort": 443,
"agentHost": "MY_ENVIRONMENT.symphony.com",
"agentPort": 443,
"botRSAPath":"./sym_api_client_python/resources/",
"botRSAName": "bot_private_key.pem",
"botUsername": "YOUR_BOT_USERNAME",
"botEmailAddress": "YOUR_BOT_EMAIL_ADDRESS",
"appCertPath": "",
"appCertName": "",
"appCertPassword": "",
"proxyURL": "",
"proxyPort": "",
"proxyUsername": "",
"proxyPassword": "",
"authTokenRefreshPeriod": "30"
}

Example main class (using RSA)

Adjust the following paths in the sample to match your configuration

  • "sym_api_client_python/logs/example.log"
  • "sym_api_client_python/resources/config.json"

Example Main Class:

import logging
from sym_api_client_python.configure.configure import SymConfig
from sym_api_client_python.auth.rsa_auth import SymBotRSAAuth
from sym_api_client_python.clients.sym_bot_client import SymBotClient
from sym_api_client_python.listeners.\
im_listener_test_imp import IMListenerTestImp
from sym_api_client_python.listeners.\
room_listener_test_imp import RoomListenerTestImp
def configure_logging():
logging.basicConfig(
filename='sym_api_client_python/logs/example.log',
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filemode='w', level=logging.DEBUG
)
logging.getLogger("urllib3").setLevel(logging.WARNING)
def main():
print('Python Client runs using RSA authentication')
# Configure log
configure_logging()
# RSA Auth flow: pass path to rsa_config.json file
configure = SymConfig('sym_api_client_python/resources'
'/rsa_config.json')
configure.load_rsa_config()
auth = SymBotRSAAuth(configure)
auth.authenticate()
# Initialize SymBotClient with auth and configure objects
bot_client = SymBotClient(auth, configure)
# Initialize datafeed service
datafeed_event_service = bot_client.get_datafeed_event_service()
# Initialize listener objects and append them to datafeed_event_service
# Datafeed_event_service polls the datafeed and the event listeners
# respond to the respective types of events
im_listener_test = IMListenerTestImp(bot_client)
datafeed_event_service.add_im_listener(im_listener_test)
room_listener_test = RoomListenerTestImp(bot_client)
datafeed_event_service.add_room_listener(room_listener_test)
# Create and read the datafeed
print('Starting datafeed')
datafeed_event_service.start_datafeed()
if __name__ == "__main__":
main()

3.2 - Run bot with Certificates

To run the bot using the Client Certificates Authentication, a config.json should be provided. In our example, the json file resides in the resources folder but it can be anywhere.

An example main_certificate.py has been provided to illustrate how all components work together.

Notes: Most of the time, the port numbers do not need to be changed.

An example of json has been provided below. (The "botCertPath" ends with a trailing "/")

{
"sessionAuthHost": "MY_ENVIRONMENT-api.symphony.com",
"sessionAuthPort": 443,
"keyAuthHost": "MY_ENVIRONMENT-api.symphony.com",
"keyAuthPort": 443,
"podHost": "MY_ENVIRONMENT.symphony.com",
"podPort": 443,
"agentHost": "MY_ENVIRONMENT.symphony.com",
"agentPort": 443,
"botCertPath": "./sym_api_client_python/resources/certificates/",
"botCertName": "my_bot_cert.p12",
"botCertPassword": "YOUR_PASSWORD",
"botEmailAddress": "YOUR_BOT_EMAIL_ADDRESS",
"appCertPath": "",
"appCertName": "",
"appCertPassword": "",
"proxyURL": "",
"proxyPort": 8080,
"proxyUsername": "",
"proxyPassword": "",
"authTokenRefreshPeriod": "30"
}

Run with Example main class (using certificates)

Once the certificates are provided and example listeners are implemented, let's run the bot by executing following command:

python3 main_certificate.py.

Change the paths to both log, and config.json

  • "sym_api_client_python/logs/example.log"
  • "sym_api_client_python/resources/config.json"

Example Main Class:

import logging
from sym_api_client_python.configure.configure import SymConfig
from sym_api_client_python.auth.auth import Auth
from sym_api_client_python.clients.sym_bot_client import SymBotClient
from sym_api_client_python.listeners.im_listener_test_imp import \
IMListenerTestImp
from sym_api_client_python.listeners.room_listener_test_imp import \
RoomListenerTestImp
def configure_logging():
logging.basicConfig(
filename='sym_api_client_python/logs/example.log',
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filemode='w', level=logging.DEBUG)
logging.getLogger("urllib3").setLevel(logging.WARNING)
def main():
print('Python Client runs using certificate authentication')
# Configure log
configure_logging()
# Certificate Auth flow: Pass in path to config file
configure = SymConfig('sym_api_client_python/resources/config.json')
configure.load_cert_config()
auth = Auth(configure)
auth.authenticate()
# Initialize SymBotClient with auth and configure objects
bot_client = SymBotClient(auth, configure)
# Initialize datafeed service
datafeed_event_service = bot_client.get_datafeed_event_service()
# Initialize listener objects and append them to datafeed_event_service
# Datafeed_event_service polls the datafeed and the event listeners
# respond to the respective types of events
im_listener_test = IMListenerTestImp(bot_client)
datafeed_event_service.add_im_listener(im_listener_test)
room_listener_test = RoomListenerTestImp(bot_client)
datafeed_event_service.add_room_listener(room_listener_test)
# create data feed and read datafeed continuously in while loop.
print('starting datafeed')
datafeed_event_service.start_datafeed()
if __name__ == "__main__":
main()

4 - Interacting with the joke bot!

The joke bot shows how a Symphony chat bot application works. In general, a chat bot application keeps polling the datafeed API for new messages, then it sends the messages to listeners to handle, depending on the message type.

To interact with the joke bot, try /bot joke

Symphony REST API offer a range of capabilities for application to integrate, visit the official documentation for more information.

Release Notes

0.1.13

  • Rewrite clients to use python sessions.
  • Moved over requests to sessions for consistent headers, proxies and truststore
  • Fixed auth using sessionAuth for both sessionAuth and keyAuth
  • Fixed functions that pre-populated payload to accept params
  • Datafeed now utilizes session user to determine userId
  • Update to ProxyURL. No longer prepend http://
  • Changed config.json for Proxy to mirror Java SDK

0.1.12

  • The updates in this release may break your existing bot implementation. Please ensure you review and test against this client prior to deployment in Production.
  • Extensively renamed client libraries to follow PEP8 Python standard. Naming now follows "snake_case" convention.
  • Bug fixes.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

symphony-api-client-python

Overview

This Symphony bot client is written in an event handler architecture. The client keeps polling a datafeed and responds to different types of Real Time Events it receives.

To build a functional bot which responds to different types of incoming messages from datafeed (Connection, IM, Chat Room, etc....), the respective type of listener needs to be implemented by inheriting the interfaces in the listeners folder. Currently ConnectionListener, imListener, RoomListener interfaces are provided.

Environment Setup

This client is compatible with Python 3.6 or above

Create a virtual environment by executing the following command (optional): python -m venv ./venv

Activate the virtual environment (optional): source ./venv/bin/activate

Install dependencies required for this client by executing the command below. pip install -r requirements.txt

Getting Started

1 - Prepare the service account

The Python client operates using a Symphony Service Account, which is a type of account that applications use to work with Symphony APIs. Please contact with Symphony Admin in your company to get the account.

The client currently supports two types of Service Account authentications, they are Client Certificates Authentication and RSA Public/Private Key Pair Authentication.

2 - Implement the event listeners

As an example, the roomListenerTestImp has been implemented to respond with "Hello World", to a chat room in which there is an incoming message. To respond to other types of events, respective Listeners need to be implemented.

3.1 - Run bot with RSA Public/Private Key Pair

RSA Public/Private Key Pair is the recommended authentication mechanism by Symphony, due to its robust security and simplicity.

To run the bot using the RSA Public/Private Key Pair, a rsa_config.json should be provided. In our example, the json file resides in the resources folder but it can be anywhere.

An example main_RSA.py has been provided to illustrate how all components work together.

Notes: Most of the time, the port numbers do not need to be changed.

An example of json has been provided below. (The "botRSAPath" ends with a trailing "/")

{
"sessionAuthHost": "MY_ENVIRONMENT.symphony.com",
"sessionAuthPort": 443,
"keyAuthHost": "MY_ENVIRONMENT.symphony.com",
"keyAuthPort": 443,
"podHost": "MY_ENVIRONMENT.symphony.com",
"podPort": 443,
"agentHost": "MY_ENVIRONMENT.symphony.com",
"agentPort": 443,
"botRSAPath":"./sym_api_client_python/resources/",
"botRSAName": "bot_private_key.pem",
"botUsername": "YOUR_BOT_USERNAME",
"botEmailAddress": "YOUR_BOT_EMAIL_ADDRESS",
"appCertPath": "",
"appCertName": "",
"appCertPassword": "",
"proxyURL": "",
"proxyPort": "",
"proxyUsername": "",
"proxyPassword": "",
"authTokenRefreshPeriod": "30"
}

Example main class (using RSA)

Adjust the following paths in the sample to match your configuration

  • "sym_api_client_python/logs/example.log"
  • "sym_api_client_python/resources/config.json"

Example Main Class:

import logging
from sym_api_client_python.configure.configure import SymConfig
from sym_api_client_python.auth.rsa_auth import SymBotRSAAuth
from sym_api_client_python.clients.sym_bot_client import SymBotClient
from sym_api_client_python.listeners.\
im_listener_test_imp import IMListenerTestImp
from sym_api_client_python.listeners.\
room_listener_test_imp import RoomListenerTestImp
def configure_logging():
logging.basicConfig(
filename='sym_api_client_python/logs/example.log',
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filemode='w', level=logging.DEBUG
)
logging.getLogger("urllib3").setLevel(logging.WARNING)
def main():
print('Python Client runs using RSA authentication')
# Configure log
configure_logging()
# RSA Auth flow: pass path to rsa_config.json file
configure = SymConfig('sym_api_client_python/resources'
'/rsa_config.json')
configure.load_rsa_config()
auth = SymBotRSAAuth(configure)
auth.authenticate()
# Initialize SymBotClient with auth and configure objects
bot_client = SymBotClient(auth, configure)
# Initialize datafeed service
datafeed_event_service = bot_client.get_datafeed_event_service()
# Initialize listener objects and append them to datafeed_event_service
# Datafeed_event_service polls the datafeed and the event listeners
# respond to the respective types of events
im_listener_test = IMListenerTestImp(bot_client)
datafeed_event_service.add_im_listener(im_listener_test)
room_listener_test = RoomListenerTestImp(bot_client)
datafeed_event_service.add_room_listener(room_listener_test)
# Create and read the datafeed
print('Starting datafeed')
datafeed_event_service.start_datafeed()
if __name__ == "__main__":
main()

3.2 - Run bot with Certificates

To run the bot using the Client Certificates Authentication, a config.json should be provided. In our example, the json file resides in the resources folder but it can be anywhere.

An example main_certificate.py has been provided to illustrate how all components work together.

Notes: Most of the time, the port numbers do not need to be changed.

An example of json has been provided below. (The "botCertPath" ends with a trailing "/")

{
"sessionAuthHost": "MY_ENVIRONMENT-api.symphony.com",
"sessionAuthPort": 443,
"keyAuthHost": "MY_ENVIRONMENT-api.symphony.com",
"keyAuthPort": 443,
"podHost": "MY_ENVIRONMENT.symphony.com",
"podPort": 443,
"agentHost": "MY_ENVIRONMENT.symphony.com",
"agentPort": 443,
"botCertPath": "./sym_api_client_python/resources/certificates/",
"botCertName": "my_bot_cert.p12",
"botCertPassword": "YOUR_PASSWORD",
"botEmailAddress": "YOUR_BOT_EMAIL_ADDRESS",
"appCertPath": "",
"appCertName": "",
"appCertPassword": "",
"proxyURL": "",
"proxyPort": 8080,
"proxyUsername": "",
"proxyPassword": "",
"authTokenRefreshPeriod": "30"
}

Run with Example main class (using certificates)

Once the certificates are provided and example listeners are implemented, let's run the bot by executing following command:

python3 main_certificate.py.

Change the paths to both log, and config.json

  • "sym_api_client_python/logs/example.log"
  • "sym_api_client_python/resources/config.json"

Example Main Class:

import logging
from sym_api_client_python.configure.configure import SymConfig
from sym_api_client_python.auth.auth import Auth
from sym_api_client_python.clients.sym_bot_client import SymBotClient
from sym_api_client_python.listeners.im_listener_test_imp import \
IMListenerTestImp
from sym_api_client_python.listeners.room_listener_test_imp import \
RoomListenerTestImp
def configure_logging():
logging.basicConfig(
filename='sym_api_client_python/logs/example.log',
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filemode='w', level=logging.DEBUG)
logging.getLogger("urllib3").setLevel(logging.WARNING)
def main():
print('Python Client runs using certificate authentication')
# Configure log
configure_logging()
# Certificate Auth flow: Pass in path to config file
configure = SymConfig('sym_api_client_python/resources/config.json')
configure.load_cert_config()
auth = Auth(configure)
auth.authenticate()
# Initialize SymBotClient with auth and configure objects
bot_client = SymBotClient(auth, configure)
# Initialize datafeed service
datafeed_event_service = bot_client.get_datafeed_event_service()
# Initialize listener objects and append them to datafeed_event_service
# Datafeed_event_service polls the datafeed and the event listeners
# respond to the respective types of events
im_listener_test = IMListenerTestImp(bot_client)
datafeed_event_service.add_im_listener(im_listener_test)
room_listener_test = RoomListenerTestImp(bot_client)
datafeed_event_service.add_room_listener(room_listener_test)
# create data feed and read datafeed continuously in while loop.
print('starting datafeed')
datafeed_event_service.start_datafeed()
if __name__ == "__main__":
main()

4 - Interacting with the joke bot!

The joke bot shows how a Symphony chat bot application works. In general, a chat bot application keeps polling the datafeed API for new messages, then it sends the messages to listeners to handle, depending on the message type.

To interact with the joke bot, try /bot joke

Symphony REST API offer a range of capabilities for application to integrate, visit the official documentation for more information.

Release Notes

0.1.13

  • Rewrite clients to use python sessions.
  • Moved over requests to sessions for consistent headers, proxies and truststore
  • Fixed auth using sessionAuth for both sessionAuth and keyAuth
  • Fixed functions that pre-populated payload to accept params
  • Datafeed now utilizes session user to determine userId
  • Update to ProxyURL. No longer prepend http://
  • Changed config.json for Proxy to mirror Java SDK

0.1.12

  • The updates in this release may break your existing bot implementation. Please ensure you review and test against this client prior to deployment in Production.
  • Extensively renamed client libraries to follow PEP8 Python standard. Naming now follows "snake_case" convention.
  • Bug fixes.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

symphony-api-client-python

Overview

This Symphony bot client is written in an event handler architecture. The client keeps polling a datafeed and responds to different types of Real Time Events it receives.

To build a functional bot which responds to different types of incoming messages from datafeed (Connection, IM, Chat Room, etc....), the respective type of listener needs to be implemented by inheriting the interfaces in the listeners folder. Currently ConnectionListener, imListener, RoomListener interfaces are provided.

Environment Setup

This client is compatible with Python 3.6 or above

Create a virtual environment by executing the following command (optional): python -m venv ./venv

Activate the virtual environment (optional): source ./venv/bin/activate

Install dependencies required for this client by executing the command below. pip install -r requirements.txt

Getting Started

1 - Prepare the service account

The Python client operates using a Symphony Service Account, which is a type of account that applications use to work with Symphony APIs. Please contact with Symphony Admin in your company to get the account.

The client currently supports two types of Service Account authentications, they are Client Certificates Authentication and RSA Public/Private Key Pair Authentication.

2 - Implement the event listeners

As an example, the roomListenerTestImp has been implemented to respond with "Hello World", to a chat room in which there is an incoming message. To respond to other types of events, respective Listeners need to be implemented.

3.1 - Run bot with RSA Public/Private Key Pair

RSA Public/Private Key Pair is the recommended authentication mechanism by Symphony, due to its robust security and simplicity.

To run the bot using the RSA Public/Private Key Pair, a rsa_config.json should be provided. In our example, the json file resides in the resources folder but it can be anywhere.

An example main_RSA.py has been provided to illustrate how all components work together.

Notes: Most of the time, the port numbers do not need to be changed.

An example of json has been provided below. (The "botRSAPath" ends with a trailing "/")

{
"sessionAuthHost": "MY_ENVIRONMENT.symphony.com",
"sessionAuthPort": 443,
"keyAuthHost": "MY_ENVIRONMENT.symphony.com",
"keyAuthPort": 443,
"podHost": "MY_ENVIRONMENT.symphony.com",
"podPort": 443,
"agentHost": "MY_ENVIRONMENT.symphony.com",
"agentPort": 443,
"botRSAPath":"./sym_api_client_python/resources/",
"botRSAName": "bot_private_key.pem",
"botUsername": "YOUR_BOT_USERNAME",
"botEmailAddress": "YOUR_BOT_EMAIL_ADDRESS",
"appCertPath": "",
"appCertName": "",
"appCertPassword": "",
"proxyURL": "",
"proxyPort": "",
"proxyUsername": "",
"proxyPassword": "",
"authTokenRefreshPeriod": "30"
}

Example main class (using RSA)

Adjust the following paths in the sample to match your configuration

  • "sym_api_client_python/logs/example.log"
  • "sym_api_client_python/resources/config.json"

Example Main Class:

import logging
from sym_api_client_python.configure.configure import SymConfig
from sym_api_client_python.auth.rsa_auth import SymBotRSAAuth
from sym_api_client_python.clients.sym_bot_client import SymBotClient
from sym_api_client_python.listeners.\
im_listener_test_imp import IMListenerTestImp
from sym_api_client_python.listeners.\
room_listener_test_imp import RoomListenerTestImp
def configure_logging():
logging.basicConfig(
filename='sym_api_client_python/logs/example.log',
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filemode='w', level=logging.DEBUG
)
logging.getLogger("urllib3").setLevel(logging.WARNING)
def main():
print('Python Client runs using RSA authentication')
# Configure log
configure_logging()
# RSA Auth flow: pass path to rsa_config.json file
configure = SymConfig('sym_api_client_python/resources'
'/rsa_config.json')
configure.load_rsa_config()
auth = SymBotRSAAuth(configure)
auth.authenticate()
# Initialize SymBotClient with auth and configure objects
bot_client = SymBotClient(auth, configure)
# Initialize datafeed service
datafeed_event_service = bot_client.get_datafeed_event_service()
# Initialize listener objects and append them to datafeed_event_service
# Datafeed_event_service polls the datafeed and the event listeners
# respond to the respective types of events
im_listener_test = IMListenerTestImp(bot_client)
datafeed_event_service.add_im_listener(im_listener_test)
room_listener_test = RoomListenerTestImp(bot_client)
datafeed_event_service.add_room_listener(room_listener_test)
# Create and read the datafeed
print('Starting datafeed')
datafeed_event_service.start_datafeed()
if __name__ == "__main__":
main()

3.2 - Run bot with Certificates

To run the bot using the Client Certificates Authentication, a config.json should be provided. In our example, the json file resides in the resources folder but it can be anywhere.

An example main_certificate.py has been provided to illustrate how all components work together.

Notes: Most of the time, the port numbers do not need to be changed.

An example of json has been provided below. (The "botCertPath" ends with a trailing "/")

{
"sessionAuthHost": "MY_ENVIRONMENT-api.symphony.com",
"sessionAuthPort": 443,
"keyAuthHost": "MY_ENVIRONMENT-api.symphony.com",
"keyAuthPort": 443,
"podHost": "MY_ENVIRONMENT.symphony.com",
"podPort": 443,
"agentHost": "MY_ENVIRONMENT.symphony.com",
"agentPort": 443,
"botCertPath": "./sym_api_client_python/resources/certificates/",
"botCertName": "my_bot_cert.p12",
"botCertPassword": "YOUR_PASSWORD",
"botEmailAddress": "YOUR_BOT_EMAIL_ADDRESS",
"appCertPath": "",
"appCertName": "",
"appCertPassword": "",
"proxyURL": "",
"proxyPort": 8080,
"proxyUsername": "",
"proxyPassword": "",
"authTokenRefreshPeriod": "30"
}

Run with Example main class (using certificates)

Once the certificates are provided and example listeners are implemented, let's run the bot by executing following command:

python3 main_certificate.py.

Change the paths to both log, and config.json

  • "sym_api_client_python/logs/example.log"
  • "sym_api_client_python/resources/config.json"

Example Main Class:

import logging
from sym_api_client_python.configure.configure import SymConfig
from sym_api_client_python.auth.auth import Auth
from sym_api_client_python.clients.sym_bot_client import SymBotClient
from sym_api_client_python.listeners.im_listener_test_imp import \
IMListenerTestImp
from sym_api_client_python.listeners.room_listener_test_imp import \
RoomListenerTestImp
def configure_logging():
logging.basicConfig(
filename='sym_api_client_python/logs/example.log',
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filemode='w', level=logging.DEBUG)
logging.getLogger("urllib3").setLevel(logging.WARNING)
def main():
print('Python Client runs using certificate authentication')
# Configure log
configure_logging()
# Certificate Auth flow: Pass in path to config file
configure = SymConfig('sym_api_client_python/resources/config.json')
configure.load_cert_config()
auth = Auth(configure)
auth.authenticate()
# Initialize SymBotClient with auth and configure objects
bot_client = SymBotClient(auth, configure)
# Initialize datafeed service
datafeed_event_service = bot_client.get_datafeed_event_service()
# Initialize listener objects and append them to datafeed_event_service
# Datafeed_event_service polls the datafeed and the event listeners
# respond to the respective types of events
im_listener_test = IMListenerTestImp(bot_client)
datafeed_event_service.add_im_listener(im_listener_test)
room_listener_test = RoomListenerTestImp(bot_client)
datafeed_event_service.add_room_listener(room_listener_test)
# create data feed and read datafeed continuously in while loop.
print('starting datafeed')
datafeed_event_service.start_datafeed()
if __name__ == "__main__":
main()

4 - Interacting with the joke bot!

The joke bot shows how a Symphony chat bot application works. In general, a chat bot application keeps polling the datafeed API for new messages, then it sends the messages to listeners to handle, depending on the message type.

To interact with the joke bot, try /bot joke

Symphony REST API offer a range of capabilities for application to integrate, visit the official documentation for more information.

Release Notes

0.1.13

  • Rewrite clients to use python sessions.
  • Moved over requests to sessions for consistent headers, proxies and truststore
  • Fixed auth using sessionAuth for both sessionAuth and keyAuth
  • Fixed functions that pre-populated payload to accept params
  • Datafeed now utilizes session user to determine userId
  • Update to ProxyURL. No longer prepend http://
  • Changed config.json for Proxy to mirror Java SDK

0.1.12

  • The updates in this release may break your existing bot implementation. Please ensure you review and test against this client prior to deployment in Production.
  • Extensively renamed client libraries to follow PEP8 Python standard. Naming now follows "snake_case" convention.
  • Bug fixes.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

symphony-api-client-python

Overview

This Symphony bot client is written in an event handler architecture. The client keeps polling a datafeed and responds to different types of Real Time Events it receives.

To build a functional bot which responds to different types of incoming messages from datafeed (Connection, IM, Chat Room, etc....), the respective type of listener needs to be implemented by inheriting the interfaces in the listeners folder. Currently ConnectionListener, imListener, RoomListener interfaces are provided.

Environment Setup

This client is compatible with Python 3.6 or above

Create a virtual environment by executing the following command (optional): python -m venv ./venv

Activate the virtual environment (optional): source ./venv/bin/activate

Install dependencies required for this client by executing the command below. pip install -r requirements.txt

Getting Started

1 - Prepare the service account

The Python client operates using a Symphony Service Account, which is a type of account that applications use to work with Symphony APIs. Please contact with Symphony Admin in your company to get the account.

The client currently supports two types of Service Account authentications, they are Client Certificates Authentication and RSA Public/Private Key Pair Authentication.

2 - Implement the event listeners

As an example, the roomListenerTestImp has been implemented to respond with "Hello World", to a chat room in which there is an incoming message. To respond to other types of events, respective Listeners need to be implemented.

3.1 - Run bot with RSA Public/Private Key Pair

RSA Public/Private Key Pair is the recommended authentication mechanism by Symphony, due to its robust security and simplicity.

To run the bot using the RSA Public/Private Key Pair, a rsa_config.json should be provided. In our example, the json file resides in the resources folder but it can be anywhere.

An example main_RSA.py has been provided to illustrate how all components work together.

Notes: Most of the time, the port numbers do not need to be changed.

An example of json has been provided below. (The "botRSAPath" ends with a trailing "/")

{
"sessionAuthHost": "MY_ENVIRONMENT.symphony.com",
"sessionAuthPort": 443,
"keyAuthHost": "MY_ENVIRONMENT.symphony.com",
"keyAuthPort": 443,
"podHost": "MY_ENVIRONMENT.symphony.com",
"podPort": 443,
"agentHost": "MY_ENVIRONMENT.symphony.com",
"agentPort": 443,
"botRSAPath":"./sym_api_client_python/resources/",
"botRSAName": "bot_private_key.pem",
"botUsername": "YOUR_BOT_USERNAME",
"botEmailAddress": "YOUR_BOT_EMAIL_ADDRESS",
"appCertPath": "",
"appCertName": "",
"appCertPassword": "",
"proxyURL": "",
"proxyPort": "",
"proxyUsername": "",
"proxyPassword": "",
"authTokenRefreshPeriod": "30"
}

Example main class (using RSA)

Adjust the following paths in the sample to match your configuration

  • "sym_api_client_python/logs/example.log"
  • "sym_api_client_python/resources/config.json"

Example Main Class:

import logging
from sym_api_client_python.configure.configure import SymConfig
from sym_api_client_python.auth.rsa_auth import SymBotRSAAuth
from sym_api_client_python.clients.sym_bot_client import SymBotClient
from sym_api_client_python.listeners.\
im_listener_test_imp import IMListenerTestImp
from sym_api_client_python.listeners.\
room_listener_test_imp import RoomListenerTestImp
def configure_logging():
logging.basicConfig(
filename='sym_api_client_python/logs/example.log',
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filemode='w', level=logging.DEBUG
)
logging.getLogger("urllib3").setLevel(logging.WARNING)
def main():
print('Python Client runs using RSA authentication')
# Configure log
configure_logging()
# RSA Auth flow: pass path to rsa_config.json file
configure = SymConfig('sym_api_client_python/resources'
'/rsa_config.json')
configure.load_rsa_config()
auth = SymBotRSAAuth(configure)
auth.authenticate()
# Initialize SymBotClient with auth and configure objects
bot_client = SymBotClient(auth, configure)
# Initialize datafeed service
datafeed_event_service = bot_client.get_datafeed_event_service()
# Initialize listener objects and append them to datafeed_event_service
# Datafeed_event_service polls the datafeed and the event listeners
# respond to the respective types of events
im_listener_test = IMListenerTestImp(bot_client)
datafeed_event_service.add_im_listener(im_listener_test)
room_listener_test = RoomListenerTestImp(bot_client)
datafeed_event_service.add_room_listener(room_listener_test)
# Create and read the datafeed
print('Starting datafeed')
datafeed_event_service.start_datafeed()
if __name__ == "__main__":
main()

3.2 - Run bot with Certificates

To run the bot using the Client Certificates Authentication, a config.json should be provided. In our example, the json file resides in the resources folder but it can be anywhere.

An example main_certificate.py has been provided to illustrate how all components work together.

Notes: Most of the time, the port numbers do not need to be changed.

An example of json has been provided below. (The "botCertPath" ends with a trailing "/")

{
"sessionAuthHost": "MY_ENVIRONMENT-api.symphony.com",
"sessionAuthPort": 443,
"keyAuthHost": "MY_ENVIRONMENT-api.symphony.com",
"keyAuthPort": 443,
"podHost": "MY_ENVIRONMENT.symphony.com",
"podPort": 443,
"agentHost": "MY_ENVIRONMENT.symphony.com",
"agentPort": 443,
"botCertPath": "./sym_api_client_python/resources/certificates/",
"botCertName": "my_bot_cert.p12",
"botCertPassword": "YOUR_PASSWORD",
"botEmailAddress": "YOUR_BOT_EMAIL_ADDRESS",
"appCertPath": "",
"appCertName": "",
"appCertPassword": "",
"proxyURL": "",
"proxyPort": 8080,
"proxyUsername": "",
"proxyPassword": "",
"authTokenRefreshPeriod": "30"
}

Run with Example main class (using certificates)

Once the certificates are provided and example listeners are implemented, let's run the bot by executing following command:

python3 main_certificate.py.

Change the paths to both log, and config.json

  • "sym_api_client_python/logs/example.log"
  • "sym_api_client_python/resources/config.json"

Example Main Class:

import logging
from sym_api_client_python.configure.configure import SymConfig
from sym_api_client_python.auth.auth import Auth
from sym_api_client_python.clients.sym_bot_client import SymBotClient
from sym_api_client_python.listeners.im_listener_test_imp import \
IMListenerTestImp
from sym_api_client_python.listeners.room_listener_test_imp import \
RoomListenerTestImp
def configure_logging():
logging.basicConfig(
filename='sym_api_client_python/logs/example.log',
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filemode='w', level=logging.DEBUG)
logging.getLogger("urllib3").setLevel(logging.WARNING)
def main():
print('Python Client runs using certificate authentication')
# Configure log
configure_logging()
# Certificate Auth flow: Pass in path to config file
configure = SymConfig('sym_api_client_python/resources/config.json')
configure.load_cert_config()
auth = Auth(configure)
auth.authenticate()
# Initialize SymBotClient with auth and configure objects
bot_client = SymBotClient(auth, configure)
# Initialize datafeed service
datafeed_event_service = bot_client.get_datafeed_event_service()
# Initialize listener objects and append them to datafeed_event_service
# Datafeed_event_service polls the datafeed and the event listeners
# respond to the respective types of events
im_listener_test = IMListenerTestImp(bot_client)
datafeed_event_service.add_im_listener(im_listener_test)
room_listener_test = RoomListenerTestImp(bot_client)
datafeed_event_service.add_room_listener(room_listener_test)
# create data feed and read datafeed continuously in while loop.
print('starting datafeed')
datafeed_event_service.start_datafeed()
if __name__ == "__main__":
main()

4 - Interacting with the joke bot!

The joke bot shows how a Symphony chat bot application works. In general, a chat bot application keeps polling the datafeed API for new messages, then it sends the messages to listeners to handle, depending on the message type.

To interact with the joke bot, try /bot joke

Symphony REST API offer a range of capabilities for application to integrate, visit the official documentation for more information.

Release Notes

0.1.13

  • Rewrite clients to use python sessions.
  • Moved over requests to sessions for consistent headers, proxies and truststore
  • Fixed auth using sessionAuth for both sessionAuth and keyAuth
  • Fixed functions that pre-populated payload to accept params
  • Datafeed now utilizes session user to determine userId
  • Update to ProxyURL. No longer prepend http://
  • Changed config.json for Proxy to mirror Java SDK

0.1.12

  • The updates in this release may break your existing bot implementation. Please ensure you review and test against this client prior to deployment in Production.
  • Extensively renamed client libraries to follow PEP8 Python standard. Naming now follows "snake_case" convention.
  • Bug fixes.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

symphony-api-client-python

Overview

This Symphony bot client is written in an event handler architecture. The client keeps polling a datafeed and responds to different types of Real Time Events it receives.

To build a functional bot which responds to different types of incoming messages from datafeed (Connection, IM, Chat Room, etc....), the respective type of listener needs to be implemented by inheriting the interfaces in the listeners folder. Currently ConnectionListener, imListener, RoomListener interfaces are provided.

Environment Setup

This client is compatible with Python 3.6 or above

Create a virtual environment by executing the following command (optional): python -m venv ./venv

Activate the virtual environment (optional): source ./venv/bin/activate

Install dependencies required for this client by executing the command below. pip install -r requirements.txt

Getting Started

1 - Prepare the service account

The Python client operates using a Symphony Service Account, which is a type of account that applications use to work with Symphony APIs. Please contact with Symphony Admin in your company to get the account.

The client currently supports two types of Service Account authentications, they are Client Certificates Authentication and RSA Public/Private Key Pair Authentication.

2 - Implement the event listeners

As an example, the roomListenerTestImp has been implemented to respond with "Hello World", to a chat room in which there is an incoming message. To respond to other types of events, respective Listeners need to be implemented.

3.1 - Run bot with RSA Public/Private Key Pair

RSA Public/Private Key Pair is the recommended authentication mechanism by Symphony, due to its robust security and simplicity.

To run the bot using the RSA Public/Private Key Pair, a rsa_config.json should be provided. In our example, the json file resides in the resources folder but it can be anywhere.

An example main_RSA.py has been provided to illustrate how all components work together.

Notes: Most of the time, the port numbers do not need to be changed.

An example of json has been provided below. (The "botRSAPath" ends with a trailing "/")

{
"sessionAuthHost": "MY_ENVIRONMENT.symphony.com",
"sessionAuthPort": 443,
"keyAuthHost": "MY_ENVIRONMENT.symphony.com",
"keyAuthPort": 443,
"podHost": "MY_ENVIRONMENT.symphony.com",
"podPort": 443,
"agentHost": "MY_ENVIRONMENT.symphony.com",
"agentPort": 443,
"botRSAPath":"./sym_api_client_python/resources/",
"botRSAName": "bot_private_key.pem",
"botUsername": "YOUR_BOT_USERNAME",
"botEmailAddress": "YOUR_BOT_EMAIL_ADDRESS",
"appCertPath": "",
"appCertName": "",
"appCertPassword": "",
"proxyURL": "",
"proxyPort": "",
"proxyUsername": "",
"proxyPassword": "",
"authTokenRefreshPeriod": "30"
}

Example main class (using RSA)

Adjust the following paths in the sample to match your configuration

  • "sym_api_client_python/logs/example.log"
  • "sym_api_client_python/resources/config.json"

Example Main Class:

import logging
from sym_api_client_python.configure.configure import SymConfig
from sym_api_client_python.auth.rsa_auth import SymBotRSAAuth
from sym_api_client_python.clients.sym_bot_client import SymBotClient
from sym_api_client_python.listeners.\
im_listener_test_imp import IMListenerTestImp
from sym_api_client_python.listeners.\
room_listener_test_imp import RoomListenerTestImp
def configure_logging():
logging.basicConfig(
filename='sym_api_client_python/logs/example.log',
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filemode='w', level=logging.DEBUG
)
logging.getLogger("urllib3").setLevel(logging.WARNING)
def main():
print('Python Client runs using RSA authentication')
# Configure log
configure_logging()
# RSA Auth flow: pass path to rsa_config.json file
configure = SymConfig('sym_api_client_python/resources'
'/rsa_config.json')
configure.load_rsa_config()
auth = SymBotRSAAuth(configure)
auth.authenticate()
# Initialize SymBotClient with auth and configure objects
bot_client = SymBotClient(auth, configure)
# Initialize datafeed service
datafeed_event_service = bot_client.get_datafeed_event_service()
# Initialize listener objects and append them to datafeed_event_service
# Datafeed_event_service polls the datafeed and the event listeners
# respond to the respective types of events
im_listener_test = IMListenerTestImp(bot_client)
datafeed_event_service.add_im_listener(im_listener_test)
room_listener_test = RoomListenerTestImp(bot_client)
datafeed_event_service.add_room_listener(room_listener_test)
# Create and read the datafeed
print('Starting datafeed')
datafeed_event_service.start_datafeed()
if __name__ == "__main__":
main()

3.2 - Run bot with Certificates

To run the bot using the Client Certificates Authentication, a config.json should be provided. In our example, the json file resides in the resources folder but it can be anywhere.

An example main_certificate.py has been provided to illustrate how all components work together.

Notes: Most of the time, the port numbers do not need to be changed.

An example of json has been provided below. (The "botCertPath" ends with a trailing "/")

{
"sessionAuthHost": "MY_ENVIRONMENT-api.symphony.com",
"sessionAuthPort": 443,
"keyAuthHost": "MY_ENVIRONMENT-api.symphony.com",
"keyAuthPort": 443,
"podHost": "MY_ENVIRONMENT.symphony.com",
"podPort": 443,
"agentHost": "MY_ENVIRONMENT.symphony.com",
"agentPort": 443,
"botCertPath": "./sym_api_client_python/resources/certificates/",
"botCertName": "my_bot_cert.p12",
"botCertPassword": "YOUR_PASSWORD",
"botEmailAddress": "YOUR_BOT_EMAIL_ADDRESS",
"appCertPath": "",
"appCertName": "",
"appCertPassword": "",
"proxyURL": "",
"proxyPort": 8080,
"proxyUsername": "",
"proxyPassword": "",
"authTokenRefreshPeriod": "30"
}

Run with Example main class (using certificates)

Once the certificates are provided and example listeners are implemented, let's run the bot by executing following command:

python3 main_certificate.py.

Change the paths to both log, and config.json

  • "sym_api_client_python/logs/example.log"
  • "sym_api_client_python/resources/config.json"

Example Main Class:

import logging
from sym_api_client_python.configure.configure import SymConfig
from sym_api_client_python.auth.auth import Auth
from sym_api_client_python.clients.sym_bot_client import SymBotClient
from sym_api_client_python.listeners.im_listener_test_imp import \
IMListenerTestImp
from sym_api_client_python.listeners.room_listener_test_imp import \
RoomListenerTestImp
def configure_logging():
logging.basicConfig(
filename='sym_api_client_python/logs/example.log',
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filemode='w', level=logging.DEBUG)
logging.getLogger("urllib3").setLevel(logging.WARNING)
def main():
print('Python Client runs using certificate authentication')
# Configure log
configure_logging()
# Certificate Auth flow: Pass in path to config file
configure = SymConfig('sym_api_client_python/resources/config.json')
configure.load_cert_config()
auth = Auth(configure)
auth.authenticate()
# Initialize SymBotClient with auth and configure objects
bot_client = SymBotClient(auth, configure)
# Initialize datafeed service
datafeed_event_service = bot_client.get_datafeed_event_service()
# Initialize listener objects and append them to datafeed_event_service
# Datafeed_event_service polls the datafeed and the event listeners
# respond to the respective types of events
im_listener_test = IMListenerTestImp(bot_client)
datafeed_event_service.add_im_listener(im_listener_test)
room_listener_test = RoomListenerTestImp(bot_client)
datafeed_event_service.add_room_listener(room_listener_test)
# create data feed and read datafeed continuously in while loop.
print('starting datafeed')
datafeed_event_service.start_datafeed()
if __name__ == "__main__":
main()

4 - Interacting with the joke bot!

The joke bot shows how a Symphony chat bot application works. In general, a chat bot application keeps polling the datafeed API for new messages, then it sends the messages to listeners to handle, depending on the message type.

To interact with the joke bot, try /bot joke

Symphony REST API offer a range of capabilities for application to integrate, visit the official documentation for more information.

Release Notes

0.1.13

  • Rewrite clients to use python sessions.
  • Moved over requests to sessions for consistent headers, proxies and truststore
  • Fixed auth using sessionAuth for both sessionAuth and keyAuth
  • Fixed functions that pre-populated payload to accept params
  • Datafeed now utilizes session user to determine userId
  • Update to ProxyURL. No longer prepend http://
  • Changed config.json for Proxy to mirror Java SDK

0.1.12

  • The updates in this release may break your existing bot implementation. Please ensure you review and test against this client prior to deployment in Production.
  • Extensively renamed client libraries to follow PEP8 Python standard. Naming now follows "snake_case" convention.
  • Bug fixes.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

symphony-api-client-python

Overview

This Symphony bot client is written in an event handler architecture. The client keeps polling a datafeed and responds to different types of Real Time Events it receives.

To build a functional bot which responds to different types of incoming messages from datafeed (Connection, IM, Chat Room, etc....), the respective type of listener needs to be implemented by inheriting the interfaces in the listeners folder. Currently ConnectionListener, imListener, RoomListener interfaces are provided.

Environment Setup

This client is compatible with Python 3.6 or above

Create a virtual environment by executing the following command (optional): python -m venv ./venv

Activate the virtual environment (optional): source ./venv/bin/activate

Install dependencies required for this client by executing the command below. pip install -r requirements.txt

Getting Started

1 - Prepare the service account

The Python client operates using a Symphony Service Account, which is a type of account that applications use to work with Symphony APIs. Please contact with Symphony Admin in your company to get the account.

The client currently supports two types of Service Account authentications, they are Client Certificates Authentication and RSA Public/Private Key Pair Authentication.

2 - Implement the event listeners

As an example, the roomListenerTestImp has been implemented to respond with "Hello World", to a chat room in which there is an incoming message. To respond to other types of events, respective Listeners need to be implemented.

3.1 - Run bot with RSA Public/Private Key Pair

RSA Public/Private Key Pair is the recommended authentication mechanism by Symphony, due to its robust security and simplicity.

To run the bot using the RSA Public/Private Key Pair, a rsa_config.json should be provided. In our example, the json file resides in the resources folder but it can be anywhere.

An example main_RSA.py has been provided to illustrate how all components work together.

Notes: Most of the time, the port numbers do not need to be changed.

An example of json has been provided below. (The "botRSAPath" ends with a trailing "/")

{
"sessionAuthHost": "MY_ENVIRONMENT.symphony.com",
"sessionAuthPort": 443,
"keyAuthHost": "MY_ENVIRONMENT.symphony.com",
"keyAuthPort": 443,
"podHost": "MY_ENVIRONMENT.symphony.com",
"podPort": 443,
"agentHost": "MY_ENVIRONMENT.symphony.com",
"agentPort": 443,
"botRSAPath":"./sym_api_client_python/resources/",
"botRSAName": "bot_private_key.pem",
"botUsername": "YOUR_BOT_USERNAME",
"botEmailAddress": "YOUR_BOT_EMAIL_ADDRESS",
"appCertPath": "",
"appCertName": "",
"appCertPassword": "",
"proxyURL": "",
"proxyPort": "",
"proxyUsername": "",
"proxyPassword": "",
"authTokenRefreshPeriod": "30"
}

Example main class (using RSA)

Adjust the following paths in the sample to match your configuration

  • "sym_api_client_python/logs/example.log"
  • "sym_api_client_python/resources/config.json"

Example Main Class:

import logging
from sym_api_client_python.configure.configure import SymConfig
from sym_api_client_python.auth.rsa_auth import SymBotRSAAuth
from sym_api_client_python.clients.sym_bot_client import SymBotClient
from sym_api_client_python.listeners.\
im_listener_test_imp import IMListenerTestImp
from sym_api_client_python.listeners.\
room_listener_test_imp import RoomListenerTestImp
def configure_logging():
logging.basicConfig(
filename='sym_api_client_python/logs/example.log',
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filemode='w', level=logging.DEBUG
)
logging.getLogger("urllib3").setLevel(logging.WARNING)
def main():
print('Python Client runs using RSA authentication')
# Configure log
configure_logging()
# RSA Auth flow: pass path to rsa_config.json file
configure = SymConfig('sym_api_client_python/resources'
'/rsa_config.json')
configure.load_rsa_config()
auth = SymBotRSAAuth(configure)
auth.authenticate()
# Initialize SymBotClient with auth and configure objects
bot_client = SymBotClient(auth, configure)
# Initialize datafeed service
datafeed_event_service = bot_client.get_datafeed_event_service()
# Initialize listener objects and append them to datafeed_event_service
# Datafeed_event_service polls the datafeed and the event listeners
# respond to the respective types of events
im_listener_test = IMListenerTestImp(bot_client)
datafeed_event_service.add_im_listener(im_listener_test)
room_listener_test = RoomListenerTestImp(bot_client)
datafeed_event_service.add_room_listener(room_listener_test)
# Create and read the datafeed
print('Starting datafeed')
datafeed_event_service.start_datafeed()
if __name__ == "__main__":
main()

3.2 - Run bot with Certificates

To run the bot using the Client Certificates Authentication, a config.json should be provided. In our example, the json file resides in the resources folder but it can be anywhere.

An example main_certificate.py has been provided to illustrate how all components work together.

Notes: Most of the time, the port numbers do not need to be changed.

An example of json has been provided below. (The "botCertPath" ends with a trailing "/")

{
"sessionAuthHost": "MY_ENVIRONMENT-api.symphony.com",
"sessionAuthPort": 443,
"keyAuthHost": "MY_ENVIRONMENT-api.symphony.com",
"keyAuthPort": 443,
"podHost": "MY_ENVIRONMENT.symphony.com",
"podPort": 443,
"agentHost": "MY_ENVIRONMENT.symphony.com",
"agentPort": 443,
"botCertPath": "./sym_api_client_python/resources/certificates/",
"botCertName": "my_bot_cert.p12",
"botCertPassword": "YOUR_PASSWORD",
"botEmailAddress": "YOUR_BOT_EMAIL_ADDRESS",
"appCertPath": "",
"appCertName": "",
"appCertPassword": "",
"proxyURL": "",
"proxyPort": 8080,
"proxyUsername": "",
"proxyPassword": "",
"authTokenRefreshPeriod": "30"
}

Run with Example main class (using certificates)

Once the certificates are provided and example listeners are implemented, let's run the bot by executing following command:

python3 main_certificate.py.

Change the paths to both log, and config.json

  • "sym_api_client_python/logs/example.log"
  • "sym_api_client_python/resources/config.json"

Example Main Class:

import logging
from sym_api_client_python.configure.configure import SymConfig
from sym_api_client_python.auth.auth import Auth
from sym_api_client_python.clients.sym_bot_client import SymBotClient
from sym_api_client_python.listeners.im_listener_test_imp import \
IMListenerTestImp
from sym_api_client_python.listeners.room_listener_test_imp import \
RoomListenerTestImp
def configure_logging():
logging.basicConfig(
filename='sym_api_client_python/logs/example.log',
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filemode='w', level=logging.DEBUG)
logging.getLogger("urllib3").setLevel(logging.WARNING)
def main():
print('Python Client runs using certificate authentication')
# Configure log
configure_logging()
# Certificate Auth flow: Pass in path to config file
configure = SymConfig('sym_api_client_python/resources/config.json')
configure.load_cert_config()
auth = Auth(configure)
auth.authenticate()
# Initialize SymBotClient with auth and configure objects
bot_client = SymBotClient(auth, configure)
# Initialize datafeed service
datafeed_event_service = bot_client.get_datafeed_event_service()
# Initialize listener objects and append them to datafeed_event_service
# Datafeed_event_service polls the datafeed and the event listeners
# respond to the respective types of events
im_listener_test = IMListenerTestImp(bot_client)
datafeed_event_service.add_im_listener(im_listener_test)
room_listener_test = RoomListenerTestImp(bot_client)
datafeed_event_service.add_room_listener(room_listener_test)
# create data feed and read datafeed continuously in while loop.
print('starting datafeed')
datafeed_event_service.start_datafeed()
if __name__ == "__main__":
main()

4 - Interacting with the joke bot!

The joke bot shows how a Symphony chat bot application works. In general, a chat bot application keeps polling the datafeed API for new messages, then it sends the messages to listeners to handle, depending on the message type.

To interact with the joke bot, try /bot joke

Symphony REST API offer a range of capabilities for application to integrate, visit the official documentation for more information.

Release Notes

0.1.13

  • Rewrite clients to use python sessions.
  • Moved over requests to sessions for consistent headers, proxies and truststore
  • Fixed auth using sessionAuth for both sessionAuth and keyAuth
  • Fixed functions that pre-populated payload to accept params
  • Datafeed now utilizes session user to determine userId
  • Update to ProxyURL. No longer prepend http://
  • Changed config.json for Proxy to mirror Java SDK

0.1.12

  • The updates in this release may break your existing bot implementation. Please ensure you review and test against this client prior to deployment in Production.
  • Extensively renamed client libraries to follow PEP8 Python standard. Naming now follows "snake_case" convention.
  • Bug fixes.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages