Skip to main content

Symphony REST API - Python Client

Project description

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 config.json

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.

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 "botPrivateKeyPath" 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,

  // For bot RSA authentication
  "botPrivateKeyPath":"./sym_api_client_python/resources/",
  "botPrivateKeyName": "bot_private_key.pem",

  // For bot cert authentication
  "botCertPath": "/path/to/bot-cert/",
  "botCertName": "/bot-cert.p12",
  "botCertPassword": "bot-cert-password",

  "botUsername": "YOUR_BOT_USERNAME",
  "botEmailAddress": "YOUR_BOT_EMAIL_ADDRESS",

  "appCertPath": "",
  "appCertName": "",
  "appCertPassword": "",
  "authTokenRefreshPeriod": "30"

  // Optional: If all the traffic goes through a single proxy, set this parameter. If using multiple proxies or only using a proxy for some of the components, set them below and don't useproxyURL
  "proxyURL": "http://localhost:8888",
  "proxyUsername": "proxy-username",
  "proxyPassword": "proxy-password",

  // Optional: set this if traffic to pod goes through a specific, unique proxy
  "podProxyURL": "http://localhost:8888",
  "podProxyUsername": "proxy-username",
  "podProxyPassword": "proxy-password",

  // Optional: set this if traffic to agent goes through a specific, unique proxy
  "agentProxyURL": "http://localhost:8888",
  "agentProxyUsername": "proxy-username",
  "agentProxyPassword": "proxy-password",

  // Optional: set this if traffic to KeyManager goes through a specific, unique proxy
  "keyManagerProxyURL": "http://localhost:8888",
  "keyManagerProxyUsername": "proxy-username",
  "keyManagerProxyPassword": "proxy-password",


  // Required: If a truststore is required to access on-prem components, provide a path to the python truststore. Needs to be .pem file.  Instructions below for converting JKS to python pem truststore. If truststore is not needed, set value as empty string ("").
  "truststorePath": "/path/to/truststore.pem" 
}

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='./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('../resources/config.json')
    configure.load_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()

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='./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 Cert authentication')

    # Configure log
    configure_logging()

    # Cert Auth flow: pass path to certificate config.json file
    configure = SymConfig('../resources/config.json')
    configure.load_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 and read the datafeed
    print('Starting datafeed')
    datafeed_event_service.start_datafeed()


if __name__ == "__main__":
    main()

4 - Converting JKS (Java Key Store) to Python truststore

The Python SDK truststore requires that your certificates be in a .pem file that is a collection of your certificates. You can convert JKSto a .p12 and then convert to .pem:

keytool -importkeystore -srckeystore myapp.jks -destkeystore myapp.p12 -srcalias myapp-dev -srcstoretype jks -deststoretype pkcs12

openssl pkcs12 -in myapp.p12 -out myapp.pem

5 - 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.17

  • Added AdminClient, SignalsClient, and ConnectionsClient
  • Added docstrings to new methods
  • Added clarification to README

0.1.16

  • Re-released 0.1.15 due to merge issues

0.1.15

  • Added podProxyURL, agentProxyURL, and keyManagerProxyURL as supported parameters in the config.json and config loader. If proxyURL is set, all of these proxies will be set to that URL. Otherwise, it will use the proxy address provided.
  • merge to using the same method in configure.py to load RSA and Cert

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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sym_api_client_python-0.1.17.tar.gz (26.2 kB view details)

Uploaded Source

Built Distribution

sym_api_client_python-0.1.17-py3-none-any.whl (36.6 kB view details)

Uploaded Python 3

File details

Details for the file sym_api_client_python-0.1.17.tar.gz.

File metadata

  • Download URL: sym_api_client_python-0.1.17.tar.gz
  • Upload date:
  • Size: 26.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.3

File hashes

Hashes for sym_api_client_python-0.1.17.tar.gz
Algorithm Hash digest
SHA256 3a448e4e5ae6a77d868429f25de55ff5c85fed35caa8f2073d0c6dfa63cb243e
MD5 efa6f9f5d56a551653860af38f5dc63c
BLAKE2b-256 e85c68c70cc80340f6c802fbd2f562ad724830b90b370075deef510556d5faf2

See more details on using hashes here.

File details

Details for the file sym_api_client_python-0.1.17-py3-none-any.whl.

File metadata

  • Download URL: sym_api_client_python-0.1.17-py3-none-any.whl
  • Upload date:
  • Size: 36.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.3

File hashes

Hashes for sym_api_client_python-0.1.17-py3-none-any.whl
Algorithm Hash digest
SHA256 22220a3e6af246eb967c0d97d88b37e598221c57084b29850f5f41ff4bd3726d
MD5 20584bb09e7e99c9f11bce308ef34ff4
BLAKE2b-256 6d33e295afd99e6a3bb55dac3b47282e6c86b50b6fc9383882a5d73e1326cfdc

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page