def auth_visitor_login(): login_session = requests.session() timestamp = int(time.time() * 1000) data = { "platform": 3, "deviceToken": "B5E1B1E4-BAA1-4F06-9011-A1E21A99DA79", "deviceName": "iPhone 6s", "sign": helper.get_str_md5(helper.APP_AES_KEY + "B5E1B1E4-BAA1-4F06-9011-A1E21A99DA79" + str(timestamp) + helper.APP_AES_KEY), "timestamp": timestamp } json_data = json.dumps(data) response = login_session.post(urls.auth_visitor_login, data=json_data, headers={"Content-Type": "application/json"}) if response.status_code != 200: print("uc登录异常: {}".format(response.text)) ret_json = helper.check_json_response(response) login_session.close() if int(ret_json['code']) != 200: print("uc登录异常:{}".format(ret_json)) return ret_json
def studentclasslist_app(self, version="9.0.8"): token = self.client.user_token params = { "token": token, "sign": get_str_md5(ConfigCase.APP_AES_KEY + token + ConfigCase.APP_AES_KEY) } return self.client.get(url=self.url_builder.studentmyclasslist_app, params=params, sign_mode=11, headers={"version": version})
def getclasslistofschool_app(self): now = int(time.time()) token = self.client.user_token post_data = { "now": now, "sign": get_str_md5(ConfigCase.APP_AES_KEY + str(now) + token + ConfigCase.APP_AES_KEY), "token": token } return self.client.post(url=self.url_builder.schoolandclassinfo_app, data=post_data)
def searchclasses_app(self, schoolid): now = int(time.time()) token = self.client.user_token post_data = \ { "now": now, "sign": get_str_md5(ConfigCase.APP_AES_KEY + str(now) + token + ConfigCase.APP_AES_KEY), "token": token, "payload": { "schoolid": schoolid } } return self.client.post(url=self.url_builder.searchclasses_app, data=post_data)
def app_login(username, password, sid=6, platform=2, devicetoken="", devicename=""): sign_switcher = {2: ewt_const.web_sign, 6: ewt_const.android_sign, 7: ewt_const.ios_sign} # todo: 当sid=2时,登录报错,提示密码有误 login_session = requests.session() encrypt_password = ewt_helper.encrypt_app_password(password) post_data = {"username": username, "password": encrypt_password, "sid": sid, "platform": platform, "devicetoken": devicetoken, "devicename": devicename} sign_value = sign_switcher.get(sid) post_data['sign'] = helper.get_str_md5(sign_value) post_data['timestamp'] = int(time.time() * 1000) response = login_session.post(uc_urls.app_login, data=post_data) logger.debug(response.text) ret_json = ewt_helper.check_json_response(response) if "Token" not in ret_json: logger.fatal("Login failed, response is: {}".format(response.text)) login_session.close() return ret_json['Token']
def __append_request_params(self, origin_params, sign_mode=None): sign_key = "eo^nye1j#!wt2%v)" exclude_keys = ['sid', 'osVersion', 'token'] prepared_params = {} if not origin_params: origin_params = {} # if isinstance(origin_params, str): # origin_params = eval(origin_params) prepared_params.update(origin_params) if 'sign' not in prepared_params: _content = '' _content += sign_key value_list_for_sign = [] keys = [k for k in prepared_params.keys() if k not in exclude_keys] if sign_mode == 0: return prepared_params if sign_mode == 1: # 签名时包含token,先按照key进行排序,再拼接value if 'token' in origin_params: keys.append('token') value_list_for_sign = [prepared_params[k] for k in sorted(keys)] elif sign_mode == 2: # 签名时包含token,先按照key进行排序,再按照key=value的格式拼接后进行签名 if 'token' in origin_params: keys.append('token') value_list_for_sign = ["&{}={}".format(k, prepared_params[k]) for k in sorted(keys)] elif sign_mode == 3: # 签名时包含token,不排序,按原顺序拼接value后进行签名 if 'token' in origin_params: keys.append('token') value_list_for_sign = [prepared_params[k] for k in keys] elif sign_mode == 4: # 签名时包含token,不排序,按原顺序按照key=value的格式拼接后进行签名 if 'token' in origin_params: keys.append('token') value_list_for_sign = ["&{}={}".format(k, prepared_params[k]) for k in keys] elif sign_mode == 5: # 签名时不包含token,先按照key进行排序,再拼接value value_list_for_sign = [prepared_params[k] for k in sorted(keys)] elif sign_mode == 6: # 签名时不包含token,先按照key进行排序,再按照key=value的格式拼接后进行签名 value_list_for_sign = ["&{}={}".format(k, prepared_params[k]) for k in sorted(keys)] elif sign_mode == 7: # 签名时不包含token,不排序,按原顺序拼接value后进行签名 value_list_for_sign = [prepared_params[k] for k in keys] elif sign_mode == 8: # 签名时不包含token,不排序,按原顺序按照key=value的格式拼接后进行签名 value_list_for_sign = ["&{}={}".format(k, prepared_params[k]) for k in keys] elif sign_mode == 9: # 签名时包含token和sid,先按照key进行排序,再拼接value if 'sid' in origin_params: keys.append('sid') if 'token' in origin_params: keys.append('token') value_list_for_sign = [prepared_params[k] for k in sorted(keys)] elif sign_mode == 11: # app教师端接口校验方式 # 签名时包含token、sid,先按照key进行排序,再拼接value prepared_params["token"] = self.user_token keys.append('token') if 'sid' in origin_params: keys.append('sid') value_list_for_sign = [prepared_params[k] for k in sorted(keys)] for v in value_list_for_sign: _content += str(v) if sign_mode in (2, 4, 6, 8): _content += "&" + sign_key else: _content += sign_key if sign_mode == 10: _content = sign_key + str(self.user_id) + sign_key prepared_params["sign"] = helper.get_str_md5(_content) return prepared_params
def __append_request_params( self, origin_params, sign_mode=RequestSignMode.no_token_no_sort_key_value_list): """ 补充请求参数 :param origin_params: 原始参数,即从通过用户选择传过来的参数 :param sign_mode: 加签的模式 :return: 补充完参数后的字典 """ exclude_keys = ['sid', 'osVersion', 'token'] prepared_params = {} if not origin_params: origin_params = {} prepared_params.update(origin_params) # add token to request body prepared_params["token"] = self.user_token # add sign to request body if not 'sign' in prepared_params: _content = '' # 1. 开头加key _content += sign_key # 2. 中间加参数值列表 value_list_for_sign = [] keys = [k for k in prepared_params.keys() if k not in exclude_keys] # sign_mode > 10 表示签名时要包含token if sign_mode > 10: keys.append('token') if sign_mode % 10 == 1: # 1 先按照key进行排序,再拼接value后进行签名 value_list_for_sign = [ prepared_params[k] for k in sorted(keys) ] elif sign_mode % 10 == 2: # 2 先按照key进行排序,再按照key=value的格式拼接后进行签名 value_list_for_sign = [ "&{}={}".format(k, prepared_params[k]) for k in sorted(keys) ] elif sign_mode % 10 == 3: # 3 不排序,按原顺序拼接value后进行签名 value_list_for_sign = [prepared_params[k] for k in keys] elif sign_mode % 10 == 4: # 4 不排序,按原顺序,按照key=value的格式拼接后进行签名 value_list_for_sign = [ "&{}={}".format(k, prepared_params[k]) for k in keys ] for v in value_list_for_sign: _content += str(v) # 3. 结尾加上key if sign_mode % 2 == 0: _content += "&" + sign_key else: _content += sign_key # 4. 获取md5签名 prepared_params["sign"] = helper.get_str_md5(_content) # add sid in request body if not 'sid' in prepared_params: prepared_params['sid'] = self.sid # add sid in request body if not 'osVersion' in prepared_params: prepared_params['osVersion'] = self.os_version return prepared_params