├── 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 | --------------------------------------------------------------------------------