Compare commits

...

12 Commits

Author SHA1 Message Date
5a1f7801a2 Bump version: 0.25.1 → 0.25.1.1 2021-07-20 13:16:55 +03:00
17845f750c Bugfix 2021-07-20 13:14:13 +03:00
883af51197 Bump version: 0.25.0.4 → 0.25.1 2021-07-10 01:32:57 +03:00
814cb5ab87 Programmatic user agent spoofing 2021-07-10 01:29:31 +03:00
3c316bada3 Bump version: 0.25.0.3 → 0.25.0.4 2021-07-10 01:14:30 +03:00
ea03979943 Energy variable bugfix 2021-07-10 01:13:21 +03:00
9aae685b21 Bump version: 0.25.0.2 → 0.25.0.3 2021-07-10 00:47:51 +03:00
cae94d7aa8 requirement update 2021-07-10 00:47:40 +03:00
fae7b0fd37 Bump version: 0.25.0.1 → 0.25.0.2 2021-07-10 00:37:46 +03:00
b7771b4da2 Update 2021-07-10 00:36:22 +03:00
e3a10af101 Bump version: 0.25.0 → 0.25.0.1 2021-05-25 09:54:44 +03:00
33a5bcacf1 Backward compatability bugfix 2021-05-25 09:54:35 +03:00
6 changed files with 69 additions and 61 deletions

View File

@ -4,7 +4,7 @@
__author__ = """Eriks Karls""" __author__ = """Eriks Karls"""
__email__ = 'eriks@72.lv' __email__ = 'eriks@72.lv'
__version__ = '0.25.0' __version__ = '0.25.1.1'
from erepublik.citizen import Citizen from erepublik.citizen import Citizen

View File

@ -15,27 +15,6 @@ __all__ = ['SlowRequests', 'CitizenAPI']
class SlowRequests(Session): class SlowRequests(Session):
last_time: datetime.datetime last_time: datetime.datetime
timeout: datetime.timedelta = datetime.timedelta(milliseconds=500) timeout: datetime.timedelta = datetime.timedelta(milliseconds=500)
_uas: List[str] = [
# Chrome
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
# FireFox
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0',
'Mozilla/5.0 (X11; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0',
'Mozilla/5.0 (X11; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0',
'Mozilla/5.0 (X11; Linux x86_64; rv:82.0) Gecko/20100101 Firefox/82.0',
'Mozilla/5.0 (X11; Linux x86_64; rv:81.0) Gecko/20100101 Firefox/81.0',
]
debug: bool = False debug: bool = False
def __init__(self, proxies: Dict[str, str] = None, user_agent: str = None): def __init__(self, proxies: Dict[str, str] = None, user_agent: str = None):
@ -43,7 +22,7 @@ class SlowRequests(Session):
if proxies: if proxies:
self.proxies = proxies self.proxies = proxies
if user_agent is None: if user_agent is None:
user_agent = random.choice(self._uas) user_agent = random.choice(self.get_random_user_agent())
self.request_log_name = utils.get_file(utils.now().strftime("debug/requests_%Y-%m-%d.log")) self.request_log_name = utils.get_file(utils.now().strftime("debug/requests_%Y-%m-%d.log"))
self.last_time = utils.now() self.last_time = utils.now()
self.headers.update({'User-Agent': user_agent}) self.headers.update({'User-Agent': user_agent})
@ -115,6 +94,36 @@ class SlowRequests(Session):
data = dump.dump_all(response) data = dump.dump_all(response)
utils.write_file(f'debug/dumps/{fd_time}_{fd_name}{fd_extra}.{fd_ext}.dump', data.decode('utf8')) utils.write_file(f'debug/dumps/{fd_time}_{fd_name}{fd_extra}.{fd_ext}.dump', data.decode('utf8'))
@staticmethod
def get_random_user_agent() -> str:
windows_x64 = 'Windows NT 10.0; Win64; x64'
linux_x64 = 'X11; Linux x86_64'
android_11 = 'Android 11; Mobile'
android_10 = 'Android 10; Mobile'
android_9 = 'Android 9; Mobile'
firefox_tmplt = 'Mozilla/5.0 ({osystem}; rv:{version}.0) Gecko/20100101 Firefox/{version}.0'
ff_version = range(85, 92)
chrome_tmplt = 'Mozilla/5.0 ({osystem}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{version} Safari/537.36'
chrome_version = ['85.0.4183.121',
'86.0.4240.183',
'87.0.4280.141',
'88.0.4324.182',
'89.0.4389.128',
'90.0.4430.18',
'91.0.4472.73',
'92.0.4515.14']
uas = []
for osystem in [windows_x64, linux_x64, android_9, android_10, android_11]:
for version in ff_version:
uas.append(firefox_tmplt.format(osystem=osystem, version=version))
for version in chrome_version:
uas.append(chrome_tmplt.format(osystem=osystem, version=version))
return random.choice(uas)
class CitizenBaseAPI: class CitizenBaseAPI:
url: str = "https://www.erepublik.com/en" url: str = "https://www.erepublik.com/en"

