xync-client 0.0.133__tar.gz → 0.0.135__tar.gz

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.

Potentially problematic release.


This version of xync-client might be problematic. Click here for more details.

Files changed (123) hide show
  1. {xync_client-0.0.133/xync_client.egg-info → xync_client-0.0.135}/PKG-INFO +1 -1
  2. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Bybit/InAgent.py +14 -3
  3. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Bybit/etype/order.py +1 -1
  4. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Pms/Payeer/__init__.py +92 -9
  5. {xync_client-0.0.133 → xync_client-0.0.135/xync_client.egg-info}/PKG-INFO +1 -1
  6. {xync_client-0.0.133 → xync_client-0.0.135}/.env.sample +0 -0
  7. {xync_client-0.0.133 → xync_client-0.0.135}/.gitignore +0 -0
  8. {xync_client-0.0.133 → xync_client-0.0.135}/.pre-commit-config.yaml +0 -0
  9. {xync_client-0.0.133 → xync_client-0.0.135}/README.md +0 -0
  10. {xync_client-0.0.133 → xync_client-0.0.135}/__init__.py +0 -0
  11. {xync_client-0.0.133 → xync_client-0.0.135}/makefile +0 -0
  12. {xync_client-0.0.133 → xync_client-0.0.135}/pyproject.toml +0 -0
  13. {xync_client-0.0.133 → xync_client-0.0.135}/setup.cfg +0 -0
  14. {xync_client-0.0.133 → xync_client-0.0.135}/tests/TestAgent.py +0 -0
  15. {xync_client-0.0.133 → xync_client-0.0.135}/tests/TestAsset.py +0 -0
  16. {xync_client-0.0.133 → xync_client-0.0.135}/tests/TestEx.py +0 -0
  17. {xync_client-0.0.133 → xync_client-0.0.135}/tests/TestOrder.py +0 -0
  18. {xync_client-0.0.133 → xync_client-0.0.135}/tests/_todo_refact/Binance/test_binance.py +0 -0
  19. {xync_client-0.0.133 → xync_client-0.0.135}/tests/_todo_refact/Bybit/test_bybit.py +0 -0
  20. {xync_client-0.0.133 → xync_client-0.0.135}/tests/_todo_refact/Bybit/test_bybit_p2p.py +0 -0
  21. {xync_client-0.0.133 → xync_client-0.0.135}/tests/_todo_refact/Gate/test_gate.py +0 -0
  22. {xync_client-0.0.133 → xync_client-0.0.135}/tests/_todo_refact/Wallet/test_agent.py +0 -0
  23. {xync_client-0.0.133 → xync_client-0.0.135}/tests/_todo_refact/Wallet/test_ex.py +0 -0
  24. {xync_client-0.0.133 → xync_client-0.0.135}/tests/_todo_refact/__init__.py +0 -0
  25. {xync_client-0.0.133 → xync_client-0.0.135}/tests/_todo_refact/_test_ex.py +0 -0
  26. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Abc/Agent.py +0 -0
  27. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Abc/Asset.py +0 -0
  28. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Abc/Auth.py +0 -0
  29. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Abc/BaseTest.py +0 -0
  30. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Abc/Ex.py +0 -0
  31. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Abc/Exception.py +0 -0
  32. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Abc/InAgent.py +0 -0
  33. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Abc/Order.py +0 -0
  34. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Abc/PmAgent.py +0 -0
  35. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Abc/xtype.py +0 -0
  36. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Binance/__init__.py +0 -0
  37. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Binance/binance_async.py +0 -0
  38. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Binance/earn_api.py +0 -0
  39. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Binance/etype/ad.py +0 -0
  40. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Binance/etype/pm.py +0 -0
  41. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Binance/ex.py +0 -0
  42. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Binance/exceptions.py +0 -0
  43. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Binance/sapi.py +0 -0
  44. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Binance/web_c2c.py +0 -0
  45. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/BingX/__init__.py +0 -0
  46. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/BingX/agent.py +0 -0
  47. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/BingX/base.py +0 -0
  48. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/BingX/etype/ad.py +0 -0
  49. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/BingX/etype/pm.py +0 -0
  50. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/BingX/ex.py +0 -0
  51. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/BingX/req.mjs +0 -0
  52. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/BingX/sign.js +0 -0
  53. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/BitGet/__init__.py +0 -0
  54. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/BitGet/agent.py +0 -0
  55. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/BitGet/etype/ad.py +0 -0
  56. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/BitGet/ex.py +0 -0
  57. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/BitPapa/ex.py +0 -0
  58. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Bybit/agent.py +0 -0
  59. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Bybit/etype/ad.py +0 -0
  60. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Bybit/etype/cred.py +0 -0
  61. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Bybit/ex.py +0 -0
  62. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Bybit/order.py +0 -0
  63. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Bybit/web_earn.py +0 -0
  64. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Bybit/web_p2p.py +0 -0
  65. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Bybit/ws.py +0 -0
  66. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Gate/etype/ad.py +0 -0
  67. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Gate/ex.py +0 -0
  68. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Gate/premarket.py +0 -0
  69. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Gmail/__init__.py +0 -0
  70. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Htx/agent.py +0 -0
  71. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Htx/earn.py +0 -0
  72. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Htx/etype/__init__.py +0 -0
  73. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Htx/etype/ad.py +0 -0
  74. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Htx/etype/cred.py +0 -0
  75. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Htx/etype/pm.py +0 -0
  76. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Htx/etype/test.py +0 -0
  77. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Htx/ex.py +0 -0
  78. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/KuCoin/etype/ad.py +0 -0
  79. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/KuCoin/etype/pm.py +0 -0
  80. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/KuCoin/ex.py +0 -0
  81. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/KuCoin/web.py +0 -0
  82. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Mexc/etype/ad.py +0 -0
  83. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Mexc/etype/pm.py +0 -0
  84. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Mexc/ex.py +0 -0
  85. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Okx/etype/ad.py +0 -0
  86. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Okx/etype/pm.py +0 -0
  87. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Okx/ex.py +0 -0
  88. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Pms/.gitignore +0 -0
  89. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Pms/Alfa/__init__.py +0 -0
  90. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Pms/Alfa/state.json +0 -0
  91. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Pms/MTS/__init__.py +0 -0
  92. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Pms/Ozon/__init__.py +0 -0
  93. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Pms/Payeer/.gitignore +0 -0
  94. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Pms/Payeer/api.py +0 -0
  95. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Pms/Payeer/login.py +0 -0
  96. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Pms/Sber/__init__.py +0 -0
  97. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Pms/Sber/utils.py +0 -0
  98. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Pms/Tinkoff/__init__.py +0 -0
  99. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Pms/Volet/__init__.py +0 -0
  100. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Pms/Volet/_todo_req/req.mjs +0 -0
  101. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Pms/Volet/_todo_req/req.py +0 -0
  102. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Pms/Volet/api.py +0 -0
  103. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Pms/Volet/pl.py +0 -0
  104. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Pms/Xync/__main__.py +0 -0
  105. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Pms/Xync/ed.py +0 -0
  106. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/Pms/Yandex/__init__.py +0 -0
  107. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/TgWallet/agent.py +0 -0
  108. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/TgWallet/asset.py +0 -0
  109. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/TgWallet/auth.py +0 -0
  110. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/TgWallet/ex.py +0 -0
  111. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/TgWallet/inAgent.py +0 -0
  112. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/TgWallet/order.py +0 -0
  113. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/TgWallet/pyd.py +0 -0
  114. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/TgWallet/pyro.py +0 -0
  115. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/TgWallet/web.py +0 -0
  116. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/__init__.py +0 -0
  117. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/details.py +0 -0
  118. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/loader.py +0 -0
  119. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client/pm_unifier.py +0 -0
  120. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client.egg-info/SOURCES.txt +0 -0
  121. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client.egg-info/dependency_links.txt +0 -0
  122. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client.egg-info/requires.txt +0 -0
  123. {xync_client-0.0.133 → xync_client-0.0.135}/xync_client.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xync-client
