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 crack(self): result = [] v = VectorTools() # 装载训练数据集 with open(os.path.join(current_dir, 'imageset.dat'), 'rb+') as f: imageset = pickle.load(f) for letter in self.handle_split_image(): guess = [] for image in imageset: for x, y in image.items(): if len(y) != 0: guess.append((v.relation(y[0], self.buildvector(letter)), x)) guess.sort(reverse=True) neighbors = guess[:10] # 距离最近的十个向量 class_votes = {} # 投票 for neighbor in neighbors: class_votes.setdefault(neighbor[-1], 0) class_votes[neighbor[-1]] += 1 sorted_votes = sorted(class_votes.items(), key=lambda x: x[1], reverse=True) result.append(sorted_votes[0][0]) return ''.join(result) def __str__(self): return self.crack() if __name__ == "__main__": r = requests.get(URL.zhengfang_captcha()) im = Image.open(BytesIO(r.content)) print(ZhengfangCaptcha(im))