-
-
Save wgins/b21f4f0c2e160f7f95af to your computer and use it in GitHub Desktop.
| ''' people export''' | |
| import hashlib | |
| import time | |
| import urllib #for url encoding | |
| import urllib2 #for sending requests | |
| import base64 | |
| import sys | |
| import csv | |
| try: | |
| import json | |
| except ImportError: | |
| import simplejson as json | |
| class Mixpanel(object): | |
| def __init__(self, api_key, api_secret, token): | |
| self.api_key = api_key | |
| self.api_secret = api_secret | |
| self.token = token | |
| def request(self, params, format = 'json'): | |
| '''let's craft the http request''' | |
| params['api_key']=self.api_key | |
| params['expire'] = int(time.time())+600 # 600 is ten minutes from now | |
| if 'sig' in params: del params['sig'] | |
| params['sig'] = self.hash_args(params) | |
| request_url = 'https://mixpanel.com/api/2.0/engage/?' + self.unicode_urlencode(params) | |
| request = urllib.urlopen(request_url) | |
| data = request.read() | |
| #print request_url | |
| return data | |
| def hash_args(self, args, secret=None): | |
| '''Hash dem arguments in the proper way | |
| join keys - values and append a secret -> md5 it''' | |
| for a in args: | |
| if isinstance(args[a], list): args[a] = json.dumps(args[a]) | |
| args_joined = '' | |
| for a in sorted(args.keys()): | |
| if isinstance(a, unicode): | |
| args_joined += a.encode('utf-8') | |
| else: | |
| args_joined += str(a) | |
| args_joined += "=" | |
| if isinstance(args[a], unicode): | |
| args_joined += args[a].encode('utf-8') | |
| else: | |
| args_joined += str(args[a]) | |
| hash = hashlib.md5(args_joined) | |
| if secret: | |
| hash.update(secret) | |
| elif self.api_secret: | |
| hash.update(self.api_secret) | |
| return hash.hexdigest() | |
| def unicode_urlencode(self, params): | |
| ''' Convert stuff to json format and correctly handle unicode url parameters''' | |
| if isinstance(params, dict): | |
| params = params.items() | |
| for i, param in enumerate(params): | |
| if isinstance(param[1], list): | |
| params[i] = (param[0], json.dumps(param[1]),) | |
| result = urllib.urlencode([(k, isinstance(v, unicode) and v.encode('utf-8') or v) for k, v in params]) | |
| return result | |
| def export_csv(self, outfilename, fname): | |
| """ | |
| takes the json and returns a csv file | |
| """ | |
| subkeys = set() | |
| with open(fname,'rb') as r: | |
| with open(outfilename, 'wb') as w: | |
| # Get all properties (will use this to create the header) | |
| for line in r: | |
| try: | |
| subkeys.update(set(json.loads(line)['$properties'].keys())) | |
| except: | |
| pass | |
| # Create the header | |
| header = ['$distinct_id'] | |
| for key in subkeys: | |
| header.append(key) | |
| # Create the writer and write the header | |
| writer = csv.writer(w) | |
| writer.writerow(header) | |
| #Return to the top of the file, then write the events out, one per row | |
| r.seek(0,0) | |
| for line in r: | |
| entry = json.loads(line) | |
| row = [] | |
| try: | |
| row.append(entry['$distinct_id']) | |
| except: | |
| row.append('') | |
| for subkey in subkeys: | |
| try: | |
| row.append((entry['$properties'][subkey]).encode('utf-8')) | |
| except AttributeError: | |
| row.append(entry['$properties'][subkey]) | |
| except KeyError: | |
| row.append("") | |
| writer.writerow(row) | |
| api_key = raw_input("API Key: ") | |
| api_secret = raw_input("API Secret: ") | |
| api_token = raw_input("API token: ") | |
| if __name__ == '__main__': | |
| api = Mixpanel( | |
| api_key = api_key, | |
| api_secret = api_secret, | |
| token = api_token, | |
| ) | |
| '''Here is the place to define your selector to target only the users that you're after | |
| selector = '(datetime(1458587013 - 86400) > properties["Created"] and behaviors["behavior_79"] > 0' | |
| behaviors = '[{"window": "90d", "name": "behavior_79", "event_selectors": [{"event": "Edit Colors"}]}]' | |
| ''' | |
| selector = '' | |
| #Leave 'r' before the behaviors string so that it's interpreted as a string literal to handle escaped quotes | |
| behaviors = r'' | |
| if not behaviors: | |
| parameters = {'selector':selector} | |
| else: | |
| time_offset = int(raw_input("Project time offset from GMT (ex. PST = -8): ")) | |
| parameters = {'selector': selector, 'behaviors': behaviors, 'as_of_timestamp': int(time.time()) - (time_offset * 3600) } | |
| response = api.request(parameters) | |
| parameters['session_id'] = json.loads(response)['session_id'] | |
| parameters['page']=0 | |
| global_total = json.loads(response)['total'] | |
| print "Session id is %s \n" % parameters['session_id'] | |
| print "Here are the # of people %d" % global_total | |
| fname = "people.txt" | |
| has_results = True | |
| total = 0 | |
| with open(fname,'w') as f: | |
| while has_results: | |
| responser = json.loads(response)['results'] | |
| total += len(responser) | |
| has_results = len(responser) == 1000 | |
| for data in responser: | |
| f.write(json.dumps(data)+'\n') | |
| print "%d / %d" % (total,global_total) | |
| parameters['page'] += 1 | |
| if has_results: | |
| response = api.request(parameters) | |
| '''specify your output filename here''' | |
| api.export_csv("people_export_"+str(int(time.time()))+".csv", fname) | |
cggaurav
commented
Oct 4, 2016
Looks like you didn't provide API secret. (Instructions on where to find it: https://mixpanel.com/help/questions/articles/how-can-i-export-my-people-profiles-into-a-csv-)
Once you run python people2csv.py in a teminal it prompts: API secret:
Just paste you API secret into terminal and press return key.
I get a pretty similar error as cggaurav, I provided API secret so not sure why this code won't work as is. Any help would be greatly appreciated
Traceback (most recent call last):
File "people2csv.py", line 155, in
api.get_and_write_results(parameters)
File "people2csv.py", line 46, in get_and_write_results
response = api.request(params)
File "people2csv.py", line 29, in request
response = urllib2.urlopen(request, timeout=120)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 154, in urlopen
return opener.open(url, data, timeout)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 429, in open
response = self._open(req, data)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 447, in _open
'_open', req)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 407, in _call_chain
result = func(*args)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1241, in https_open
context=self._context)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1198, in do_open
raise URLError(err)
urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:726)>