""" Client module """ import logging import re import time from datetime import datetime import json import requests import cloudscraper from webbot.webbot import Browser logging.basicConfig( format='%(name)s - %(levelname)s - %(message)s', level=logging.INFO ) LOGGER = logging.getLogger(__name__) class RRClientException(Exception): """RR exception""" def __init__(self, *args, **kwargs): Exception.__init__(self, *args, **kwargs) LOGGER.warning('RRClientException') class SessionExpireException(Exception): """Raise when session has expired""" def __init__(self, *args, **kwargs): Exception.__init__(self, *args, **kwargs) LOGGER.warning('Session has expired') class NoLogginException(Exception): """Raise exception when client isn't logged in""" def __init__(self, *args, **kwargs): Exception.__init__(self, *args, **kwargs) LOGGER.warning('Session has expired') class NoPHPsessidException(Exception): """Raise exception when cookie isn't found""" def __init__(self, *args, **kwargs): Exception.__init__(self, *args, **kwargs) LOGGER.warning('No phpsessid found') def session_handler(func): """Handle expired sessions""" def wrapper(*args, **kwargs): instance = args[0] return try_run(instance, func, *args, **kwargs) def try_run(instance, func, *args, **kwargs): try: return func(*args, **kwargs) except (SessionExpireException, ConnectionError, ConnectionResetError): instance.remove_cookie(instance.username) instance.login() return try_run(instance, func, *args, **kwargs) except NoLogginException: instance.login() return try_run(instance, func, *args, **kwargs) return wrapper class Client: """class for RR client""" resource_id = { 'oil': 3, 'ore': 4, 'uranium': 11, 'diamond': 15, 'liquid oxygen': 21, 'helium-3': 24, 'antirad': 13, 'energy drink': 17, 'spacerockets': 20, 'tanks': 2, 'aircrafts': 1, 'missiles': 14, 'bombers': 16, 'battleships': 18, 'moon tanks': 22, 'space stations': 23 } cookie = None var_c = None login_method = None username = None password = None session = None def __init__(self, show_window=False): self.show_window = show_window LOGGER.info('Init client, show window %s', self.show_window) def set_credentials(self, credentials): """Set the credentials""" LOGGER.info('Setting "%s" credentials', credentials['username']) self.login_method = credentials['login_method'] self.username = credentials['username'] self.password = credentials['password'] def login(self): """Login user if needed""" cookie = self.get_cookie(self.username) if cookie is None: LOGGER.info('Client login "%s" username "%s"', self.login_method, self.username) if self.login_method not in ["g", "google", "v", "vk", "f", "facebook"]: raise RRClientException("Not a valid login method.") auth_text = requests.get("http://rivalregions.com").text web = Browser(showWindow=self.show_window) method_dict = { 'g': self.login_google, 'google': self.login_google, 'v': self.login_vk, 'vk': self.login_vk, 'f': self.login_facebook, 'facebook': self.login_facebook, } if self.login_method in method_dict: web = method_dict[self.login_method](web, auth_text) else: LOGGER.info('Invallid loggin method "%s"', self.login_method) exit() LOGGER.info('Get cookie') phpsessid = web.get_cookie('PHPSESSID') if phpsessid: cookie = self.create_cookie( phpsessid.get('expiry', None), phpsessid.get('value', None) ) self.write_cookie(self.username, cookie) else: raise NoPHPsessidException() LOGGER.info('closing login tab') web.close_current_tab() # old self.session = requests.Session() # new to bypass cloudflare # self.session = cloudscraper.CloudScraper( # browser={'browser': 'chrome', 'mobile': False}, # # debug=False # debug=True # ) # not required self.session.headers.update({'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64)' \ 'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'}) self.cookie = cookie self.session.cookies.set(**cookie) LOGGER.info('set the var_c') response = self.session.get('http://rivalregions.com/#overview') lines = response.text.split("\n") for line in lines: if re.match("(.*)var c_html(.*)", line): var_c = line.split("'")[-2] LOGGER.info('var_c: %s', var_c) self.var_c = line.split("'")[-2] def login_google(self, web, auth_text): """login using Google""" LOGGER.info('Login method Google') auth_text1 = auth_text.split('\t\r\n\t\t\t\t
= expires: LOGGER.info('Cookie is expired') return None cookie = cls.create_cookie( cookie['expires'], cookie['value'], ) return cookie except FileNotFoundError: pass return None @classmethod def remove_cookie(cls, username): """Remove cookie from storage""" LOGGER.info('Removing cookie for "%s"', username) cookies = None try: with open('cookies.json', 'r') as cookies_file: cookies = json.load(cookies_file) except FileNotFoundError: cookies = {} cookies.pop(username, None) with open('cookies.json', 'w+') as cookies_file: json.dump(cookies, cookies_file) LOGGER.info('Removed cookie for "%s"', username) @staticmethod def create_cookie(expires, value): """Create cookie""" return { 'domain': 'rivalregions.com', 'name': 'PHPSESSID', 'path': '/', 'secure': False, 'expires': expires, 'value': value, } @session_handler def get(self, path, add_var_c=False): """Send get request to Rival Regions""" if path[0] == '/': path = path[1:] params = {} if add_var_c: params['c'] = self.var_c if self.session: response = self.session.get( url='http://rivalregions.com/{}'.format(path), params=params ) if "Session expired, please, reload the page" in response.text: raise SessionExpireException() else: raise NoLogginException() return response.text @session_handler def post(self, path, data=None): """Send post request to Rival Regions""" if path[0] == '/': path = path[1:] data['c'] = self.var_c if self.session: response = self.session.post( "http://rivalregions.com/{}".format(path), data=data ) print(response.headers) print(response.text) print(response.status_code) if "Session expired, please, reload the page" in response.text: raise SessionExpireException() else: raise NoLogginException() return response.text @session_handler def send_chat(self, language, message): """send chat message""" if self.session: response = self.session.get("http://rivalregions.com/#overview") if "Session expired, please, reload the page" in response.text: raise SessionExpireException() web = Browser(showWindow=self.show_window) web.go_to('http://rivalregions.com/') web.add_cookie(self.get_cookie(self.username)) web.go_to('http://rivalregions.com/#slide/chat/lang_{}'.format(language)) web.refresh() time.sleep(2) web.type(message, id='message') web.click(id='chat_send') web.close_current_tab() else: raise NoLogginException()