3
- Version: 0.0.133
3
+ Version: 0.0.135
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
@@ -1,7 +1,7 @@
1
1
  import json
2
2
  import logging
3
3
  import re
4
- from datetime import datetime, timezone
4
+ from datetime import datetime, timezone, timedelta
5
5
  from uuid import uuid4
6
6
 
7
7
  import websockets
@@ -11,6 +11,7 @@ from decimal import Decimal
11
11
  from playwright.async_api import async_playwright
12
12
  from pydantic import ValidationError
13
13
  from pyro_client.client.file import FileClient
14
+ from tortoise.timezone import now
14
15
  from tortoise.transactions import in_transaction
15
16
 
16
17
  from xync_client.Abc.PmAgent import PmAgentClient
@@ -130,7 +131,7 @@ class InAgentClient(BaseInAgentClient):
130
131
 
131
132
  # если висят незавершенные продажи с такой же суммой
132
133
  pos = (await self.agent_client.get_orders_active(1))["result"]
133
- if [
134
+ pos = [
134
135
  o
135
136
  for o in pos.get("items", [])
136
137
  if (
@@ -138,7 +139,17 @@ class InAgentClient(BaseInAgentClient):
138
139
  and o["id"] != upd.id
139
140
  and int(order.createDate) < int(o["createDate"]) + 3600 * 000
140
141
  )
141
- ]:
142
+ ]
143
+ curex = await models.CurEx.get(
144
+ cur__ticker=order.currencyId, ex=self.agent_client.ex_client.ex
145
+ )
146
+ pos_db = await models.Order.filter(
147
+ exid__not=order.id,
148
+ amount=int(float(order.amount) * 10**curex.scale),
149
+ status__not_in=[OrderStatus.completed, OrderStatus.canceled],
150
+ created_at__gt=now() - timedelta(hours=1),
151
+ )
152
+ if pos or pos_db:
142
153
  await self.agent_client.ex_client.bot.send(
143
154
  f"[Duplicate amount!]"
144
155
  f"(https://www.bybit.com/ru-RU/p2p/orderList/{order.id})",
@@ -335,7 +335,7 @@ class Receive(_BaseMsg):
335
335
 
336
336
  class Read(_BaseMsg):
337
337
  readAmount: int
338
- read: Literal["101", "110", "111"]
338
+ read: Literal["101", "110", "11", "111"]
339
339
  orderStatus: StatusApi
340
340
 
341
341
 
@@ -1,15 +1,25 @@
1
1
  import logging
2
2
  from asyncio import run
3
+ from base64 import b64encode
3
4
  from datetime import datetime
4
5
  from decimal import Decimal
5
6
  from enum import StrEnum
7
+ from hashlib import sha256
8
+ from json import dumps
6
9
  from math import ceil
10
+ from os import urandom
7
11
  from time import sleep
12
+ from urllib.parse import urlencode
8
13
 
9
14
  from asyncpg.pgproto.pgproto import timedelta
15
+ from cryptography.hazmat.primitives import padding
16
+ from cryptography.hazmat.primitives.ciphers import Cipher
17
+ from cryptography.hazmat.primitives.ciphers.algorithms import AES
18
+ from cryptography.hazmat.primitives.ciphers.modes import CBC
10
19
  from payeer_api import PayeerAPI
11
20
  from playwright.async_api import async_playwright, Playwright, Error
12
21
  from playwright._impl._errors import TimeoutError
22
+ from xync_schema.models import TopUp, TopUpAble
13
23
 
14
24
  from xync_client.loader import TORM
15
25
 
@@ -17,6 +27,34 @@ from xync_client.Abc.PmAgent import PmAgentClient
17
27
  from xync_client.Pms.Payeer.login import login
18
28
 
19
29
 
30
+ def encrypt_data(data: dict, md5digest: bytes):
31
+ # Convert data to JSON string (equivalent to json_encode)
32
+ bdata = dumps(data).encode()
33
+
34
+ # Generate random IV (16 bytes for AES)
35
+ iv = urandom(16)
36
+
37
+ # Pad or truncate key to 32 bytes
38
+ if len(md5digest) < 32:
39
+ md5digest = md5digest.ljust(32, b"\0") # Pad with null bytes
40
+ elif len(md5digest) > 32:
41
+ md5digest = md5digest[:32] # Truncate to 32 bytes
42
+
43
+ # Apply PKCS7 padding
44
+ padder = padding.PKCS7(128).padder() # 128 bits = 16 bytes block size
45
+ padded_data = padder.update(bdata)
46
+ padded_data += padder.finalize()
47
+
48
+ # Create cipher
49
+ cipher = Cipher(AES(md5digest), CBC(iv))
50
+ encryptor = cipher.encryptor()
51
+
52
+ # Encrypt
53
+ ciphertext = encryptor.update(padded_data) + encryptor.finalize()
54
+
55
+ return iv + ciphertext
56
+
57
+
20
58
  class Client(PmAgentClient):
21
59
  class Pages(StrEnum):
22
60
  _base = "https://payeer.com/en/"
@@ -39,6 +77,50 @@ class Client(PmAgentClient):
39
77
  await self.page.context.add_cookies([cookie])
40
78
  await self.page.goto(self.pages.SEND)
41
79
 
80
+ @staticmethod
81
+ def form_redirect(topup: TopUp) -> tuple[str, dict | None]:
82
+ m_shop = str(topup.topupable.auth["id"])
83
+ m_orderid = str(topup.id)
84
+ m_amount = str(topup.amount * 0.01)
85
+ m_curr = topup.cur.ticker
86
+ m_desc = b64encode(b"XyncPay top up").decode()
87
+ m_key = topup.topupable.auth["sec"]
88
+ data = [m_shop, m_orderid, m_amount, m_curr, m_desc]
89
+
90
+ # # additional
91
+ # m_params = {
92
+ # 'success_url': 'https://xync.net/topup?success=1',
93
+ # 'fail_url': 'https://xync.net/topup?success=0',
94
+ # 'status_url': 'https://xync.net/topup',
95
+ # 'reference': {'var1': '1'},
96
+ # }
97
+ #
98
+ # key = md5(m_orderid.to_bytes()).digest()
99
+ #
100
+ # base64url_encode(encrypt_data(params, key))
101
+ #
102
+ # data.append(m_params)
103
+ # # additional
104
+
105
+ data.append(m_key)
106
+
107
+ sign = sha256(":".join(data).encode()).hexdigest().upper()
108
+
109
+ params = {
110
+ "m_shop": m_shop,
111
+ "m_orderid": m_orderid,
112
+ "m_amount": m_amount,
113
+ "m_curr": m_curr,
114
+ "m_desc": m_desc,
115
+ "m_sign": sign,
116
+ # 'm_params': m_params,
117
+ # 'm_cipher_method': 'AES-256-CBC-IV',
118
+ "form[ps]": "2609",
119
+ "form[curr[2609]]": m_curr,
120
+ }
121
+ url = "https://payeer.com/merchant/?" + urlencode(params)
122
+ return url, None
123
+
42
124
  async def send(self, dest: str, amount: int, cur: str) -> tuple[int, bytes, int] | int:
43
125
  self.last_active = datetime.now()
44
126
  page = self.page
@@ -125,17 +207,18 @@ async def main(uid: int):
125
207
  playwright: Playwright = await async_playwright().start()
126
208
  pyr = Client(uid)
127
209
  try:
128
- await pyr.start(playwright, False)
210
+ dest, amount, cur = "P79619335", 4, "RUB"
211
+ ta = await TopUpAble.get(pm__norm="payeer")
212
+ topup = await TopUp.create(amount=1001, cur_id=1, topupable=ta, user_id=1)
213
+ await topup.fetch_related("cur")
214
+ _url, _data = pyr.form_redirect(topup)
129
215
 
130
- dest, amount, cur = "P79619335", 2, "RUB"
216
+ await pyr.start(playwright, False)
131
217
 
132
- res = await pyr.send(dest, amount, cur)
133
- res = await pyr.send(dest, 3, cur)
134
- res = await pyr.send(dest, amount, cur)
135
- res = await pyr.send(dest, 3, cur)
136
- res = await pyr.send(dest, amount, cur)
218
+ _res = await pyr.send(dest, amount, cur)
219
+ _res = await pyr.send(dest, 3, cur)
137
220
 
138
- res = pyr.check_in(2, cur, datetime.now())
221
+ res = pyr.check_in(3, cur, datetime.now())
139
222
 
140
223
  if len(res) > 1 and isinstance(res[1], bytes):
141
224
  await pyr.bot.send(f"Transaction #{res[0]}", uid, photo=res[1])
@@ -152,4 +235,4 @@ async def main(uid: int):
152
235
 
153
236
 
154
237
  if __name__ == "__main__":
155
- run(main(1779829771))
238
+ run(main(193017646))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xync-client
3
- Version: 0.0.133
3
+ Version: 0.0.135
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes