eses 1.0.5__py3-none-any.whl → 1.0.7__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- eses/__init__.py +39 -96
- eses/version.py +1 -1
- {eses-1.0.5.dist-info → eses-1.0.7.dist-info}/METADATA +1 -1
- eses-1.0.7.dist-info/RECORD +7 -0
- eses-1.0.5.dist-info/RECORD +0 -7
- {eses-1.0.5.dist-info → eses-1.0.7.dist-info}/WHEEL +0 -0
- {eses-1.0.5.dist-info → eses-1.0.7.dist-info}/licenses/LICENSE +0 -0
- {eses-1.0.5.dist-info → eses-1.0.7.dist-info}/top_level.txt +0 -0
eses/__init__.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
import requests
|
2
2
|
import time
|
3
3
|
import threading
|
4
|
+
from concurrent.futures import ThreadPoolExecutor, as_completed
|
4
5
|
from datetime import datetime
|
5
6
|
from typing import List, Optional, Dict, Any
|
6
7
|
|
@@ -12,125 +13,67 @@ active_threads: List[threading.Thread] = []
|
|
12
13
|
|
13
14
|
# Debug Utilities
|
14
15
|
def _print_debug(msg: str) -> None:
|
15
|
-
"""Print debug messages with timestamps"""
|
16
16
|
timestamp = datetime.now().strftime("%H:%M:%S.%f")[:-3]
|
17
17
|
print(f"[{timestamp}] {msg}")
|
18
18
|
|
19
|
-
# Core Functions
|
20
|
-
def addproxy(proxy: str) -> None:
|
21
|
-
"""Add a proxy to the rotation pool"""
|
22
|
-
if not proxy.startswith(('http://', 'https://')):
|
23
|
-
proxy = f"http://{proxy}"
|
24
|
-
|
25
|
-
with proxy_lock:
|
26
|
-
if proxy not in proxies:
|
27
|
-
proxies.append(proxy)
|
28
|
-
_print_debug(f"Proxy added: {proxy}")
|
29
|
-
else:
|
30
|
-
_print_debug(f"Proxy already exists: {proxy}")
|
31
|
-
|
32
|
-
def clear_proxies() -> None:
|
33
|
-
"""Clear all registered proxies"""
|
34
|
-
with proxy_lock:
|
35
|
-
proxies.clear()
|
36
|
-
_print_debug("All proxies cleared")
|
37
|
-
|
38
|
-
def donate(
|
39
|
-
company_name: str,
|
40
|
-
country: str,
|
41
|
-
war_id: str,
|
42
|
-
donation_sum: str = "100000000000",
|
43
|
-
proxy: Optional[str] = None
|
44
|
-
) -> Optional[Dict[str, Any]]:
|
45
|
-
"""
|
46
|
-
Send a single donation request
|
47
|
-
Returns: JSON response if successful, None otherwise
|
48
|
-
"""
|
49
|
-
params = {
|
50
|
-
"Operation": "postDonation",
|
51
|
-
"available_patriotism": "0",
|
52
|
-
"company_id": "4456964",
|
53
|
-
"company_name": company_name,
|
54
|
-
"country": country,
|
55
|
-
"donation_sum": donation_sum,
|
56
|
-
"donation_type": "0",
|
57
|
-
"sender_company_id": "4456964",
|
58
|
-
"user_id": "3CE57CF11AFA43A1ABB7DB10431C2234",
|
59
|
-
"version_code": "22",
|
60
|
-
"war_id": war_id
|
61
|
-
}
|
62
|
-
|
63
|
-
proxy_display = proxy or "DIRECT"
|
64
|
-
_print_debug(f"Starting donation: {company_name} via {proxy_display}")
|
65
|
-
|
66
|
-
try:
|
67
|
-
start_time = time.time()
|
68
|
-
response = requests.post(
|
69
|
-
api_url,
|
70
|
-
params=params,
|
71
|
-
headers={"Content-Length": "0"},
|
72
|
-
proxies={"http": proxy, "https": proxy} if proxy else None,
|
73
|
-
timeout=10
|
74
|
-
)
|
75
|
-
elapsed_ms = int((time.time() - start_time) * 1000)
|
76
|
-
|
77
|
-
_print_debug(f"Success ({response.status_code}) in {elapsed_ms}ms")
|
78
|
-
_print_debug(f"Response: {response.text[:200]}")
|
79
|
-
return response.json()
|
80
|
-
except Exception as e:
|
81
|
-
_print_debug(f"Failed via {proxy_display}: {str(e)}")
|
82
|
-
return None
|
19
|
+
# Core Functions (keep all existing functions exactly the same until donatewithproxy)
|
83
20
|
|
84
21
|
def donatewithproxy(
|
85
22
|
company_name: str,
|
86
23
|
country: str,
|
87
24
|
war_id: str,
|
88
25
|
times: int = 1,
|
89
|
-
delay: int = 0
|
26
|
+
delay: int = 0,
|
27
|
+
max_workers: int = 50 # High concurrency for fast bursts
|
90
28
|
) -> None:
|
91
29
|
"""
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
30
|
+
Send ALL requests in parallel bursts:
|
31
|
+
1. Send (proxies × times) requests ALL AT ONCE
|
32
|
+
2. Wait for ALL to complete
|
33
|
+
3. Delay
|
34
|
+
4. Repeat
|
96
35
|
"""
|
97
36
|
def _worker():
|
98
37
|
cycle = 0
|
99
38
|
while True:
|
100
39
|
cycle += 1
|
101
|
-
_print_debug(f"===
|
40
|
+
_print_debug(f"=== BURST CYCLE {cycle} ===")
|
102
41
|
|
103
|
-
# Get current
|
42
|
+
# Get current proxies
|
104
43
|
with proxy_lock:
|
105
|
-
current_proxies = proxies.copy() or [None]
|
44
|
+
current_proxies = proxies.copy() or [None]
|
45
|
+
total_requests = len(current_proxies) * times
|
46
|
+
_print_debug(f"Preparing {total_requests} concurrent requests...")
|
106
47
|
|
107
|
-
#
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
48
|
+
# Send ALL requests in parallel
|
49
|
+
with ThreadPoolExecutor(max_workers=max_workers) as executor:
|
50
|
+
futures = []
|
51
|
+
for proxy in current_proxies:
|
52
|
+
for _ in range(times):
|
53
|
+
futures.append(
|
54
|
+
executor.submit(
|
55
|
+
donate,
|
56
|
+
company_name,
|
57
|
+
country,
|
58
|
+
war_id,
|
59
|
+
proxy=proxy
|
60
|
+
)
|
61
|
+
)
|
62
|
+
|
63
|
+
# Just wait for ALL to complete (don't process results)
|
64
|
+
for future in as_completed(futures):
|
65
|
+
try:
|
66
|
+
future.result(timeout=30)
|
67
|
+
except:
|
68
|
+
pass # Errors already logged by donate()
|
112
69
|
|
113
|
-
#
|
114
|
-
_print_debug(f"
|
70
|
+
# Burst complete
|
71
|
+
_print_debug(f"Burst {cycle} complete ({total_requests} requests). Waiting {delay}s...")
|
115
72
|
time.sleep(delay)
|
116
73
|
|
117
74
|
thread = threading.Thread(target=_worker, daemon=True)
|
118
75
|
thread.start()
|
119
76
|
active_threads.append(thread)
|
120
|
-
_print_debug(f"Started
|
121
|
-
|
122
|
-
def stop_all_donations() -> None:
|
123
|
-
"""Gracefully stop all active donation threads"""
|
124
|
-
for thread in active_threads:
|
125
|
-
thread.join(timeout=1)
|
126
|
-
active_threads.clear()
|
127
|
-
_print_debug("All donation threads stopped")
|
77
|
+
_print_debug(f"Started burst-mode controller (ID: {thread.ident})")
|
128
78
|
|
129
|
-
#
|
130
|
-
__all__ = [
|
131
|
-
'addproxy',
|
132
|
-
'clear_proxies',
|
133
|
-
'donate',
|
134
|
-
'donatewithproxy',
|
135
|
-
'stop_all_donations'
|
136
|
-
]
|
79
|
+
# Keep all other existing functions EXACTLY THE SAME
|
eses/version.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = "1.0.
|
1
|
+
__version__ = "1.0.7"
|
@@ -0,0 +1,7 @@
|
|
1
|
+
eses/__init__.py,sha256=rgWTvoS0kL1TDFa9JEBAHOnAKe8IoszKZRuVT64dOSM,2771
|
2
|
+
eses/version.py,sha256=98rTj2jvgnCZhTIeHpbml7e2xuhIqt_9BJNSWkWEQb8,21
|
3
|
+
eses-1.0.7.dist-info/licenses/LICENSE,sha256=aG4OK9mj5S-wNkDBtWV4cDftgrzOM901qqYwlGF2Q2U,1085
|
4
|
+
eses-1.0.7.dist-info/METADATA,sha256=KOr56rpLFiXh58DbEUiPY8h2euv3kn8LH48zxTVdYmA,667
|
5
|
+
eses-1.0.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
6
|
+
eses-1.0.7.dist-info/top_level.txt,sha256=bhF_PMTvXEr3zbQtvND1twvnv1MQUq2hcn8kREYmePw,5
|
7
|
+
eses-1.0.7.dist-info/RECORD,,
|
eses-1.0.5.dist-info/RECORD
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
eses/__init__.py,sha256=tPweWqPFegOItVtG_fCcBfF2AeeiZHHe3fwkTHfQx1g,4223
|
2
|
-
eses/version.py,sha256=e8JJ4MdiO15dQqeUEMek04s0R9lqLAAtJnt0wdJmUf8,20
|
3
|
-
eses-1.0.5.dist-info/licenses/LICENSE,sha256=aG4OK9mj5S-wNkDBtWV4cDftgrzOM901qqYwlGF2Q2U,1085
|
4
|
-
eses-1.0.5.dist-info/METADATA,sha256=ArCgEkeg4BJvB3x7bv_IfnyRp3F8J7YcC2b3opHHoUg,667
|
5
|
-
eses-1.0.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
6
|
-
eses-1.0.5.dist-info/top_level.txt,sha256=bhF_PMTvXEr3zbQtvND1twvnv1MQUq2hcn8kREYmePw,5
|
7
|
-
eses-1.0.5.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|