def _check_login_params(self, params): assert params is not None, '缺少参数' assert 'other' in params, '请选择登录方式' if params["other"] == "1": assert 'bh1' in params, '缺少客户号' assert 'mm1' in params, '缺少密码' elif params["other"] == "3": assert 'bh3' in params, '缺少用户名' assert 'mm3' in params, '缺少密码' elif params["other"] == "4": assert 'bh4' in params, '缺少市民邮箱' assert 'mm4' in params, '缺少密码' assert 'vc' in params, '缺少验证码' # other check if params["other"] == "1": 用户名 = params['bh1'] elif params["other"] == "3": 用户名 = params['bh3'] elif params["other"] == "4": 用户名 = params['bh4'] if params["other"] == "1": 密码 = params['mm1'] elif params["other"] == "3": 密码 = params['mm3'] elif params["other"] == "4": 密码 = params['mm4'] if len(密码) < 4: raise InvalidParamsError('用户名或密码错误') if len(用户名) < 5: raise InvalidParamsError('登陆名错误') if '@' in 用户名: if not 用户名.endswith('@hz.cn'): raise InvalidParamsError('市民邮箱错误') return
def _unit_login(self, params=None): err_msg = None params if not self.is_start or params: # 非开始或者开始就提供了参数 try: self._check_login_params(params) id_num = params['身份证号'] #account_num = params['account_num'] password=params['密码'] vc = params['vc'] resp=self.s.post(LOGINONE_URL,data=dict( aac147=id_num )) soup = BeautifulSoup(resp.content, 'html.parser') if len(soup.text)>0: raise InvalidParamsError(soup.text) else: m = hashlib.md5() m.update(password.encode(encoding='utf-8')) hashpsw=m.hexdigest() resp = self.s.post(LOGIN_URL,data = dict( method='login', domainId='1', groupid='-95', checkCode=vc, loginName18=id_num, loginName=id_num, password=hashpsw, kc02flag='' )) if resp.url==PASS_URl: raise InvalidParamsError('请登录官网修改密码 !说明:1、为保证信息安全,密码不能为个人编号。2、密码长度需大于6位小于18位。') elif resp.url==MB_URL: raise InvalidParamsError('请登录官网修改密保 !说明:注:1、请设置密保问题,密保问题不要随意泄露。2、密保问题作为找回密码的依据,请妥善保存。') else: soup = BeautifulSoup(resp.content, 'html.parser') if soup.select('.text3'): return_message=soup.select('.text3')[0].text raise InvalidParamsError(return_message) else: print("登录成功!") self.result_key = id_num self.result_meta['身份证号'] = id_num self.result_meta['密码'] = password self.result_identity['task_name'] = '青岛' self.result_identity['target_id'] = id_num return except (AssertionError, InvalidParamsError) as e: err_msg = str(e) vc = self._new_vc() raise AskForParamsError([ dict(key='身份证号', name='身份证号', cls='input', value=params.get('身份证号', '')), dict(key='密码', name='密码', cls='input:password', value=params.get('密码', '')), dict(key='vc', name='验证码', cls='data:image', query={'t': 'vc'}, value=params.get('vc', '')), ], err_msg)
def _check_login_params(self, params): assert params is not None, '缺少参数' assert '身份证号' in params, '缺少身份证号' assert '密码' in params, '缺少密码' # other check 身份证号 = params['身份证号'] 密码 = params['密码'] if len(密码) < 4: raise InvalidParamsError('登陆名或密码错误') if len(身份证号) < 15: raise InvalidParamsError('身份证号错误')
def _check_login_params(self, params): assert params is not None, '缺少参数' assert '账号' in params, '缺少账号' assert '密码' in params, '缺少密码' # other check 账号 = params['账号'] 密码 = params['密码'] if len(密码) < 4: raise InvalidParamsError('账号或密码错误') if len(账号) < 15: raise InvalidParamsError('账号或密码错误')
def _check_login_params(self, params): assert params is not None, '缺少参数' assert '用户名' in params, '缺少用户名' assert '密码' in params, '缺少密码' # other check 用户名 = params['用户名'] 密码 = params['密码'] if len(密码) < 4: raise InvalidParamsError('用户名或密码错误') if len(用户名) < 5: raise InvalidParamsError('用户名错误')
def _check_login_params(self, params): assert params is not None, '缺少参数' assert '用户名' in params, '缺少证件号码' assert '个人账号' in params, '个人账号' # other check 证件号码 = params['证件号码'] 个人账号 = params['个人账号'] if len(个人账号) != 8: raise InvalidParamsError('个人账号') if len(证件号码) < 15: raise InvalidParamsError('证件号码错误')
def _unit_login(self, params=None): err_msg = None if not self.is_start or params: # 非开始或者开始就提供了参数 try: self._check_login_params(params) id_num = params['身份证号'] account_num = params['个人账号'] password = params['密码'] vc = params['vc'] resp = self.s.post(LOGIN_URL, data=dict(dispatch='fund_search', return_message='', id_card=id_num, id_account=account_num, searchpwd=password, validcode=vc), verify=False, timeout=30) soup = BeautifulSoup(resp.content, 'html.parser') return_message = soup.find('input', {'name': 'return_message'}) if return_message: return_message = soup.find( 'input', {'name': 'return_message'})["value"] if return_message: raise InvalidParamsError(return_message) else: print("登录成功!") self.html = str(resp.content, 'gbk') else: return_message = '您输入的信息不符合要求,请到公积金管理中心确认' raise InvalidParamsError(return_message) self.result_key = id_num self.result_meta['身份证号'] = id_num self.result_meta['个人账号'] = account_num self.result_meta['密码'] = password self.result_identity['task_name'] = '哈尔滨' self.result_identity['target_id'] = id_num return except (AssertionError, InvalidParamsError) as e: err_msg = str(e) vc = self._new_vc() raise AskForParamsError([ dict(key='身份证号', name='身份证号', cls='input'), dict(key='个人账号', name='个人账号', cls='input'), dict(key='密码', name='密码', cls='input:password'), dict(key='vc', name='验证码', cls='data:image', query={'t': 'vc'}), ], err_msg)
def _check_login_params(self, params): assert params is not None, '缺少参数' assert '身份证号' in params, '缺少身份证号' assert '登录密码' in params, '缺少登录密码' # other check 身份证号 = params['身份证号'] 登录密码 = params['登录密码'] if len(身份证号) <9 or len(身份证号)>19: raise InvalidParamsError('身份证号或个人公积金帐号或黄山卡号错误') if len(登录密码) < 6: raise InvalidParamsError('登录密码错误')
def _check_login_params(self, params): assert params is not None, '缺少参数' assert '登陆名' in params, '缺少账号' assert '密码' in params, '缺少密码' # other check 登陆名 = params['登陆名'] 密码 = params['密码'] if len(密码) < 4: raise InvalidParamsError('登陆名或密码错误') if 登陆名.isdigit(): if len(登陆名) < 5: raise InvalidParamsError('登陆名错误') return raise InvalidParamsError('登陆名或密码错误')
def _check_login_params(self, params): assert params is not None, '缺少参数' assert '身份证号' in params, '缺少公积金账号' assert '密码' in params, '缺少密码' # other check 身份证号 = params['身份证号'] 密码 = params['密码'] if len(密码) < 4: raise InvalidParamsError('身份证号或密码错误') if 身份证号.isdigit(): if len(身份证号) < 18: raise InvalidParamsError('身份证号错误') return raise InvalidParamsError('身份证号或密码错误')
def _check_login_params(self, params): assert params is not None, '缺少参数' assert '账号' in params, '缺少账号' assert '密码' in params, '缺少密码' # other check 账号 = params['账号'] 密码 = params['密码'] if len(密码) < 4: raise InvalidParamsError('账号或密码错误') if 账号.isdigit(): if len(账号) < 11: raise InvalidParamsError('手机号或身份证错误') return raise InvalidParamsError('账号或密码错误')
def _check_login_params(self, params): assert params is not None, '缺少参数' assert '账号' in params, '缺少账号' assert '密码' in params, '缺少密码' # other check 账号 = params['账号'] 密码 = params['密码'] if len(账号) == 0: raise InvalidParamsError('账号为空,请输入账号') if len(密码) == 0: raise InvalidParamsError('密码为空,请输入密码!') elif len(密码) < 6: raise InvalidParamsError('密码不正确,请重新输入!')
def _do_login(self, username, password, vc): """使用web driver模拟登录过程""" with self.dsc.get_driver_ctx() as driver: # 打开登录页 driver.get(LOGIN_URL) time.sleep(10) driver.get("http://www.12333sh.gov.cn/sbsjb/wzb/229.jsp") username_input = driver.find_element_by_xpath('//*[@id="userid"]') password_input = driver.find_element_by_xpath('//*[@id="userpw"]') vc_input = driver.find_element_by_xpath('//*[@id="userjym"]') # 用户名 username_input.clear() username_input.send_keys(username) # 密码 password_input.clear() password_input.send_keys(password) # 验证码 vc_input.clear() vc_input.send_keys(vc) # 登录 # driver.find_element_by_xpath('//*[@id="ckRecId20"]/form/table[1]/tbody/tr[7]/td[2]/img').click() # /html/body/form/table/tbody/tr[6]/td[2] driver.execute_script('checkForm()') time.sleep(10) if driver.current_url != "http://www.12333sh.gov.cn/sbsjb/wzb/helpinfo.jsp?id=0": raise InvalidParamsError('登录失败,请重新登录!')
def _loadJs(self): import execjs resps = self.s.get("http://gzlss.hrssgz.gov.cn/cas/login") modlus = BeautifulSoup(resps.content).findAll('script')[2].text.split( '=')[3].split(';')[0].replace('"', '') jsstrs = self.s.get( "http://gzlss.hrssgz.gov.cn/cas/third/jquery-1.5.2.min.js") jsstr = self.s.get("http://gzlss.hrssgz.gov.cn/cas/third/security.js") ctx = execjs.compile(jsstr.text + jsstrs.text) key = ctx.call("RSAUtils.getKeyPair", '010001', '', modlus) resp = self.s.get("http://gzlss.hrssgz.gov.cn/cas/login") lt = BeautifulSoup(resp.content, 'html.parser').find('input', {'name': 'lt'})['value'] datas = { 'usertype': "2", 'lt': lt, # 'username': params.get('账号'), # 'password': params.get('密码'), '_eventId': 'submit' } resps = self.s.post( "http://gzlss.hrssgz.gov.cn/cas/login?service=http://gzlss.hrssgz.gov.cn:80/gzlss_web/business/tomain/main.xhtml", datas) raise InvalidParamsError(resps.text)
def _unit_login(self, params=None): err_msg = None if params: # 非开始或者开始就提供了参数 try: self._check_login_params(params) id_num = params['id_num'] account_num = params['account_num'] vc = params['vc'] resp = self.s.post(LOGIN_URL, data=dict( sfzh=id_num, grbh=account_num, yzcode=vc )) data = resp.json() errormsg = data.get('errormsg') if errormsg: raise InvalidParamsError(errormsg) self.result['key'] = id_num self.result['meta'] = { 'id_num': id_num, 'account_num': account_num } return except (AssertionError, InvalidParamsError) as e: err_msg = str(e) raise AskForParamsError([ dict(key='id_num', name='身份证号', cls='input'), dict(key='account_num', name='个人编号', cls='input'), dict(key='vc', name='验证码', cls='data:image', query={'t': 'vc'}), ], err_msg)
def _do_login(self, username, password, vc): """使用web driver模拟登录过程""" with self.dsc.get_driver_ctx(excepted_exceptions=(InvalidParamsError,)) as driver: # 选择身份证号方式登录 driver.find_element_by_xpath('/html/body/table[2]/tbody/tr[3]/td/table/tbody/tr/td/div/form/div[1]/ul/li[3]/a').click() username_input = driver.find_element_by_xpath('//*[@id="bh1"]') password_input = driver.find_element_by_xpath('//*[@id="mm1"]') vc_input = driver.find_element_by_xpath('//*[@id="login_tab_2"]/div/div[3]/input') submit_btn = driver.find_element_by_xpath('//*[@id="login_tab_2"]/div/div[4]/input[1]') # 用户名 username_input.clear() username_input.send_keys(username) # 密码 password_input.clear() password_input.send_keys(password) vc_input.clear() vc_input.send_keys(vc) # 提交 submit_btn.click() if not driver.current_url == 'http://www.bjgjj.gov.cn/wsyw/wscx/gjjcx-choice.jsp': raise InvalidParamsError('登录失败,请检查输入') # 登录成功 # 同步cookie到session self.dsc.create_session() self.dsc.inc_and_sync_d_cookies() # 保存登录后的页面内容供抓取单元解析使用 self.g.login_page_html = driver.find_element_by_tag_name('html').get_attribute('innerHTML') self.g.current_url = driver.current_url
def _do_login(self, username, password, vc): """使用web driver模拟登录过程""" with self.dsc.get_driver_ctx() as driver: # 打开登录页 driver.get("https://gr.cdhrss.gov.cn:442/cdwsjb/login.jsp") username_input = driver.find_element_by_xpath( '//*[@id="c_username"]') js = 'document.getElementById("c_password").style.display="inline-block";' driver.execute_script(js) password_input = driver.find_element_by_xpath( '//*[@id="c_password"]') vc_input = driver.find_element_by_xpath('//*[@id="checkCode"]') # 用户名 username_input.clear() username_input.send_keys(username) # 密码 password_input.clear() password_input.send_keys(password) # 验证码 vc_input.clear() vc_input.send_keys(vc) # 登录 driver.find_element_by_xpath( '//*[@id="loginbox"]/div[5]/div[1]/input').click() time.sleep(5) if driver.current_url.startswith( 'https://gr.cdhrss.gov.cn:442/cdwsjb/login.jsp'): raise InvalidParamsError('登录失败,请重新登录!')
def _unit_login(self, params=None): err_msg = None if params: # 非开始或者开始就提供了参数 try: self._check_login_params(params) sfzh = params['sfzh'] password = base64.b64encode(params['password'].encode(encoding="utf-8")) vc = params['vc'] resp = self.s.post(LOGIN_URL, data=dict( sfzh=sfzh, password=password, validateCode=vc )) data = resp.json() errormsg = data.get('message') if data.get('code') == '0': raise InvalidParamsError(errormsg) self.result_key = sfzh self.result_meta.update({ '身份证编号': sfzh, '密码': params['password'] }) return except (AssertionError, InvalidParamsError) as e: err_msg = str(e) raise AskForParamsError([ dict(key='sfzh', name='身份证号', cls='input', value=params.get('sfzh', '')), dict(key='password', name='密码', cls='input:password', value=params.get('password', '')), dict(key='vc', name='验证码', cls='data:image', query={'t': 'vc'}, value=params.get('vc', '')), ], err_msg)
def _unit_login(self, params: dict): err_msg = None if params: try: self._check_login_params(params) id_num = params['身份证号'] password = params['密码'] m = hashlib.md5() m.update(str(password).encode(encoding="utf-8")) pw = m.hexdigest() vc = params['vc'] respvc = self.s.post( 'http://218.28.166.74:8080/zzsbonline/companyAction!getRandCode', data=dict(code=vc)) vctext = BeautifulSoup(respvc.content, 'html.parser') if vctext.text == '0': resp = self.s.post(LOGIN_URL, data=dict(cardid=id_num, password=pw, vcode=vc)) soup = BeautifulSoup(resp.content, 'html.parser') msg = json.loads(soup.text) err_msg = msg['msgbox'] if err_msg == '用户成功登录': err_msg = '' else: err_msg = '验证码错误!' if err_msg: raise InvalidParamsError(err_msg) else: print("登录成功!") self.result_key = params.get('身份证号') # 保存到meta self.result_meta['身份证号'] = params.get('身份证号') self.result_meta['密码'] = params.get('密码') self.result_identity['task_name'] = '郑州' self.result_identity['target_id'] = id_num return except (AssertionError, InvalidParamsError) as e: err_msg = str(e) vc = self._new_vc() raise AskForParamsError([ dict(key='身份证号', name='身份证号', cls='input', placeholder='身份证号', value=params.get('身份证号', '')), dict(key='密码', name='密码', cls='input:password', value=params.get('密码', '')), dict(key='vc', name='验证码', cls='data:image', query={'t': 'vc'}, value=params.get('vc', '')), ], err_msg)
def _unit_login(self, params=None): err_msg = None params if not self.is_start or params: # 非开始或者开始就提供了参数 try: self._check_login_params(params) id_num = params['用户名'] password = params['密码'] vc = params['vc'] # self._do_login(id_num, password, vc) m = hashlib.md5() m.update(password.encode(encoding='utf-8')) hashpsw = m.hexdigest() data = { 'password_md5': hashpsw, 'username': id_num, 'password': password, 'imagecode': vc, 'ID': '0', 'SUBMIT.x': '35', 'SUBMIT.y': '8' } resp = self.s.post(LOGIN_URL, data=data, headers={ 'Content-Type': 'application/x-www-form-urlencoded', 'Cache-Control': 'max-age=0', 'Upgrade-Insecure-Requests': '1' }, timeout=20) soup = BeautifulSoup(resp.content.decode('gbk'), 'html.parser') errormsg = soup.findAll('font')[0].text # if errormsg and errormsg != id_num: # raise InvalidParamsError(errormsg) if errormsg == id_num: self.g.soup = soup else: raise InvalidParamsError(errormsg) self.result_key = id_num self.result_meta['用户名'] = id_num self.result_meta['密码'] = password self.result_identity['task_name'] = '上海' self.result_identity['target_id'] = id_num return except (AssertionError, InvalidParamsError) as e: err_msg = str(e) vc = self._new_vc() raise AskForParamsError([ dict(key='用户名', name='用户名', cls='input'), dict(key='密码', name='密码', cls='input:password'), dict(key='vc', name='验证码', cls='data:image', query={'t': 'vc'}), ], err_msg)
def _check_login_params(self, params): assert params is not None, '缺少参数' assert '用户名' in params, '缺少用户名' assert '密码' in params, '缺少密码' # other check 用户名 = params['用户名'] 密码 = params['密码'] if len(用户名) == 0: raise InvalidParamsError('用户名为空,请输入用户名') elif len(用户名) < 15: raise InvalidParamsError('用户名不正确,请重新输入') if len(密码) == 0: raise InvalidParamsError('密码为空,请输入密码!') elif len(密码) < 6: raise InvalidParamsError('密码不正确,请重新输入!')
def _check_login_params(self, params): assert params is not None, '缺少参数' assert '姓名' in params, '缺少姓名' assert '身份证号' in params, '缺少身份证号' assert '密码' in params, '缺少密码' # other check 姓名 = params['姓名'] 身份证号 = params['身份证号'] 密码 = params['密码'] if len(姓名) <= 1: raise InvalidParamsError('请输入姓名') if len(身份证号) < 15 or len(身份证号) > 18: raise InvalidParamsError('身份证输入有误') if len(密码) < 6: raise InvalidParamsError('密码输入有误')
def _check_login_params(self, params): assert params is not None, '缺少参数' assert '身份证号' in params, '缺少身份证号' assert '密码' in params, '缺少密码' # other check 身份证号 = params['身份证号'] 密码 = params['密码'] if len(身份证号) == 0: raise InvalidParamsError('身份证号为空,请输入身份证号') elif len(身份证号) < 15: raise InvalidParamsError('身份证号不正确,请重新输入') if len(密码) == 0: raise InvalidParamsError('密码为空,请输入密码!') elif len(密码) < 6: raise InvalidParamsError('密码不正确,请重新输入!')
def _check_login_params(self, params): assert params is not None, '缺少参数' assert '社保号' in params, '缺少社保号' assert '密码' in params, '缺少密码' # other check 证件号 = params['社保号'] 密码 = params['密码'] if len(证件号) == 0: raise InvalidParamsError('社保号为空,请输入社保号!') elif len(证件号) != 15 and len(证件号) != 18: raise InvalidParamsError('社保号不正确,请重新输入!') if len(密码) == 0: raise InvalidParamsError('密码为空,请输入密码!') elif len(密码) < 6: raise InvalidParamsError('密码不正确,请重新输入!')
def _check_login_params(self, params): assert params is not None, '缺少参数' assert '证件号码' in params, '缺少证件号码' assert '密码' in params, '缺少密码' # other check 证件号码 = params['证件号码'] 密码 = params['密码'] if len(证件号码) == 0: raise InvalidParamsError('证件号码为空,请输入证件号码') elif len(证件号码) < 15: raise InvalidParamsError('证件号码不正确,请重新输入') if len(密码) == 0: raise InvalidParamsError('密码为空,请输入密码!') elif len(密码) < 6: raise InvalidParamsError('密码不正确,请重新输入!')
def _unit_login(self, params=None): err_msg = None if params: # 非开始或者开始就提供了参数 try: self._check_login_params(params) id_num = params['身份证号'] account_num = params['个人编号'] vc = params['vc'] if account_num.__len__() != 10: raise InvalidParamsError("请录入10位个人编号") resp = self.s.post(LOGIN_URL, data=dict(sfzh=id_num, grbh=account_num, yzcode=vc)) data = resp.json() errormsg = data.get('errormsg') if errormsg: raise InvalidParamsError(errormsg) self.result_key = id_num # 保存到meta self.result_meta['身份证号'] = id_num self.result_meta['个人编号'] = account_num self.result_identity['task_name'] = '苏州' self.result_identity['target_id'] = id_num return except (AssertionError, InvalidParamsError) as e: err_msg = str(e) raise AskForParamsError([ dict(key='身份证号', name='身份证号', cls='input', value=params.get('身份证号', '')), dict(key='个人编号', name='个人编号', cls='input', value=params.get('个人编号', '')), dict(key='vc', name='验证码', cls='data:image', query={'t': 'vc'}) ], err_msg)
def _check_login_params(self, params): assert params is not None, '缺少参数' assert '身份证号' in params, '缺少身份证号' assert '个人编号' in params, '缺少个人编号' assert 'vc' in params, '缺少验证码' # other check 身份证号 = params['身份证号'] 个人编号 = params['个人编号'] if len(身份证号) == 0: raise InvalidParamsError('身份证号为空,请输入身份证号') elif len(身份证号) < 15: raise InvalidParamsError('身份证号不正确,请重新输入') if len(个人编号) == 0: raise InvalidParamsError('个人编号为空,请输入个人编号!') elif len(个人编号) < 6: raise InvalidParamsError('个人编号不正确,请重新输入!')
def _check_login_params(self, params): assert params is not None, '缺少参数' assert '姓名' in params, '缺少姓名' assert '账号' in params, '缺少账号' assert '密码' in params, '缺少密码' # other check 姓名 = params['姓名'] 账号 = params['账号'] 密码 = params['密码'] if len(姓名) > 1: raise InvalidParamsError('姓名错误') if len(密码) < 4: raise InvalidParamsError('用户名或密码错误') if len(账号) > 14: raise InvalidParamsError('账号错误') return raise InvalidParamsError('账号或密码错误')
def _do_login(self, username, password, vc): """使用web driver模拟登录过程""" with self.dsc.get_driver_ctx() as driver: # 打开登录页 driver.get(LOGIN_PAGE_URL) # 等待lk请求 WebDriverWait(driver, 10).until( value_is_number((By.XPATH, '//*[@id="lk"]'))) for l in driver.get_log('browser'): print(l) # 选择身份证号方式登录 driver.find_element_by_xpath( '/html/body/table[2]/tbody/tr[3]/td/table/tbody/tr/td/div/form/div[1]/ul/li[3]/a' ).click() username_input = driver.find_element_by_xpath('//*[@id="bh1"]') password_input = driver.find_element_by_xpath('//*[@id="mm1"]') vc_input = driver.find_element_by_xpath( '//*[@id="login_tab_2"]/div/div[3]/input') submit_btn = driver.find_element_by_xpath( '//*[@id="login_tab_2"]/div/div[4]/input[1]') # 用户名 username_input.clear() username_input.send_keys(username) # 密码 password_input.clear() password_input.send_keys(password) vc_input.clear() vc_input.send_keys(vc) # 提交 submit_btn.click() if not driver.current_url == 'http://www.bjgjj.gov.cn/wsyw/wscx/gjjcx-choice.jsp': # FIXME: debug for l in driver.get_log('browser'): print(l) print(driver.get_cookies()) # FIXME: 尝试处理alert err_msg = '登录失败,请检查输入' alert = driver.switch_to.alert try: err_msg = alert.text # alert.accept() finally: raise InvalidParamsError(err_msg) # 登录成功 # 保存登录后的页面内容供抓取单元解析使用 self.g.login_page_html = driver.find_element_by_tag_name( 'html').get_attribute('innerHTML') self.g.current_url = driver.current_url
def _check_login_params(self, params): assert params is not None, '缺少参数' assert '账号' in params, '缺少账号' assert '密码' in params, '缺少密码' # other check 账号 = params['账号'] 密码 = params['密码'] if len(密码) < 4: raise InvalidParamsError('账号或密码错误') if 账号.isdigit(): if len(账号) < 15: raise InvalidParamsError('身份证错误') return if '@' in 账号: if not 账号.endswith('@hz.cn'): raise InvalidParamsError('市民邮箱错误') return raise InvalidParamsError('账号或密码错误')