xync-client 0.0.114__py3-none-any.whl → 0.0.155__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.
Files changed (39) hide show
  1. xync_client/Abc/AdLoader.py +299 -0
  2. xync_client/Abc/Agent.py +94 -10
  3. xync_client/Abc/Ex.py +27 -22
  4. xync_client/Abc/HasAbotUid.py +10 -0
  5. xync_client/Abc/InAgent.py +0 -11
  6. xync_client/Abc/PmAgent.py +42 -35
  7. xync_client/Abc/xtype.py +24 -2
  8. xync_client/Binance/ex.py +2 -2
  9. xync_client/BingX/ex.py +2 -2
  10. xync_client/BitGet/ex.py +2 -2
  11. xync_client/Bybit/InAgent.py +229 -114
  12. xync_client/Bybit/agent.py +584 -572
  13. xync_client/Bybit/etype/ad.py +11 -56
  14. xync_client/Bybit/etype/cred.py +29 -9
  15. xync_client/Bybit/etype/order.py +55 -62
  16. xync_client/Bybit/ex.py +17 -4
  17. xync_client/Gate/ex.py +2 -2
  18. xync_client/Gmail/__init__.py +119 -98
  19. xync_client/Htx/agent.py +162 -31
  20. xync_client/Htx/etype/ad.py +18 -11
  21. xync_client/Htx/ex.py +9 -11
  22. xync_client/KuCoin/ex.py +2 -2
  23. xync_client/Mexc/agent.py +85 -0
  24. xync_client/Mexc/api.py +636 -0
  25. xync_client/Mexc/etype/order.py +639 -0
  26. xync_client/Mexc/ex.py +12 -10
  27. xync_client/Okx/ex.py +2 -2
  28. xync_client/Pms/Payeer/__init__.py +147 -43
  29. xync_client/Pms/Payeer/login.py +29 -2
  30. xync_client/Pms/Volet/__init__.py +148 -94
  31. xync_client/Pms/Volet/api.py +17 -13
  32. xync_client/TgWallet/ex.py +2 -2
  33. xync_client/details.py +44 -0
  34. xync_client/loader.py +2 -1
  35. xync_client/pm_unifier.py +1 -1
  36. {xync_client-0.0.114.dist-info → xync_client-0.0.155.dist-info}/METADATA +6 -1
  37. {xync_client-0.0.114.dist-info → xync_client-0.0.155.dist-info}/RECORD +39 -33
  38. {xync_client-0.0.114.dist-info → xync_client-0.0.155.dist-info}/WHEEL +0 -0
  39. {xync_client-0.0.114.dist-info → xync_client-0.0.155.dist-info}/top_level.txt +0 -0
@@ -1,22 +1,28 @@
1
1
  import logging
2
2
  import re
3
- from asyncio import run, ensure_future
3
+ from asyncio import run
4
+ from datetime import datetime
5
+ from decimal import Decimal
4
6
  from enum import StrEnum
5
- from typing import Literal
7
+ from hashlib import sha256
6
8
 
7
- from playwright.async_api import async_playwright, Page, Locator, Position, Playwright # , FloatRect
9
+ from PGram import Bot
10
+ from playwright.async_api import async_playwright, Page, Locator, Position, Playwright, Browser # , FloatRect
8
11
  from pyotp import TOTP
9
12
 
10
13
  # noinspection PyProtectedMember
11
14
  from playwright._impl._errors import TimeoutError
12
- from pyro_client.client.bot import BotClient
13
15
  from pyro_client.client.user import UserClient
16
+ from pyrogram.handlers import MessageHandler
17
+ from tortoise.timezone import now
18
+ from xync_schema import models
14
19
  from xync_schema.enums import UserStatus
15
- from xync_schema.models import Cur, User, PmAgent, Cred, PmCur, Fiat
20
+ from xync_schema.models import Cur, User, PmAgent, Cred, PmCur, Fiat, TopUp, Transfer
16
21
 
22
+ from xync_client.Abc.PmAgent import PmAgentClient
17
23
  from xync_client.Gmail import GmClient
18
24
  from xync_client.Pms.Volet.api import APIClient
19
- from xync_client.loader import TOKEN
25
+ from xync_client.loader import PAY_TOKEN
20
26
 
21
27
 
22
28
  class CaptchaException(Exception): ...
@@ -31,14 +37,6 @@ class NoCodeException(Exception): ...
31
37
  class NoMailException(Exception): ...
32
38
 
33
39
 
34
- class Pages(StrEnum):
35
- base_url = "https://account.volet.com/"
36
- LOGIN = base_url + "login"
37
- OTP_LOGIN = base_url + "login/otp"
38
- HOME = base_url + "pages/transaction"
39
- SEND = base_url + "pages/transfer/wallet"
40
-
41
-
42
40
  def parse_transaction_info(text: str) -> dict[str, str] | None:
43
41
  # Поиск ID транзакции
44
42
  transaction_id_match = re.search(r"Transaction ID:\s*([\w-]+)", text)
@@ -57,104 +55,159 @@ def parse_transaction_info(text: str) -> dict[str, str] | None:
57
55
  return None
58
56
 
59
57
 
60
- class Client:
58
+ class Client(PmAgentClient):
59
+ class Pages(StrEnum):
60
+ base = "https://account.volet.com/"
61
+ LOGIN = base + "login"
62
+ OTP_LOGIN = base + "login/otp"
63
+ # HOME = base + "pages/transaction"
64
+ SEND = base + "pages/transfer/wallet"
65
+
66
+ async def check_in(
67
+ self, amount: int | Decimal | float, cur: str, dt: datetime, tid: str | int = None
68
+ ) -> float | None:
69
+ return await (self.api.check_by_id(tid) if tid else self.api.check_by_amount(amount, cur))
70
+
71
+ async def proof(self) -> bytes:
72
+ pass
73
+
61
74
  uid: int
62
75
  agent: PmAgent
63
- bot: UserClient
76
+ abot: Bot
77
+ ubot: UserClient
64
78
  api: APIClient
65
79
  page: Page
66
80
  gmail: GmClient
81
+ norm: str = "payeer"
82
+ pages: type(StrEnum) = Pages
83
+ with_userbot: bool = True
67
84
 
