_username = "<YOUR CXENSE USER NAME>"
_secret = "<YOUR CXENSE API KEY>"
_siteGroupId = "<SITE GROUP ID>"
_segments = [
{
"name" : "My Test Segment",
"taxonomy" : ["section1", "section2/subsection"],
"host" : ["server1.domain", "server2.domain"],
"url" : ["http://server3.domain/some/path/someFile.html"],
"min" : 25,
"days" : 30
}
]
import json, datetime, hmac, hashlib, http.client
def cxApi(path, obj):
date = datetime.datetime.utcnow().isoformat() + "Z"
signature = hmac.new(_secret.encode('utf-8'), date.encode('utf-8'), digestmod=hashlib.sha256).hexdigest()
headers = {"X-cXense-Authentication": "username=%s date=%s hmac-sha256-hex=%s" % (_username, date, signature)}
connection = http.client.HTTPSConnection("api.cxense.com", 443)
connection.request("POST", path, json.dumps(obj), headers)
response = connection.getresponse()
status = response.status
responseObj = json.loads(response.read().decode('utf-8'))
connection.close()
return status, responseObj
def errorHandling(status, response, message):
if status != 200:
raise Exception("%s (http status = %s, error details: '%s')" % (message, status, response['error']))
def createUserSegment(requestObj):
status, response = cxApi('/segment/create', requestObj)
errorHandling(status, response, "Unable to retrieve traffic data")
return response
def getFilterObj(days, minPageViews, filterGroups):
return [{
"type": "time",
"start": days,
"filter": {
"type": "user",
"having": {
"min": minPageViews,
"filter": {
"type": "or",
"filters": filterGroups
}
}
}
}]
def genDescription(items, minPageViews, days):
return "Minimum of %s page views during last %s days across: %s" % (minPageViews, days, ', '.join(items))
def getSegmentRequestObj(siteGroupId, segment):
mappings = {'taxonomy':'keyword', 'host':'event', 'url':'event'}
filterGroups = []
for group in mappings.keys():
filterGroups.append({"type":mappings[group], "group":group, "items":segment[group]})
minPageViews = segment['min'] if 'min' in segment else '1'
return {
"siteGroupId": siteGroupId,
"name": segment['name'] if 'name' in segment else '<No segment name defined>',
"description": genDescription([', '.join(group['items']) for group in filterGroups], minPageViews, segment['days']),
"filters": getFilterObj("-%sd" % segment['days'], minPageViews, filterGroups),
"active": True
}
for segment in _segments:
requestObj = getSegmentRequestObj(_siteGroupId, segment)
print(json.dumps(requestObj, indent=4))
print(createUserSegment(requestObj))