def delete_account(site, type, username): conn = RedisClient(type, site) num = 0 while num < 5: result = conn.delete(username) if result: print('删除 {} 成功! '.format(username)) break num += 1 time.sleep(1) print('删除失败, 请手动删除! ')
def run(): for website in ACCOUNTS.keys(): print('*' * 40) print('%s正在检测cookies...' % website) acc = RedisClient('accounts', website) coo = RedisClient('cookies', website) log = eval(website.capitalize() + 'Login()') for username, password in acc.get_all().items(): # 第一次运行时,可能数据还未录入就开始测试,因此加异常处理 try: cookies = coo.get(username) if log.good_cookies(cookies): print('\t%s\t\tCookies已通过检测...' % username) else: print('\t%s\t\tCookies未通过检测!!!' % username) coo.delete(username) print('\t%s\t\tCookies已删除!!!' % username) log.login(username, password) cookies = log.get_cookies() coo.set(username, cookies) except Exception as e: print('数据库为空,请等数据录入之后再进行测试:', e.args)
class CookiesGenerator(object): def __init__(self, website='default'): """ 父类,初始化一些对象 :param website: 名称 :param browser: 浏览器,不用可以设置为None """ self.website = website self.cookies_db = RedisClient('cookies', self.website) self.accounts_db = RedisClient('accounts', self.website) self.init_browser() def __del__(self): self.close() def init_browser(self): """ 通过browser参数初始化全局游览器共模拟登录使用 :return: """ if BROWSER_TYPE == 'PhantomJS': caps = DesiredCapabilities.PHANTOMJS caps[ "phantomjs.page.settings.userAgent"] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36' self.browser = webdriver.PhantomJS(desired_capabilities=caps) self.browser.set_window_size(1400, 500) elif BROWSER_TYPE == 'Chrome': self.browser = webdriver.Chrome() def new_cookies(self, username, password): """ 新生成Cookies,子类需要重写 :param username: 用户名 :param password: 密码 :return: """ return NotImplementedError def process_cookies(self, cookies): """ 处理cookies :param cookies: :return: """ dict = {} for cookie in cookies: dict[cookie['name']] = cookie['value'] return dict def run(self): """ 运行,得到所有账户,然后顺次模拟登录 :return: """ accounts_usernames = self.accounts_db.usernames() cookies_usernames = self.cookies_db.usernames() for username in accounts_usernames: if not username in cookies_usernames: password = self.accounts_db.get(username) print('正在生成Cookies', '账号', username, '密码', password) result = self.new_cookies(username, password) # 成功获取 if result.get('status') == 1: cookies = self.process_cookies(result.get('content')) print('成功获取到Cookies', cookies) if self.cookies_db.set(username, json.dumps(cookies)): print('成功保存Cookies') # 密码错误,移除账号 elif result.get('status') == 2: print(result.get('content')) if self.accounts_db.delete(username): print('成功删除账号') else: print(result.get('content')) else: print('所有账号都已经成功获取Cookies') def close(self): """ 关闭 :return: """ try: print('Closing Browser') self.browser.close() del self.browser except TypeError: print('Browser not opened')
class CookiesGenerator(object): def __init__(self, website = 'default'): self.website = website self.cookies_db = RedisClient('cookies', self.website) self.accounts_db = RedisClient('accounts', self.website) self.init_browser() def __del__(self): self.close() def init_browser(self): chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') self.browser = webdriver.Chrome(chrome_options = chrome_options) def new_cookies(self, username, password): """ 新生成Cookies,子类需要重写 :param username: 用户名 :param password: 密码 :return: """ raise NotImplementedError def process_cookies(self, cookies): dict = {} for cookie in cookies: dict[cookie['name']] = cookie['value'] return dict def run(self): account_usernames = self.accounts_db.usernames() cookies_usernames = self.cookies_db.usernames() for username in account_usernames: if not username in cookies_usernames: password = self.accounts_db.get(username) print('Generating new cookies...[username: {} password: {}]'.format(username, password)) result = self.new_cookies(username, password) if result.get('status') == 1: cookies = self.process_cookies(result.get('content')) print('Generated successfully!') if self.cookies_db.set(username, json.dumps(cookies)): print('Saved new cookies successfully!') elif result.get('status') == 2: print(result.get('content')) if self.accounts_db.delete(username): print('Deleted invalid account successfully! [username: {}]'.format(username)) else: print(result.get('content')) else: print('All accounts has got cookies successfully!') def close(self): try: print('Closing browser...') self.browser.close() del self.browser print('Browser has closed!') except TypeError: print('Browser not opened!')
class CookiesGenerator: """ Cookie 生成器基类 """ def __init__(self, site, single_cycle_limit): self.site = site # 单轮登录数量上限 self.single_cycle_limit = single_cycle_limit self.cookies_db = RedisClient('cookies', self.site) self.accounts_db = RedisClient('accounts', self.site) def new_cookies(self, username, password): """ 新生成 Cookies :param username: 用户名 :param password: 密码 :return: """ raise NotImplementedError @staticmethod def process_cookies(cookies): """ 处理 cookies :param cookies: :return: """ return {cookie['name']: cookie['value'] for cookie in cookies} def run(self): """ 运行账号池的所有账号生成 cookie :return: """ accounts_usernames = self.accounts_db.usernames() cookies_usernames = self.cookies_db.usernames() num = 0 for username in accounts_usernames: if num >= self.single_cycle_limit: print('已达单轮登录上限, 停止登录! ') return if username not in cookies_usernames: password = self.accounts_db.get(username).decode('utf-8') username = username.decode('utf-8') print('正在生成 Cookies -> 账号: {}, 密码: {}'.format( username, password)) result = self.new_cookies(username, password) if result.get('status') == '1': if isinstance(result['result'], list): cookies = self.process_cookies(result['result']) else: cookies = result['result'] print('成功生成 Cookies : {}'.format(cookies)) if self.cookies_db.set(username, json.dumps(cookies)): print('成功保存至 Cookie Pool!') else: print('疑似 redis 连接断开, 未成功保存, 尝试调用录入器保存...') set_account( self.site, 'cookies', '{} {}'.format(username, json.dumps(cookies))) # 密码错误, 移除账号 elif result.get('status') == '3': print(result['result']) if self.accounts_db.delete(username): print('删除账号: ', username) else: print('疑似 redis 断开连接, 删除失败, 尝试调用删除器删除...') delete_account(self.site, 'accounts', username) else: print(result.get('result')) num += 1 else: continue sleep_time = random.randint(90, 180) # print('休息{}秒...'.format(sleep_time)) time.sleep(sleep_time) print('所有账号生成完毕! ')
class CookiesGenerator(): def __init__(self, website="default"): self.website = website self.cookie_db = RedisClient('cookies', self.website) self.account_db = RedisClient('accounts', self.website) self.browser = self.init_browser() def init_browser(self): if BROWSER_TYPE == "PhantomJS": caps = DesiredCapabilities.PHANTOMJS caps[ "phantomjs.page.settings.userAgent"] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36' browser = webdriver.PhantomJS(desired_capabilities=caps) browser.set_window_size(1400, 500) return browser elif BROWSER_TYPE == "Chrome": browser = webdriver.Chrome() return browser def new_cookies(self, username, password): raise NotImplementedError def parse_cookies_dict(self, cookies): dic = {} for cookie in cookies: dic[cookie['name']] = cookie['value'] return dic def run(self): account_usernames = self.account_db.usernames() cookies_usernames = self.cookie_db.usernames() for username in account_usernames: if not username in cookies_usernames: password = self.account_db.get(username) print("正在生成Cookies", username, password) result = self.new_cookies(username, password) if result.get("status") == 1: cookies = self.parse_cookies_dict(result.get('content')) print("成功获取Cookies", cookies) if self.cookie_db.set(username, json.dumps(cookies)): print("成功保存Cookies") elif result.get('status') == 2: print("密码错误") if self.account_db.delete(username): print("删除成功") else: print(result.get("content")) print("所有账号已经成功获取Cookies") def close(self): try: print("Closing Browser") self.browser.close() del self.browser except TypeError: print("Browser not opened") def __del__(self): self.close()