import argparse import json from urllib import request, parse parser = argparse.ArgumentParser(description="Get user IDs by emails.") parser.add_argument("-token", type=str, help="Auth0 M2M token") parser.add_argument("-client_id", type=str, help="Auth0 M2M client ID", required=True) parser.add_argument("-client_secret", type=str, help="Auth0 M2M client secret", required=True) parser.add_argument("-domain", type=str, help="Auth0 domain", required=True) parser.add_argument("-filename", type=str, default="./emails.txt") parser.add_argument("-emails", nargs='+', help="Email list") args = parser.parse_args() emails = args.emails token = args.token if not emails: with open(args.filename) as f: emails = f.readlines() def make_request(url: str, data: dict = None, headers: dict = None) -> dict or list: if data: data = parse.urlencode(data).encode() req = request.Request(url, **{**({"data": data} if data else {}), **({"headers": headers} if headers else {})}) with request.urlopen(req) as resp: content = resp.read() return json.loads(content.decode()) if not token: token = make_request("https://{}/oauth/token".format(args.domain), data={ "client_id": args.client_id, "client_secret": args.client_secret, "audience": "https://{}/api/v2/".format(args.domain), "grant_type": "client_credentials", })["access_token"] print("Token:", token) def get_user_id(email: str): # https://auth0.com/docs/users/user-search/retrieve-users-with-get-users-endpoint data = make_request("https://{}/api/v2/users?q=email%3A{}&search_engine=v3".format(args.domain, email), headers={ "authorization": f"Bearer {token}" }) if data: return data[0]["user_id"] missing = [] mapping = {} for item in emails: item = item.strip() if not item: continue user_id = get_user_id(item) if not user_id: user_id = get_user_id(f"{item.split('@')[0]}*") if not user_id: missing.append(item) else: mapping[item] = user_id if missing: print("Missing:", missing) print("Mapping:", mapping) print("IDs:", ",".join(mapping.values()))