68
- def __init__(self, uid: int):
69
- self.uid = uid
70
- self.gmail = GmClient(uid)
71
-
72
- async def start(self, pw: Playwright, headed: bool = False):
73
- self.agent = await PmAgent.get(
74
- user__username_id=self.uid, user__status__gte=UserStatus.PAY, pm__norm="volet"
75
- ).prefetch_related("user__gmail", "user__username__session")
85
+ def __init__(self, agent: PmAgent, browser: Browser, abot: Bot):
86
+ super().__init__(agent, browser, abot)
87
+ self.gmail = GmClient(agent.user)
76
88
  self.api = APIClient(self.agent.auth["api"], self.agent.auth["password"], self.agent.auth["login"])
77
- # await self.upd_balances()
78
- bot = await BotClient(TOKEN)
79
- self.bot = await UserClient(self.uid, bot)
80
- await self.bot.start()
81
-
82
- browser = await pw.chromium.launch(channel="chrome", headless=not headed, timeout=9000)
83
- context = await browser.new_context(storage_state=self.agent.state, locale="en")
84
- self.page = await context.new_page()
85
- ensure_future(self.gmail.start(pw, headed))
86
- await self.go(Pages.HOME)
87
- if self.page.url == Pages.LOGIN:
88
- await self.login()
89
- # elif self.page.url == Pages.OTP_LOGIN:
90
- # await self.login_otp()
91
- if self.page.url != Pages.HOME:
92
- await self.bot.receive("Not logged in!", photo=await self.page.screenshot())
93
- raise Exception(f"User {self.agent.user_id} has not logged in")
94
-
95
- async def wait_for_code(self, typ: Literal["login", "send"]) -> str:
96
- code = await self.bot.wait_from(243630567, f"otp_{typ}")
97
- return code[-6:]
98
-
99
- async def login(self):
100
- await self.page.locator("input#j_username").fill("mixartemev@gmail.com")
101
- await self.page.locator("input#j_password").fill("mixfixX98")
89
+
90
+ @staticmethod
91
+ def form_redirect(topup: TopUp) -> tuple[str, dict | None]:
92
+ ac_account_email = topup.topupable.auth["ac_account_email"]
93
+ ac_sci_name = topup.topupable.auth["ac_sci_name"]
94
+ ac_order_id = str(topup.id)
95
+ ac_amount = "{0:.2f}".format(topup.amount * 0.01)
96
+ ac_currency = topup.cur.ticker
97
+ ac_comments = "XyncPay top up"
98
+ secret = topup.topupable.auth["secret"]
99
+ data = [ac_account_email, ac_sci_name, ac_amount, ac_currency, secret, ac_order_id]
100
+
101
+ ac_sign = sha256(":".join(data).encode()).hexdigest()
102
+
103
+ params = {
104
+ "ac_account_email": ac_account_email,
105
+ "ac_sci_name": ac_sci_name,
106
+ "ac_amount": ac_amount,
107
+ "ac_currency": ac_currency,
108
+ "ac_order_id": ac_order_id,
109
+ "ac_sign": ac_sign,
110
+ "ac_comments": ac_comments,
111
+ }
112
+ url = "https://account.volet.com/sci/"
113
+ return url, params
114
+
115
+ def get_topup(self, tid: str) -> dict:
116
+ t = self.api.check_by_id(tid)
117
+ return t["status"] == "COMPLETED" and {
118
+ "pmid": t["id"],
119
+ "from_acc": t["walletSrcId"],
120
+ "oid": t["orderId"],
121
+ "amount": int(t["amount"] * 100),
122
+ "ts": t["updatedTime"],
123
+ }
124
+
125
+ async def wait_for_code(self, uid: int, topic: str, hg: tuple[MessageHandler, int]) -> str:
126
+ code = await self.ubot.wait_from(uid, topic, hg)
127
+ return code and code[-6:]
128
+
129
+ async def _login(self):
130
+ ll = self.page.locator("input#j_username")
131
+ await ll.fill(self.agent.auth["login"])
132
+ await self.page.locator("input#j_password").fill(self.agent.auth["password"])
133
+ await self.page.wait_for_timeout(300)
134
+ await ll.click()
135
+ await ll.press(key="ArrowLeft")
136
+ await ll.blur()
137
+ volet_bot_id, topic = 243630567, "otp_login"
102
138
  await self.page.locator("input#loginToAdvcashButton", has_text="log in").hover()
139
+ hg = self.ubot.subscribe_for(volet_bot_id, topic)
103
140
  await self.page.locator("input#loginToAdvcashButton:not([disabled])", has_text="log in").click()
104
- await self.page.wait_for_url(Pages.OTP_LOGIN)
105
- await self.login_otp()
106
-
107
- async def login_otp(self):
108
- if not (code := await self.wait_for_code("login")):
109
- await self.bot.receive("no login code", photo=await self.page.screenshot())
141
+ await self.page.wait_for_url(self.pages.OTP_LOGIN)
142
+ if not (code := await self.wait_for_code(volet_bot_id, topic, hg)):
143
+ await self.ubot.receive("no login code", photo=await self.page.screenshot())
110
144
  raise NoCodeException(self.agent.user_id)
111
145
  await self.page.locator("input#otpId").fill(code)
112
146
  await self.page.click("input#checkOtpButton")
113
- await self.page.wait_for_url(Pages.HOME)
147
+ await self.page.wait_for_url(self.pages.SEND, wait_until="domcontentloaded")
148
+ # save state
149
+ # noinspection PyTypeChecker
150
+ self.agent.state = await self.page.context.storage_state()
151
+ await self.agent.save()
114
152
 
115
- async def send(self, dest: str, amount: float):
116
- await self.go(Pages.SEND)
153
+ async def send(self, t: Transfer) -> tuple[str, bytes] | float:
154
+ dest, cur = t.order.cred.detail, t.order.cred.pmcur.cur.ticker
155
+ amount = round(t.order.amount * 10**-t.order.cred.pmcur.cur.scale, t.order.cred.pmcur.cur.scale)
156
+ self.last_active = now()
157
+ curs_map = {"RUB": "Ruble"}
158
+ await self.go(self.pages.SEND, False)
117
159
  await self.page.click("[class=combobox-account]")
