Querying Office 365 Service Communications API with Python

2k Views Asked by At

I am trying to get the name of all Office 365 services by querying the Service Communications API.

I have been able to complete the task using a PowerShell script, but am unable to do the same using Python.

When using Python, I get a 200 response code, but have been unable to parse what is returned. Any help would be much appreciated.

My attempt to convert the PowerShell script to Python is below.

import json
import requests
from requests.auth import HTTPBasicAuth

username = "username"
password = "password"

# Base Service Communications URI
baseuri = "https://api.admin.microsoftonline.com/shdtenantcommunications.svc"
headers = {"accept": "application/json;odata=verbose"}
auth = {"username": username, "password": password}
# URI Paths
serviceinfo = "/GetServiceInformation"
register = "/Register"

response = requests.options(baseuri+register, auth=HTTPBasicAuth(username, password))
print("Registration status code: %s" % response.status_code)
if (response is not None and 200 == response.status_code):
    info = requests.options(baseuri+serviceinfo, auth=HTTPBasicAuth(username, password))
    print("Info status code: %s" % info.status_code)
    data = json.loads(info.text)

The Python script returns an error. Specifically, it returns the following:

Registration status code: 200
Info status code: 200
Traceback (most recent call last):
  File "o365_option.py", line 22, in <module>
    data = json.loads(info.text)
  File "/usr/local/lib/python2.7/json/__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "/usr/local/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/local/lib/python2.7/json/decoder.py", line 384, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
1

There are 1 best solutions below

10
On BEST ANSWER

There are a few issues with your python script. Here is the correct python script to duplicate the results from the powershell script you posted.

import json
import requests
from requests.auth import HTTPBasicAuth

username = "username"
password = "password"

# Base Service Communications URI
baseuri = "https://api.admin.microsoftonline.com/shdtenantcommunications.svc"
headers = {"accept": "application/json;odata=verbose"}
auth = {"username": username, "password": password}
# URI Paths
serviceinfo = "/GetServiceInformation"
register = "/Register"

payload = {'userName': username, 'password': password}
myheaders = {'Content-Type': 'application/json'}
data=json.dumps(payload)
response = requests.post(baseuri+register,data=json.dumps(payload),headers=myheaders)
responsedata = json.loads(response.text)
cookie = responsedata.get("RegistrationCookie")

payload1 = {'lastCookie':cookie,'locale':"en-US"} 
response = requests.post(baseuri+serviceinfo,data=json.dumps(payload1),headers=myheaders)
responsedata = json.loads(response.text)
for myobject in responsedata:
   print myobject.get("ServiceName")

This is the response you will get:

"Exchange Online"
"Office Subscription"
"Identity Service"
"Office 365 Portal"
"Skype for Business"
"SharePoint Online"
"Rights Management Service"
"Yammer Enterprise"
"OneDrive for Business"
"Mobile Device Management"

Additionally, please note that there is a new version of the Office 365 Service Communications API in public preview which is available here: https://msdn.microsoft.com/en-us/library/office/dn707385.aspx

It has a few new methods that might be interesting to you, and is a bit easier to develop against. The new API follows the OAuth 2.0 flow that the other Microsoft APIs are using. If you are using multiple Microsoft APIs, than you will be familiar with the flow already.

Let me know if this answers your question or if have any additional questions.