xync-client 0.0.43.dev35__tar.gz → 0.0.43.dev42__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.
Files changed (119) hide show
  1. {xync_client-0.0.43.dev35/xync_client.egg-info → xync_client-0.0.43.dev42}/PKG-INFO +1 -1
  2. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Abc/Ex.py +12 -12
  3. xync_client-0.0.43.dev42/xync_client/Pms/Alfa/__init__.py +102 -0
  4. xync_client-0.0.43.dev42/xync_client/Pms/Alfa/state.json +1 -0
  5. xync_client-0.0.43.dev42/xync_client/Pms/Sber/__init__.py +79 -0
  6. xync_client-0.0.43.dev42/xync_client/Pms/Tinkoff/__init__.py +88 -0
  7. xync_client-0.0.43.dev42/xync_client/Pms/Tinkoff/state.json +1 -0
  8. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Pms/Volet/__init__.py +28 -43
  9. xync_client-0.0.43.dev42/xync_client/Pyrogram/base.py +42 -0
  10. xync_client-0.0.43.dev42/xync_client/Pyrogram/bot.py +11 -0
  11. xync_client-0.0.43.dev42/xync_client/Pyrogram/file.py +61 -0
  12. xync_client-0.0.43.dev42/xync_client/Pyrogram/user.py +104 -0
  13. xync_client-0.0.43.dev42/xync_client/TgWallet/pyro.py +43 -0
  14. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/loader.py +1 -3
  15. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42/xync_client.egg-info}/PKG-INFO +1 -1
  16. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client.egg-info/SOURCES.txt +7 -3
  17. xync_client-0.0.43.dev35/xync_client/Pms/Tinkoff/__init__.py +0 -89
  18. xync_client-0.0.43.dev35/xync_client/Pms/Tinkoff/state.json +0 -1
  19. xync_client-0.0.43.dev35/xync_client/Pms/Tinkoff/storage.json +0 -0
  20. xync_client-0.0.43.dev35/xync_client/TgWallet/pyro.py +0 -147
  21. xync_client-0.0.43.dev35/xync_client/pg_storage.py +0 -276
  22. xync_client-0.0.43.dev35/xync_client/pyro.py +0 -121
  23. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/.env.sample +0 -0
  24. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/.gitignore +0 -0
  25. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/.pre-commit-config.yaml +0 -0
  26. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/README.md +0 -0
  27. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/makefile +0 -0
  28. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/pyproject.toml +0 -0
  29. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/setup.cfg +0 -0
  30. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/TestAgent.py +0 -0
  31. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/TestAsset.py +0 -0
  32. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/TestEx.py +0 -0
  33. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/TestOrder.py +0 -0
  34. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/_todo_refact/Binance/test_binance.py +0 -0
  35. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/_todo_refact/Bybit/test_bybit.py +0 -0
  36. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/_todo_refact/Bybit/test_bybit_p2p.py +0 -0
  37. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/_todo_refact/Gate/test_gate.py +0 -0
  38. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/_todo_refact/Htx/test_htx_p2p.py +0 -0
  39. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/_todo_refact/Wallet/test_agent.py +0 -0
  40. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/_todo_refact/Wallet/test_ex.py +0 -0
  41. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/_todo_refact/__init__.py +0 -0
  42. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/_todo_refact/_test_ex.py +0 -0
  43. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Abc/Agent.py +0 -0
  44. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Abc/Asset.py +0 -0
  45. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Abc/AuthTrait.py +0 -0
  46. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Abc/Base.py +0 -0
  47. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Abc/BaseTest.py +0 -0
  48. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Abc/InAgent.py +0 -0
  49. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Abc/Order.py +0 -0
  50. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Abc/types.py +0 -0
  51. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Binance/__init__.py +0 -0
  52. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Binance/binance_async.py +0 -0
  53. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Binance/earn_api.py +0 -0
  54. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Binance/etype/ad.py +0 -0
  55. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Binance/etype/pm.py +0 -0
  56. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Binance/ex.py +0 -0
  57. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Binance/exceptions.py +0 -0
  58. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Binance/sapi.py +0 -0
  59. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Binance/web_c2c.py +0 -0
  60. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BingX/__init__.py +0 -0
  61. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BingX/agent.py +0 -0
  62. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BingX/base.py +0 -0
  63. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BingX/etype/ad.py +0 -0
  64. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BingX/etype/pm.py +0 -0
  65. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BingX/ex.py +0 -0
  66. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BingX/req.mjs +0 -0
  67. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BingX/sign.js +0 -0
  68. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BitGet/__init__.py +0 -0
  69. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BitGet/agent.py +0 -0
  70. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BitGet/etype/ad.py +0 -0
  71. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BitGet/ex.py +0 -0
  72. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BitGet/req.mjs +0 -0
  73. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BitPapa/ex.py +0 -0
  74. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Bybit/InAgent.py +0 -0
  75. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Bybit/agent.py +0 -0
  76. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Bybit/etype/ad.py +0 -0
  77. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Bybit/etype/cred.py +0 -0
  78. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Bybit/etype/order.py +0 -0
  79. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Bybit/ex.py +0 -0
  80. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Bybit/web_earn.py +0 -0
  81. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Bybit/web_p2p.py +0 -0
  82. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Bybit/ws.py +0 -0
  83. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Gate/etype/ad.py +0 -0
  84. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Gate/ex.py +0 -0
  85. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Gate/premarket.py +0 -0
  86. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Htx/agent.py +0 -0
  87. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Htx/earn.py +0 -0
  88. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Htx/etype/__init__.py +0 -0
  89. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Htx/etype/ad.py +0 -0
  90. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Htx/etype/cred.py +0 -0
  91. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Htx/etype/pm.py +0 -0
  92. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Htx/etype/test.py +0 -0
  93. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Htx/ex.py +0 -0
  94. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/KuCoin/etype/ad.py +0 -0
  95. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/KuCoin/etype/pm.py +0 -0
  96. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/KuCoin/ex.py +0 -0
  97. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/KuCoin/web.py +0 -0
  98. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Mexc/etype/ad.py +0 -0
  99. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Mexc/etype/pm.py +0 -0
  100. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Mexc/ex.py +0 -0
  101. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Okx/etype/ad.py +0 -0
  102. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Okx/etype/pm.py +0 -0
  103. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Okx/ex.py +0 -0
  104. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Pms/Volet/_todo_req/req.mjs +0 -0
  105. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Pms/Volet/_todo_req/req.py +0 -0
  106. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Pms/Volet/api.py +0 -0
  107. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/TgWallet/agent.py +0 -0
  108. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/TgWallet/asset.py +0 -0
  109. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/TgWallet/auth.py +0 -0
  110. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/TgWallet/ex.py +0 -0
  111. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/TgWallet/inAgent.py +0 -0
  112. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/TgWallet/order.py +0 -0
  113. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/TgWallet/pyd.py +0 -0
  114. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/TgWallet/web.py +0 -0
  115. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/__init__.py +0 -0
  116. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/pm_unifier.py +0 -0
  117. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client.egg-info/dependency_links.txt +0 -0
  118. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client.egg-info/requires.txt +0 -0
  119. {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/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.43.dev35
3
+ Version: 0.0.43.dev42
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
@@ -6,14 +6,14 @@ import msgspec
6
6
  from aiohttp import ClientSession
7
7
  from msgspec import Struct
8
8
  from tortoise.exceptions import MultipleObjectsReturned, IntegrityError
9
+ from xync_client.Pyrogram.file import FileClient
9
10
  from xync_schema import models
10
- from xync_schema.enums import FileType
11
+ from xync_schema.enums import FileType, df_curs
11
12
  from xync_schema.types import CurEx, CoinEx, BaseAd, BaseAdIn
12
13
 
13
14
  from xync_client.Abc.Base import BaseClient, MapOfIdsList
14
15
  from xync_client.Abc.types import PmEx
15
- from xync_client.TgWallet.pyro import PyroClient
16
- from xync_client.loader import bot
16
+ from xync_client.loader import TOKEN
17
17
  from xync_client.pm_unifier import PmUnifier, PmUni
18
18
 
19
19
 
@@ -164,19 +164,19 @@ class BaseExClient(BaseClient):
164
164
  else:
165
165
  pmin = models.Pm.validate({**pmu.model_dump(), "country_id": country_id, "typ": pmex.typ})
166
166
  if c := df_curs.get(pmu.norm):
167
- pmin.df_cur_id = curs[c].id
167
+ pmin.df_cur_id = await models.Cur.get(ticker=c).values_list("id", flat=True)
168
168
  try:
169
169
  pms[k], _ = await models.Pm.update_or_create(**pmin.df_unq())
170
170
  except (MultipleObjectsReturned, IntegrityError) as e:
171
171
  raise e
172
172
  prev = k, pmu.norm, pmex.name, pmu.country
173
- await models.Pmcur.update_or_create(
174
- cur=await models.Cur.get(ticker="THB"), pm=await models.Pm.get(norm="cash in person")
175
- )
173
+ await models.Pmcur.update_or_create( # todo: NA HU YA???
174
+ cur=await models.Cur.get(ticker="THB"), pm=await models.Pm.get(norm="cash in person")
175
+ )
176
176
 
177
177
  # Pmexs
178
- pbot = PyroClient(bot)
179
- await pbot.app.start()
178
+ pbot = FileClient(TOKEN)
179
+ await pbot.start()
180
180
  async with ClientSession(headers=getattr(self, "logo_headers", None)) as ss:
181
181
  pmexs = [
182
182
  models.Pmex(
@@ -189,7 +189,7 @@ class BaseExClient(BaseClient):
189
189
  )
190
190
  for k, pm in pms.items()
191
191
  ]
192
- await pbot.app.stop()
192
+ await pbot.stop()
193
193
 
194
194
  await models.Pmex.bulk_create(pmexs, on_conflict=["ex_id", "exid"], update_fields=["pm_id", "logo_id", "name"])
195
195
  # Pmex banks
@@ -214,7 +214,7 @@ class BaseExClient(BaseClient):
214
214
  # pmcurexs = [Pmcurex(pmcur=pmcur, ex=self.ex) for pmcur in pmcurs]
215
215
  # await Pmcurex.bulk_create(pmcurexs)
216
216
 
217
- async def logo_save(self, url: str | None, pbot: PyroClient, ss: ClientSession) -> models.File | None:
217
+ async def logo_save(self, url: str | None, pbot: FileClient, ss: ClientSession) -> models.File | None:
218
218
  if url or (file := None):
219
219
  if not url.startswith("https:"):
220
220
  if not url.startswith("/"):
@@ -224,7 +224,7 @@ class BaseExClient(BaseClient):
224
224
  resp = await ss.get(url)
225
225
  if resp.ok:
226
226
  byts = await resp.read()
227
- upf, ref = await pbot.save_file(byts, resp.content_type)
227
+ upf, ref = await pbot.save_doc(byts, resp.content_type)
228
228
  await sleep(0.34)
229
229
  typ = FileType[resp.content_type.split("/")[-1]]
230
230
  file, _ = await models.File.update_or_create({"ref": ref, "size": len(byts), "typ": typ}, name=url)
@@ -0,0 +1,102 @@
1
+ import asyncio
2
+
3
+ from playwright.async_api import async_playwright
4
+ from playwright._impl._errors import TimeoutError
5
+
6
+
7
+ async def main():
8
+ async with async_playwright() as p:
9
+ browser = await p.chromium.launch(
10
+ channel="chrome",
11
+ headless=False,
12
+ timeout=5000,
13
+ args=[
14
+ "--disable-blink-features=AutomationControlled",
15
+ "--no-sandbox",
16
+ "--disable-web-security",
17
+ "--disable-infobars",
18
+ "--disable-extensions",
19
+ "--start-maximized",
20
+ ],
21
+ )
22
+ context = await browser.new_context(storage_state="state.json")
23
+ page = await context.new_page()
24
+ await page.goto("https://web.alfabank.ru/dashboard")
25
+ await page.wait_for_timeout(1000)
26
+ try:
27
+ await page.wait_for_url("https://web.alfabank.ru/dashboard")
28
+ await page.wait_for_timeout(1000)
29
+ # Новый пользователь
30
+ except TimeoutError:
31
+ await page.locator('[data-test-id="phoneInput-form-control-inner"] [data-test-id="phoneInput"]').fill(
32
+ "79680252000"
33
+ )
34
+ await page.wait_for_timeout(1000)
35
+ await page.locator("span", has_text="Вперёд").click(delay=500)
36
+ await page.locator('[data-test-id="card-account-input"]').fill("2200150913416522")
37
+ await page.locator('[data-test-id="card-account-continue-button"]').click()
38
+ await page.locator(
39
+ '[class*=confirmation__component] [class*=code-input] [autocomplete="one-time-code"]'
40
+ ).fill(input("Введите код"))
41
+ await page.wait_for_timeout(500)
42
+ if await page.locator('[data-test-id="trust-device-page-submit-btn"]').is_visible():
43
+ await page.locator('[data-test-id="trust-device-page-submit-btn"]').click()
44
+ await page.locator('[data-test-id="new-password"]').click()
45
+ await page.locator('[data-test-id="new-password"]').fill("0909")
46
+ await page.locator('[data-test-id="new-password-again"]').click()
47
+ await page.locator('[data-test-id="new-password-again"]').fill("0909")
48
+ await page.locator('[data-test-id="submit-button"]').click()
49
+ await page.context.storage_state(path="state.json")
50
+
51
+ # Переходим на сбп и вводим данные получателя
52
+ # await page.locator(
53
+ # '[data-qa-type="desktop-ib-pay-buttons"] [data-qa-type="atomPanel pay-card-0"]',
54
+ # has_text="Перевести по телефону",
55
+ # ).click()
56
+ # await page.locator('[data-qa-type="recipient-input.value.placeholder"]').click()
57
+ # await page.wait_for_timeout(300)
58
+ # await page.locator('[data-qa-type="recipient-input.value.input"]').fill("9992259898")
59
+ # await page.locator('[data-qa-type="amount-from.placeholder"]').click()
60
+ # await page.locator('[data-qa-type="amount-from.input"]').fill("100")
61
+ # await page.wait_for_timeout(300)
62
+ # await page.locator('[data-qa-type="bank-plate-other-bank click-area"]').click()
63
+ # await page.locator('[data-qa-type*="inputAutocomplete.value.input"]').click()
64
+ # await page.locator('[data-qa-type*="inputAutocomplete.value.input"]').fill("Озон")
65
+ # await page.wait_for_timeout(300)
66
+ # await page.locator('[data-qa-type="banks-popup-list"]').click()
67
+ # await page.locator('[data-qa-type="transfer-button"]').click()
68
+
69
+ # Проверка последнего платежа
70
+ # try:
71
+ # await page.goto("https://www.tbank.ru/events/feed")
72
+ # except Error:
73
+ # await page.wait_for_timeout(1000)
74
+ # await page.goto("https://www.tbank.ru/events/feed")
75
+ # await page.wait_for_timeout(2000)
76
+ # await page.locator('[data-qa-type = "timeline-operations-list"]:last-child').scroll_into_view_if_needed()
77
+ # transactions = await page.locator(
78
+ # '[data-qa-type="timeline-operations-list"] [data-qa-type="operation-money"]'
79
+ # ).all_text_contents()
80
+ # result = recursion_payments(100, transactions)
81
+ # if result == 100:
82
+ # print("Платеж", result, "получен")
83
+ # else:
84
+ # print("Ничегошеньки нет")
85
+ # await page.wait_for_timeout(3000)
86
+ await context.close()
87
+ # await page.video.path()
88
+ # BufferedInputFile(pth, 'tbank')
89
+ # await bot.send_video('mixartemev')
90
+ ...
91
+ await browser.close()
92
+
93
+
94
+ def recursion_payments(amount: int, transactions: list):
95
+ tran = transactions.pop(0)
96
+ normalized_tran = tran.replace("−", "-").replace(",", ".")
97
+ if 0 > int(float(normalized_tran)) != amount:
98
+ return recursion_payments(amount, transactions)
99
+ return int(float(tran.replace("−", "-").replace(",", ".")))
100
+
101
+
102
+ asyncio.run(main())
@@ -0,0 +1 @@
1
+ {"cookies": [{"name": "capsLockPushed", "value": "false", "domain": "private.auth.alfabank.ru", "path": "/passport/cerberus-mini-blue/dashboard-blue", "expires": 1778487847, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "access_token", "value": "eyJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX3Rva2VuIjoiYWMxYjAyYzctYThmNC0zZWI0LTg1MzUtMjM3YzBmNjU4YmRmIiwiaXNzIjoiY2VyYmVydXMtbWluaSIsInNlc3Npb25fY2xpZW50IjoibmV3Y2xpY2std2ViIiwic3ViIjoiYWMxYjAyYzctYThmNC0zZWI0LTg1MzUtMjM3YzBmNjU4YmRmIiwianRpIjoiNmM5ZDc4ZTllNmZkNDBkNThjYjUwNTAxNDVkYTQ5YWQifQ.zFmw9TGaq4-tFNyRude0fycVHHqjgygEBkQkNjdi4Hs", "domain": "private.auth.alfabank.ru", "path": "/passport", "expires": 1767687997.168728, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "cross_auth_token", "value": "eyJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX3Rva2VuIjoiYWMxYjAyYzctYThmNC0zZWI0LTg1MzUtMjM3YzBmNjU4YmRmIiwiaXNzIjoiY2VyYmVydXMtbWluaSIsInNlc3Npb25fY2xpZW50IjoibmV3Y2xpY2std2ViIiwic3ViIjoiYWMxYjAyYzctYThmNC0zZWI0LTg1MzUtMjM3YzBmNjU4YmRmIiwianRpIjoiNmM5ZDc4ZTllNmZkNDBkNThjYjUwNTAxNDVkYTQ5YWQifQ.zFmw9TGaq4-tFNyRude0fycVHHqjgygEBkQkNjdi4Hs", "domain": ".auth.alfabank.ru", "path": "/passport", "expires": 1767687997.168805, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "XSRF-TOKEN", "value": "dd7ce66e-0b13-4bdb-9e10-67c70520e4ef", "domain": "web.alfabank.ru", "path": "/", "expires": -1, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "__zzatw-alfabank-retail", "value": "MDA0dBA=Fz2+aQ==", "domain": ".private.auth.alfabank.ru", "path": "/", "expires": 1778487995, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "__zzatw-alfabank-retail", "value": "MDA0dBA=Fz2+aQ==", "domain": ".auth.alfabank.ru", "path": "/", "expires": 1778487995, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "_sp_ses.3c2b", "value": "*", "domain": ".alfabank.ru", "path": "/", "expires": 1746953842, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "__alfa_uid", "value": "215a0cbd-166f-4b34-889d-cfb41432459c", "domain": "metrics.alfabank.ru", "path": "/", "expires": 1778488042.869225, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "passport_session_id", "value": "a6a13b54-78fe-4146-b0c0-9033f4efc269", "domain": ".alfabank.ru", "path": "/", "expires": -1, "httpOnly": false, "secure": true, "sameSite": "Lax"}, {"name": "cfidsw-alfabank-retail", "value": "gByg8Td5MgEvwzJDwItXuU78OzWRBFa1CPNKrHpfFEsp5jsJ4ecdrYV46AboZL+kj7bv7sKMciLs6KT/j7Mq10XF680HdwuYXe4t0MPloEUa5wFlVvTyX8uM3QoRgN6pNUh2mV4AFaZMfOjRqVXFSxzJkfcUaNVnNlYzuw==", "domain": ".private.auth.alfabank.ru", "path": "/", "expires": 1778487995, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "cfidsw-alfabank-retail", "value": "gByg8Td5MgEvwzJDwItXuU78OzWRBFa1CPNKrHpfFEsp5jsJ4ecdrYV46AboZL+kj7bv7sKMciLs6KT/j7Mq10XF680HdwuYXe4t0MPloEUa5wFlVvTyX8uM3QoRgN6pNUh2mV4AFaZMfOjRqVXFSxzJkfcUaNVnNlYzuw==", "domain": ".auth.alfabank.ru", "path": "/", "expires": 1778487995, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "gsscw-alfabank-retail", "value": "hnGFKIFZ7D1OvofAoh5gpWzMgC2N9UK/amM1Mq/otZ9clk1l88cZPwNdQQgBTAUDjgxr/NV9SEh8i2zR/Jrs5oxzXEvjKM12rMQp4TL5qUSO/njPC8gnOc2QI4Yj1L1ktLuVNc7ockAd05brO2aeBpRN8WCXyoh2AYZONHvLNAkU593acMGrtNvLuF3VJPQKlNcwrSCfiNre5fM5IQOUPPTk6icKyhKxMQUjUgQZNa9k/ROVt1dnEbIGlaqgP00Z22+REFkO", "domain": ".private.auth.alfabank.ru", "path": "/", "expires": 1778487997, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "gsscw-alfabank-retail", "value": "hnGFKIFZ7D1OvofAoh5gpWzMgC2N9UK/amM1Mq/otZ9clk1l88cZPwNdQQgBTAUDjgxr/NV9SEh8i2zR/Jrs5oxzXEvjKM12rMQp4TL5qUSO/njPC8gnOc2QI4Yj1L1ktLuVNc7ockAd05brO2aeBpRN8WCXyoh2AYZONHvLNAkU593acMGrtNvLuF3VJPQKlNcwrSCfiNre5fM5IQOUPPTk6icKyhKxMQUjUgQZNa9k/ROVt1dnEbIGlaqgP00Z22+REFkO", "domain": ".auth.alfabank.ru", "path": "/", "expires": 1778487997, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "browserId", "value": "68205f3adc69f01d00012ee4", "domain": "private.auth.alfabank.ru", "path": "/", "expires": 1778487995.512104, "httpOnly": false, "secure": true, "sameSite": "Strict"}, {"name": "passport-session", "value": "true", "domain": ".alfabank.ru", "path": "/", "expires": 1746952897.168841, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "SUCHASH", "value": "E6DE996481A14BCB59887DEF111E195A", "domain": ".alfabank.ru", "path": "/", "expires": -1, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "GW_SESSION_NEWCLICK", "value": "72b4dc05-cc93-4be8-bad4-f23ce09d1faa", "domain": ".alfabank.ru", "path": "/", "expires": -1, "httpOnly": true, "secure": true, "sameSite": "Lax"}, {"name": "DEVICE_APP_ID", "value": "3082d7e4-b8fc-4feb-9aa3-71c5d1748d9e", "domain": ".alfabank.ru", "path": "/", "expires": 1781511997.04382, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "DEVICE_SECRET", "value": "1f1d6529-2e74-4102-b25f-09bf87063d07daf99c91-8e21-453b-85ff-23471dcb799c", "domain": "web.alfabank.ru", "path": "/", "expires": 1781511997.043926, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "DEVICE_PUBLIC_KEY_ID", "value": "1324b1de-39df-4b08-b852-eac65192fb44", "domain": "web.alfabank.ru", "path": "/", "expires": 1781511997.04396, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "STARTED_PASS_CODE_LOGIC_TIME", "value": "1746951996673", "domain": "web.alfabank.ru", "path": "/", "expires": 1781511997.043985, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "auth_type_pincode", "value": "true", "domain": ".alfabank.ru", "path": "/", "expires": 1781511997.044055, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "f36b39c34hj", "value": "8e99fba30096bdfcdfde6187d1fb2edc8c1bbc24eb53bf064b7bea1f0a33ad274939d9367bed4deb794147ea2708f306SSz3uoOrR0dcrfrZf40iFw%3D%3D", "domain": ".alfabank.ru", "path": "/", "expires": 1781511997.044074, "httpOnly": false, "secure": true, "sameSite": "Lax"}, {"name": "5c24xow7n6w", "value": "0", "domain": ".alfabank.ru", "path": "/", "expires": 1781511997.044098, "httpOnly": false, "secure": true, "sameSite": "Lax"}, {"name": "newclick-sticky-cookie", "value": "\"7ac27a834001e010\"", "domain": "web.alfabank.ru", "path": "/", "expires": -1, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "fgsscw-alfabank-retail", "value": "xNH5563df983ef073795951fdfdc4d8d41c19cc2", "domain": ".private.auth.alfabank.ru", "path": "/", "expires": 1778487997, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "fgsscw-alfabank-retail", "value": "xNH5563df983ef073795951fdfdc4d8d41c19cc2", "domain": ".auth.alfabank.ru", "path": "/", "expires": 1778487997, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "__zzatw-alfabank-retail", "value": "MDA0dC0cTHtmcDhhDHEWTT17CT4VHThHKHIzd2U6VGs7CmhLGzUdCkNoUlRDXS1BSk8if3IsMBs3V2EgDBYRTVZUfSsiFnh0LFYLD1s5MzlEaXBXJ1EPHVB8Gxk2bV17TGcVfjYucGBkDhpHan4xUVEsEREOEUZaCxtpJCkICA4VQkVqejFxIhpjSF0lQA9NNCUWGnduJg0LQBlwQ3N8GzdXXRwRJFgOIT8LF1xVPjVUDjx1Vy8NLjheLW8eZktfKEhWVgosHRV3ZxUbUEsYL0tfO2VsJlsrfCljNSoi9Ku4jw==", "domain": ".web.alfabank.ru", "path": "/", "expires": 1778487997, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "__zzatw-alfabank-retail", "value": "MDA0dC0cTHtmcDhhDHEWTT17CT4VHThHKHIzd2U6VGs7CmhLGzUdCkNoUlRDXS1BSk8if3IsMBs3V2EgDBYRTVZUfSsiFnh0LFYLD1s5MzlEaXBXJ1EPHVB8Gxk2bV17TGcVfjYucGBkDhpHan4xUVEsEREOEUZaCxtpJCkICA4VQkVqejFxIhpjSF0lQA9NNCUWGnduJg0LQBlwQ3N8GzdXXRwRJFgOIT8LF1xVPjVUDjx1Vy8NLjheLW8eZktfKEhWVgosHRV3ZxUbUEsYL0tfO2VsJlsrfCljNSoi9Ku4jw==", "domain": ".alfabank.ru", "path": "/", "expires": 1778487997, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "mpid", "value": "NjgyMDVmM2QwMTFmNTMzZQ==", "domain": "sync.otm-r.ru", "path": "/", "expires": 1749630397.66852, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "gsscw-alfabank-retail", "value": "8Dkk6uzysnsnxoExz0WaH/74J0a5GKKxYCrScmcW5I7FZvs1Y2dqutsTzQMfP/OYnI9vknBlu/6OCbGFK9gdqw6Z5bmLQC6EBIHLHm//ReH77I0/R0/oUqf8fP/AsqEWlC1wNXUb509RHQwqkGopEwT7ZYV4ELnusN421HIw0s/J5Bs5g1jvTZIv9ViJv0ESzRZZgc8NHAzU9C+fPPZpADxuhiH0EdFH62RtHdk/hM1EBFQhge2MMhiMDgkP3gbxNdChAPKvHDAEGTxlkSTqB00V9T8ywuaiXXjE+j8=", "domain": "groupib-ac.alfabank.ru", "path": "/", "expires": 1778488030.688616, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "cfidsw-alfabank-retail", "value": "VzxbLNDV5NBTFTMgCqaAepzKZSg2AuI87mh7OY+aH+d0zV12npNKzhdZthsdf70GHeiIjbaKzPlAI1n89AXzkzoDkh2/iTHLNFfAJIF1zG6Np2/XsWZW59m3yW/G3fPUJyrx7k4W32CwtW5owKudkDIkyCwWJpIELvar4A==", "domain": "groupib-ac.alfabank.ru", "path": "/", "expires": 1778488030.688772, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "cfidsw-alfabank-retail", "value": "VzxbLNDV5NBTFTMgCqaAepzKZSg2AuI87mh7OY+aH+d0zV12npNKzhdZthsdf70GHeiIjbaKzPlAI1n89AXzkzoDkh2/iTHLNFfAJIF1zG6Np2/XsWZW59m3yW/G3fPUJyrx7k4W32CwtW5owKudkDIkyCwWJpIELvar4A==", "domain": ".web.alfabank.ru", "path": "/", "expires": 1778488030, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "cfidsw-alfabank-retail", "value": "VzxbLNDV5NBTFTMgCqaAepzKZSg2AuI87mh7OY+aH+d0zV12npNKzhdZthsdf70GHeiIjbaKzPlAI1n89AXzkzoDkh2/iTHLNFfAJIF1zG6Np2/XsWZW59m3yW/G3fPUJyrx7k4W32CwtW5owKudkDIkyCwWJpIELvar4A==", "domain": ".alfabank.ru", "path": "/", "expires": 1778488030, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "gsscw-alfabank-retail", "value": "8Dkk6uzysnsnxoExz0WaH/74J0a5GKKxYCrScmcW5I7FZvs1Y2dqutsTzQMfP/OYnI9vknBlu/6OCbGFK9gdqw6Z5bmLQC6EBIHLHm//ReH77I0/R0/oUqf8fP/AsqEWlC1wNXUb509RHQwqkGopEwT7ZYV4ELnusN421HIw0s/J5Bs5g1jvTZIv9ViJv0ESzRZZgc8NHAzU9C+fPPZpADxuhiH0EdFH62RtHdk/hM1EBFQhge2MMhiMDgkP3gbxNdChAPKvHDAEGTxlkSTqB00V9T8ywuaiXXjE+j8=", "domain": ".web.alfabank.ru", "path": "/", "expires": 1778488042, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "gsscw-alfabank-retail", "value": "8Dkk6uzysnsnxoExz0WaH/74J0a5GKKxYCrScmcW5I7FZvs1Y2dqutsTzQMfP/OYnI9vknBlu/6OCbGFK9gdqw6Z5bmLQC6EBIHLHm//ReH77I0/R0/oUqf8fP/AsqEWlC1wNXUb509RHQwqkGopEwT7ZYV4ELnusN421HIw0s/J5Bs5g1jvTZIv9ViJv0ESzRZZgc8NHAzU9C+fPPZpADxuhiH0EdFH62RtHdk/hM1EBFQhge2MMhiMDgkP3gbxNdChAPKvHDAEGTxlkSTqB00V9T8ywuaiXXjE+j8=", "domain": ".alfabank.ru", "path": "/", "expires": 1778488042, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "lipcookeid", "value": "!YZ/d4aBTxoAHVkuJIm0005mk4pPY5HqlSSHRy/VkDVs+4/8LothKya7gJUOnLr7q9jzUl/X242NyZ3YUhuTgsLp3fjUWhS6qx9bjUEQ=", "domain": "online.alfabank.ru", "path": "/", "expires": -1, "httpOnly": true, "secure": true, "sameSite": "Lax"}, {"name": "_sp_id.3c2b", "value": "aa98c4ba-a78c-4359-a368-143a639e7331.1746951746.1.1746952042.1746951746.2b2ae3d8-acf8-4069-97eb-a88c70e28187", "domain": ".alfabank.ru", "path": "/", "expires": 1781512042.460605, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "fgsscw-alfabank-retail", "value": "62yx8d793b86d100949677fb86684909bf1070a3", "domain": ".web.alfabank.ru", "path": "/", "expires": 1778488042, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "fgsscw-alfabank-retail", "value": "62yx8d793b86d100949677fb86684909bf1070a3", "domain": ".alfabank.ru", "path": "/", "expires": 1778488042, "httpOnly": false, "secure": false, "sameSite": "Lax"}], "origins": [{"origin": "https://web.alfabank.ru", "localStorage": [{"name": "snowplowOutQueue_sp_newclick-host-ui_get", "value": "[]"}, {"name": "DEVICE_APP_ID", "value": "3082d7e4-b8fc-4feb-9aa3-71c5d1748d9e"}, {"name": "user-last-activity-date", "value": "1746952038742"}, {"name": "snowplowOutQueue_sp_newclick-dashboard-ui_get", "value": "[\"?e=se&se_ca=Carousel%20for%20you&se_ac=View&se_la=Banner&tv=js-2.8.2&tna=newclick-dashboard-ui&aid=newclick_dashboard_ui&p=web&tz=Europe%2FMinsk&lang=ru-RU&cs=UTF-8&f_pdf=1&f_qt=0&f_realp=0&f_wma=0&f_dir=0&f_fla=0&f_java=0&f_gears=0&f_ag=0&res=1280x720&cd=30&cookie=1&eid=4b5328ee-efa7-4dd5-a2bb-8e3cc576558a&dtm=1746952042460&vp=1280x720&ds=1280x3549&vid=1&sid=2b2ae3d8-acf8-4069-97eb-a88c70e28187&duid=aa98c4ba-a78c-4359-a368-143a639e7331&fp=477354862&uid=AI6NSQ&refr=https%3A%2F%2Fprivate.auth.alfabank.ru%2F&url=https%3A%2F%2Fweb.alfabank.ru%2Fdashboard&cx=eyJzY2hlbWEiOiJpZ2x1OmNvbS5zbm93cGxvd2FuYWx5dGljcy5zbm93cGxvdy9jb250ZXh0cy9qc29uc2NoZW1hLzEtMC0wIiwiZGF0YSI6W3sic2NoZW1hIjoiaWdsdTpjb20uYWxmYWJhbmsvY3VzdG9tX2RpbWVuc2lvbi9qc29uc2NoZW1hLzEtMC0wIiwiZGF0YSI6eyIxIjoiU0FTXzE5MjUxNDA5NTIxIiwiMiI6IkRDX0lOU1RfQ09NTU9OX0FPXzAzMjAyNSIsIjMiOiJCSVBEQyIsIjQiOiJkYXNoYm9hcmQiLCI2Ijoi0JTQtdC90YzQs9C4INCywqDRgNCw0YHRgdGA0L7Rh9C60YNcbtCx0LXQtyDQv9GA0L7RhtC10L3RgtC-0LIiLCI3IjoiaHR0cHM6Ly93ZWIuYWxmYWJhbmsucnUvbXVsdGlzdGVwdWk_ZnJvbU1vZHVsZT1GT1JNJmFsaWFzPWRjLWluc3RhbGxtZW50LWxvYW4mc291cmNlPUxFTlRBX0ZPUl9ZT1VfQU9fTkVXIiwiOCI6MiwiNDAiOiI0NTIzOSIsIjQxIjpudWxsLCI0OCI6ImNsaWVudCIsIjQ5IjoiQURVTFQiLCI1MCI6InVuZGVmaW5lZCJ9fV19\"]"}, {"name": "logout-reason", "value": ""}, {"name": "AlfaOnlineOpenedTabs", "value": "1"}, {"name": "__gitd", "value": "MDA0dC0iD2k5IVB2GApFSE5PMyhXQXt1Fy9LICglLS8PaTleJktWU3orHhN4cChYfw5hLxY=69EuPg=="}, {"name": "PRIVATE_KEY_ENC", "value": "eyJpdiI6IkVPOEVtMzBxZWp4Ym9CTC9zaGZvVkE9PSIsInYiOjEsIml0ZXIiOjEwMDAsImtzIjoyNTYsInRzIjoxMjgsIm1vZGUiOiJjY20iLCJhZGF0YSI6IiIsImNpcGhlciI6ImFlcyIsInNhbHQiOiJSb3V1Z05WdnBtbldXRUZRanQreStZSWtEcWZPcGVwYiIsImN0IjoiejhHaERSVGxpQU5JWHJ3SXFKYzRkSkhnWVU4RnZDaU9iNlFDYjQ3dkU1Q2FSQ2hVdWJpVTJqUWpuZWNoOXhjNENEZ0xUbmI5VU1DWDljUzA4NlJvMjRCT3dmNjk4a0tzbE1TNmhDdXdkaUFYWWcvOEtXMHV1M2ZJWE9XQmJ3VCsxVVptR1FMNEZFeGdHSVpjOWYyRnlCNElNS01KcWVoK0ljZmpTcHFKWWR1UmExOGZaZE1aUXVFRXRsQm9sUUVZc2tzMkJ4UTFiaGMwUmNEa28wTFo3cG5UREhWYzQzVGtKdDVjTWZhQWQ3ZW5OVUlsdktQOXhmRTlMdUlRQkErNy9ReFFxc1ZhZWhDbklrZTRCQVRaSVhSc2JhR3ZWQXlzY2dJRDNWQ0xGQzRnYy9vRHBQQVd1T0ZDUmd4cUZVOG9NcWtvNVBOVmh6SnRMSWduNUJSQ043QnpML3BUb3pNN1FZYXZER1I0U1hWL1VQWWVBb0RUN2I0YjRMYUJhR29wSnIrWTlUSUxlZkZnZnZoWnpaVFFUT0poc2JIcDVtV3NuelBlTnZlRDh1SVpESjUzMkhUNFRVaWY4d1oyOGtybGZablFXb2szWFpoam9DMkJsYVRwWmEzaHN5ZzBHY2ZaUUJ2Y05YVzhyRlNjaGRocVRWT3lpOVJZbW5USEhnL2dZZnFhM1dTY00zc1o1dHNsWEEvVElvSU04UlNCSzVOV2luQ1dna25yc0lCQzN0VUFSNEJBbXJuYzA0eGk3aWpPRjBwT0xpN3VnSThGS2ZTQ2RPWWpoeTBRYzZmWUYwWmwzQUZUQVFDZjUrR0U1M0hZTkNoZGR1clp5bHh3L1NVbk5zTkdqQ3hFcFNLTkhoZE9ITVdwOVlmWWJqU2tMVmpUM2t0MVQva0ZzMG13b0dKcGpVYkFmYVhBNFhSbGUrTWpmR3h4NnRiOGNzbkxyNkJEREVDcGlVc3ZTTXlpelNRNHhNMk94QnhFbXNjdkJndzVDeSs1WFRkTWp3d3VOcW12VGJTQiswMU1QWXM5VVpGcUJWTzhtQ3VHOUZadDFGVW1icXlFbFRsa0Z5K3VSSUJsbFh3c3NZME0rOW53bzJ1V1ZxcVo1RlNHaTBZWkV5ZHV4R0pHZ01VNHpIeTE0d3ZyUHBia0QrNzlKLy9HcGtNcFpzUFhzY3d0MHIwTlhIU1VOQmU1OUo4NGo3WjJ6UjM1Q1dTYTNFNlp2WkY3Mk5sMDl5RVJRc1JiMW8wVmpham9WbjRkYXRlajZzbUxMK3VhdTZ1L2RVS1Y2RThFc2hVZFdHZWxwUW9ydnpxNi9paSt5SHJzT2hvSE9KVU9sQXJYZS9sTlg1NWRSRFlyMXpuRnY5VlZTZ1VZNXczK3BYSXBvd0tSYW05dk9VUnVYQ1lWK0RKYjNqUjNYbHVCTEJHcWFsZUwyQlZFcHMwYlZKS2crRldEMk4raUQvczg5anJTWVJtTEF6bmErNy9XbUJvZUxRL0IvWkVzdHFtcHorTDJveVpvMjIya1dBU0NvdXRIUTFCb1U2YXlGNHNFK2FVeHkrRkdiZStldGdTUitnRFptU3BGNWlMSEo5ZFFIWkl6dlltTHZ2TkN0ajUySDkvNXQrVHN1R0RUT3gzWENHZVRSaVFmZVBJUDRFbUJobnZNempkbzBwMDlHTFduTTluTks2QUJDWmp5UGJpSmJ2SjJmZzJqd0w1QWdzdnVad010OVZVckYzR2ZNcmNEQkl1ald4c2pJd0M4M2UyNnRuNitvbVlYVUFhY0VhdW1LTDFrbHViMjdUNStjbFZsNmkxTzJBY3FBZmZxc2tQTWdZTFdBNGFvcVlvTHhWeGo5aHRDK2ZxblI3TW9sSEszSmZXOGFKS0N5NUdYRXZtSjBKQU1tWUlydms2cWcxQU05M0hhZjhhT0pGTDVUdzlZOXBMa0trZExPeGZZK0QyOTJJZlFYcjNUd3RLTUJPYmxWTjducjNMZGpnQnN0Vm82c3RTaTVIaG00WUx5Uzg1SDVER3g0NjlkR05TL3VScmwycVZ1Q0t5dkowdTg1U21zckdaMWUxNTJxZDdTQWNwUDY2OTB0Z21ySiswSWFZSENnOHRPdC9Ld2RnN0x6L3o1eHdZZUxqaWxNMXBGUUtndUtSMXNuY2l0d1VOVHBVL0dCc2lPUTBWZS9aa1cvR2JrK1FHVVZPdDR0UVRYUGIyU2RpLzg5eTZTZFIrbi9QaGJwMU5DT0FGdFhGL1JUN1FqeEdTYVVTZEN5M2FOQzFBTytRZWEwQ0xNSzExN1lTLzNSK0xDWU8rMUFYNjJhK0VWMUcwZStpZUlML3Z1aHliUDNFMnBWZ1lOYllQaGVwVXNvNXl1ekJQZEtUekcrQ0s1T2dqSnhFTW41QU5xb2RDOXZmWTVXNG9taitIeGxhcFdnN3crZEpuOFRhYmcwbm1sWndLb09UN2dhV3RuT1pSR1QwaUJTQmVZV1lXK0Fhc1V1Y2g3RDZpc3gxZEM0ZUlmb2krTVdDOUhiOEYwRXZFT3FmQXdlRCtJWWU3MkhuQlphUnFCb2tzOVZyQ3pObFZPZys1LzMwZmEydTFhQi9pMG9kdWR6dUk3OFdwTnI5WEhvc0haTXppS3JVbFMyY3ZDa040Um5hbHpVMzJOWFdJTUxVYUJlTHBEeFBlR2U4SGsvWDVNTzIrVFl3UTUxYzhzdWZPRllLS3QvZlhDbWpZVUx5YzV5bWlyZ3ErbXh4YnJxeExrakxqQlBaKzJ1TnI2YVVtTmNWaXRHN3V4c1R5WG5oRStEbFpXOUNZTkQyMGY5VStCRkFjVWhPYkJoakF4T2pWWHdKSmxtSmRPMXJxNHBTQTMifQ=="}, {"name": "identificationType", "value": "undefined"}, {"name": "userRole", "value": "client"}, {"name": "snowplowOutQueue_sp_newclick-deeplink-ui_get", "value": "[]"}, {"name": "SECURED_DEVICE_SECRET", "value": "bca6f1e6-ce22-4b06-871e-da2915343883d9f600ee-e463-49f8-b4ea-7c55331ba731"}, {"name": "__zzatw-alfabank-retail", "value": "MDA0dC0cTHtmcDhhDHEWTT17CT4VHThHKHIzd2U6VGs7CmhLGzUdCkNoUlRDXS1BSk8if3IsMBs3V2EgDBYRTVZUfSsiFnh0LFYLD1s5MzlEaXBXJ1EPHVB8Gxk2bV17TGcVfjYucGBkDhpHan4xUVEsEREOEUZaCxtpJCkICA4VQkVqejFxIhpjSF0lQA9NNCUWGnduJg0LQBlwQ3N8GzdXXRwRJFgOIT8LF1xVPjVUDjx1Vy8NLjheLW8eZktfKEhWVgosHRV3ZxUbUEsYL0tfO2VsJlsrfCljNSoi9Ku4jw=="}, {"name": "userAgeRange", "value": "ADULT"}, {"name": "otm_save_flag", "value": "{\"otm_id\":\"7503101694815720254\",\"exp_date\":1747038397670}"}, {"name": "DEVICE_PUBLIC_KEY_ID", "value": "1324b1de-39df-4b08-b852-eac65192fb44"}]}, {"origin": "https://private.auth.alfabank.ru", "localStorage": [{"name": "__gitd", "value": "MDA0dC0iD2k5IVB2GApFSE5PMyhXQXt1Fy9LICglLS8PaTlaJExaVHsmIBd8biVRCQ5hQzNC+4S3OA=="}, {"name": "snowplowOutQueue_sp_ab_get", "value": "[]"}, {"name": "browser_secret_date", "value": "1746951995518"}, {"name": "__zzatw-alfabank-retail", "value": "MDA0dBA=Fz2+aQ=="}, {"name": "x-user-info", "value": "eyJuYW1lIjogItCc0LjRhdCw0LjQuyJ9"}, {"name": "browser_secret", "value": "76698639-09ad-4ea2-b4da-77ab753960363da43dba-6e20-45b4-b336-62b184b22427"}]}]}
@@ -0,0 +1,79 @@
1
+ import asyncio
2
+ import os
3
+ from playwright.async_api import async_playwright
4
+ from playwright._impl._errors import TimeoutError
5
+
6
+
7
+ async def main():
8
+ from x_model import init_db
9
+ from xync_schema import models
10
+ from xync_client.loader import PG_DSN
11
+
12
+ _ = await init_db(PG_DSN, models, True)
13
+ agent = await models.PmAgent.filter(pm__norm="sber", auth__isnull=False).first()
14
+
15
+ async with async_playwright() as p:
16
+ storage_state = "state.json" if os.path.exists("state.json") else None
17
+ browser = await p.chromium.launch(headless=False)
18
+ context = await browser.new_context(storage_state=storage_state, record_video_dir="videos")
19
+ page = await context.new_page()
20
+
21
+ await page.goto("https://online.sberbank.ru/CSAFront/index.do")
22
+ try:
23
+ await page.wait_for_url("https://online.sberbank.ru/CSAFront/index.do", timeout=3000)
24
+ except TimeoutError:
25
+ if card := agent.auth.get("card"):
26
+ await page.locator('button[aria-controls="tabpanel-card"]').is_visible()
27
+ await page.locator('button[aria-controls="tabpanel-card"]').click()
28
+ await page.wait_for_selector('input[placeholder="Введите номер карты"]', timeout=10000)
29
+ await page.locator('input[placeholder="Введите номер карты"]').fill(card)
30
+ await page.locator('button[type="submit"]').click()
31
+
32
+ sms_code = input("Введите код из SMS: ")
33
+ for i in range(5):
34
+ await page.locator(f'input[name="confirmPassword-{i}"]').fill(sms_code[i])
35
+
36
+ password = input("Введите 5-значный код: ")
37
+ await page.wait_for_selector(".FWAhBZHPePsATLTVFeTT", timeout=10000)
38
+ otp_fields = page.locator('[class="BjsSl7Uv2es5tUtwB03r"]')
39
+ for i in range(await otp_fields.count() + 1):
40
+ await page.keyboard.press(password[i])
41
+
42
+ await page.wait_for_timeout(1000)
43
+
44
+ await page.wait_for_selector(".Re_Wg4Drqw9QjVM43vJ_", timeout=10000)
45
+ fields = page.locator('[class="BjsSl7Uv2es5tUtwB03r"]')
46
+ for i in range(await fields.count() + 1):
47
+ await page.keyboard.press(password[i])
48
+ await page.wait_for_timeout(100000)
49
+ elif login := agent.auth.get("login"):
50
+ await page.locator('input[autocomplete="login"]').fill(login)
51
+ password = input("Введите пароль: ")
52
+ await page.locator('input[autocomplete="password"]').fill(password)
53
+ await page.locator('button[data-testid="button-continue"]').click()
54
+ sms_code = input("Введите код из SMS: ")
55
+ for i in range(5):
56
+ await page.locator(f'input[name="confirmPassword-{i}"]').fill(sms_code[i])
57
+
58
+ password = input("Введите 5-значный код: ")
59
+ await page.wait_for_selector(".FWAhBZHPePsATLTVFeTT", timeout=10000)
60
+ otp_fields = page.locator('[class="BjsSl7Uv2es5tUtwB03r"]')
61
+ for i in range(await otp_fields.count() + 1):
62
+ await page.keyboard.press(password[i])
63
+
64
+ await page.wait_for_timeout(1000)
65
+
66
+ await page.wait_for_selector(".Re_Wg4Drqw9QjVM43vJ_", timeout=10000)
67
+ fields = page.locator('[class="BjsSl7Uv2es5tUtwB03r"]')
68
+ for i in range(await fields.count() + 1):
69
+ await page.keyboard.press(password[i])
70
+
71
+ await page.wait_for_timeout(100000)
72
+ await context.storage_state(path="state.json")
73
+
74
+ await context.close()
75
+ await browser.close()
76
+
77
+
78
+ if __name__ == "__main__":
79
+ asyncio.run(main())
@@ -0,0 +1,88 @@
1
+ import asyncio
2
+
3
+ from playwright.async_api import async_playwright
4
+ from playwright._impl._errors import TimeoutError, Error
5
+
6
+
7
+ async def main():
8
+ async with async_playwright() as p:
9
+ browser = await p.chromium.launch(headless=False)
10
+ context = await browser.new_context(storage_state="state.json", record_video_dir="videos")
11
+ page = await context.new_page()
12
+ await page.goto("https://www.tbank.ru/mybank/")
13
+ await page.wait_for_timeout(1000)
14
+ try:
15
+ await page.wait_for_url("https://www.tbank.ru/mybank/", timeout=3000)
16
+ except TimeoutError:
17
+ # Новый пользователь
18
+ if await page.locator('[automation-id="form-title"]', has_text="Вход в Т‑Банк").is_visible():
19
+ await page.wait_for_timeout(200)
20
+ await page.locator('[automation-id="phone-input"]').fill("9992259898")
21
+ await page.locator('[automation-id="button-submit"] svg').click()
22
+ # Известный пользователь
23
+ else:
24
+ await page.locator('[automation-id="button-submit"]').click()
25
+ await page.wait_for_timeout(100)
26
+ await page.locator('[automation-id="otp-input"]').fill(input("Введите код"))
27
+ await page.wait_for_timeout(1000)
28
+ if await page.locator('[automation-id="cancel-button"]').is_visible():
29
+ await page.wait_for_timeout(3000)
30
+ await page.locator('[automation-id="cancel-button"]', has_text="Не сейчас").click(delay=500)
31
+ elif await page.locator('[automation-id="password-input"]').is_visible():
32
+ await page.locator('[automation-id="password-input"]').fill("mixfix98")
33
+ await page.locator('[automation-id="button-submit"] svg').click()
34
+ await page.context.storage_state(path="state.json")
35
+ await page.wait_for_timeout(200)
36
+
37
+ # Переходим на сбп и вводим данные получателя
38
+ # await page.locator(
39
+ # '[data-qa-type="desktop-ib-pay-buttons"] [data-qa-type="atomPanel pay-card-0"]',
40
+ # has_text="Перевести по телефону",
41
+ # ).click()
42
+ # await page.locator('[data-qa-type="recipient-input.value.placeholder"]').click()
43
+ # await page.wait_for_timeout(300)
44
+ # await page.locator('[data-qa-type="recipient-input.value.input"]').fill("9992259898")
45
+ # await page.locator('[data-qa-type="amount-from.placeholder"]').click()
46
+ # await page.locator('[data-qa-type="amount-from.input"]').fill("100")
47
+ # await page.wait_for_timeout(300)
48
+ # await page.locator('[data-qa-type="bank-plate-other-bank click-area"]').click()
49
+ # await page.locator('[data-qa-type*="inputAutocomplete.value.input"]').click()
50
+ # await page.locator('[data-qa-type*="inputAutocomplete.value.input"]').fill("Озон")
51
+ # await page.wait_for_timeout(300)
52
+ # await page.locator('[data-qa-type="banks-popup-list"]').click()
53
+ # await page.locator('[data-qa-type="transfer-button"]').click()
54
+
55
+ # Проверка последнего платежа
56
+ try:
57
+ await page.goto("https://www.tbank.ru/events/feed")
58
+ except Error:
59
+ await page.wait_for_timeout(1000)
60
+ await page.goto("https://www.tbank.ru/events/feed")
61
+ await page.wait_for_timeout(2000)
62
+ await page.locator('[data-qa-type = "timeline-operations-list"]:last-child').scroll_into_view_if_needed()
63
+ transactions = await page.locator(
64
+ '[data-qa-type="timeline-operations-list"] [data-qa-type="operation-money"]'
65
+ ).all_text_contents()
66
+ result = recursion_payments(100, transactions)
67
+ if result == 100:
68
+ print("Платеж", result, "получен")
69
+ else:
70
+ print("Ничегошеньки нет")
71
+ await page.wait_for_timeout(3000)
72
+ await context.close()
73
+ await page.video.path()
74
+ # BufferedInputFile(pth, 'tbank')
75
+ # await bot.send_video('mixartemev')
76
+ ...
77
+ await browser.close()
78
+
79
+
80
+ def recursion_payments(amount: int, transactions: list):
81
+ tran = transactions.pop(0)
82
+ normalized_tran = tran.replace("−", "-").replace(",", ".")
83
+ if 0 > int(float(normalized_tran)) != amount:
84
+ return recursion_payments(amount, transactions)
85
+ return int(float(tran.replace("−", "-").replace(",", ".")))
86
+
87
+
88
+ asyncio.run(main())
@@ -0,0 +1 @@
1
+ {"cookies": [{"name": "SSO_CONVERSATION_CSRF_KHm2f", "value": "yjYGHKshOgHjpG5NeWzWnoQ5sOY.1746868636", "domain": "id.tbank.ru", "path": "/auth", "expires": 1746870436.083603, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "SSO_CONVERSATION_CSRF_fKa8U", "value": "CHzL_q5JBzl0eyAd7-Bxm1jaBIc.1746869224", "domain": "id.tbank.ru", "path": "/auth", "expires": 1746871024.185283, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "SSO_CONVERSATION_CSRF_csrHb", "value": "wB62INnKtyQ1zEZfTxirzC5yJR0.1746869831", "domain": "id.tbank.ru", "path": "/auth", "expires": 1746871631.718935, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "SSO_CONVERSATION_CSRF_wf6u8", "value": "xpeQ6ktey2L_b9siFlaK1fgJQa8.1746869999", "domain": "id.tbank.ru", "path": "/auth", "expires": 1746871799.640428, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "isSubscribedToPush", "value": "false", "domain": ".tbank.ru", "path": "/", "expires": 1781428634.642818, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "__P__wuid", "value": "357e0453744ecb9f0872a3cea1788d63", "domain": ".tbank.ru", "path": "/", "expires": 1778405999.640488, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "x-ssoId", "value": "", "domain": "www.tbank.ru", "path": "/", "expires": -1, "httpOnly": true, "secure": true, "sameSite": "Lax"}, {"name": "dco.id", "value": "fe913cd8-7bbb-4a4d-b756-00003b519cd4", "domain": ".tbank.ru", "path": "/", "expires": 1778405998.533392, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "stDeIdU", "value": "357e0453744ecb9f0872a3cea1788d63", "domain": ".tbank.ru", "path": "/", "expires": 1781428634.934439, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "userType", "value": "Visitor", "domain": ".tbank.ru", "path": "/", "expires": 1781429998.908664, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "dsp_click_id", "value": "no%20dsp_click_id", "domain": ".tbank.ru", "path": "/", "expires": 1752053998, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "pageLanding", "value": "https%3A%2F%2Fwww.tbank.ru%2Fauth%2Flogin%2F", "domain": ".tbank.ru", "path": "/", "expires": -1, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "__P__wuid_visit_id", "value": "v1%3A0000001%3A1746868634956%3A357e0453744ecb9f0872a3cea1788d63", "domain": ".tbank.ru", "path": "/", "expires": 1781429998.928833, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "__P__wuid_visit_persistence", "value": "1746868634956", "domain": ".tbank.ru", "path": "/", "expires": 1746871798, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "vIdUid", "value": "6a491558-3424-4acb-9d5d-5f360c313cf2", "domain": ".tbank.ru", "path": "/", "expires": 1781428635.032442, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "stSeStTi", "value": "1746868635032", "domain": ".tbank.ru", "path": "/", "expires": 1781428635.03296, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "mediaInfo", "value": "{%22width%22:1280%2C%22height%22:720%2C%22isTouch%22:false%2C%22displayMode%22:%22browser%22%2C%22retina%22:false}", "domain": "www.tbank.ru", "path": "/", "expires": -1, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "__P__wuid_last_update_time", "value": "1746868634956", "domain": ".tbank.ru", "path": "/", "expires": 1781428635.036991, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "api_prefix_594f33", "value": "w6LDIW5eCSOwIQXEugwFv_lBadPeFnVrvr_wdYP8Qdk.1746868635", "domain": "www.tbank.ru", "path": "/", "expires": 1746870435.120456, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "api_prefix_6d17aa", "value": "8wGZVFr_2tViPADH5DIXNnWwJj_MFzi1iRo7FtvpA80.1746868635", "domain": "www.tbank.ru", "path": "/", "expires": 1746870435.58469, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "last_getuaid", "value": "1746868635", "domain": "id.tinkoff.ru", "path": "/", "expires": 1778404635.96212, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "sso_cookies_migrated", "value": "true", "domain": "id.tbank.ru", "path": "/", "expires": 1762420636.014557, "httpOnly": true, "secure": true, "sameSite": "Lax"}, {"name": "last_setuaid", "value": "1746868636", "domain": "id.tbank.ru", "path": "/", "expires": 1778404636.014685, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "sso_uaid", "value": "uaid.ILmm0h260gW89SLgwF8YBTmBI1huv6meZ2VGmaNZSkgbBFWth2Nl3Vsowa30DDm6", "domain": "id.tbank.ru", "path": "/", "expires": 1762421999.640528, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "api_prefix_e508ad", "value": "-gn0quC8c9HqnibECdoX9qLjS_PMTl3xB-Er9hpYpvc.1746869223", "domain": "www.tbank.ru", "path": "/", "expires": 1746871023.753302, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "api_prefix_c04771", "value": "y1D5N7cu9XjVqlpv-62VqPWwVUANWEgx7g_37ILk4KY.1746869224", "domain": "www.tbank.ru", "path": "/", "expires": 1746871024.115589, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "psid", "value": "I0UerouudQw4Q6Zo6RLt5FWos9sAOETt.auth-entity-mgmt-5ffc8797c6-g5xsv", "domain": "www.tbank.ru", "path": "/", "expires": 1746870490, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "api_prefix_996320", "value": "G1qeydXpdOBqumqfERB2UMJqIy2e88nHQALMWJKMEFY.1746869831", "domain": "www.tbank.ru", "path": "/", "expires": 1746871630.998858, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "api_prefix_ba8a0d", "value": "2QXqGla7a_8wbOqCU9zvR7Ab1YdGAIoT3BN2Ln9pNes.1746869831", "domain": "www.tbank.ru", "path": "/", "expires": 1746871631.602552, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "_t_modern", "value": "true", "domain": "www.tbank.ru", "path": "/", "expires": -1, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "api_prefix_a8e066", "value": "KNAo7FK9ZijwufO-btbU90ItN5G7ZRQ7cMbAEsFNFJM.1746869999", "domain": "www.tbank.ru", "path": "/", "expires": 1746871799.067144, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "api_prefix_ecc1af", "value": "JNnt0-Es4RXiK2r-pBtJoPhT6kLH_KTlUFI0O80y9Cs.1746869999", "domain": "www.tbank.ru", "path": "/", "expires": 1746871799.561736, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "tid_cid_timestamp", "value": "wf6u8TpJ4E80:1746870020464", "domain": "id.tbank.ru", "path": "/", "expires": 1781430020, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "stLaEvTi", "value": "1746870024328", "domain": ".tbank.ru", "path": "/", "expires": 1781430024.328793, "httpOnly": false, "secure": true, "sameSite": "None"}], "origins": [{"origin": "https://www.tbank.ru", "localStorage": [{"name": "twt_wuid_visit_storage", "value": "{\"visitId\":\"v1:0000001:1746868634956:357e0453744ecb9f0872a3cea1788d63\",\"items\":{\"pageLanding\":\"https://www.tbank.ru/auth/login/\"}}"}, {"name": "dco_general_ids", "value": ""}]}]}
@@ -1,4 +1,3 @@
1
- import logging
2
1
  import re
3
2
  from asyncio import run, sleep
4
3
  from enum import StrEnum
@@ -6,7 +5,7 @@ from os.path import dirname
6
5
  from typing import Literal
7
6
 
8
7
  from aiogram.types import BufferedInputFile
9
- from playwright.async_api import async_playwright, Page, FloatRect, Locator
8
+ from playwright.async_api import async_playwright, Page
10
9
  from pyotp import TOTP
11
10
  from pyrogram import filters
12
11
  from pyrogram.handlers import MessageHandler
@@ -15,8 +14,8 @@ from playwright._impl._errors import TimeoutError
15
14
  from xync_schema.enums import UserStatus
16
15
  from xync_schema.models import User, PmAgent
17
16
 
18
- from xync_client.pyro import PyroClient
19
- from xync_client.loader import bot, dp
17
+ from xync_client.TgWallet.pyro import PyroClient
18
+ from xync_client.loader import bot
20
19
 
21
20
 
22
21
  class ExtraCaptchaException(Exception): ...
@@ -58,8 +57,7 @@ async def report(uid: int, byts: bytes, msg: str, exc: bool = True):
58
57
 
59
58
  class Client:
60
59
  agent: PmAgent
61
- bbot: PyroClient
62
- ubot: PyroClient
60
+ pbot: PyroClient
63
61
  page: Page
64
62
  gpage: Page
65
63
 
@@ -72,10 +70,10 @@ class Client:
72
70
  async def start(self, headed: bool = False):
73
71
  self.agent = await PmAgent.get(user_id=self.uid, user__status__gt=0, pm__norm="volet").prefetch_related("user")
74
72
 
75
- self.ubot, self.bbot = PyroClient(self.agent.user), PyroClient(bot)
76
- await self.ubot.app.start(), await self.bbot.app.start()
73
+ self.pbot = PyroClient(self.agent)
74
+ await self.pbot.app.start()
77
75
  self.msg_listener = MessageHandler(self.got_msg, filters.chat(["ProtectimusBot"]))
78
- self.ubot.app.add_handler(self.msg_listener)
76
+ self.pbot.app.add_handler(self.msg_listener)
79
77
 
80
78
  playwright = await async_playwright().start()
81
79
  browser = await playwright.chromium.launch(
@@ -115,7 +113,7 @@ class Client:
115
113
  await self.page.click("input#checkOtpButton")
116
114
  await self.page.wait_for_url(Pages.HOME)
117
115
 
118
- async def wait_for_code(self, typ: Literal["login", "send", "cap_xy"], past: int = 0, timeout: int = 5) -> str:
116
+ async def wait_for_code(self, typ: Literal["login", "send"], past: int = 0, timeout: int = 5) -> str:
119
117
  while past < timeout:
120
118
  if code := self.msgs.pop(f"otp_{typ}", None):
121
119
  return code
@@ -126,7 +124,7 @@ class Client:
126
124
  async def got_msg(self, _, msg: Message):
127
125
  if "Your OTP code:" in msg.text:
128
126
  self.msgs["otp_login"] = msg.text[-6:]
129
- elif "Confirmation code:" in msg.text:
127
+ if "Confirmation code:" in msg.text:
130
128
  self.msgs["otp_send"] = msg.text[-6:]
131
129
  elif "Status: Completed. Sender:" in msg.text:
132
130
  self.msgs["got_payment"] = parse_transaction_info(msg.text)
@@ -139,7 +137,7 @@ class Client:
139
137
  await self.page.fill("#srcAmount", str(amount))
140
138
  await self.page.fill("#destWalletId", dest)
141
139
  await self.page.wait_for_timeout(300)
142
- await self.page.locator("form#mainForm input[type=submit]", has_text="continue").click()
140
+ await self.page.locator("input[type=submit]", has_text="continue").click()
143
141
  if otp := self.agent.auth.get("otp"):
144
142
  totp = TOTP(otp)
145
143
  code = totp.now()
@@ -159,16 +157,23 @@ class Client:
159
157
 
160
158
  async def gmail_page(self):
161
159
  gp = await self.page.context.new_page()
162
- await gp.goto(Pages.GMH, timeout=30000)
160
+ await gp.goto(Pages.GMH, timeout=20000)
163
161
  if not gp.url.startswith(Pages.GMH):
164
- if await ( # ваще с 0 заходим
162
+ # ваще с 0 заходим
163
+ if await (
165
164
  sgn_btn := gp.locator(
166
165
  'header a[href^="https://accounts.google.com/AccountChooser/signinchooser"]:visible',
167
- has_text="sign",
166
+ has_text="sign in",
168
167
  )
169
168
  ).count():
170
169
  await sgn_btn.click()
171
- if gp.url.startswith("https://accounts.google.com/v3/signin/accountchooser"): # если надо выбрать акк
170
+ # если надо выбрать акк
171
+ lang = await gp.get_attribute("html", "lang")
172
+ sgn = {
173
+ "ru": "Выберите аккаунт",
174
+ "en": "Choose an account",
175
+ }
176
+ if await gp.locator("h1#headingText", has_text=sgn[lang]).count():
172
177
  await gp.locator("li").first.click()
173
178
  # если предлагает залогиниться
174
179
  elif await gp.locator("h1#headingText", has_text="Sign In").count():
@@ -176,7 +181,8 @@ class Client:
176
181
  await gp.locator("button", has_text="Next").click()
177
182
  # осталось ввести пороль:
178
183
  await gp.fill("input[type=password]", self.agent.user.gmail_auth["password"])
179
- await gp.locator("#passwordNext").click()
184
+ nxt = {"ru": "Далее", "en": "Next"}
185
+ await gp.locator("button", has_text=nxt[lang]).click()
180
186
  await report(self.uid, await gp.screenshot(), "Аппрувни гмейл, у тебя 1.5 минуты", False)
181
187
  await gp.wait_for_url(lambda u: u.startswith(Pages.GMH), timeout=90 * 1000) # убеждаемся что мы в почте
182
188
  self.gpage = gp
@@ -206,32 +212,13 @@ class Client:
206
212
  except Exception as e:
207
213
  await report(self.uid, await self.page.screenshot(), repr(e))
208
214
 
209
- async def send_cap_help(self, xcap: Locator):
210
- bb = await xcap.bounding_box(timeout=2000)
211
- byts = await self.page.screenshot(clip=bb)
212
- infile = BufferedInputFile(byts, "cap_xy.png")
213
- await self.bbot.send_img("put x, y", byts)
214
- self.bbot.app.storage.user_id()
215
- await bot.send_photo(uid, infile, caption=msg)
216
- await report(self.uid, byts, "x, y", False)
217
- dp.message.register(self.got_cap_xy)
218
-
219
- async def got_cap_xy(self, _, msg):
220
- self.msgs["typ_cap_xy"] = msg.text.split(",")
221
-
222
215
  async def captcha_click(self):
223
216
  captcha_url = self.page.url
224
217
  cbx = self.page.frame_locator("#main-iframe").frame_locator("iframe").first.locator("div#checkbox")
225
218
  await cbx.wait_for(state="visible"), await self.page.wait_for_timeout(500)
226
219
  await cbx.click(delay=94)
227
- xcap = self.page.frame_locator("#main-iframe").frame_locator("iframe").last.locator("div.challenge-view")
228
- if await xcap.count():
229
- await self.send_cap_help(xcap)
230
- x, y = await self.wait_for_code("cap_xy", timeout=59)
231
-
232
220
  try:
233
221
  await self.page.wait_for_url(lambda url: url != captcha_url)
234
-
235
222
  except TimeoutError: # if page no changed -> captcha is undone
236
223
  await self.page.screenshot(path=dirname(__file__) + "/xtr_captcha.png")
237
224
  raise ExtraCaptchaException(self.page.url)
@@ -249,22 +236,20 @@ class Client:
249
236
  # closing
250
237
  await self.page.context.close()
251
238
  await self.page.context.browser.close()
252
- self.ubot.app.remove_handler(self.msg_listener)
253
- await self.ubot.app.stop(), await self.bbot.app.stop()
239
+ self.pbot.app.remove_handler(self.msg_listener)
240
+ await self.pbot.app.stop()
254
241
 
255
242
 
256
- async def _test():
243
+ async def _test(uid: int, dest: str, amount):
257
244
  from x_model import init_db
258
245
  from xync_client.loader import PG_DSN
259
246
  from xync_schema import models
260
247
 
261
248
  _ = await init_db(PG_DSN, models, True)
262
- logging.basicConfig(level=logging.DEBUG)
263
- uid = 193017646
264
249
  va = Client(uid)
265
250
  try:
266
251
  await va.start(True)
267
- await va.send("alena.artemeva25@gmail.com", 8.3456)
252
+ await va.send(dest, amount)
268
253
  await va.wait_for_payments()
269
254
  except TimeoutError as te:
270
255
  await report(uid, await va.page.screenshot(), repr(te))
@@ -272,4 +257,4 @@ async def _test():
272
257
 
273
258
 
274
259
  if __name__ == "__main__":
275
- run(_test())
260
+ run(_test(7807393311, "alena.artemeva25@gmail.com", 8.3456))