View File

@ -7,7 +7,7 @@ from decimal import Decimal
from itertools import product from itertools import product
from threading import Event from threading import Event
from time import sleep from time import sleep
from typing import Any, Dict, List, NoReturn, Optional, Set, Tuple, TypedDict, Union from typing import Any, Dict, List, NoReturn, Optional, Set, Tuple, Union
from requests import HTTPError, RequestException, Response from requests import HTTPError, RequestException, Response
@ -206,11 +206,14 @@ class BaseCitizen(access_points.CitizenAPI):
citizen_js = utils.json.loads(ugly_js) citizen_js = utils.json.loads(ugly_js)
citizen = citizen_js.get('citizen', {}) citizen = citizen_js.get('citizen', {})
self.details.citizen_id = int(citizen['citizenId'])
self.name = citizen['name']
self.eday = citizen_js.get('settings').get('eDay') self.eday = citizen_js.get('settings').get('eDay')
self.division = int(citizen.get('division', 0)) self.division = int(citizen.get('division', 0))
self.energy.interval = citizen.get('energyPerInterval', 0) self.energy.interval = citizen.get('energyPerInterval', 0)
self.energy.limit = citizen.get('energyPoolLimit', 0) self.energy.limit = citizen.get('energyToRecover', 0)
self.energy.energy = citizen.get('energy', 0) self.energy.energy = citizen.get('energy', 0)
# self.energy.set_reference_time(utils.good_timedelta(self.now, timedelta(seconds=int(next_recovery[1]) * 60 + int(next_recovery[2])))) # self.energy.set_reference_time(utils.good_timedelta(self.now, timedelta(seconds=int(next_recovery[1]) * 60 + int(next_recovery[2]))))
@ -280,11 +283,11 @@ class BaseCitizen(access_points.CitizenAPI):
return self._post_main_session_get_challenge(captcha_id, image_id).json() return self._post_main_session_get_challenge(captcha_id, image_id).json()
def solve_captcha(self, src: str) -> Optional[List[Dict[str, int]]]: def solve_captcha(self, src: str) -> Optional[List[Dict[str, int]]]:
class _API_RESULT(TypedDict): class _API_RESULT(dict):
x: int x: int
y: int y: int
class _API_RETURN(TypedDict): class _API_RETURN(dict):
status: bool status: bool
message: str message: str
result: Optional[List[_API_RESULT]] result: Optional[List[_API_RESULT]]
@ -599,11 +602,11 @@ class BaseCitizen(access_points.CitizenAPI):
def _resume_session(self): def _resume_session(self):
resp = self._req.get(self.url) resp = self._req.get(self.url)
re_name_id = re.search(r'<a data-fblog="profile_avatar" href="/en/citizen/profile/(\d+)" ' try:
r'class="user_avatar" title="(.*?)">', resp.text) self.update_citizen_info(resp.text)
if re_name_id: if not self.name:
self.name = re_name_id.group(2) raise classes.ErepublikException("Unable to find player name")
self.details.citizen_id = re_name_id.group(1)
self.write_log(f"Resumed as: {self.name}") self.write_log(f"Resumed as: {self.name}")
if re.search('<div id="accountSecurity" class="it-hurts-when-ip">', resp.text): if re.search('<div id="accountSecurity" class="it-hurts-when-ip">', resp.text):
self.restricted_ip = True self.restricted_ip = True
@ -611,7 +614,7 @@ class BaseCitizen(access_points.CitizenAPI):
self.logged_in = True self.logged_in = True
self.get_csrf_token() self.get_csrf_token()
else: except classes.ErepublikException:
self._login() self._login()
def __str__(self) -> str: def __str__(self) -> str:
@ -792,11 +795,7 @@ class BaseCitizen(access_points.CitizenAPI):
if r.url == f"{self.url}/login": if r.url == f"{self.url}/login":
self.report_error("Citizen email and/or password is incorrect!") self.report_error("Citizen email and/or password is incorrect!")
else: else:
re_name_id = re.search(r'<a data-fblog="profile_avatar" href="/en/citizen/profile/(\d+)" ' self.update_citizen_info(r.text)
r'class="user_avatar" title="(.*?)">', r.text)
self.name = re_name_id.group(2)
self.details.citizen_id = re_name_id.group(1)
self.write_log(f"Logged in as: {self.name}") self.write_log(f"Logged in as: {self.name}")
self.get_csrf_token() self.get_csrf_token()
if re.search('<div id="accountSecurity" class="it-hurts-when-ip">', self.r.text): if re.search('<div id="accountSecurity" class="it-hurts-when-ip">', self.r.text):

View File

@ -1,21 +1,21 @@
bump2version==1.0.1 bump2version==1.0.1
coverage==5.5 coverage==5.5
edx-sphinx-theme==2.0.0 edx-sphinx-theme==3.0.0
flake8==3.8.4 flake8==3.9.2
ipython>=7.21.0 ipython>=7.25.0
jedi!=0.18.0 jedi!=0.18.0
isort==5.7.0 isort==5.9.2
pip==21.0.1 pip==21.1.3
pre-commit==2.10.1 pre-commit==2.13.0
pur==5.3.0 pur==5.4.2
PyInstaller==4.2 PyInstaller==4.3
PySocks==1.7.1 PySocks==1.7.1
pytest==6.2.2 pytest==6.2.4
pytz==2021.1 pytz==2021.1
requests==2.25.1 requests==2.25.1
requests-toolbelt==0.9.1 requests-toolbelt==0.9.1
responses==0.12.1 responses==0.13.3
setuptools==54.0.0 setuptools==57.1.0
Sphinx==3.5.1 Sphinx==4.0.3
twine==3.3.0 twine==3.4.1
wheel==0.36.2 wheel==0.36.2

View File

@ -1,5 +1,5 @@
[bumpversion] [bumpversion]
current_version = 0.25.0 current_version = 0.25.1.1
commit = True commit = True
tag = True tag = True
parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)\.?(?P<dev>\d+)? parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)\.?(?P<dev>\d+)?

View File

@ -12,17 +12,17 @@ with open('HISTORY.rst') as history_file:
history = history_file.read() history = history_file.read()
requirements = [ requirements = [
'PySocks==1.7.1', 'PySocks>=1.7.1',
'pytz==2021.1', 'pytz>=2021.1',
'requests==2.25.1', 'requests>=2.25.0',
'requests-toolbelt==0.9.1', 'requests-toolbelt>=0.9.0',
] ]
setup_requirements = [] setup_requirements = []
test_requirements = [ test_requirements = [
"pytest==6.1.2", "pytest==6.2.4",
"responses==0.12.1" "responses==0.13.3"
] ]
setup( setup(
@ -34,8 +34,8 @@ setup(
'License :: OSI Approved :: MIT License', 'License :: OSI Approved :: MIT License',
'Natural Language :: English', 'Natural Language :: English',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9',
], ],
description="Python package for automated eRepublik playing", description="Python package for automated eRepublik playing",
entry_points={}, entry_points={},
@ -46,11 +46,11 @@ setup(
keywords='erepublik', keywords='erepublik',
name='eRepublik', name='eRepublik',
packages=find_packages(include=['erepublik']), packages=find_packages(include=['erepublik']),
python_requires='>=3.7, <4', python_requires='>=3.8, <4',
setup_requires=setup_requirements, setup_requires=setup_requirements,
test_suite='tests', test_suite='tests',
tests_require=test_requirements, tests_require=test_requirements,
url='https://github.com/eeriks/erepublik/', url='https://github.com/eeriks/erepublik/',
version='0.25.0', version='0.25.1.1',
zip_safe=False, zip_safe=False,
) )