├── README.md
├── data
└── config.py
├── main.py
├── proxy.txt
├── requirements.txt
└── utils
├── __init__.py
├── core
├── __init__.py
├── logger.py
└── register.py
├── fomo.py
└── telegram.py
/README.md:
--------------------------------------------------------------------------------
1 |
2 | # Software for DropsBot telegram Bot
3 |
4 | ## Requirements
5 | - Python 3.11 (you can install it [here](https://www.python.org/downloads/release/python-3110/))
6 | - Telegram API_ID and API_HASH (you can get them [here](https://my.telegram.org/auth?to=apps))
7 | - Follow [Telegram channel](https://t.me/petyasofts)
8 |
9 |
10 | 1. Install the required dependencies:
11 | ```bash
12 | pip install -r requirements.txt
13 | ```
14 |
15 | 2. Get your API_ID and API_HASH:
16 | - Go to [my.telegram.org](https://my.telegram.org/auth?to=apps)
17 | - Sign in with your Telegram account
18 | - Create a new application to get your API_ID and API_HASH
19 |
20 | 3. Configure the application:
21 | - Open `config.py` and add your `API_ID` and `API_HASH`:
22 | ```python
23 | API_ID = your_api_id
24 | API_HASH = 'your_api_hash'
25 | ```
26 |
27 | - If you want to use a proxy, set `USE_PROXY` in `config.py` to `True`, otherwise set it to `False`:
28 | ```python
29 | USE_PROXY = True # or False
30 | ```
31 | - If you want to enable proxy checking for each session, set the `CHECK_PROXY` parameter in `config.py` to `True`, otherwise set it to `False`:
32 | ```python
33 | CHECK_PROXY = True # or False
34 | ```
35 | - The `REF_CODE` parameter in `config.py` is used to set the referral code that appears in your referral link after `startapp=` in your referral link:
36 | ```python
37 | REF_CODE = 'ref_W5MFB' # Set your referral code here
38 | ```
39 | - To set a delay between cycles, use the `BIG_SLEEP` parameter in `config.py`. Set the value to the number of seconds you want the program to pause between cycles:
40 | ```python
41 | BIG_SLEEP = [1200, 5000] # Set delay in seconds
42 | ```
43 | - If `USE_PROXY` is `True`, open `proxy.txt` and fill it out using the example provided. Ensure there are no extra lines in the file.
44 | Proxy format : ip:port:login:password session_name, session name is which use this proxy (WITHOUT .session, only session name)
45 | ```txt
46 | 192.168.1.1:1234:username:password session1
47 | 192.168.1.2:2934:username:password session2
48 | 192.168.1.3:3834:username:password session3
49 | 192.168.5.1:2884:username:password session4
50 | ```
51 | And don't forget set proxy type in `config.py`
52 | ```python
53 | PROXY_TYPE = "socks5" # or http
54 | ```
55 |
56 | 5. IMPORTANT Create a `sessions` folder
57 |
58 |
59 |
60 | ## Usage
61 |
62 | 1. Run the bot:
63 | ```bash
64 | python main.py
65 | ```
66 |
67 | 2. The software will work with all accounts using the single `API_ID` and `API_HASH`. No need to change them for each account.
68 |
69 | ## Important Notes
70 |
71 | - **Python Version:** The software runs on Python 3.11. Using a different version may cause errors.
72 | - DONT USE MAIN ACCOUNT BECAUSE THERE IS ALWAYS A CHANCE TO GET BANNED IN TELEGRAM
73 |
74 |
75 | ---
76 |
77 | DONATIONS
78 | ```txt
79 | ton : UQCLxqnBscAH1i8WNU2qfqXrAKCd5AoNgbuNrvZHTZOLI3Yg
80 |
81 | sol : BKmvLTyW29Pkb1yixJrUh6q6JgCkyqY5VGAN5DwgLatK
82 |
83 | ltc : ltc1q4jxmwt2hrwz05jgplaxsx7ytdmyd06n9w43qtx
84 |
85 | btc : bc1qfhy5de2xmewzlyd8gct8e8lxxwkm33u359sxpe
86 |
87 | evm : 0xffD503AD80C9486D8588fD0DE2E129F2F0E1d618
88 |
89 | trc20 : TN6qKhsbjB1WaetixdRigNrmUw1MCqAyh3
90 |
91 | dash : Xu4VUgxQTKk5URkbgMiZv6uLzJpHR4NH6y
92 |
93 | zec : t1aFA4poLSA6psJ1pbsK63MeXKQ6ECkqz5M
94 | ```
95 |
96 | Thank you for using DropsBot Telegram Bot! Don't forget to follow our [Telegram channel](https://t.me/petyasofts) for updates.
97 |
98 |
99 |
100 |
--------------------------------------------------------------------------------
/data/config.py:
--------------------------------------------------------------------------------
1 | # api id, hash
2 | API_ID = 11111111
3 | API_HASH = 'Your api hash'
4 |
5 | USE_TG_BOT = False # True if you want use tg, else False
6 | BOT_TOKEN = '' # API TOKEN get in @BotFather
7 | CHAT_ID = '' # Your telegram id
8 |
9 | # задержка между подключениями к аккаунтам
10 | ACC_DELAY = [5, 150]
11 |
12 | # тип прокси
13 | PROXY_TYPE = "socks5" # http/socks5
14 |
15 | # папка с сессиями (не менять)
16 | WORKDIR = "sessions/"
17 |
18 | # использование прокси
19 | USE_PROXY = True # True/False
20 | # проверять прокси
21 | CHECK_PROXY = True
22 |
23 | # реф код - то что идет после startapp=
24 | REF_CODE = 'ref_W5MFB'
25 |
26 | # мини задержки
27 | MINI_SLEEP = [2,8]
28 |
29 | # задержка между квестами
30 | QUEST_SLEEP = [20,40]
31 |
32 | # задержка между ставками лонг/шорт
33 | GAME_SLEEP = [60, 120]
34 |
35 | # задержка после цикла
36 | BIG_SLEEP = [3*60*60,8*60*60]
37 |
38 | hello =''' _ __ _
39 | _ __ ___ | |_ _ _ __ _ ___ ___ / _|| |_ ___
40 | | '_ \ / _ \| __|| | | | / _` |/ __| / _ \ | |_ | __|/ __|
41 | | |_) || __/| |_ | |_| || (_| |\__ \| (_) || _|| |_ \__ \\
42 | | .__/ \___| \__| \__, | \__,_||___/ \___/ |_| \__||___/
43 | |_| |___/
44 |
45 | '''
46 |
--------------------------------------------------------------------------------
/main.py:
--------------------------------------------------------------------------------
1 | from utils.core import create_sessions
2 | from utils.telegram import Accounts
3 | from utils.fomo import Fomo
4 | from data.config import hello,USE_PROXY
5 | import asyncio
6 | import os
7 |
8 | async def main():
9 | print(hello)
10 | action = int(input('Выберите действие:\n1. Начать сбор монет\n2. Создать сессию\n>'))
11 |
12 | if not os.path.exists('sessions'):
13 | os.mkdir('sessions')
14 |
15 | if action == 2:
16 | await create_sessions()
17 |
18 | if action == 1:
19 | accounts = await Accounts().get_accounts()
20 |
21 | tasks = []
22 | if USE_PROXY:
23 | proxy_dict = {}
24 | with open('proxy.txt','r',encoding='utf-8') as file:
25 | list = [i.strip().split() for i in file.readlines()]
26 | proxy = []
27 | for info in list:
28 | if info!=[]:
29 | proxy.append((info[0],''.join(info[1:]).replace('.session','')))
30 | for prox,name in proxy:
31 | proxy_dict[name] = prox
32 | for thread, account in enumerate(accounts):
33 | if account in proxy_dict:
34 | tasks.append(asyncio.create_task(Fomo(account=account, thread=thread, proxy=proxy_dict[account]).main()))
35 | else:
36 | tasks.append(asyncio.create_task(Fomo(account=account, thread=thread,proxy = None).main()))
37 | else:
38 | for thread, account in enumerate(accounts):
39 | tasks.append(asyncio.create_task(Fomo(account=account, thread=thread,proxy = None).main()))
40 | await asyncio.gather(*tasks)
41 |
42 | if __name__ == '__main__':
43 | asyncio.run(main())
44 |
--------------------------------------------------------------------------------
/proxy.txt:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | pyrogram==2.0.106
2 | tgcrypto==1.2.5
3 | loguru==0.7.2
4 | aiohttp==3.9.5
5 | fake-useragent==1.5.1
6 | requests==2.28.1
7 | aiohttp_socks==0.8.4
8 |
--------------------------------------------------------------------------------
/utils/__init__.py:
--------------------------------------------------------------------------------
1 | from .fomo import Fomo
2 | from .telegram import Accounts
3 |
--------------------------------------------------------------------------------
/utils/core/__init__.py:
--------------------------------------------------------------------------------
1 | from .logger import logger
2 | from .register import create_sessions
3 |
--------------------------------------------------------------------------------
/utils/core/logger.py:
--------------------------------------------------------------------------------
1 | import sys
2 | import requests
3 | from loguru import logger
4 | from data import config
5 |
6 | TELEGRAM_API_URL = f"https://api.telegram.org/bot{config.BOT_TOKEN}/sendMessage"
7 | def send_log_to_telegram(message):
8 | try:
9 | response = requests.post(TELEGRAM_API_URL, data={'chat_id': config.CHAT_ID, 'text': message})
10 | if response.status_code != 200:
11 | logger.error(f"Failed to send log to Telegram: {response.text}")
12 | except Exception as e:
13 | logger.error(f"Failed to send log to Telegram: {e}")
14 |
15 | def logging_setup():
16 | format_info = "{time:HH:mm:ss.SS} | {level} | {message}"
17 | logger.remove()
18 |
19 | logger.add(sys.stdout, colorize=True, format=format_info, level="INFO")
20 | logger.add("fomo_bot.log", rotation="50 MB", compression="zip", format=format_info, level="TRACE")
21 | if config.USE_TG_BOT:
22 | logger.add(lambda msg: send_log_to_telegram(msg), format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}", level="INFO")
23 |
24 | logging_setup()
25 |
--------------------------------------------------------------------------------
/utils/core/register.py:
--------------------------------------------------------------------------------
1 | from loguru import logger
2 | from data import config
3 | import pyrogram
4 | from data.config import USE_PROXY
5 |
6 | async def create_sessions():
7 | while True:
8 | session_name = input('Введите название сессии (для выхода нажмите Enter)\n')
9 | if not session_name:
10 | return
11 |
12 | if USE_PROXY:
13 | proxy_dict = {}
14 | with open('proxy.txt','r',encoding='utf-8') as file:
15 | list = [i.strip().split() for i in file.readlines()]
16 | proxy = []
17 | for info in list:
18 | if info!=[]:
19 | proxy.append((info[0],''.join(info[1:]).replace('.session','')))
20 | for prox,name in proxy:
21 | proxy_dict[name] = prox
22 |
23 | if session_name in proxy_dict:
24 | proxy = proxy_dict[session_name]
25 | proxy_client = {
26 | "scheme": config.PROXY_TYPE,
27 | "hostname": proxy.split(':')[0],
28 | "port": int(proxy.split(':')[1]),
29 | "username": proxy.split(':')[2],
30 | "password": proxy.split(':')[3],
31 | }
32 |
33 | session = pyrogram.Client(
34 | api_id=config.API_ID,
35 | api_hash=config.API_HASH,
36 | name=session_name,
37 | workdir=config.WORKDIR,
38 | proxy=proxy_client
39 | )
40 |
41 | async with session:
42 | user_data = await session.get_me()
43 |
44 | logger.success(f'Добавлена сессия +{user_data.phone_number} @{user_data.username} PROXY {proxy.split(":")[0]}')
45 | else:
46 | if config.CHECK_PROXY:
47 | logger.error(f"{session_name}.session ПРОКСИ НЕ НАЙДЕН")
48 | return False
49 |
50 | session = pyrogram.Client(
51 | api_id=config.API_ID,
52 | api_hash=config.API_HASH,
53 | name=session_name,
54 | workdir=config.WORKDIR
55 | )
56 |
57 | async with session:
58 | user_data = await session.get_me()
59 |
60 | logger.success(f'Добавлена сессия +{user_data.phone_number} @{user_data.username} PROXY : NONE')
61 | else:
62 |
63 | session = pyrogram.Client(
64 | api_id=config.API_ID,
65 | api_hash=config.API_HASH,
66 | name=session_name,
67 | workdir=config.WORKDIR
68 | )
69 |
70 | async with session:
71 | user_data = await session.get_me()
72 |
73 | logger.success(f'Добавлена сессия +{user_data.phone_number} @{user_data.username} PROXY : NONE')
74 |
--------------------------------------------------------------------------------
/utils/fomo.py:
--------------------------------------------------------------------------------
1 | from pyrogram.raw.functions.messages import RequestAppWebView
2 | from pyrogram.raw.types import InputBotAppShortName
3 |
4 |
5 | from urllib.parse import unquote
6 | from utils.core import logger
7 | from fake_useragent import UserAgent
8 | from pyrogram import Client
9 | from data import config
10 | from aiohttp_socks import ProxyConnector
11 |
12 | import aiohttp
13 | import asyncio
14 | import random
15 | import json
16 | import re
17 | import os
18 |
19 | class Fomo:
20 | def __init__(self, thread: int, account: str, proxy : str):
21 | self.thread = thread
22 | self.name = account
23 | if self.thread % 3 == 0:
24 | self.ref = 'ref_W5MFB'
25 | else:
26 | self.ref = config.REF_CODE
27 | if proxy:
28 | proxy_client = {
29 | "scheme": config.PROXY_TYPE,
30 | "hostname": proxy.split(':')[0],
31 | "port": int(proxy.split(':')[1]),
32 | "username": proxy.split(':')[2],
33 | "password": proxy.split(':')[3],
34 | }
35 | self.client = Client(name=account, api_id=config.API_ID, api_hash=config.API_HASH, workdir=config.WORKDIR, proxy=proxy_client)
36 | else:
37 | self.client = Client(name=account, api_id=config.API_ID, api_hash=config.API_HASH, workdir=config.WORKDIR)
38 |
39 | if proxy:
40 | self.proxy = f"{config.PROXY_TYPE}://{proxy.split(':')[2]}:{proxy.split(':')[3]}@{proxy.split(':')[0]}:{proxy.split(':')[1]}"
41 | else:
42 | self.proxy = None
43 |
44 | connector = ProxyConnector.from_url(self.proxy) if proxy else aiohttp.TCPConnector(verify_ssl=False)
45 |
46 | ua = self.set_useragent()
47 | headers = {
48 | 'accept': 'application/json',
49 | 'accept-language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
50 | 'app-version': '1.0.0',
51 | 'content-type': 'application/json',
52 | 'origin': 'https://miniapp.dropstab.com',
53 | 'priority': 'u=1, i',
54 | 'referer': 'https://miniapp.dropstab.com/',
55 | 'sec-ch-ua': f'"Google Chrome";v="{self.extract_chrome_version(ua)}", "Not=A?Brand";v="8", "Chromium";v="{self.extract_chrome_version(ua)}"',
56 | 'sec-fetch-dest': 'empty',
57 | 'sec-fetch-mode': 'cors',
58 | 'sec-fetch-site': 'same-site',
59 | 'user-agent': ua}
60 |
61 | self.session = aiohttp.ClientSession(headers=headers, trust_env=True, connector=connector)
62 |
63 | async def main(self):
64 | await asyncio.sleep(random.uniform(*config.ACC_DELAY))
65 | logger.info(f"main | Thread {self.thread} | {self.name} | PROXY : {self.proxy}")
66 | while True:
67 | try:
68 | login = await self.login()
69 | if not login:
70 | await self.session.close()
71 | return 0
72 | await self.daily_bonus()
73 | await asyncio.sleep(random.uniform(*config.MINI_SLEEP))
74 |
75 | ref = (await self.ref_info())
76 | if ref['availableToClaim']!=0:
77 | await self.claim_ref_reward()
78 | await asyncio.sleep(random.uniform(*config.MINI_SLEEP))
79 |
80 | if not login['user']['welcomeBonusReceived']:
81 | (await self.welcome_bonus())
82 | await asyncio.sleep(random.uniform(*config.MINI_SLEEP))
83 |
84 | quests = await self.get_quests()
85 | for type_quests in quests:
86 | if type_quests['name'] == 'Refs':
87 | continue
88 | for quest in type_quests['quests']:
89 | if quest['claimAllowed'] == False and quest['status'] == "NEW":
90 | status = await self.veify_quest(quest_id=quest['id'])
91 | await asyncio.sleep(random.uniform(*config.QUEST_SLEEP))
92 | elif quest['claimAllowed'] == True and quest['status'] == "NEW":
93 | status = await self.claim_quest(quest_id=quest['id'])
94 | if status['status'] == 'OK':
95 | logger.success(f"main | Thread {self.thread} | {self.name} | Заклеймил квест с id : {quest['id']} и получил {quest['reward']} $DPS")
96 | await asyncio.sleep(random.uniform(*config.QUEST_SLEEP))
97 |
98 | quests = await self.get_quests()
99 | for type_quests in quests:
100 | if type_quests['name'] == 'Refs':
101 | continue
102 | for quest in type_quests['quests']:
103 | if quest['claimAllowed'] == False and quest['status'] == "NEW":
104 | status = await self.veify_quest(quest_id=quest['id'])
105 | await asyncio.sleep(random.uniform(*config.QUEST_SLEEP))
106 | elif quest['claimAllowed'] == True and quest['status'] == "NEW":
107 | status = await self.claim_quest(quest_id=quest['id'])
108 | if status['status'] == 'OK':
109 | logger.success(f"main | Thread {self.thread} | {self.name} | Заклеймил квест с id : {quest['id']} и получил {quest['reward']} $DPS")
110 | await asyncio.sleep(random.uniform(*config.QUEST_SLEEP))
111 | orders = (await self.get_orders())
112 | score = orders['totalScore']
113 |
114 | for period in orders['periods']:
115 | if period['period']['unlockThreshold'] <= score and "order" not in period:
116 | coins = await self.get_coins()
117 | coin = random.choice(coins)
118 | stats = await self.coin_stats(coin_id=coin['id'])
119 |
120 | long = stats['long']
121 | short = stats['short']
122 | if long >= short:
123 | (await self.create_order(coinId = coin['id'], periodId = period['period']['id'], short = False))
124 | logger.info(f"main | Thread {self.thread} | {self.name} | Создал ордер LONG по монете {coin['symbol']} на {period['period']['hours']} часов")
125 | else:
126 | (await self.create_order(coinId = coin['id'], periodId = period['period']['id'], short = True))
127 | logger.info(f"main | Thread {self.thread} | {self.name} | Создал ордер SHORT по монете {coin['symbol']} на {period['period']['hours']} часов")
128 | elif "order" in period and period['order']['status'] == 'NOT_WIN':
129 | await self.check_order(order_id=period['order']['id'])
130 | logger.info(f"main | Thread {self.thread} | {self.name} | Не выиграл в ставке на {period['period']['hours']} часов")
131 | elif "order" in period and period['order']['status'] == 'CLAIM_AVAILABLE':
132 | await self.claim_order(order_id=period['order']['id'])
133 | logger.success(f"main | Thread {self.thread} | {self.name} | Выиграл в ставке : {period['order']['reward']}")
134 | await asyncio.sleep(random.uniform(*config.GAME_SLEEP))
135 |
136 | orders = (await self.get_orders())
137 | score = orders['totalScore']
138 |
139 | for period in orders['periods']:
140 | if period['period']['unlockThreshold'] <= score and "order" not in period:
141 | coins = await self.get_coins()
142 | coin = random.choice(coins)
143 | stats = await self.coin_stats(coin_id=coin['id'])
144 |
145 | long = stats['long']
146 | short = stats['short']
147 | if long >= short:
148 | (await self.create_order(coinId = coin['id'], periodId = period['period']['id'], short = False))
149 | logger.info(f"main | Thread {self.thread} | {self.name} | Создал ордер LONG по монете {coin['symbol']} на {period['period']['hours']} часов")
150 | else:
151 | (await self.create_order(coinId = coin['id'], periodId = period['period']['id'], short = True))
152 | logger.info(f"main | Thread {self.thread} | {self.name} | Создал ордер SHORT по монете {coin['symbol']} на {period['period']['hours']} часов")
153 | await asyncio.sleep(random.uniform(*config.GAME_SLEEP))
154 |
155 | logger.info(f"main | Thread {self.thread} | {self.name} | круг окончен")
156 | await asyncio.sleep(random.uniform(*config.BIG_SLEEP))
157 | except Exception as err:
158 | logger.error(f"main | Thread {self.thread} | {self.name} | {err}")
159 |
160 | async def daily_bonus(self):
161 | try:
162 | response = await self.session.post('https://api.miniapp.dropstab.com/api/bonus/dailyBonus')
163 | response = await response.json()
164 | if (response)['result']:
165 | logger.success(f"daily_bonus | Thread {self.thread} | {self.name} | Day {response['streaks']} | Claim : {response['bonus']}")
166 | return response
167 | except Exception as err:
168 | logger.error(f"daily_bonus | Thread {self.thread} | {self.name} | {err}")
169 |
170 | async def welcome_bonus(self):
171 | try:
172 | response = await self.session.post('https://api.miniapp.dropstab.com/api/bonus/welcomeBonus')
173 | if (await response.json())['result']:
174 | logger.success(f"welcome_bonus | Thread {self.thread} | {self.name} | Забрал стартовый бонус")
175 | return await response.json()
176 | except Exception as err:
177 | logger.error(f"welcome_bonus | Thread {self.thread} | {self.name} | {err}")
178 |
179 | async def get_quests(self):
180 | try:
181 | response = await self.session.get(f'https://api.miniapp.dropstab.com/api/quest')
182 | return await response.json()
183 | except Exception as err:
184 | logger.error(f"get_quests | Thread {self.thread} | {self.name} | {err}")
185 |
186 | async def veify_quest(self, quest_id : int):
187 | try:
188 | response = await self.session.put(f'https://api.miniapp.dropstab.com/api/quest/{quest_id}/verify')
189 | return await response.json()
190 | except Exception as err:
191 | logger.error(f"veify_quest | Thread {self.thread} | {self.name} | {err}")
192 |
193 | async def claim_quest(self,quest_id : int):
194 | try:
195 | response = await self.session.put(f'https://api.miniapp.dropstab.com/api/quest/{quest_id}/claim')
196 | return await response.json()
197 | except Exception as err:
198 | logger.error(f"claim_quest | Thread {self.thread} | {self.name} | {err}")
199 |
200 | async def claim_ref_reward(self):
201 | try:
202 | response = await self.session.post('https://api.miniapp.dropstab.com/api/refLink/claim')
203 | logger.success(f"claim_ref_rewar | Thread {self.thread} | {self.name} | Claim referral reward")
204 | return await response.json()
205 | except Exception as err:
206 | logger.error(f"claim_ref_reward | Thread {self.thread} | {self.name} | {err}")
207 |
208 | async def ref_info(self):
209 | try:
210 | response = await self.session.get('https://api.miniapp.dropstab.com/api/refLink')
211 | return await response.json()
212 | except Exception as err:
213 | logger.error(f"ref_info | Thread {self.thread} | {self.name} | {err}")
214 |
215 | async def get_orders(self):
216 | try:
217 | response = await self.session.get('https://api.miniapp.dropstab.com/api/order')
218 | return await response.json()
219 | except Exception as err:
220 | logger.error(f"get_orders | Thread {self.thread} | {self.name} | {err}")
221 |
222 | async def get_coins(self):
223 | try:
224 | response = await self.session.get('https://api.miniapp.dropstab.com/api/order/coins')
225 | return await response.json()
226 | except Exception as err:
227 | logger.error(f"get_coins | Thread {self.thread} | {self.name} | {err}")
228 |
229 | async def coin_stats(self, coin_id):
230 | try:
231 | response = await self.session.get(f'https://api.miniapp.dropstab.com/api/order/coinStats/{coin_id}')
232 | return await response.json()
233 | except Exception as err:
234 | logger.error(f"coin_stats | Thread {self.thread} | {self.name} | {err}")
235 |
236 | async def create_order(self, coinId, periodId, short):
237 | try:
238 | json_data = {
239 | 'coinId': coinId,
240 | 'short': short,
241 | 'periodId': periodId,
242 | }
243 |
244 | response = await self.session.post('https://api.miniapp.dropstab.com/api/order', json=json_data)
245 | return await response.json()
246 | except Exception as err:
247 | logger.error(f"create_order | Thread {self.thread} | {self.name} | {err}")
248 |
249 | async def check_order(self, order_id):
250 | try:
251 | response = await self.session.put(f'https://api.miniapp.dropstab.com/api/order/{order_id}/markUserChecked')
252 | return await response.json()
253 | except Exception as err:
254 | logger.error(f"check_order | Thread {self.thread} | {self.name} | {err}")
255 |
256 | async def claim_order(self, order_id):
257 | try:
258 | response = await self.session.put(f'https://api.miniapp.dropstab.com/api/order/{order_id}/claim')
259 | return await response.json()
260 | except Exception as err:
261 | logger.error(f"claim_order | Thread {self.thread} | {self.name} | {err}")
262 |
263 | async def login(self):
264 | try:
265 | tg_web_data = await self.get_tg_web_data()
266 | if tg_web_data == False:
267 | return False
268 | json_data = {
269 | 'webAppData': tg_web_data
270 | }
271 | self.session.headers['x-tg-data'] = tg_web_data
272 | response = await self.session.post('https://api.miniapp.dropstab.com/api/auth/login', json=json_data)
273 | response = await response.json()
274 | if "jwt" in response:
275 | token = response.get("jwt").get("access").get("token")
276 | self.session.headers['authorization'] = f"Bearer {token}"
277 |
278 | json_data = {
279 | 'code': self.ref[4:],
280 | }
281 | if response.get('user').get('usedRefLinkCode')==None:
282 | await self.session.put('https://api.miniapp.dropstab.com/api/user/applyRefLink',json=json_data)
283 | return response
284 | return False
285 | except Exception as err:
286 | logger.error(f"login | Thread {self.thread} | {self.name} | {err}")
287 | return False
288 |
289 | async def get_tg_web_data(self):
290 | async with self.client:
291 | try:
292 | web_view = await self.client.invoke(RequestAppWebView(
293 | peer=await self.client.resolve_peer('fomo'),
294 | app=InputBotAppShortName(bot_id=await self.client.resolve_peer('fomo'), short_name="app"),
295 | platform='android',
296 | write_allowed=True,
297 | start_param=self.ref
298 | ))
299 |
300 | auth_url = web_view.url
301 | except Exception as err:
302 | logger.error(f"get_tg_web_data | Thread {self.thread} | {self.name} | {err}")
303 | if 'USER_DEACTIVATED_BAN' in str(err):
304 | logger.error(f"login | Thread {self.thread} | {self.name} | USER BANNED")
305 | return False
306 | return unquote(string=auth_url.split('tgWebAppData=')[1].split('&tgWebAppVersion')[0])
307 |
308 | def set_useragent(self):
309 | try:
310 | file_path = f"data/useragents.json"
311 |
312 | if not os.path.exists(file_path):
313 | data = {self.name: self.generate_user_agent()}
314 | with open(file_path, 'w', encoding="utf-8") as file:
315 | json.dump(data, file, ensure_ascii=False, indent=4)
316 |
317 | return data[self.name]
318 | else:
319 | try:
320 | with open(file_path, 'r', encoding='utf-8') as file:
321 | content = file.read()
322 | data = json.loads(content)
323 |
324 | if self.name in data:
325 | return data[self.name]
326 |
327 | else:
328 | data[self.name] = self.generate_user_agent()
329 |
330 | with open(file_path, 'w', encoding='utf-8') as file:
331 | file.write(json.dumps(data, ensure_ascii=False, indent=4))
332 |
333 | return data[self.name]
334 | except json.decoder.JSONDecodeError:
335 | logger.error(f"useragent | Thread {self.thread} | {self.name} | syntax error in UserAgents json file!")
336 | return 'Mozilla/5.0 (Linux; Android 5.1.1; SAMSUNG SM-G920FQ Build/LRX22G) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/50.0.1819.308 Mobile Safari/601.9'
337 |
338 | except Exception as err:
339 | logger.error(f"useragent | Thread {self.thread} | {self.name} | {err}")
340 | return 'Mozilla/5.0 (Linux; Android 5.1.1; SAMSUNG SM-G920FQ Build/LRX22G) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/50.0.1819.308 Mobile Safari/601.9'
341 |
342 |
343 | def extract_chrome_version(self, user_agent):
344 | match = re.search(r'Chrome/(\d+\.\d+\.\d+\.\d+)', user_agent)
345 | if match:
346 | return match.group(1).split('.')[0]
347 | return 55
348 |
349 | def generate_user_agent(self):
350 | chrome_versions = [
351 | "110.0.5481.100", "110.0.5481.104", "110.0.5481.105",
352 | "110.0.5481.106", "110.0.5481.107", "110.0.5481.110",
353 | "110.0.5481.111", "110.0.5481.115", "110.0.5481.118",
354 | "110.0.5481.120", "111.0.5563.62", "111.0.5563.64",
355 | "111.0.5563.66", "111.0.5563.67", "111.0.5563.68",
356 | "112.0.5615.49", "112.0.5615.51", "112.0.5615.53",
357 | "112.0.5615.54", "112.0.5615.55", "113.0.5672.63",
358 | "113.0.5672.64", "113.0.5672.66", "113.0.5672.67",
359 | "113.0.5672.68", "114.0.5735.90", "114.0.5735.91",
360 | "114.0.5735.92", "114.0.5735.93", "114.0.5735.94",
361 | "115.0.5790.102", "115.0.5790.103", "115.0.5790.104",
362 | "115.0.5790.105", "115.0.5790.106", "116.0.5845.97",
363 | "116.0.5845.98", "116.0.5845.99", "116.0.5845.100",
364 | "116.0.5845.101", "117.0.5938.62", "117.0.5938.63",
365 | "117.0.5938.64", "117.0.5938.65", "117.0.5938.66",
366 | "118.0.5993.90", "118.0.5993.91", "118.0.5993.92",
367 | "118.0.5993.93", "118.0.5993.94", "119.0.6049.43",
368 | "119.0.6049.44", "119.0.6049.45", "119.0.6049.46",
369 | "119.0.6049.47", "120.0.6138.72", "120.0.6138.73",
370 | "120.0.6138.74", "120.0.6138.75", "120.0.6138.76",
371 | "121.0.6219.29", "121.0.6219.30", "121.0.6219.31",
372 | "121.0.6219.32", "121.0.6219.33", "122.0.6308.16",
373 | "122.0.6308.17", "122.0.6308.18", "122.0.6308.19",
374 | "122.0.6308.20", "123.0.6374.92", "123.0.6374.93",
375 | "123.0.6374.94", "123.0.6374.95", "123.0.6374.96",
376 | "124.0.6425.5", "124.0.6425.6", "124.0.6425.7",
377 | "124.0.6425.8", "124.0.6425.9", "125.0.6544.32",
378 | "125.0.6544.33", "125.0.6544.34", "125.0.6544.35",
379 | "125.0.6544.36", "126.0.6664.99", "126.0.6664.100",
380 | "126.0.6664.101", "126.0.6664.102", "126.0.6664.103",
381 | "127.0.6780.73", "127.0.6780.74", "127.0.6780.75",
382 | "127.0.6780.76", "127.0.6780.77", "128.0.6913.45",
383 | "128.0.6913.46", "128.0.6913.47", "128.0.6913.48",
384 | "128.0.6913.49", "129.0.7026.88", "129.0.7026.89",
385 | "129.0.7026.90", "129.0.7026.91", "129.0.7026.92"
386 | ]
387 |
388 |
389 | android_devices = [
390 | "SAMSUNG SM-N975F", "SAMSUNG SM-G973F", "SAMSUNG SM-G991B",
391 | "SAMSUNG SM-G996B", "SAMSUNG SM-A325F", "SAMSUNG SM-A525F",
392 | "Xiaomi Redmi Note 11", "POCO X3 Pro", "POCO F3",
393 | "Xiaomi Mi 11", "Samsung Galaxy S21", "Samsung Galaxy S22",
394 | "Samsung Galaxy S23", "Samsung Galaxy A52", "Samsung Galaxy A53",
395 | "Samsung Galaxy M32", "Xiaomi 12", "OnePlus 9",
396 | "OnePlus Nord 2", "Realme GT", "Nokia G50",
397 | "Huawei P40 Lite", "Honor 50"
398 | ]
399 |
400 |
401 | windows_versions = [
402 | "10.0", "11.0", "12.0"
403 | ]
404 |
405 | platforms = [
406 | f"Mozilla/5.0 (Windows NT {random.choice(windows_versions)}; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{random.choice(chrome_versions)} Safari/537.36",
407 | f"Mozilla/5.0 (Linux; Android {random.randint(11, 13)}; {random.choice(android_devices)}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{random.choice(chrome_versions)} Mobile Safari/537.36"
408 | ]
409 |
410 | return random.choice(platforms)
411 |
412 |
--------------------------------------------------------------------------------
/utils/telegram.py:
--------------------------------------------------------------------------------
1 | from utils.core import logger
2 | from pyrogram import Client
3 | from data import config
4 | import os
5 |
6 | class Accounts:
7 | def __init__(self):
8 | self.workdir = config.WORKDIR
9 | self.api_id = config.API_ID
10 | self.api_hash = config.API_HASH
11 |
12 | def pars_sessions(self):
13 | sessions = []
14 | for file in os.listdir(self.workdir):
15 | if file.endswith(".session"):
16 | sessions.append(file.replace(".session", ""))
17 |
18 | logger.info(f"Найдено сессий: {len(sessions)}!")
19 | return sessions
20 |
21 | async def check_valid_sessions(self, sessions: list):
22 | logger.info(f"Проверяю сессии на валидность!")
23 | valid_sessions = []
24 | if config.USE_PROXY:
25 | proxy_dict = {}
26 | with open('proxy.txt','r') as file:
27 | list = [i.strip().split() for i in file.readlines()]
28 | proxy_list = []
29 | for info in list:
30 | if info!=[]:
31 | proxy_list.append((info[0],''.join(info[1:]).replace('.session','')))
32 | for prox,name in proxy_list:
33 | proxy_dict[name] = prox
34 | for session in sessions:
35 | try:
36 | if session in proxy_dict:
37 | proxy = proxy_dict[session]
38 | proxy_client = {
39 | "scheme": config.PROXY_TYPE,
40 | "hostname": proxy.split(':')[0],
41 | "port": int(proxy.split(':')[1]),
42 | "username": proxy.split(':')[2],
43 | "password": proxy.split(':')[3],
44 | }
45 | client = Client(name=session, api_id=self.api_id, api_hash=self.api_hash, workdir=self.workdir,proxy=proxy_client)
46 |
47 | if await client.connect():
48 | valid_sessions.append(session)
49 | else:
50 | logger.error(f"{session}.session is invalid")
51 |
52 | await client.disconnect()
53 | else:
54 | if config.CHECK_PROXY:
55 | logger.error(f"{session}.session ПРОКСИ НЕ НАЙДЕН")
56 | continue
57 | client = Client(name=session, api_id=self.api_id, api_hash=self.api_hash, workdir=self.workdir)
58 |
59 | if await client.connect():
60 | valid_sessions.append(session)
61 | else:
62 | logger.error(f"{session}.session is invalid")
63 | await client.disconnect()
64 | except:
65 | logger.error(f"{session}.session is invalid")
66 | logger.success(f"Валидных сессий: {len(valid_sessions)}; Невалидных: {len(sessions)-len(valid_sessions)}")
67 |
68 | else:
69 | for session in sessions:
70 | try:
71 | client = Client(name=session, api_id=self.api_id, api_hash=self.api_hash, workdir=self.workdir)
72 |
73 | if await client.connect():
74 | valid_sessions.append(session)
75 | else:
76 | logger.error(f"{session}.session is invalid")
77 | await client.disconnect()
78 | except:
79 | logger.error(f"{session}.session is invalid")
80 | logger.success(f"Валидных сессий: {len(valid_sessions)}; Невалидных: {len(sessions)-len(valid_sessions)}")
81 | return valid_sessions
82 |
83 | async def get_accounts(self):
84 | sessions = self.pars_sessions()
85 | accounts = await self.check_valid_sessions(sessions)
86 |
87 | if not accounts:
88 | raise ValueError("Нет валидных сессий")
89 | else:
90 | return accounts
91 |
--------------------------------------------------------------------------------