1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53#!/usr/bin/env python3 import json from hashlib import sha256 from urllib.request import Request, urlopen from urllib.parse import urlencode from os import environ def record_participation(email, project_slug): """Record participation for the specified user in the specified project This will appear to succeed, regardless of whether the user is actually a SciStarter user or not. However, in that case this API call is a no-op. It only reports an error if the request is incorrect in some way. If the email address does *not* belong to a SciStarter user, all we've received is an opaque hash value, which preserves the user's privacy; we have no way of reversing the hashing process to discover the email. The project_slug parameter should contain the textual unique identifier of the project. It is easily accesible from the project URL. In the URL https://scistarter.org/airborne-walrus-capture the slug is the string airborne-walrus-capture """ hashed = sha256(email.encode("utf8")).hexdigest() req = Request( method="POST", url="https://scistarter.org/api/participation/hashed/" + project_slug + "?key=" + environ["SCISTARTER_API_KEY"], data=urlencode( { "hashed": hashed, "type": "classification", # other options: 'collection', 'signup' "duration": 31, # Seconds the user spent participating, or an estimate } ).encode("utf8"), ) r = urlopen(req) if r.status != 200: raise Exception(r.status, r.reason) return json.loads(r.read()) if __name__ == "__main__": print(record_participation(input("Email: "), input("Project slug: ")))