def login(self): # 登录vpn super(JWC, self).login() idcode_url = "https://vpn.btbu.edu.cn/,DanaInfo=jwgl.btbu.edu.cn+verifycode.servlet" login_url = 'https://vpn.btbu.edu.cn/,DanaInfo=jwgl.btbu.edu.cn+Logon.do' idcode = get_idcode(idcode_url, cookies=self.s.cookies) login_data = {"method": "logon", "USERNAME": self.id, "PASSWORD": self.pwd, "RANDOMCODE": idcode} r = self.s.post(login_url, data=login_data) if re.search("http://jwgl.btbu.edu.cn/framework/main.jsp", r.text) or re.search( "http://10.0.40.192/jsxsjz/framework/main.jsp", r.text): # 登陆成功之后必须先访问这个网站,拿到权限 r = self.s.post(login_url, data={'method': 'logonBySSO'}) if r.status_code == 200: return self.s.cookies else: result = re.findall('''<span id="errorinfo">(.*)</span>''', r.text) if result: error_msg = result[0] logger.warning(error_msg) raise Exception("error: %s" % error_msg) else: logger.error("error: 未知的异常") logger.error(r.text) raise Exception("error: 未知的异常")
def login(self): # 登录vpn super(JWC, self).login() idcode_url = "https://vpn.btbu.edu.cn/,DanaInfo=jwgl.btbu.edu.cn+verifycode.servlet" login_url = 'https://vpn.btbu.edu.cn/,DanaInfo=jwgl.btbu.edu.cn+Logon.do' idcode = get_idcode(idcode_url, cookies=self.s.cookies) login_data = {"method": "logon", "USERNAME": self.id, "PASSWORD": self.pwd, "RANDOMCODE": idcode} r = self.s.post(login_url, data=login_data) if re.search("http://jwgl.btbu.edu.cn/framework/main.jsp", r.text) or re.search( "http://10.0.40.192/jsxsjz/framework/main.jsp", r.text): # 登陆成功之后必须先访问这个网站,拿到权限 r = self.s.post(login_url, data={'method': 'logonBySSO'}) if r.status_code == 200: return self.s.cookies else: raise BaseException(JWC_EXCEPTION.PASSWORD_ERROR) else: result = re.findall('''<span id="errorinfo">(.*)</span>''', r.text) if result: error_msg = result[0] raise BaseException(JWC_EXCEPTION.ERROR, error_msg) else: logger.error(r.text) raise BaseException(JWC_EXCEPTION.UNKNOW_ERROR)
def traffic(self, id, name, radio=2): # 先要授权 url = 'https://vpn.btbu.edu.cn/dana/home/invalidsslsite_confirm.cgi' result = self.s.post(url) match = re.search(r"""<input id="xsauth_400" type="hidden" name="xsauth" value="(.*?)">""", result.text) xsauth = match.groups()[0] data = 'xsauth={}&url=%2F%2CDanaInfo%3Dself.btbu.edu.cn%2CSSL%252B&certHost=self.btbu.edu.cn&certPort=443&certDigest=048ef3a83ef7af63e9651ba47b2ff39e&errorCount=1¬After=1450339235&action=%E7%BB%A7%E7%BB%AD'.format( xsauth) self.s.post(url, data) url = 'https://vpn.btbu.edu.cn/,DanaInfo=self.btbu.edu.cn,SSL+chaxjg.php' data = {'UserAccount': id, 'UserName': requests.utils.quote(name.encode('gbk')), 'radio': radio, 'button': requests.utils.quote(u'查询'.encode('gbk')),} data_str = "" for k, v in data.items(): data_str += "{}={}&".format(k, v) headers = {'Content-Type': 'application/x-www-form-urlencoded',} result = self.s.post(url, headers=headers, data=data_str) html = result.text.encode('latin1').decode('gbk') # 解析 soup = BeautifulSoup(html, 'html.parser') print(html) logger.debug(html) logger.error(html) u2t = [soup.find_all('strong')[-1].parent.parent.parent.parent.text.strip().split('\n')[i] for i in [-2, 3]] return u2t
def get(): all = (("", 1), ("http://202.106.16.36:3128", 0),) ip = random.choice([k for k, v in all for i in range(v)]) p = dict(https=ip, http=ip) try: requests.get("http://www.baidu.com", timeout=1, proxies=p) except requests.exceptions.Timeout as e: logger.error("proxies not use able: %s" % ip) return {'https': ''} return p
def get_timetable(self, time): # get significant # timetable_url = "https://vpn.btbu.edu.cn/jsxsjz/,DanaInfo=10.0.40.192,Port=80+tkglAction.do" timetable_url = "https://vpn.btbu.edu.cn/,DanaInfo=jwgl.btbu.edu.cn+tkglAction.do" params = "?method=kbxxXs" r = self.s.get(timetable_url + params) g = re.findall("""<input.*"xs0101id".*value ?= ?"(.*)".*/>""", r.text) if len(g) < 1: logger.error('get_timetable,拿不到操作码') return "登录已失效" signid = g[0] logger.info(signid) params = "?method=goListKbByXs&istsxx=no&xnxqh=" + time + "&zc=&xs0101id=" + signid r = self.s.get(timetable_url + params) return self.__parse_timetable(r.content)
def get(): (ip, port), name = get_proxy() if ip is None or port is None: return dict(https='', http='') ip, port = ip.decode(), port.decode() url = 'http://{0}:{1}'.format(ip, port) p = dict(https=url, http=url) try: requests.get("https://www.baidu.com", timeout=1, proxies=p) good_proxy(name) except: logger.error("proxies not use able: %s" % ip) rm_proxy(name) return dict(https='', http='') return p
def login(self): login_url = "https://vpn.btbu.edu.cn/dana-na/auth/url_default/login.cgi" login_data = {'tz_offset': '480', 'username': self.id, 'password': self.internet_pwd, 'realm': '教师', 'btnSubmit': '登陆'} # 必须设置超时时间,超时证明密码不正确,服务器响应时间太长了 try: r = self.s.post(login_url, data=login_data, timeout=2) except Exception as e: logger.error(e.message) raise Exception("error:上网登录密码错误") # 判断密码正确: if not re.match(r'.+p=failed', r.url) is None: utils.incr(settings.VPN_FAIL_KEY) if utils.over_limit(settings.VPN_FAIL_KEY): logger.error("vpn登录失败超过限制: %d" % settings.fail_count_limit) logger.warning("vpn密码不对 %s,vpn登录失败超过 %s次" % (str(login_data), utils.get(settings.VPN_FAIL_KEY))) raise utils.PasswordError("error:上网登录密码错误,不要在盲目尝试啦") soup = bs4.BeautifulSoup(r.text.encode("gbk", errors='replace').decode("gbk"), 'html.parser') # 在特殊情况下才能拿到cookies DSIDFormDataStrs = soup.find_all(id="DSIDFormDataStr") if len(DSIDFormDataStrs) > 0: formdatastr = DSIDFormDataStrs[0]['value'] continue_data = {"btnContinue": "%E7%BB%A7%E7%BB%AD%E4%BC%9A%E8%AF%9D", "FormDataStr": formdatastr} self.s.post(login_url, data=continue_data, verify=False, allow_redirects=False) if not self.s.cookies.get('DSID'): logger.error("error:查询次数太多") raise Exception("error:查询次数太多,学校vpn禁止了ip,没人的时候再来吧~~") logger.info('succeed logging into vpn ...')