Compare commits

...

12 Commits

Author SHA1 Message Date
9750ee1926 Bump version: 0.30.0.3 → 0.30.0.4 2022-03-21 16:41:08 +02:00
7015b6d299 CookieFix 2022-03-21 16:40:46 +02:00
288c3df4a5 Bump version: 0.30.0.2 → 0.30.0.3 2022-03-21 15:22:45 +02:00
15eb3ac8a0 remove requests 2022-03-21 15:21:28 +02:00
c4933de237 import 2022-03-21 15:13:52 +02:00
bd864a110d Bump version: 0.30.0.1 → 0.30.0.2 2022-03-21 15:10:07 +02:00
ee422c4b02 . 2022-03-21 15:10:04 +02:00
4af6101665 Bump version: 0.30.0 → 0.30.0.1 2022-03-21 15:06:29 +02:00
61a535dca5 requirements 2022-03-21 15:05:50 +02:00
6c0871cfbd Bump version: 0.29.2.3 → 0.30.0 2022-03-21 14:57:17 +02:00
c9dbf7ee1e Enable HTTP2 to overcome CloudFlare captchas 2022-03-21 14:55:07 +02:00
c86a5ffc5a Added Readme swag icons 2022-03-15 10:44:15 +02:00
10 changed files with 47 additions and 33 deletions

View File

@ -10,6 +10,13 @@ eRepublik script
:target: https://erepublik.readthedocs.io/en/latest/?badge=latest :target: https://erepublik.readthedocs.io/en/latest/?badge=latest
:alt: Documentation Status :alt: Documentation Status
.. image:: https://github.com/eeriks/erepublik/actions/workflows/codeql-analysis.yml/badge.svg?branch=master
:target: //github.com/eeriks/erepublik/actions/workflows/codeql-analysis.yml
:alt: CodeQL
.. image:: https://github.com/eeriks/erepublik/actions/workflows/pythonpackage.yml/badge.svg
:target: https://github.com/eeriks/erepublik/actions/workflows/pythonpackage.yml
:alt: Python package
Python package for automated eRepublik playing Python package for automated eRepublik playing

View File

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

View File

@ -9,7 +9,7 @@ from logging import LogRecord, handlers
from pathlib import Path from pathlib import Path
from typing import Any, Dict, Union from typing import Any, Dict, Union
import requests from httpx import post
from erepublik.classes import Reporter from erepublik.classes import Reporter
from erepublik.constants import erep_tz from erepublik.constants import erep_tz
@ -112,7 +112,7 @@ class ErepublikErrorHTTTPHandler(handlers.HTTPHandler):
def _get_last_response(self) -> Dict[str, str]: def _get_last_response(self) -> Dict[str, str]:
response = self.reporter.citizen.r response = self.reporter.citizen.r
url = response.url url = str(response.url)
last_index = url.index("?") if "?" in url else len(response.url) last_index = url.index("?") if "?" in url else len(response.url)
name = slugify(response.url[len(self.reporter.citizen.url) : last_index]) name = slugify(response.url[len(self.reporter.citizen.url) : last_index])
@ -209,6 +209,6 @@ class ErepublikErrorHTTTPHandler(handlers.HTTPHandler):
headers = {"Authorization": s} headers = {"Authorization": s}
data = self.mapLogRecord(record) data = self.mapLogRecord(record)
files = data.pop("files") if "files" in data else None files = data.pop("files") if "files" in data else None
requests.post(f"{proto}://{self.host}{self.url}", headers=headers, data=data, files=files) post(f"{proto}://{self.host}{self.url}", headers=headers, data=data, files=files)
except Exception: except Exception:
self.handleError(record) self.handleError(record)

View File

