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.
- {xync_client-0.0.43.dev35/xync_client.egg-info → xync_client-0.0.43.dev42}/PKG-INFO +1 -1
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Abc/Ex.py +12 -12
- xync_client-0.0.43.dev42/xync_client/Pms/Alfa/__init__.py +102 -0
- xync_client-0.0.43.dev42/xync_client/Pms/Alfa/state.json +1 -0
- xync_client-0.0.43.dev42/xync_client/Pms/Sber/__init__.py +79 -0
- xync_client-0.0.43.dev42/xync_client/Pms/Tinkoff/__init__.py +88 -0
- xync_client-0.0.43.dev42/xync_client/Pms/Tinkoff/state.json +1 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Pms/Volet/__init__.py +28 -43
- xync_client-0.0.43.dev42/xync_client/Pyrogram/base.py +42 -0
- xync_client-0.0.43.dev42/xync_client/Pyrogram/bot.py +11 -0
- xync_client-0.0.43.dev42/xync_client/Pyrogram/file.py +61 -0
- xync_client-0.0.43.dev42/xync_client/Pyrogram/user.py +104 -0
- xync_client-0.0.43.dev42/xync_client/TgWallet/pyro.py +43 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/loader.py +1 -3
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42/xync_client.egg-info}/PKG-INFO +1 -1
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client.egg-info/SOURCES.txt +7 -3
- xync_client-0.0.43.dev35/xync_client/Pms/Tinkoff/__init__.py +0 -89
- xync_client-0.0.43.dev35/xync_client/Pms/Tinkoff/state.json +0 -1
- xync_client-0.0.43.dev35/xync_client/Pms/Tinkoff/storage.json +0 -0
- xync_client-0.0.43.dev35/xync_client/TgWallet/pyro.py +0 -147
- xync_client-0.0.43.dev35/xync_client/pg_storage.py +0 -276
- xync_client-0.0.43.dev35/xync_client/pyro.py +0 -121
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/.env.sample +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/.gitignore +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/.pre-commit-config.yaml +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/README.md +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/makefile +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/pyproject.toml +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/setup.cfg +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/TestAgent.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/TestAsset.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/TestEx.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/TestOrder.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/_todo_refact/Binance/test_binance.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/_todo_refact/Bybit/test_bybit.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/_todo_refact/Bybit/test_bybit_p2p.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/_todo_refact/Gate/test_gate.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/_todo_refact/Htx/test_htx_p2p.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/_todo_refact/Wallet/test_agent.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/_todo_refact/Wallet/test_ex.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/_todo_refact/__init__.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/tests/_todo_refact/_test_ex.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Abc/Agent.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Abc/Asset.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Abc/AuthTrait.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Abc/Base.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Abc/BaseTest.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Abc/InAgent.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Abc/Order.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Abc/types.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Binance/__init__.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Binance/binance_async.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Binance/earn_api.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Binance/etype/ad.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Binance/etype/pm.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Binance/ex.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Binance/exceptions.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Binance/sapi.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Binance/web_c2c.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BingX/__init__.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BingX/agent.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BingX/base.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BingX/etype/ad.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BingX/etype/pm.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BingX/ex.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BingX/req.mjs +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BingX/sign.js +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BitGet/__init__.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BitGet/agent.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BitGet/etype/ad.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BitGet/ex.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BitGet/req.mjs +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/BitPapa/ex.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Bybit/InAgent.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Bybit/agent.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Bybit/etype/ad.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Bybit/etype/cred.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Bybit/etype/order.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Bybit/ex.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Bybit/web_earn.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Bybit/web_p2p.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Bybit/ws.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Gate/etype/ad.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Gate/ex.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Gate/premarket.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Htx/agent.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Htx/earn.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Htx/etype/__init__.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Htx/etype/ad.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Htx/etype/cred.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Htx/etype/pm.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Htx/etype/test.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Htx/ex.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/KuCoin/etype/ad.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/KuCoin/etype/pm.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/KuCoin/ex.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/KuCoin/web.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Mexc/etype/ad.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Mexc/etype/pm.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Mexc/ex.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Okx/etype/ad.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Okx/etype/pm.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Okx/ex.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Pms/Volet/_todo_req/req.mjs +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Pms/Volet/_todo_req/req.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/Pms/Volet/api.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/TgWallet/agent.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/TgWallet/asset.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/TgWallet/auth.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/TgWallet/ex.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/TgWallet/inAgent.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/TgWallet/order.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/TgWallet/pyd.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/TgWallet/web.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/__init__.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client/pm_unifier.py +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client.egg-info/dependency_links.txt +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client.egg-info/requires.txt +0 -0
- {xync_client-0.0.43.dev35 → xync_client-0.0.43.dev42}/xync_client.egg-info/top_level.txt +0 -0
|
@@ -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.
|
|
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 =
|
|
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
|
-
|
|
174
|
-
|
|
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 =
|
|
179
|
-
await pbot.
|
|
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.
|
|
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:
|
|
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.
|
|
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
|
|
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
|
|
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
|
-
|
|
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.
|
|
76
|
-
await self.
|
|
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.
|
|
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"
|
|
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
|
-
|
|
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("
|
|
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=
|
|
160
|
+
await gp.goto(Pages.GMH, timeout=20000)
|
|
163
161
|
if not gp.url.startswith(Pages.GMH):
|
|
164
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
253
|
-
await self.
|
|
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(
|
|
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))
|