from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) from datetime import datetime import time import requests from otree.settings import RECAPTCHA_PRIVATE_KEY, RECAPTCHA_PUBLIC_KEY author = 'Huanren Zhang' doc = """ Basic information and consent form """ class Constants(BaseConstants): name_in_url = 'consent' consent_template = 'consent/ConsentForm.html' players_per_group = None num_rounds = 1 wait_minutes = 1 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass # FUNCTIONS def recaptcha_valid(response_token): res = requests.post("https://www.google.com/recaptcha/api/siteverify", data={ 'secret': RECAPTCHA_PRIVATE_KEY, 'response': response_token }) return res.json()["success"] class Player(BasePlayer): consent = models.BooleanField() workerid = models.StringField() time_diff = models.FloatField(initial=0) # time difference between client and server in seconds keyword = models.StringField() # keyword received from the client -- only the hackers of the JS code can send a keyword data_received = models.IntegerField(initial=0) # on which page user data is received (0 represent not received) machine = models.StringField() browser = models.StringField() is_mobile = models.BooleanField() # agent_string = models.StringField() ip = models.StringField(blank=True) language = models.StringField(blank=True) country = models.StringField(blank=True) region = models.StringField(blank=True) locality = models.StringField(blank=True) city = models.StringField(blank=True) postcode = models.StringField(blank=True) network = models.StringField(blank=True) timeZone = models.StringField(blank=True) utcOffset = models.StringField(blank=True) latitude = models.FloatField(blank=True) longitude = models.FloatField(blank=True) hostingLikelihood = models.IntegerField(blank=True) securityThreat = models.StringField(blank=True,initial='') risk_score = models.IntegerField(initial=-1) isp = models.StringField(initial='') asn = models.StringField(initial='') as_name = models.StringField(initial='') network_type = models.StringField(initial='') is_human = models.BooleanField(initial=False) captcha = models.CharField(blank=True) suspicious = models.BooleanField(initial=False) def live_method(self, data): if data.get('client_timestamp','') != '': # time difference between client sent time and server receiving time self.time_diff = round((data['client_timestamp'] - time.time())*10)/10 ## returning time left to start from the server to the client experiment_starting_time = self.session.config.get('experiment_starting_time', '') time_to_start = 0 if experiment_starting_time != '': starting_timestamp = datetime.fromisoformat(experiment_starting_time).timestamp() time_to_start = starting_timestamp - time.time() # return {self.id_in_group: time_to_start} if data.get('word','') != '': self.keyword = data.get('word','') # print(self.keyword) if self.keyword == 'zhang': return {self.id_in_group: 'advance'} return if data.get('response_token', '') != '': if recaptcha_valid(data["response_token"]): self.captcha = data["response_token"] self.is_human = True return else: # user_agent_string = data['userAgent'] # print('received agent data for player%d'%self.participant.id_in_session) if self.data_received == 0: self.data_received = data.get('page',0) info = data.get('deviceInfo', {}) self.browser = info.get('browser') self.machine = info.get('os') self.is_mobile = info.get('isMobile') geo_data = data['geoData'] self.ip = geo_data['ip'] self.language = geo_data['language'] self.country = geo_data['country'] self.region = geo_data['region'] self.city = geo_data['city'] self.locality = geo_data['locality'] self.postcode = geo_data['postcode'] self.latitude = geo_data['latitude'] self.longitude = geo_data['longitude'] self.timeZone = geo_data['timeZone'] self.utcOffset = geo_data['utcOffset'] self.network = geo_data['network'] self.hostingLikelihood = geo_data['hostingLikelihood'] self.securityThreat = geo_data['securityThreat'] return {self.id_in_group: dict(status='ok')}