@ -4,9 +4,8 @@ import random
import time import time
from typing import Any, Dict, List, Mapping, Union from typing import Any, Dict, List, Mapping, Union
from requests import Response, Session from httpx import Response, Client as Session, RequestError
from requests.exceptions import ConnectionError #from requests_toolbelt.utils import dump
from requests_toolbelt.utils import dump
from erepublik import constants, utils from erepublik import constants, utils
@ -15,11 +14,12 @@ __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)
debug: bool = False debug: bool = False
http2 = True
def __init__(self, proxies: Dict[str, str] = None, user_agent: str = None): def __init__(self, proxies: Dict[str, str] = None, user_agent: str = None):
super().__init__() super().__init__(http2=True, follow_redirects=True)
if proxies: if proxies:
self.proxies = proxies self.proxies = proxies
if user_agent is None: if user_agent is None:
@ -27,13 +27,13 @@ class SlowRequests(Session):
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})
self.hooks["response"] = [self._log_response] self.event_hooks["response"] = [self._log_response]
@property @property
def as_dict(self): def as_dict(self):
return dict( return dict(
last_time=self.last_time, last_time=self.last_time,
timeout=self.timeout, __timeout=self.__timeout,
cookies=self.cookies.get_dict(), cookies=self.cookies.get_dict(),
debug=self.debug, debug=self.debug,
user_agent=self.headers["User-Agent"], user_agent=self.headers["User-Agent"],
@ -46,14 +46,14 @@ class SlowRequests(Session):
self._log_request(url, method, **kwargs) self._log_request(url, method, **kwargs)
try: try:
resp = super().request(method, url, *args, **kwargs) resp = super().request(method, url, *args, **kwargs)
except ConnectionError: except RequestError:
time.sleep(1) time.sleep(1)
return self.request(method, url, *args, **kwargs) return self.request(method, url, *args, **kwargs)
# self._log_response(resp) # self._log_response(resp)
return resp return resp
def _slow_down_requests(self): def _slow_down_requests(self):
ltt = utils.good_timedelta(self.last_time, self.timeout) ltt = utils.good_timedelta(self.last_time, self.__timeout)
if ltt > utils.now(): if ltt > utils.now():
seconds = (ltt - utils.now()).total_seconds() seconds = (ltt - utils.now()).total_seconds()
time.sleep(seconds if seconds > 0 else 0) time.sleep(seconds if seconds > 0 else 0)
@ -81,7 +81,7 @@ class SlowRequests(Session):
def _log_response(self, response: Response, *args, **kwargs): def _log_response(self, response: Response, *args, **kwargs):
redirect = kwargs.get("redirect") redirect = kwargs.get("redirect")
url = response.request.url url = str(response.request.url)
if self.debug: if self.debug:
if response.history and not redirect: if response.history and not redirect:
for hist_resp in response.history: for hist_resp in response.history:
@ -92,7 +92,7 @@ class SlowRequests(Session):
fd_time = self.last_time.strftime("%Y/%m/%d/%H-%M-%S") fd_time = self.last_time.strftime("%Y/%m/%d/%H-%M-%S")
fd_name = utils.slugify(url[len(CitizenBaseAPI.url) :]) fd_name = utils.slugify(url[len(CitizenBaseAPI.url) :])
fd_extra = "_REDIRECT" if redirect else "" fd_extra = "_REDIRECT" if redirect else ""
response.read()
try: try:
utils.json.loads(response.text) utils.json.loads(response.text)
fd_ext = "json" fd_ext = "json"
@ -102,9 +102,9 @@ class SlowRequests(Session):
filename = f"{fd_path}/{fd_time}_{fd_name}{fd_extra}.{fd_ext}" filename = f"{fd_path}/{fd_time}_{fd_name}{fd_extra}.{fd_ext}"
utils.write_file(filename, response.text) utils.write_file(filename, response.text)
if not redirect: #if not redirect:
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 @staticmethod
def get_random_user_agent() -> str: def get_random_user_agent() -> str:
@ -145,7 +145,7 @@ class CitizenBaseAPI:
return dict(url=self.url, request=self._req.as_dict, token=self.token) return dict(url=self.url, request=self._req.as_dict, token=self.token)
def post(self, url: str, data=None, json=None, **kwargs) -> Response: def post(self, url: str, data=None, json=None, **kwargs) -> Response:
return self._req.post(url, data, json, **kwargs) return self._req.post(url, data=data, json=json, **kwargs)
def get(self, url: str, **kwargs) -> Response: def get(self, url: str, **kwargs) -> Response:
return self._req.get(url, **kwargs) return self._req.get(url, **kwargs)

View File

@ -9,7 +9,7 @@ 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, TypedDict, Union
from requests import RequestException, Response from httpx import RequestError, Response
from erepublik import _types as types from erepublik import _types as types
from erepublik import access_points, classes, constants, utils from erepublik import access_points, classes, constants, utils
@ -118,7 +118,7 @@ class BaseCitizen(access_points.CitizenAPI):
else: else:
try: try:
response = super().get(url, **kwargs) response = super().get(url, **kwargs)
except RequestException: except RequestError:
self.report_error("Network error while issuing GET request") self.report_error("Network error while issuing GET request")
self.sleep(60) self.sleep(60)
return self.get(url, **kwargs) return self.get(url, **kwargs)
@ -151,7 +151,7 @@ class BaseCitizen(access_points.CitizenAPI):
try: try:
response = super().post(url, data=data, json=json, **kwargs) response = super().post(url, data=data, json=json, **kwargs)
except RequestException: except RequestError:
self.report_error("Network error while issuing POST request") self.report_error("Network error while issuing POST request")
self.sleep(60) self.sleep(60)
return self.post(url, data=data, json=json, **kwargs) return self.post(url, data=data, json=json, **kwargs)
@ -613,7 +613,10 @@ class BaseCitizen(access_points.CitizenAPI):
"comment_url", "comment_url",
"rfc2109", "rfc2109",
] ]
cookies = [{attr: getattr(cookie, attr) for attr in cookie_attrs} for cookie in self._req.cookies] cookies = []
for cookie in self._req.cookies.jar:
cookies.append({attr: getattr(cookie, attr, None) for attr in cookie_attrs if hasattr(cookie, attr)})
#cookies = [{attr: getattr(cookie, attr) for attr in cookie_attrs} for cookie in self._req.cookies]
with open(filename, "w") as f: with open(filename, "w") as f:
utils.json_dump( utils.json_dump(

View File

@ -7,7 +7,7 @@ from decimal import Decimal
from io import BytesIO from io import BytesIO
from typing import Any, Dict, Generator, Iterable, List, NamedTuple, NoReturn, Optional, Tuple, Union from typing import Any, Dict, Generator, Iterable, List, NamedTuple, NoReturn, Optional, Tuple, Union
from requests import HTTPError, Response, Session, post from httpx import HTTPError, Response, Client as Session, post
from erepublik import _types as types from erepublik import _types as types
from erepublik import constants, utils from erepublik import constants, utils
@ -772,7 +772,7 @@ class Reporter:
def __init__(self, citizen): def __init__(self, citizen):
self._citizen = weakref.ref(citizen) self._citizen = weakref.ref(citizen)
self._req = Session() self._req = Session(follow_redirects=True)
self.url = "https://erep.lv" self.url = "https://erep.lv"
self._req.headers.update({"user-agent": "eRepublik Script Reporter v3", "erep-version": utils.__version__}) self._req.headers.update({"user-agent": "eRepublik Script Reporter v3", "erep-version": utils.__version__})
self.__to_update = [] self.__to_update = []

View File

@ -12,8 +12,8 @@ from pathlib import Path
from typing import Any, Dict, List, Union from typing import Any, Dict, List, Union
import pytz import pytz
import requests import httpx
from requests import Response from httpx import Response
from erepublik import __version__, constants from erepublik import __version__, constants
@ -204,7 +204,7 @@ def calculate_hit(
def get_ground_hit_dmg_value( def get_ground_hit_dmg_value(
citizen_id: int, natural_enemy: bool = False, true_patriot: bool = False, booster: int = 0, weapon_power: int = 200 citizen_id: int, natural_enemy: bool = False, true_patriot: bool = False, booster: int = 0, weapon_power: int = 200
) -> Decimal: ) -> Decimal:
r = requests.get(f"https://www.erepublik.com/en/main/citizen-profile-json/{citizen_id}").json() r = httpx.get(f"https://www.erepublik.com/en/main/citizen-profile-json/{citizen_id}").json()
rang = r["military"]["militaryData"]["ground"]["rankNumber"] rang = r["military"]["militaryData"]["ground"]["rankNumber"]
strength = r["military"]["militaryData"]["ground"]["strength"] strength = r["military"]["militaryData"]["ground"]["strength"]
elite = r["citizenAttributes"]["level"] > 100 elite = r["citizenAttributes"]["level"] > 100
@ -217,7 +217,7 @@ def get_ground_hit_dmg_value(
def get_air_hit_dmg_value( def get_air_hit_dmg_value(
citizen_id: int, natural_enemy: bool = False, true_patriot: bool = False, booster: int = 0, weapon_power: int = 0 citizen_id: int, natural_enemy: bool = False, true_patriot: bool = False, booster: int = 0, weapon_power: int = 0
) -> Decimal: ) -> Decimal:
r = requests.get(f"https://www.erepublik.com/en/main/citizen-profile-json/{citizen_id}").json() r = httpx.get(f"https://www.erepublik.com/en/main/citizen-profile-json/{citizen_id}").json()
rang = r["military"]["militaryData"]["aircraft"]["rankNumber"] rang = r["military"]["militaryData"]["aircraft"]["rankNumber"]
elite = r["citizenAttributes"]["level"] > 100 elite = r["citizenAttributes"]["level"] > 100
return calculate_hit(0, rang, true_patriot, elite, natural_enemy, booster, weapon_power) return calculate_hit(0, rang, true_patriot, elite, natural_enemy, booster, weapon_power)

View File

@ -1,4 +1,8 @@
PySocks==1.7.1 PySocks==1.7.1
pytz>2021.0 pytz>2021.0
requests>2.25.0,!=2.27.0 httpx==0.22.0
requests-toolbelt==0.9.1 h2==4.1.0
socksio==1.0.0
brotli==1.0.9
#requests>2.25.0,!=2.27.0
#requests-toolbelt==0.9.1

View File

@ -1,5 +1,5 @@
[bumpversion] [bumpversion]
current_version = 0.29.2.3 current_version = 0.30.0.4
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

@ -49,6 +49,6 @@ setup(
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.29.2.3", version="0.30.0.4",
zip_safe=False, zip_safe=False,
) )