118
- await self.page.click('[class=rf-ulst-itm] b:has-text("Ruble ")')
119
- await self.page.wait_for_timeout(200)
160
+ await self.page.click(f'[class=rf-ulst-itm] b:has-text("{curs_map[cur]}")')
161
+ await self.page.wait_for_selector(f"#srcCurrency:has-text('{cur}')")
120
162
  await self.page.fill("#srcAmount", str(amount))
121
- await self.page.fill("#destWalletId", dest)
122
- await self.page.wait_for_timeout(300)
163
+ dw = self.page.locator("#destWalletId")
164
+ await dw.fill(dest)
165
+ await dw.blur()
166
+ await self.page.wait_for_selector(f"#destCurrency:has-text('{cur}')")
167
+ volet_bot_id, topic = 243630567, "otp_send"
168
+ hg = self.ubot.subscribe_for(volet_bot_id, topic)
123
169
  await self.page.locator("form#mainForm input[type=submit]", has_text="continue").click()
124
170
  # todo: check success confirming
125
171
  if otp := self.agent.auth.get("otp"):
126
172
  totp = TOTP(otp)
127
173
  code = totp.now()
128
174
  elif self.agent.user.username.session:
129
- if not (code := await self.wait_for_code("send")):
130
- if 1: # todo: need main confirm
131
- await self.gmail.mail_confirm()
132
- await self.bot.receive("no send trans code", photo=await self.page.screenshot())
175
+ if not (code := await self.wait_for_code(volet_bot_id, topic, hg)):
176
+ if 1: # todo: Is mail_confirm required?
177
+ if _mcr := await self.gmail.volet_confirm(amount, t.updated_at):
178
+ ...
179
+ # todo: click Continue
180
+ if not (code := await self.wait_for_code(volet_bot_id, topic, hg)):
181
+ code = await self.wait_for_code(volet_bot_id, topic, hg)
182
+ if not code:
183
+ await self.receive("no send trans code", photo=await self.page.screenshot())
133
184
  raise NoCodeException(self.agent.user_id)
134
185
  else:
135
186
  raise OtpNotSetException(self.agent.user_id)
136
187
  await self.page.fill("#securityValue", code)
137
188
  await self.page.locator("input[type=submit]", has_text="confirm").click()
138
- await self.page.wait_for_url(Pages.SEND)
189
+ await self.page.wait_for_url(self.pages.SEND)
190
+ tid = await self.page.text_content("ul.p-confirmation-info dl.success>dd")
139
191
  await self.page.get_by_role("heading").click()
140
- slip = await self.page.screenshot(clip={"x": 440, "y": 205, "width": 420, "height": 360})
141
- await self.bot.receive(f"{amount} to {dest} sent", photo=slip)
192
+ slip = await self.page.screenshot(clip={"x": 440, "y": 205, "width": 440, "height": 415})
193
+ await self.receive(f"{amount} to {dest} sent", photo=slip)
194
+ return tid, slip
142
195
 
143
- async def go(self, url: Pages):
196
+ async def go(self, url: Pages, commit: bool = True):
144
197
  try:
145
- await self.page.goto(url)
198
+ await self.page.goto(url, wait_until="commit" if commit else "domcontentloaded")
146
199
  if len(await self.page.content()) < 1000: # todo: fix captcha symptom
147
200
  await self.captcha_click()
148
201
  except Exception as e:
149
- await self.bot.receive(repr(e), photo=await self.page.screenshot())
202
+ await self.receive(repr(e), photo=await self.page.screenshot())
150
203
  raise e
151
204
 
152
205
  async def send_cap_help(self, xcap: Locator):
153
206
  if await xcap.count():
154
207
  bb = await xcap.bounding_box(timeout=2000)
155
208
  byts = await self.page.screenshot(clip=bb)
156
- await self.bot.receive("put x, y", photo=byts)
157
- txt = await self.bot.bot.wait_from(self.bot.me.id, "xy", timeout=59)
209
+ await self.receive("put x, y", photo=byts)
210
+ txt = await self.ubot.wait_from(self.uid, "xy", timeout=59) # todo: fix
158
211
  for xy in txt.split(";"):
159
212
  px, py = xy
160
213
  x, y = bb["x"] + bb["width"] * int(px) / 100, bb["y"] + bb["height"] * int(py) / 100
@@ -173,7 +226,7 @@ class Client:
173
226
  if await xcap.count():
174
227
  await self.send_cap_help(xcap)
175
228
  try:
176
- await self.page.wait_for_url(lambda url: url != captcha_url)
229
+ await self.page.wait_for_url(lambda url: url != captcha_url, wait_until="commit")
177
230
  except TimeoutError: # if page no changed -> captcha is undone
178
231
  await self.page.screenshot()
179
232
  raise CaptchaException(self.page.url)
@@ -204,35 +257,36 @@ class Client:
204
257
  ]
205
258
  [await Fiat.update_or_create({"amount": amount}, cred=cred) for cred, amount in creds]
206
259
 
207
- async def stop(self):
208
- # save state
209
- self.agent.state = await self.page.context.storage_state()
210
- await self.agent.save()
211
- # closing
212
- await self.bot.stop()
213
- await self.gmail.stop()
214
- await self.page.context.close()
215
- await self.page.context.browser.close()
216
-
217
260
 
218
261
  async def _test():
219
262
  from x_model import init_db
220
- from xync_schema import TORM
263
+ from xync_client.loader import TORM
221
264
 
222
265
  _ = await init_db(TORM, True)
223
- logging.basicConfig(level=logging.DEBUG)
224
- uid = 193017646
266
+ logging.basicConfig(level=logging.INFO)
267
+ abot = Bot(PAY_TOKEN)
225
268
  playwright: Playwright = await async_playwright().start()
226
- va = Client(uid)
269
+
227
270
  try:
