This example written in Python allows users to manage VoipNow accounts and fetch call statistics.
How To Install It
In order to be able to use the SystemAPI Python Tool, you must first check what components you need depending on your operating system and after that follow the installation steps.
System Requirements for Linux
- gcc
- Download Python-2.6.2
- Download fpconst-0.7.2.tar.gz
- Download PyXML-0.8.4.tar.gz
- Download SOAPpy-0.12.0.tar.gz
- Download ZSI-2.1-a1.tar.gz
System Requirements for Microsoft Windows
- Download Visual Studio 2008 Express
- Download Python 2.4.4 installer
- Download fpconst-0.7.2.tar.gz
- Download PyXML-0.8.4.win32-py2.4.exe
- Download SOAPpy-0.12.0.tar.gz
- Download ZSI-2.1-a1.tar.gz
Setup
The code is on GitHub
Download here. Do not hesitate to contribute in order to make this example better - we welcome Pull Requests!
Linux
STEP 1: As soon as gcc
and Python
are installed and fpconst
is downloaded, please extract the contents of the fpconst
archive, open the extracted folder, and run the following commands:
python setup.py build python setup.py install
To check that fpconst
has been properly installed, type the following in your Python command-line:
import fpconst
If you don't have any error messages, fpconst
is correctly installed.
STEP 2: As soon as PyXML
is downloaded, please extract the contents of the archive, open the extracted folder, and run the following commands:
python setup.py build python setup.py install
To check that PyXML has been properly installed, type the following in your Python command-line:
import xml
If you do not have any error messages, PyXML is correctly installed.
STEP 3: As soon as SOAPpy
is downloaded, please extract the contents of the archive, open the extracted folder, and run the following commands:
python setup.py build python setup.py install
To check that SOAPpy has been properly installed, type the following in your Python command-line:
import SOAPpy
If you do not have any error messages, SOAPpy is correctly installed.
If you get the following error during installation:
File ".../SOAPpy/Client.py", line 46
from _future_ import nested_scopes
SyntaxError: from _future_ imports must occur at the beginning of the file
You need to open your temporary folder SOAPpy\Client.py and copy/paste the "from _future_ imports" line to be the first import.
The same error will appear with other files during installation; therefore, it is recommended that you repeat this step.
The Client.py is just a temporary folder used by the SOAPpy engine. You don't need to bother with it.
STEP 4: As soon as ZSI
is downloaded, please extract the contents of the archive, open the extracted folder, and run the following commands:
python setup.py build python setup.py install
To check that ZSI has been properly installed, type the following in your Python command-line:
import ZSI
If you do not have any error messages, ZSI
is correctly installed.
STEP 5: You can start writing applications for your VoipNow server using the SOAPpy
web services toolkit.
Microsoft Windows
STEP 1: As soon as Visual Studio 2008 Express
and Python
are installed and fpconst
is downloaded, please extract the contents of the fpconst
archive, open the extracted folder, and run the following commands:
python setup.py build python setup.py install
STEP 2: As soon as PyXML
is downloaded, you need to run the installer:
There are different PyXML
installers for various Python versions, so make sure you download the appropriate one, otherwise the installer will not work. If you're not sure what to do, please visit the links in the README
file.
STEP 3: As soon as SOAPpy
is downloaded, please extract the contents of the archive, open the extracted folder, and run the following commands:
python setup.py build python setup.py install
If you get the following error during installation:
File ".../SOAPpy/Client.py", line 46
from _future_ import nested_scopes
SyntaxError: from _future_ imports must occur at the beginning of the file
You must open your temporary folder SOAPpy\Client.py and copy/paste the "from _future_ imports" line to be the first import.
The same error will appear with other files during installation; therefore, it is recommended that you repeat this step.
STEP 4: As soon as ZSI
is downloaded, please extract the contents of the archive, open the extracted folder, and run the following commands:
python setup.py build python setup.py install
STEP 5: You can start writing applications for your VoipNow server using the SOAPpy
web services toolkit.
When writing applications, you may sometimes encounter the following error:
Traceback (most recent call last): File "pythonDemo.py", line 61, in ? server._callWithBody(body1) File "/usr/lib/python2.4/site-packages/SOAPpy/Client.py", line 436, in _callWithBody return self.__call(None, body, {}) File "/usr/lib/python2.4/site-packages/SOAPpy/Client.py", line 395, in __call p, attrs = parseSOAPRPC(r, attrs = 1) File "/usr/lib/python2.4/site-packages/SOAPpy/Parser.py", line 1049, in parseSOAPRPC t = _parseSOAP(xml_str, rules = rules) File "/usr/lib/python2.4/site-packages/SOAPpy/Parser.py", line 1029, in _parseSOAP parser.parse(inpsrc) File "/usr/lib/python2.4/site-packages/_xmlplus/sax/expatreader.py", line 109, in parse xmlreader.IncrementalParser.parse(self, source) File "/usr/lib/python2.4/site-packages/_xmlplus/sax/xmlreader.py", line 123, in parse self.feed(buffer) File "/usr/lib/python2.4/site-packages/_xmlplus/sax/expatreader.py", line 216, in feed self._parser.Parse(data, isFinal) File "/usr/lib/python2.4/site-packages/_xmlplus/sax/expatreader.py", line 363, in end_element_ns self._cont_handler.endElementNS(pair, None) File "/usr/lib/python2.4/site-packages/SOAPpy/Parser.py", line 235, in endElementNS kind = (self._prem[kind[:i]], kind[i + 1:]) KeyError: u'http'
If this happens to you, please make sure you download the latest patch for the Parser.py
file from the SOAPpy
library.
You may find it here: http://pywebsvcs.svn.sourceforge.net/viewvc/pywebsvcs/trunk/SOAPpy/SOAPpy/Parser.py?view=markup&pathrev=1497
How To Use It
Authentication
First you need to create a headerType object.
header1 = SOAPpy.Types.headerType()
Then you need to fill in the user credentials. VoipNow the OAuth protocol, where the user must provide his access token. The old legacy authentication and OAuth with consumer key and consumer secret are deprecated.
The code should look something like this:
# Authentication data ACCESS_TOKEN = "CHANGEME" #XML template for sending the authentication data authenticationTemplate = """ <ns1:accessToken>%s</ns1:accessToken>""" # filling in the template above with our authentication data credentials = authenticationTemplate % (ACCESS_TOKEN) soapHeader.userCredentials = SOAPpy.Types.headerType(credentials) # the namespace for the user credentials soapHeader.userCredentials._ns = "http://4psa.com/HeaderData.xsd/3.0.0" soapHeader.userCredentials.userCredentials = SOAPpy.Types.untypedType(credentials)
Examples
Add a Service Provider
The following example shows how to add a new service provider. It also fetches the list of charging plans in order to pick a random one to use with the new service provider. For more information on how to get the access token, please check the access management documentation. The code should look like this:
curl "https://raw.githubusercontent.com/4psa/systemapi-example-python/Demo/DemoAddServiceProvider.py" -o DemoAddServiceProvider.py -L
Adding Other Account Types
If you wish to add other account types (organizations, users or extensions), there is not much to change from the program listed above. First of all, you will also need the id of a parent account. This stands for the ID of the service provider that owns the organization (when adding a new organization) or the ID of the organization that owns the user (when adding a new user) or the ID of the user that owns the extension (when adding a new extension). Therefore, the list of appropriate accounts will be fetched and a random one will be chosen as the parent for the new account:
# We need a parent service provider for the new organization, so we make a request to # fetch all the service providers. # Construct the Body soapBody = SOAPpy.Types.untypedType("") soapBody._name = "ns2:GetServiceProviders" # Set namespaces soapBody._setAttr("xmlns:ns2", "http://4psa.com/ServiceProviderMessages.xsd/3.0.0") # Set endpoint endpoint = "https://voipnow2demo.4psa.com/soap2/sp_agent.php" # Set soapaction soapaction = "http://4psa.com/ServiceProvider/3.0.0:getServiceProvidersIn" # Set service connection server = SOAPProxy(endpoint, noroot = 1, soapaction = soapaction, header = soapHeader) #run our soap request try: serviceProviders = server._callWithBody(soapBody) except SOAPpy.Types.faultType, error: # Catch exception, for situations when the service providers could not be fetched print "Error " + error[0] + ": " + error[1] sys.exit(1) # Get the id of a random service provider serviceProviderID = None if len(serviceProviders) != 0: randServiceProvider = serviceProviders[random.randint(0, len(serviceProviders) - 1)] if hasattr(randServiceProvider, 'ID'): serviceProviderID = randServiceProvider.ID if hasattr(randServiceProvider, 'name'): print "Using parent service provider " + randServiceProvider.name + "." else: print "Using parent service provider with id " + serviceProviderID + "." if serviceProviderID == None: print "No service providers found on the server. Can not add an organization." sys.exit(1)
You will also need to make adjustments to the parameters of the new request, in order to match the new account type:
# Organization data name = "OrgPython" + str(random.randint(1, 1000)) login = "OrgPythong" + str(random.randint(1, 1000)) password = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(10)) country = "us" parentID = serviceProviderID # Filling in the template above with the organization data if chargingPlanID != None: body = bodyTemplate % (name, login, password, country, parentID, chargingPlanID) else: body = bodyTemplate % (name, login, password, country, parentID) soapBody = SOAPpy.Types.untypedType(body) soapBody._name = "ns2:AddOrganization" # Set namespaces soapBody._setAttr("xmlns:ns2", "http://4psa.com/OrganizationMessages.xsd/3.0.0") soapBody._setAttr("xmlns:ns3", "http://4psa.com/OrganizationData.xsd/3.0.0") # Set endpoint endpoint = "https://voipnow2demo.4psa.com/soap2/organization_agent.php" # Set soapaction soapaction = "http://4psa.com/Organization/3.0.0:addOrganizationIn"
Adding an user or an extension is very similar. You only need to adjust the namespaces, endpoint and soapaction variables. Also, for extension accounts, you should use the label field instead of name and login.
CallCosts
The DEMO version also provides a CallCosts request. Here is the code:
curl "https://raw.githubusercontent.com/4psa/systemapi-example-python/Demo/DemoCallCosts.py" -o DemoCallCosts.py -L
Except where otherwise noted, content in this space is licensed under a Creative Commons Attribution 4.0 International.