def login(self, account, password): """ 登录教务系统 jwxt.njupt.edu.cn :param account: 南邮学号 :param password: 密码 :return: {'code': 1, "msg": "登录失败"} 或 {'code': 0, 'msg': '登录成功'} """ captcha_code = ZhengfangCaptcha(self.get_image( URL.zhengfang_captcha())).crack() data = { "__VIEWSTATE": self._get_viewstate(URL.zhengfang_login()), 'txtUserName': account, 'TextBox2': password, 'RadioButtonList1': "%D1%A7%C9%FA", "txtSecretCode": captcha_code, "Button1": "", "hidPdrs": "", "hidsc": "" } result = self._login_execute(url=URL.zhengfang_login(), data=data) if result['code'] == 2: # 如果验证码错误,尝试递归重复登录 return self.login(account, password) result['success'] = not result['code'] if result['success']: self.verify = True else: raise AuthenticationException(result['msg']) return result
def _get_captcha(self, url=URL.jwxt_captcha()): r = self.get(url) im = Image.open(BytesIO(r.content)) if url == URL.aolan_captcha(): return str(AolanCaptcha(im)) if url == URL.jwxt_captcha(): return str(ZhengfangCaptcha(im))
def spilt2chars(): """ 分割已有的数据为字符并保存 """ try: shutil.rmtree('captcha_chars') except: pass os.mkdir("captcha_chars") values = "abcdefghijklmnopqrstuvwxyz1234567890" for value in values: os.mkdir('captcha_chars/{}'.format(value)) file_names = os.listdir('captchas') for file_name in file_names: # if not os.path.isdir(file_name) and file_name != '.DS_Store': values = file_name[:4] im = Image.open('captchas/{}'.format(file_name)) captcha = ZhengfangCaptcha(im) for im_part, value in zip(captcha.handle_split_image(), values): m = hashlib.md5() m.update("{}{}".format(time.time(), value).encode('utf8')) im_part.save("captcha_chars/{}/{}.png".format(value, m.hexdigest()))
def login(self, account, password): # FIXME: 登录不可靠 captcha_code = ZhengfangCaptcha(self.get_image(self.URLs.CAPTCHA)).crack() data = { "__VIEWSTATE": self._get_viewstate(self.URLs.LOGIN), 'txtUserName': account, 'TextBox2': password, 'RadioButtonList1': "%D1%A7%C9%FA", "txtSecretCode": captcha_code, "Button1": "", "hidPdrs": "", "hidsc": "" } result = self._login_execute(url=self.URLs.LOGIN, data=data) if result['code'] == 2: # 如果验证码错误,尝试递归重复登录 return self.login(account, password) result['success'] = not result['code'] if result['success']: self.verify = True else: raise AuthenticationException(result['msg']) return result
def login_by_username(self): captcha_code = ZhengfangCaptcha(self.s.get_image( self.URLs.CAPTCHA)).crack() data = { "__VIEWSTATE": self.s._get_viewstate(self.URLs.USERNAME_LOGIN), 'txtUserName': self.username, 'TextBox2': self.password, 'RadioButtonList1': "%D1%A7%C9%FA", "txtSecretCode": captcha_code, "Button1": "", "hidPdrs": "", "hidsc": "" } r = self.s.post(url=self.URLs.USERNAME_LOGIN, data=data) if r.ok: if "请到信息维护中完善个人联系方式" in r.text: self.verified = True return {'success': True, 'msg': '登录成功'} elif "密码错误" in r.text: raise AuthenticationException('密码错误') elif "验证码不正确" in r.text: return self.login_by_username() else: raise AuthenticationException('未知错误')
os.mkdir('captcha_chars/{}'.format(value)) file_names = os.listdir('captchas') for file_name in file_names: # if not os.path.isdir(file_name) and file_name != '.DS_Store': values = file_name[:4] im = Image.open('captchas/{}'.format(file_name)) captcha = ZhengfangCaptcha(im) for im_part, value in zip(captcha.handle_split_image(), values): m = hashlib.md5() m.update("{}{}".format(time.time(), value).encode('utf8')) im_part.save("captcha_chars/{}/{}.png".format(value, m.hexdigest())) if __name__ == "__main__": # spilt2chars() letters = list('qwertyuiopasdfghjklzcxvbnm1234567890') # 将图像数据转为向量数据并保存 imageset = [] for letter in letters: try: for img in os.listdir('captcha_chars/{}/'.format(letter)): if img != "Thumbs.db" and img != ".DS_Store": vector = ZhengfangCaptcha.buildvector(Image.open("captcha_chars/{}/{}".format(letter, img))) imageset.append({letter: vector}) except FileNotFoundError as e: pass with open('image_data.json', 'w') as f: json.dump(imageset, f)