228
- await va.start(playwright)
229
- await va.send("alena.artemeva25@gmail.com", 7.98)
230
- await va.wait_for_payments()
271
+ o = await models.Order.create(ad_id=7, exid=1, amount=900, cred_id=522, taker_id=419)
272
+ await o.fetch_related("cred__pmcur__cur", "ad")
273
+ pma = await models.PmAgent.get(
274
+ active=True,
275
+ auth__isnull=False,
276
+ pm_id=o.cred.pmcur.pmex_exid,
277
+ user__person__actors=o.ad.maker_id,
278
+ user__status=UserStatus.ACTIVE,
279
+ ).prefetch_related("pm", "user__gmail", "user__username__session")
280
+ t = models.Transfer(amount=9, created_at=now(), order=o)
281
+ pcl: Client = pma.client(abot)
282
+ pcl = await pcl.start(playwright, True, True)
283
+ await pcl.send(t)
284
+ await pcl.wait_for_payments()
231
285
  except TimeoutError as te:
232
- await va.bot.receive(repr(te), photo=await va.page.screenshot())
286
+ await pcl.receive(repr(te), photo=await pcl.page.screenshot())
233
287
  raise te
234
288
  finally:
235
- await va.stop()
289
+ await pcl.stop()
236
290
 
237
291
 
238
292
  if __name__ == "__main__":
@@ -9,6 +9,8 @@ from zeep.client import Client
9
9
 
10
10
  from xync_client.loader import TORM
11
11
 
12
+ period = 5
13
+
12
14
 
13
15
  class APIClient:
14
16
  wsdl = "https://wallet.advcash.com/wsm/merchantWebService?wsdl"
@@ -83,25 +85,27 @@ class APIClient:
83
85
  params.update(walletId=to)
84
86
  return self.make_request("sendMoney", params)
85
87
 
88
+ async def check_by_amount(self, amount: decimal, cur: str = "RUB", timeout: int = 5 * 60, past: int = 0):
89
+ hist: list = self.make_request("history", {"transactionDirection": "INCOMING", "count": 3, "from": 0})
90
+ if int(hist[0].amount) == int(amount):
91
+ return hist[0]["amount"], hist[0]["id"]
92
+ await sleep(period)
93
+ past += period
94
+ if past < timeout:
95
+ return await self.check_by_amount(amount, cur, timeout, past)
96
+ return None, None
86
97
 
87
- period = 5
88
-
89
-
90
- async def check_payment(cl: APIClient, amount: decimal, cur: str = "RUB", timeout: int = 5 * 60, past: int = 0):
91
- hist: list = cl.make_request("history", {"transactionDirection": "INCOMING", "count": 3, "from": 0})
92
- if int(hist[0].amount) == int(amount):
93
- return hist[0]
94
- await sleep(period)
95
- past += period
96
- if past < timeout:
97
- return await check_payment(cl, amount, cur, timeout, past)
98
- return False
98
+ def check_by_id(self, tid: str):
99
+ if t := self.make_request("findTransaction", tid):
100
+ return t["amount"], t["id"]
101
+ return None, None
99
102
 
100
103
 
101
104
  async def main():
102
105
  _ = await init_db(TORM, True)
103
106
  cl = APIClient("main", "mixfixX98", "mixartemev@gmail.com")
104
- b = cl.get_balances()
107
+ # b = cl.get_balances()
108
+ b = cl.check_by_id("ce9a52be-8085-431e-8e6e-b0be427c6c55")
105
109
  cl.make_request("history", {"transactionDirection": "INCOMING", "count": 100, "from": 0})
106
110
  print(b)
107
111
 
@@ -16,7 +16,7 @@ from xync_client.TgWallet.pyd import (
16
16
  _PmsTrait,
17
17
  _BaseAd,
18
18
  )
19
- from xync_client.loader import TOKEN, TORM
19
+ from xync_client.loader import NET_TOKEN, TORM
20
20
  from xync_client.Abc.Ex import BaseExClient
21
21
  from xync_client.Abc.xtype import MapOfIdsList
22
22
  from xync_client.TgWallet.auth import AuthClient
@@ -156,7 +156,7 @@ class ExClient(BaseExClient, AuthClient):
156
156
  async def _test():
157
157
  await init_db(TORM)
158
158
  tgex = await models.Ex.get(name="TgWallet")
159
- async with FileClient(TOKEN) as b:
159
+ async with FileClient(NET_TOKEN) as b:
160
160
  cl: ExClient = tgex.client(b)
161
161
 
162
162
  await cl.set_coins()
xync_client/details.py ADDED
@@ -0,0 +1,44 @@
1
+ import asyncio
2
+ from xync_client.loader import TORM
3
+ from x_model import init_db
4
+ from xync_schema import models
5
+ import re
6
+ from typing import List, Dict
7
+
8
+ details = ["дай(те)?", "номер", "рек(и|визиты)", "карту", "банк(и|а)?", "куда", "(на )?как(ой|ую)", "актуал"]
9
+
10
+ begging = ["вз (лайк|отзыв)", "взаим(о|ный)?", "отзыву?", "like", "лайкни"]
11
+
12
+ greetings = [
13
+ "привет(ствую|ик)?",
14
+ "здаровa?",
15
+ "здоров(а|енько)",
16
+ "здравствуй(те)?",
17
+ "Добрый ?(день|вечер)?",
18
+ "h(i|ello)",
19
+ "сал(ют|лам)",
20
+ "ку",
21
+ "йо",
22
+ "хай",
23
+ "добро пожаловать",
24
+ ]
25
+
26
+
27
+ async def search_messages(phrases_to_find) -> List[Dict[str, str]]:
28
+ _ = await init_db(TORM, True)
29
+ msgs = await models.Msg.all().values("txt")
30
+ patterns = [re.compile(rf"\b{phrase}\b", re.IGNORECASE) for phrase in phrases_to_find]
31
+ results = []
32
+ for msg in msgs:
33
+ if not msg["txt"]:
34
+ continue
35
+ for pattern in patterns:
36
+ if pattern.search(msg["txt"]):
37
+ results.append({pattern.pattern: msg["txt"]})
38
+ for i in results:
39
+ print(i)
40
+ return results
41
+
42
+
43
+ if __name__ == "__main__":
44
+ asyncio.run(search_messages(greetings))
xync_client/loader.py CHANGED
@@ -4,7 +4,8 @@ from xync_schema import models
4
4
 
