import base64 import configparser import click import requests from logbook import * # from requests.cookies import RequestsCookieJar import controller as ctrl from config.base_settings import CAPTCHA_MODEL_NAME, TIMEOUT, USE_PROXY from controller.url_config import url_captcha, url_login # from service.log import init_log from service.proxy import update_proxy, notify_ip_address, update_cookies from service.sipoknn import get_captcha_result logger = Logger(__name__) account_notify_times = 0 description = ( ''' 用户信息配置模块 由于专利网站的改版,现在要求必须要登录账号密码才能进行高级查询, 请使用者到专利网站自行注册账号,并修改一下USERNAME和PASSWORD的值 链接:http://www.pss-system.gov.cn/sipopublicsearch/portal/uiregister-showRegisterPage.shtml ''' ) class Account: """ 账户信息定义 """ def __init__(self): # 用户名,约定私有约束,使用请调用self.username self._username = '' # 密码,约定私有约束,使用请调用self.password self._password = '' @property def username(self): return self._username @username.setter def username(self, username: str): if username is None: raise Exception('username invalid') username = username.replace(' ', '') if username == '': raise Exception('username invalid') self._username = username @property def password(self): return self._password @password.setter def password(self, password: str): if password is None or password == '': raise Exception('password invalid') self._password = password def check_username(self, cfg: configparser.ConfigParser): """ 用户名校验,设置 :param cfg: :return: """ try: username = cfg.get('account', 'username') self.username = username except: click.echo(description) while True: try: username = click.prompt('用户名出错,请填写') self.username = username break except: pass def check_password(self, cfg: configparser.ConfigParser): """ 密码校验,配置 :param cfg: :return: """ try: password = cfg.get('account', 'password') self.password = password except: while True: try: password = click.prompt('密码出错,请填写') self.password = password break except: pass # 账户信息的单例 account = Account() def change_to_base64(source): """ 将参数进行base64加密 :param source: :return: """ return str(base64.b64encode(bytes(source, encoding='utf-8')), 'utf-8') def get_captcha(): """ 获取验证码 :return: """ resp = requests.get(url=url_captcha.get('url'), cookies=ctrl.COOKIES, proxies=ctrl.PROXIES) with open('captcha.png', 'wb') as f: f.write(resp.content) result = get_captcha_result(CAPTCHA_MODEL_NAME, 'captcha.png') return result def check_login_status(): if USE_PROXY: try: if ctrl.PROXIES is not None: notify_ip_address() logger.info('当前已有登录状态') return True except: pass return False def login(username=None, password=None): """ 登录API :return: True: 登录成功; False: 登录失败 """ if username is None or password is None: username = account.username password = account.password ctrl.BEING_LOG = True if check_login_status(): ctrl.BEING_LOG = False return True error_times = 0 while True: try: # logger.debug("before proxy") update_proxy() # logger.debug("before cookie") update_cookies() # logger.debug("after cookie") busername = change_to_base64(username) bpassword = change_to_base64(password) captcha = get_captcha() logger.info('验证码识别结果:%s' % captcha) form_data = url_login.get('form_data') form_data.__setitem__('j_validation_code', captcha) form_data.__setitem__('j_username', busername) form_data.__setitem__('j_password', bpassword) resp = requests.post(url=url_login.get('url'), headers=url_login.get('headers'), data=form_data, cookies=ctrl.COOKIES, proxies=ctrl.PROXIES, timeout=TIMEOUT) if resp.text.find(username + ',欢迎访问') != -1: # 网站调整了逻辑,下面这句不用了 # print(resp.cookies) # ctrl.COOKIES.__delitem__('IS_LOGIN') # ctrl.COOKIES.set('IS_LOGIN', 'true', domain='www.pss-system.gov.cn/sipopublicsearch/patentsearch') jsession = ctrl.COOKIES.get('JSESSIONID') resp.cookies.__delitem__('JSESSIONID') resp.cookies.set('JSESSIONID', jsession, domain='www.pss-system.gov.cn') update_cookies(resp.cookies) requests.post( 'http://www.pss-system.gov.cn/sipopublicsearch/patentsearch/showViewList-jumpToView.shtml', cookies=ctrl.COOKIES, proxies=ctrl.PROXIES) ctrl.BEING_LOG = False logger.info('登录成功') return True else: if error_times > 5: break logger.error('登录失败') error_times += 1 except Exception as e: logger.error(e) ctrl.BEING_LOG = False return False if __name__ == '__main__': pass # init_log() # login('', '') # print(notify_ip_address()) # # resp = requests.post('http://www.pss-system.gov.cn/sipopublicsearch/patentsearch/showViewList-jumpToView.shtml', cookies=ctrl.COOKIES) # # print(resp.text) # form_data = url_detail.get('form_data') # # ''' # # 'nrdAn': '', # # 'cid': '', # # 'sid': '', # # 'wee.bizlog.modulelevel': '0201101' # # ''' # form_data.__setitem__('nrdAn', 'CN201520137687') # form_data.__setitem__('cid', 'CN201520137687.320150916XX') # form_data.__setitem__('sid', 'CN201520137687.320150916XX') # print(ctrl.COOKIES) # resp = requests.post(url_detail.get('url'), headers=url_detail.get('headers'), cookies=ctrl.COOKIES, data=form_data) # print(resp.text)