├── README.md ├── config.py ├── main.py └── requirements.txt /README.md: -------------------------------------------------------------------------------- 1 | # people-s-launchpad 2 | 3 | people-s-launchpad Merlin L2 邀请注册 4 | 5 | 便宜Twitter令牌号:[hdd.cm](https://hdd.cm/) 单价低至0.2元 6 | 7 | ### README 8 | 9 | 在开始使用之前,请确保安装了所有必要的依赖。 10 | 11 | 执行以下命令以安装依赖: 12 | 13 | ``` 14 | pip install -r requirements.txt 15 | ``` 16 | 修改config.py文件配置内容: 17 | 18 | ``` 19 | # yescaptcha key 20 | yescaptcha_client_key = '0x0000000000000000000' 21 | # 代理提取链接 22 | get_ip_url = 'https://www.ip.com' 23 | 24 | ``` 25 | 26 | ### 直达链接 27 | - 直达链接:[people-s-launchpad](https://launchpad.ally.build?id=1&inviteCode=QMATJJ)。 28 | - 如果你还没有 YesCaptcha 账号,请先在这里注册:[yescaptcha注册链接](https://yescaptcha.com/i/0vVEgw)。 29 | 30 | ### 更多疑问请扫码添加好友加入交流群 31 | ![微信图片_20240206233445](https://github.com/ymmmmmmmm/BeraChainTools/assets/51306299/52dfc20e-0f11-4fd8-b732-154f38f9b04a) 32 | -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time :2024/2/6 17:03 3 | # @Author :ym 4 | # @File :config.py 5 | # @Software :PyCharm 6 | # yescaptcha key 7 | yescaptcha_client_key = 'cc9c18d3e263515c2c072b36a7125eecc078618f' 8 | # 代理提取链接 9 | get_ip_url = 'https://www.ip.com' 10 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time :2024/2/6 17:07 3 | # @Author :ym 4 | # @File :main.py 5 | # @Software :PyCharm 6 | import concurrent.futures 7 | import hashlib 8 | import json 9 | import re 10 | import time 11 | import uuid 12 | from base64 import b64encode 13 | 14 | import requests 15 | import tls_client 16 | from eth_account import Account 17 | from eth_account.messages import encode_defunct 18 | from faker import Faker 19 | from loguru import logger 20 | 21 | from config import yescaptcha_client_key, get_ip_url 22 | 23 | fake = Faker(locale='en-US') 24 | 25 | 26 | def get_turnstile_token(): 27 | while True: 28 | json_data = { 29 | "clientKey": yescaptcha_client_key, 30 | "task": 31 | { 32 | "type": "TurnstileTaskProxylessM1", 33 | "websiteURL": "https://launchpad.ally.build/zh-CN/signup", 34 | "websiteKey": "0x4AAAAAAAPesjutGoykVbu0" 35 | }, "softID": 109 36 | } 37 | response = requests.post(url='https://api.yescaptcha.com/createTask', json=json_data).json() 38 | if response['errorId'] != 0: 39 | raise ValueError(response) 40 | task_id = response['taskId'] 41 | time.sleep(5) 42 | for _ in range(30): 43 | data = {"clientKey": yescaptcha_client_key, "taskId": task_id} 44 | response = requests.post(url='https://api.yescaptcha.com/getTaskResult', json=data).json() 45 | if response['status'] == 'ready': 46 | return response['solution']['token'] 47 | else: 48 | time.sleep(2) 49 | 50 | 51 | def get_ip(): 52 | response = requests.get(url=get_ip_url).text.strip() 53 | return {'http': f'http://{response}', 'https': f'http://{response}'} 54 | 55 | 56 | def sha256(data): 57 | hash_object = hashlib.sha256() 58 | hash_object.update(json.dumps(data).replace(' ', '').encode()) 59 | hex_dig = hash_object.hexdigest() 60 | return hex_dig 61 | 62 | 63 | def build_trackers(user_agent) -> str: 64 | return b64encode(json.dumps({"os": "Mac OS X", "browser": "Safari", "device": "", "system_locale": "zh-CN", 65 | "browser_user_agent": user_agent, 66 | "browser_version": "13.1.twitter_account", "os_version": "10.13.6", "referrer": "", 67 | "referring_domain": "", "referrer_current": "", "referring_domain_current": "", 68 | "release_channel": "stable", "client_build_number": 177662, 69 | "client_event_source": None}, separators=(',', ':')).encode()).decode() 70 | 71 | 72 | def authorize_twitter(twitter_token, proxies=None): 73 | try: 74 | session = requests.session() 75 | session.proxies = proxies 76 | response = session.get(url='https://twitter.com/home', cookies={ 77 | 'auth_token': twitter_token, 78 | 'ct0': '960eb16898ea5b715b54e54a8f58c172' 79 | }) 80 | ct0 = re.findall('ct0=(.*?);', dict(response.headers)['set-cookie'])[0] 81 | cookies = {'ct0': ct0, 'auth_token': twitter_token} 82 | params = { 83 | 'response_type': 'code', 84 | 'client_id': 'TjkxNDIzc1ZscF9mSjU4Y3M0bkg6MTpjaQ', 85 | 'redirect_uri': 'https://launchpad.ally.build/signup', 86 | 'scope': 'tweet.read users.read', 87 | 'state': f'twitter-{uuid.uuid4()}', 88 | 'code_challenge': 'challenge', 89 | 'code_challenge_method': 'plain', 90 | } 91 | 92 | headers = {'authority': 'twitter.com', 'accept': '*/*', 'accept-language': 'zh-CN,zh;q=0.9', 93 | 'authorization': 'Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA', 94 | 'cache-control': 'no-cache', 'content-type': 'application/json', 'origin': 'https://twitter.com', 95 | 'pragma': 'no-cache', 'referer': 'https://twitter.com/puffer_finance/status/1751954283052810298', 96 | 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36', 97 | 'x-csrf-token': ct0} 98 | 99 | response = session.get('https://twitter.com/i/api/2/oauth2/authorize', params=params, cookies=cookies, 100 | headers=headers).json() 101 | auth_code = response['auth_code'] 102 | data = {'approval': True, 'code': auth_code} 103 | response = session.post('https://twitter.com/i/api/2/oauth2/authorize', json=data, cookies=cookies, 104 | headers=headers).json() 105 | redirect_uri = response['redirect_uri'] 106 | return redirect_uri 107 | except Exception as e: 108 | logger.error(e) 109 | 110 | 111 | def authorize_discord(discord_token, proxies=None): 112 | try: 113 | session = tls_client.Session( 114 | random_tls_extension_order=True 115 | ) 116 | session.proxies = proxies 117 | user_agent = fake.safari() 118 | headers = { 119 | 'Host': 'discord.com', 120 | 'Connection': 'keep-alive', 121 | 'User-Agent': user_agent, 122 | 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 123 | 'Accept-Encoding': 'gzip, deflate, br', 124 | 'Accept-Language': 'zh-CN,zh;q=0.9', 125 | } 126 | _uuid = uuid.uuid4() 127 | response = session.get( 128 | url=f'https://discord.com/api/oauth2/authorize?client_id=1189751301643456613&redirect_uri=https%3A%2F%2Flaunchpad.ally.build%2Fsignup&response_type=code&scope=identify%20email&state=discord-{_uuid}', 129 | headers=headers, allow_redirects=False) 130 | logger.debug(response) 131 | x_super_properties = build_trackers(user_agent) 132 | headers.update({"Authorization": discord_token}) 133 | headers.update({"X-Super-Properties": x_super_properties}) 134 | headers.update({"X-Debug-Options": 'bugReporterEnabled'}) 135 | response = session.get( 136 | url=f'https://discord.com/oauth2/authorize?client_id=1189751301643456613&redirect_uri=https%3A%2F%2Flaunchpad.ally.build%2Fsignup&response_type=code&scope=identify%20email&state=discord-{_uuid}', 137 | headers=headers, allow_redirects=False) 138 | logger.debug(response.status_code) 139 | data = {"permissions": "0", "authorize": True, "integration_type": 0} 140 | response = session.post( 141 | url=f'https://discord.com/api/v9/oauth2/authorize?client_id=1189751301643456613&response_type=code&redirect_uri=https%3A%2F%2Flaunchpad.ally.build%2Fsignup&scope=identify%20email&state=discord-{_uuid}', 142 | headers=headers, allow_redirects=False, json=data).json() 143 | logger.debug(response) 144 | location = response['location'] 145 | code = re.findall('code=(.*?)&state=', location)[0] 146 | return code 147 | except Exception as e: 148 | logger.error(e) 149 | 150 | 151 | def run(twitter_token, discord_token, invite_code): 152 | try: 153 | account = Account.create() 154 | logger.debug(account.address) 155 | logger.debug(account.key.hex()) 156 | device_id = str(uuid.uuid4()) 157 | logger.debug(device_id) 158 | session = requests.Session() 159 | user_agent = fake.chrome() 160 | proxies = get_ip() 161 | session.proxies = proxies 162 | headers = { 163 | 'authority': 'launchpad-api.particle.network', 164 | 'accept': 'application/json, text/plain, */*', 165 | 'accept-language': 'zh-CN,zh;q=0.9', 166 | 'auth-type': 'Basic', 167 | 'authorization': 'Basic SEJuRjRjOGlxU1FzUENtOTpMb1FGUmRyZTk0QmJmU0huR1NRTERIM0RC', 168 | 'cache-control': 'no-cache', 169 | 'content-type': 'application/json', 170 | 'origin': 'https://launchpad.ally.build', 171 | 'pragma': 'no-cache', 172 | 'referer': 'https://launchpad.ally.build/', 173 | 'user-agent': user_agent, 174 | } 175 | random_str = str(uuid.uuid4()) 176 | timestamp = int(time.time()) 177 | params = { 178 | 'timestamp': timestamp, 179 | 'random_str': random_str, 180 | 'device_id': device_id, 181 | 'sdk_version': 'web_1.0.0', 182 | 'project_uuid': 'aa93891b-14ee-4d92-be1a-f8bf4c9ef8b1', 183 | 'project_client_key': 'cKqywDmiUAKvveMTyIW76i6argRwxtapjnQdPraZ', 184 | 'project_app_uuid': '227102d9-5c30-455c-a03f-ed38e8fc893d', 185 | } 186 | sign_str = f"""Welcome to People's Launchpad!\n\nWallet address:\n{account.address}\n\nNonce:\n{device_id}""" 187 | signature = account.sign_message(encode_defunct(text=sign_str)).signature.hex() 188 | mac_info = {"device_id": device_id, 189 | "loginInfo": {"address": account.address.lower(), 190 | "signature": signature}, 191 | "loginMethod": "evm_wallet", 192 | "mac_key": "d2cf33cbf7808a428e8704e3217f0fff38873a8272c9ed58adb03a113d8ef95e", 193 | "project_app_uuid": "227102d9-5c30-455c-a03f-ed38e8fc893d", 194 | "project_client_key": "cKqywDmiUAKvveMTyIW76i6argRwxtapjnQdPraZ", 195 | "project_uuid": "aa93891b-14ee-4d92-be1a-f8bf4c9ef8b1", 196 | "random_str": random_str, "sdk_version": "web_1.0.0", "timestamp": timestamp} 197 | mac = sha256(dict(sorted(mac_info.items()))) 198 | params.update({'mac': mac}) 199 | json_data = {'loginMethod': 'evm_wallet', 200 | 'loginInfo': {'address': account.address.lower(), 'signature': signature}} 201 | response = session.post('https://launchpad-api.particle.network/global_user', params=params, headers=headers, 202 | json=json_data).json() 203 | logger.debug(response) 204 | mac_key = response['macKey'] 205 | token = response['token'] 206 | headers.update({'authorization': f'Basic {token}'}) 207 | # 操作绑定推特 208 | redirect_uri = authorize_twitter(twitter_token, proxies) 209 | twitter_code = redirect_uri.split('=')[2] 210 | response = session.get(redirect_uri, headers=headers) 211 | logger.debug(response.status_code) 212 | turnstile_token = get_turnstile_token() 213 | timestamp = int(time.time()) 214 | random_str = str(uuid.uuid4()) 215 | params = { 216 | "cfTurnstileResponse": turnstile_token, 217 | "code": twitter_code, 218 | "device_id": device_id, "mac_key": mac_key, 219 | "project_app_uuid": "227102d9-5c30-455c-a03f-ed38e8fc893d", 220 | "project_client_key": "cKqywDmiUAKvveMTyIW76i6argRwxtapjnQdPraZ", 221 | "project_uuid": "aa93891b-14ee-4d92-be1a-f8bf4c9ef8b1", "provider": "twitter", 222 | "random_str": random_str, "sdk_version": "web_1.0.0", "timestamp": timestamp} 223 | mac = sha256(dict(sorted(params.items()))) 224 | params.update({'mac': mac}) 225 | json_data = {"code": twitter_code, 226 | "provider": "twitter", 227 | "cfTurnstileResponse": turnstile_token} 228 | response = session.post('https://launchpad-api.particle.network/global_user/bind', params=params, 229 | headers=headers, 230 | json=json_data).json() 231 | logger.debug(response) 232 | if not response.get('twitterId', None): 233 | logger.warning(f'绑定推特失败') 234 | with open('twitter_fail.txt', 'a+') as f: 235 | f.writelines(f'{twitter_token}----{discord_token}----{invite_code}\n') 236 | return 237 | discord_code = authorize_discord(discord_token, proxies) 238 | turnstile_token = get_turnstile_token() 239 | timestamp = int(time.time()) 240 | random_str = str(uuid.uuid4()) 241 | params = { 242 | "cfTurnstileResponse": turnstile_token, 243 | "code": discord_code, 244 | "device_id": device_id, "mac_key": mac_key, 245 | "project_app_uuid": "227102d9-5c30-455c-a03f-ed38e8fc893d", 246 | "project_client_key": "cKqywDmiUAKvveMTyIW76i6argRwxtapjnQdPraZ", 247 | "project_uuid": "aa93891b-14ee-4d92-be1a-f8bf4c9ef8b1", "provider": "discord", 248 | "random_str": random_str, "sdk_version": "web_1.0.0", "timestamp": timestamp} 249 | mac = sha256(dict(sorted(params.items()))) 250 | params.update({'mac': mac}) 251 | json_data = {"code": discord_code, 252 | "provider": "discord", 253 | "cfTurnstileResponse": turnstile_token} 254 | response = session.post('https://launchpad-api.particle.network/global_user/bind', params=params, 255 | headers=headers, 256 | json=json_data).json() 257 | logger.debug(response) 258 | if not response.get('discordId', None): 259 | logger.warning(f'绑定discord失败') 260 | with open('discord_fail.txt', 'a+') as f: 261 | f.writelines( 262 | f'{twitter_token}----{discord_token}----{invite_code}----{account.address}----{account.key.hex()}\n') 263 | return 264 | 265 | timestamp = int(time.time()) 266 | random_str = str(uuid.uuid4()) 267 | params = {"code": invite_code, "device_id": device_id, 268 | "mac_key": mac_key, 269 | "project_app_uuid": "227102d9-5c30-455c-a03f-ed38e8fc893d", 270 | "project_client_key": "cKqywDmiUAKvveMTyIW76i6argRwxtapjnQdPraZ", 271 | "project_uuid": "aa93891b-14ee-4d92-be1a-f8bf4c9ef8b1", 272 | "random_str": random_str, "sdk_version": "web_1.0.0", "timestamp": timestamp} 273 | mac = sha256(dict(sorted(params.items()))) 274 | params.update({'mac': mac}) 275 | json_data = {'code': invite_code} 276 | response = session.post('https://launchpad-api.particle.network/launchpads/2/user', params=params, 277 | headers=headers, 278 | json=json_data).json() 279 | if response.get('invitationCode', None): 280 | logger.success(response) 281 | with open('success.txt', 'a+') as f: 282 | f.writelines( 283 | f'{invite_code}----{twitter_token}----{discord_token}----{account.address}----{account.key.hex()}\n') 284 | else: 285 | logger.warning(response) 286 | return 287 | except Exception as e: 288 | logger.error(e) 289 | 290 | 291 | def batch_run(): 292 | """ 293 | 批量运行 294 | 推特token----discordtoken----invite_code 295 | 一行一个 ---- 隔开 296 | :return: 297 | """ 298 | max_workers = 16 299 | with open('info_data.txt', 'r') as f: 300 | info_list = f.readlines() 301 | 302 | with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: 303 | futures = [executor.submit(run, i.split('----')[0].replace('\n', ''), i.split('----')[1].replace('\n', ''), 304 | i.split('----')[2].replace('\n', '')) for i in info_list] 305 | 306 | 307 | if __name__ == '__main__': 308 | _invite_code = '邀请码' 309 | _twitter_token = '推特token' 310 | _discord_token = 'discord token' 311 | run(_twitter_token, _discord_token, _invite_code) 312 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | requests>=2.28.2 2 | Faker>=17.6.0 3 | loguru>=0.6.0 4 | tls-client>=1.0.1 --------------------------------------------------------------------------------