5
5
  load_dotenv()
6
6
 
7
- TOKEN = env("TOKEN")
7
+ NET_TOKEN = env("NET_TOKEN")
8
+ PAY_TOKEN = env("PAY_TOKEN")
8
9
  PG_DSN = f"postgres://{env('POSTGRES_USER')}:{env('POSTGRES_PASSWORD')}@{env('POSTGRES_HOST', 'xyncdbs')}:{env('POSTGRES_PORT', 5432)}/{env('POSTGRES_DB', env('POSTGRES_USER'))}"
9
10
  TORM = {
10
11
  "connections": {"default": PG_DSN},
xync_client/pm_unifier.py CHANGED
@@ -17,7 +17,7 @@ class PmUnifier:
17
17
  pms: dict[str, PmUni] = {} # {origin: normalized}
18
18
 
19
19
  re_bank = [
20
- r"^bank (?!of )|bank$",
20
+ r"^bank (?!(of |transfer))|(?<!(to|the)\s) bank$",
21
21
  r" banka$",
22
22
  r" bankas$",
23
23
  r" bankasi$",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xync-client
3
- Version: 0.0.114
3
+ Version: 0.0.155
4
4
  Author-email: Mike Artemiev <mixartemev@gmail.com>
5
5
  Project-URL: Homepage, https://gitlab.com/XyncNet/client
6
6
  Project-URL: Repository, https://gitlab.com/XyncNet/client
@@ -8,12 +8,17 @@ Requires-Python: >=3.11
8
8
  Requires-Dist: asynchuobi
9
9
  Requires-Dist: bs4
10
10
  Requires-Dist: bybit-p2p
11
+ Requires-Dist: google-api-python-client
12
+ Requires-Dist: google-auth-httplib2
13
+ Requires-Dist: google-auth-oauthlib
11
14
  Requires-Dist: requests-toolbelt
12
15
  Requires-Dist: msgspec
13
16
  Requires-Dist: python-binance
14
17
  Requires-Dist: pybit
15
18
  Requires-Dist: pyotp
19
+ Requires-Dist: pypng
16
20
  Requires-Dist: kurigram
21
+ Requires-Dist: payeer-api
17
22
  Requires-Dist: playwright
18
23
  Requires-Dist: python-dotenv
19
24
  Requires-Dist: python-okx
@@ -1,20 +1,23 @@
1
1
  xync_client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- xync_client/loader.py,sha256=qAOQqE4id42aOG3jwc0UMBB8roHd6X3_O08qRG7Bfxw,563
3
- xync_client/pm_unifier.py,sha256=T2Xh-tvcu114P2YBI6RK_XDiaIhyq6ABMrXDuXPlx7A,6541
4
- xync_client/Abc/Agent.py,sha256=OJaJ1RIMDYAS4xeefeXxVIVI0EKnMczQtrO35MLzqr4,5390
2
+ xync_client/details.py,sha256=21itVPCgAtaYRR1H9J9oYudj95gafcFjExUN6QL17OI,1330
3
+ xync_client/loader.py,sha256=hxf8ob50DO7r_qjr2qBoO7IyjkXeHHzVQ63YjXerjoU,600
4
+ xync_client/pm_unifier.py,sha256=DYkFYXzmhVEh8WJvI---3Geas34mZ83cT1O-88D68YQ,6568
5
+ xync_client/Abc/AdLoader.py,sha256=EsrQY_yjhRE2V-4eK2nfq1aAmZPY-FX7x9yKXfp7ILk,14066
6
+ xync_client/Abc/Agent.py,sha256=FjpFWnVj6FB498KCDtGPzCMHdRuOo4ejPvRmOeug7qM,8764
5
7
  xync_client/Abc/Asset.py,sha256=hlgyFaU9byr2N2r8Heh-_ICx49SKuKxfRTUA4yQWmEw,454
6
8
  xync_client/Abc/Auth.py,sha256=OPQXN7_XYQZP9431ylFksd6JDusbKG8N_1g6CXTZ6yY,1495
7
9
  xync_client/Abc/BaseTest.py,sha256=vaAs5Z4HYV7k_C3zQz6JKO75s2hXtVbBI3-0Srkzv5Q,2388
8
- xync_client/Abc/Ex.py,sha256=n41-XCjoIV-KpC_lK3jO049tQKbFmE0eDU3SDlgZTws,12986
10
+ xync_client/Abc/Ex.py,sha256=s6v_jR_Wqj64RxU6lDd6-IYpmGBcWNASsBqkX3MCoPo,13554
9
11
  xync_client/Abc/Exception.py,sha256=Sts7RpP370NBdjaH_cyXDdHtjge8zXNUGWCrKw49Zyk,482
10
- xync_client/Abc/InAgent.py,sha256=svKGATUM0c9YIDDEVLc-NxpUNWqZoVr5PjxoxK64RKs,650
12
+ xync_client/Abc/HasAbotUid.py,sha256=LsTHHjMHBauCwJoqgDa9Lx4R6xsDOHfsN4jM539Bpqg,279
13
+ xync_client/Abc/InAgent.py,sha256=8BnZ7VzWLIJY93xnNTqlpY3JdarQkkpRRjDDEALaVAA,303
11
14
  xync_client/Abc/Order.py,sha256=7-FGIJu5z9aYi0A_eJV4F-cp_6Mz_izNpefexDQZvHw,2428
12
- xync_client/Abc/PmAgent.py,sha256=0uUjR_3ClcuMHgqVksvQngvI3UC05bdaBDTQs46LWMs,4196
13
- xync_client/Abc/xtype.py,sha256=o1JEzWmEXCPddtlqWZ6HRTZTKX6SAnvsztbASj21zOQ,2584
15
+ xync_client/Abc/PmAgent.py,sha256=Xl-0-KMwcTp_7qIt7NV7-aD22j955tFYFqcHHbmGMTQ,4193
16
+ xync_client/Abc/xtype.py,sha256=H2S5UV67v5Uiy0KC3JI4N142MYQWS_8d9d3N8_WHnVs,3050
14
17
  xync_client/Binance/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
18
  xync_client/Binance/binance_async.py,sha256=LP2DZaHwkfsp_4Tjvetb-1ntjQtJfODF0OgZpoPx4KU,2688
16
19
  xync_client/Binance/earn_api.py,sha256=hvk0MaVTLszIglQXVhbUjGcaHfbF9Ul7FFXmy94U2so,4411
17
- xync_client/Binance/ex.py,sha256=QACoWp_xFdS9LD1aWv6zZHw-FMCxx1YXkIvt7zn_1gg,5360
20
+ xync_client/Binance/ex.py,sha256=m9KvSS-FjPe0BH-npkoqaIZ2WyNUsddxEgrbUpFzGsw,5368
18
21
  xync_client/Binance/exceptions.py,sha256=An-TK5_SKmGXMdGIs_K59u-0iBpqVgOPfkJqrEELcGQ,847
19
22
  xync_client/Binance/sapi.py,sha256=_2eXFtcFIerjvyyyqqSnwZxCqQPiMUdqAXJj7hyOQDQ,9584
20
23
  xync_client/Binance/web_c2c.py,sha256=WZ2BVq26ZcdOEcRvRsEKxvwe6x-XQ51b-nEFFAaRNOk,9249
@@ -23,46 +26,49 @@ xync_client/Binance/etype/pm.py,sha256=rorFX4HDjqDQwJ7Kqx41KOO1JJAi4yWbe4pkGAMmR
23
26
  xync_client/BingX/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
27
  xync_client/BingX/agent.py,sha256=F-QvzPCwwSvgFe5DafscT-puISbqCw23iTnvbfXlV-k,4318
25
28
  xync_client/BingX/base.py,sha256=Zx2H21iZrF94cMOz3imz6djMMNzAaB_iJSzDSP6beXo,739
26
- xync_client/BingX/ex.py,sha256=m47cXkmd6vzh_i4NuNeCcYHcCYz2dX5Jt7q-UTP6CEY,4267
29
+ xync_client/BingX/ex.py,sha256=QzHaEEB_mnOSdMSfvg3Odd9oHortj6wZeIC7fPPFFf4,4275
27
30
  xync_client/BingX/req.mjs,sha256=JvLv1KBKsiIVVvRmAFC0RqpsxkBcwqbjk2_PGCubnX0,304
28
31
  xync_client/BingX/sign.js,sha256=uTfbKV0Y7bKapOs1AtlT1FmduelwvH2pGqIxCK2z5NY,100086
29
32
  xync_client/BingX/etype/ad.py,sha256=aUsZcvhk418d73SaOQlZYYYikHN1zFVYj49d5Xzb6qc,1360
30
33
  xync_client/BingX/etype/pm.py,sha256=hKaUHwkZC2ioBv_mNfIIutDkNNhO_ljhsCtSy2uwLAY,128
31
34
  xync_client/BitGet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
35
  xync_client/BitGet/agent.py,sha256=YVs3bDY0OcEJGU7m2A8chzO6PFhWDnQQrA-E6MVkBBg,3030
33
- xync_client/BitGet/ex.py,sha256=nAexKRkguIhq4fYP1tkIaou6oBFjjV2xwlajlJ-9DAE,3757
36
+ xync_client/BitGet/ex.py,sha256=uEvvXuLaJv8o8BFi0bMA3XyBuTfVDWagAjLOHZl-xlE,3765
34
37
  xync_client/BitGet/etype/ad.py,sha256=fysSW47wGYjSOPUqY864z857AJz4gjN-nOkI1Jxd27U,1838
35
38
  xync_client/BitPapa/ex.py,sha256=U-RRB_RSOtErfRgxOZYWegZ_td_uZO37YKo3Jxchf_w,912
36
- xync_client/Bybit/InAgent.py,sha256=OgzDZTwKh0uHsSdRNKZnX4LnA6kHcxLn6fRsS8WRVqE,20855
37
- xync_client/Bybit/agent.py,sha256=ypo2MXLP5IAjJto1r0WXu1bLYgyON7mXE0XBL95LeDg,58801
38
- xync_client/Bybit/ex.py,sha256=DgPOmnjphcSCSsO4ZQjnIlWICNzdtKhNIpVsU93s99k,4707
39
+ xync_client/Bybit/InAgent.py,sha256=sHpugXfgeAYG68z6cKiTc3QSeGGNGKUSCh5NzXIbAKw,26657
40
+ xync_client/Bybit/agent.py,sha256=ekzuPdZQpKMhONe_tZT54nri2D0aYRMao4UOjIE123A,59456
41
+ xync_client/Bybit/ex.py,sha256=ovbCZ1-36KIo-8FYb8yt_VNE3UZszBoik10Adzrpi2Y,5088
39
42
  xync_client/Bybit/order.py,sha256=H4UIb8hxFGnw1hZuSbr0yZ4qeaCOIZOMc6jEst0ycBs,1713
40
43
  xync_client/Bybit/web_earn.py,sha256=qjqS10xlFc8r40IhDdPZ0LxA2dFEGbvBGXdsrUUJCMo,3019
41
44
  xync_client/Bybit/web_p2p.py,sha256=sAXzK03t6jwDnz4rrvP2IzI0KxfKa7C_5GuzH1HwLuA,11768
42
45
  xync_client/Bybit/ws.py,sha256=OQjZHo_MiAH1dlOs3c-aUZBKyqToNTmH560udh6RYDE,1431
43
- xync_client/Bybit/etype/ad.py,sha256=HJOHi9KrbLQMpwEyd4oA8436QTNRqrd2HWFF-JNZGDo,8066
44
- xync_client/Bybit/etype/cred.py,sha256=dgFExLB4e5Wf6SqfU9SOdeooHQa84DRbTGm_OJhNw_o,1354
45
- xync_client/Bybit/etype/order.py,sha256=M9hxHCELTb2llz2c8q0QrfG-lCxuUb-Zwmag82ggXn0,8073
46
- xync_client/Gate/ex.py,sha256=1vSXctCOyZfYDojkHU6u4YSXwYTLg-e7BfAdGKvZ_UM,3727
46
+ xync_client/Bybit/etype/ad.py,sha256=r356t4Kmho5Q6BAS0JWyRmsxui427W9O2Y1glUU6l3g,5091
47
+ xync_client/Bybit/etype/cred.py,sha256=CH6xqHh1214bLhHy_K9eVBb1SJVhWBfGb0l3LtBf3fU,1701
48
+ xync_client/Bybit/etype/order.py,sha256=A1LQSqSOIgDu-dfZDhAdSnED_Xty4vXdJEoikRbelH0,8350
49
+ xync_client/Gate/ex.py,sha256=QbhB3u7TWnvVGD-AknB2nay6KZjEXQ-1JT9UacX4sWI,3735
47
50
  xync_client/Gate/premarket.py,sha256=IW-CgkmNJePJR2j_NRfULNKTePMX35XlhldqdiO76zY,2138
48
51
  xync_client/Gate/etype/ad.py,sha256=-EwtFcOWWvtE6UjaOdsuXWDTCVjAIRK0kSEsqPP4Yls,1296
49
- xync_client/Gmail/__init__.py,sha256=6aXhqtiVS5lA6O_W1276kamnixlH5OmUFklqwbVG4RA,4647
50
- xync_client/Htx/agent.py,sha256=rOURgTeY9TsA-IzT78l5-Ze91i0x1PY683mrX38MSgs,7356
52
+ xync_client/Gmail/__init__.py,sha256=9JGT8PyzJaOTVvaFV0Gki3Fdo6Bp6m6DnWOPGZJ-eAA,5436
53
+ xync_client/Htx/agent.py,sha256=NqoiK95Zhxle5ZqB0aa1kfIbQo2qEGjkhlzwr4LA9Y0,12573
51
54
  xync_client/Htx/earn.py,sha256=jL6eRwytZEMRom_3bFm1DYthi_GFg-E1Mm3ZDXENHSg,2386
52
- xync_client/Htx/ex.py,sha256=KobBInICyuEdvwRbMe8SYfAQYczn5_7CvNdu5_CXvL0,6066
55
+ xync_client/Htx/ex.py,sha256=66GTk7kitTXrNdwM0xRJTc2sIlLk0VUOAWunYG7iF-s,6051
53
56
  xync_client/Htx/etype/__init__.py,sha256=sZIhFOxj2dRQRmMe86-y9vlzOGAPo1qoOi6u1qVxWr0,123
54
- xync_client/Htx/etype/ad.py,sha256=bShCGHRAvFJxt2io5rjQrEFMB0zZzkTww7sBxIcmLVM,2000
57
+ xync_client/Htx/etype/ad.py,sha256=2nTTUgL1utDBVUYiVpDzCowlXFg-94leihFpAAguK8A,2311
55
58
  xync_client/Htx/etype/cred.py,sha256=sAOQTsk7BA8zBWUkkwM6vIQcq1LcSK5NLYGrkTdtkQ8,1129
56
59
  xync_client/Htx/etype/pm.py,sha256=ILCP9reFRkfuzmtsJDYomJ3WBTU4s_KE-69JksTxwMk,375
57
60
  xync_client/Htx/etype/test.py,sha256=uomFicPE1OoA3WXnXOxhsTtGJEpVCQ0CId9D0NI6vto,893
58
- xync_client/KuCoin/ex.py,sha256=Ovni7nj4-Z5jeP_YBPQAAq8N31PAu45mzsVIbYlmyMA,3229
61
+ xync_client/KuCoin/ex.py,sha256=w-6-aedlC1mYf8LShMv6pOrQzqMR9E6yIyXGUHQP888,3237
59
62
  xync_client/KuCoin/web.py,sha256=--OHS0Z29xjfNUjdTL7K0EDmU4dwej95OJ8Sv4PsxLI,920
60
63
  xync_client/KuCoin/etype/ad.py,sha256=MTx90Qo2xFKvfgIr4_qMowjwO23HVpFCD6J7INNFDuQ,1223
61
64
  xync_client/KuCoin/etype/pm.py,sha256=S50S5fyY5YeWlcPwO66o-GsPcdqgoeXuxvmEIy6Zqvs,130
62
- xync_client/Mexc/ex.py,sha256=WuR-MLwcz5rkHuCewE_jkxv3n6_2ZEPSUaU9SzFnGms,4287
65
+ xync_client/Mexc/agent.py,sha256=7xhT-UH3aLFAVAfnGUhHqOauNeADNt84ifsT-x3ydq4,2843
66
+ xync_client/Mexc/api.py,sha256=RUbggGalZllKcxTRjXzhW05WTvhXCtdCLETRty-ZcAE,18998
67
+ xync_client/Mexc/ex.py,sha256=JAx07nIzMs8p2PfAmlTpvugis4dlgGjxhQiKlGRS0jY,4416
63
68
  xync_client/Mexc/etype/ad.py,sha256=GUgvylx_z64CXNcw0YejUQJHg9F59eRo5v0zU7DRrAM,1434
69
+ xync_client/Mexc/etype/order.py,sha256=LUA4jL5Y1Qmf1C6rU9_PFyg9aCqo60kZbZPAiSrx77U,19001
64
70
  xync_client/Mexc/etype/pm.py,sha256=m5kCoMx9IEKUPB-z7YwwymQhASkv2npC4-Z_ePYeeRY,453
65
- xync_client/Okx/ex.py,sha256=7YQ1e2z1NawObbM9Z5js8kaQdwNhv0BkyU0CA3AZMb4,4534
71
+ xync_client/Okx/ex.py,sha256=WG1NSh7wFMNePV0eXDePWELUBD1ksxE_-Q87QaDXLvE,4542
66
72
  xync_client/Okx/etype/ad.py,sha256=rTWMMmDwJK9chBByyihCZcgE5P6c5ti2yR1RbUtev3A,3773
67
73
  xync_client/Okx/etype/pm.py,sha256=MaxeyltowP3ESdOjec2HvSfMBwV_mC6w56Xbw-puadc,251
68
74
  xync_client/Pms/.gitignore,sha256=uGduC1_B8Wc0RiBzBS1YsrLPClFG2e42r1At9taidMI,6
@@ -71,14 +77,14 @@ xync_client/Pms/Alfa/state.json,sha256=MKE6vl-JsJO9PNCVqoQgBgYZTgYkHCas7USwl8QFt
71
77
  xync_client/Pms/MTS/__init__.py,sha256=P_E7W46IZEk8RsEgl7H1xV3JplMT5l9vYQYTYyNbyQ8,2101
72
78
  xync_client/Pms/Ozon/__init__.py,sha256=EvQZDSPv0fOT2hNCTP44nXHOIEQvP5bQf_7HVLiZc2I,4123
73
79
  xync_client/Pms/Payeer/.gitignore,sha256=sWORdRp8ROppV2CsMEDJ3M_SokrNWCf8b1hlaNs64hg,12
74
- xync_client/Pms/Payeer/__init__.py,sha256=6ibuADbrrk_8utXSEo1ddR4c520vm6VYYRyFeYZyM3A,6239
80
+ xync_client/Pms/Payeer/__init__.py,sha256=dSQw0JSQGW33sjScyhpOkFK4VsNU-ob1K-ldmZWLmQQ,10020
75
81
  xync_client/Pms/Payeer/api.py,sha256=bb8qrlPYyWafel1VR-2nate6xBeRZAVciFJblHygfAs,549
76
- xync_client/Pms/Payeer/login.py,sha256=O1Uf_5tAMXiyDknE4XgY0MWb5DUbOM0XnxOa6ENqe6Y,1796
82
+ xync_client/Pms/Payeer/login.py,sha256=GyNwB-GKE_1nlkbZJ0KNI-EnCT0j_S9ogFdn-ufb-zU,3053
77
83
  xync_client/Pms/Sber/__init__.py,sha256=dxQfd9ZPhFTc_C4xrwaxrV6p0SijDCLNzBeUv3oQG38,4926
78
84
  xync_client/Pms/Sber/utils.py,sha256=gIeJspwvoBbOBt-fjxwW4WDHPoL2Evs8LVufsjrFOfo,1870
79
85
  xync_client/Pms/Tinkoff/__init__.py,sha256=ZyLvBEUn-vh-85oPUUDS586AHgvx3c-mkQE3yBQtbw8,5580
80
- xync_client/Pms/Volet/__init__.py,sha256=afbWlAg1s5l4N2dIz5TaeTG-wFz-HIFwzRJQO1NzJAk,9500
81
- xync_client/Pms/Volet/api.py,sha256=uvXWTzmzD4v7re253Xd-ev68G3Iwh83Z0VutgUThRvU,3383
86
+ xync_client/Pms/Volet/__init__.py,sha256=mYJEmZwFoNU2B2erv7n8k6RA0PsXU12K7hpyrdEocrk,12088
87
+ xync_client/Pms/Volet/api.py,sha256=6_dH2rzmyyvha3PeoiZdSltiAzKDWn8roSUJOAErX4M,3673
82
88
  xync_client/Pms/Volet/pl.py,sha256=l7lvUrpjFoObXPHaseOIAcSbkNqJdpy6OLDutxYJH3U,2451
83
89
  xync_client/Pms/Volet/_todo_req/req.mjs,sha256=ut3Jw37rL5lY7SskjZ9f1l0VE33tuP-PZEYUTcJMc2I,817
84
90
  xync_client/Pms/Volet/_todo_req/req.py,sha256=mKvdPrb-lkQ98Ws92_oBKu5yqyU8Krxy9XwuIhdsBao,1570
@@ -88,13 +94,13 @@ xync_client/Pms/Yandex/__init__.py,sha256=2Fu77vDlnGnhesu-OTSsn8lYsnMGO2eDBxWW57
88
94
  xync_client/TgWallet/agent.py,sha256=2fCB8ea8kEAbMqqcflpZUoHTK6_dQZrxmZbrhXci7nk,22066
89
95
  xync_client/TgWallet/asset.py,sha256=pNauwSE7tp5mKQVxH3W-B1yyEV6ZCefttVElOhyqJ1c,433
90
96
  xync_client/TgWallet/auth.py,sha256=pfoEiOW3bg8oJqD4hFBlSNnxTTVTzr305YrAREqqfFY,1284
91
- xync_client/TgWallet/ex.py,sha256=4fxJLtBPUBCX29ww_4w2CbYQOh9fE_QeTdkpQoO5cvI,8198
97
+ xync_client/TgWallet/ex.py,sha256=N6z9Ht_wZXRR_6qSj8HMYg4URGiLvSjkUZZaJlgvt8k,8206
92
98
  xync_client/TgWallet/inAgent.py,sha256=vJUQNlQviSnDnhSfEubqwz-DnrYtMnS4qZ2gDjnK3Tc,5441
93
99
  xync_client/TgWallet/order.py,sha256=BOmBx5WWfJv0-_-A8DcR-Xd8utqO_VTmSqSegm0cteQ,3818
94
100
  xync_client/TgWallet/pyd.py,sha256=Ys3E8b3RLuyQ26frWT0F0BorkNxVpxnd18tY4Gp9dik,5636
95
101
  xync_client/TgWallet/pyro.py,sha256=2K7QWdo48k4MbbgQt90gdz_HiPck69Njm4xaMjIVgoo,1440
96
102
  xync_client/TgWallet/web.py,sha256=kDcv9SKKQPe91mw1qJBpbuyKYCAmZdfdHJylHumLBVU,1608
97
- xync_client-0.0.114.dist-info/METADATA,sha256=Z32VnhXER6E-cjv-5cA5ZPOTb4LRWYnUGQZvpII_1oU,990
98
- xync_client-0.0.114.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
99
- xync_client-0.0.114.dist-info/top_level.txt,sha256=bmYEVIIrD3v7yFwH-X15pEfRvzhuAdfsAZ2igvNI4O8,12
100
- xync_client-0.0.114.dist-info/RECORD,,
103
+ xync_client-0.0.155.dist-info/METADATA,sha256=PizI21QJhBoGXcmRFqqmjbcilHvhK9uwXdD5zmz1t6k,1149
104
+ xync_client-0.0.155.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
105
+ xync_client-0.0.155.dist-info/top_level.txt,sha256=bmYEVIIrD3v7yFwH-X15pEfRvzhuAdfsAZ2igvNI4O8,12
106
+ xync_client-0.0.155.dist-info/RECORD,,