├── README.md ├── main.py └── register.py /README.md: -------------------------------------------------------------------------------- 1 | # Auto_grass 2 | 3 | 更新了下y神的小草脚本,原po:https://github.com/ymmmmmmmm/getgrass_bot 4 | 5 | 新增了grass批量注册+批量挂号 6 | 7 | register.py使用方法: 8 | 9 | 修改代码中的:yescaptcha_client_key = '' 为你的apikey 10 | 注册地址:https://yescaptcha.com/i/rPuQqA 11 | 12 | 设置下面3个值 13 | num = 100 # 注册数量 14 | password = '' # 密码 15 | refcode = '' # 邀请码 16 | 17 | 执行:python3 register.py 18 | 19 | main.py使用方法: 20 | 通过register.py生成的account.txt,将每一行结尾加上代理,格式如下 21 | 邮箱----密码----user_id----socks5://xxx:xxxx@1.1.1.1:1111 22 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import random 3 | import ssl 4 | import json 5 | import time 6 | import uuid 7 | from loguru import logger 8 | from websockets_proxy import Proxy, proxy_connect 9 | 10 | 11 | async def connect_to_wss(socks5_proxy, user_id): 12 | device_id = str(uuid.uuid3(uuid.NAMESPACE_DNS, socks5_proxy)) 13 | logger.info(device_id) 14 | while True: 15 | try: 16 | await asyncio.sleep(random.randint(1, 10) / 10) 17 | custom_headers = { 18 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36" 19 | } 20 | ssl_context = ssl.create_default_context() 21 | ssl_context.check_hostname = False 22 | ssl_context.verify_mode = ssl.CERT_NONE 23 | uri = "wss://proxy.wynd.network:4650/" 24 | server_hostname = "proxy.wynd.network" 25 | proxy = Proxy.from_url(socks5_proxy) 26 | async with proxy_connect(uri, proxy=proxy, ssl=ssl_context, server_hostname=server_hostname, 27 | extra_headers=custom_headers,timeout=20) as websocket: 28 | async def send_ping(): 29 | while True: 30 | send_message = json.dumps( 31 | {"id": str(uuid.uuid4()), "version": "1.0.0", "action": "PING", "data": {}}) 32 | logger.debug(send_message) 33 | await websocket.send(send_message) 34 | await asyncio.sleep(20) 35 | 36 | # asyncio.create_task(send_http_request_every_10_seconds(socks5_proxy, device_id)) 37 | await asyncio.sleep(1) 38 | asyncio.create_task(send_ping()) 39 | 40 | while True: 41 | response = await websocket.recv() 42 | message = json.loads(response) 43 | logger.info(message) 44 | if message.get("action") == "AUTH": 45 | auth_response = { 46 | "id": message["id"], 47 | "origin_action": "AUTH", 48 | "result": { 49 | "browser_id": device_id, 50 | "user_id": user_id, 51 | "user_agent": custom_headers['User-Agent'], 52 | "timestamp": int(time.time()), 53 | "device_type": "extension", 54 | "version": "2.5.0" 55 | } 56 | } 57 | logger.debug(auth_response) 58 | await websocket.send(json.dumps(auth_response)) 59 | 60 | elif message.get("action") == "PONG": 61 | pong_response = {"id": message["id"], "origin_action": "PONG"} 62 | logger.debug(pong_response) 63 | await websocket.send(json.dumps(pong_response)) 64 | except Exception as e: 65 | logger.error(e) 66 | logger.error(socks5_proxy) 67 | 68 | 69 | async def main(): 70 | with open ('account.txt','r') as f: 71 | lines = f.readlines() 72 | tasks = [] 73 | for line in lines: 74 | source = line.strip().split('----') 75 | user_id = source[2] 76 | socks5_proxy = source[3] 77 | tasks.append(asyncio.ensure_future(connect_to_wss(socks5_proxy, user_id))) 78 | await asyncio.gather(*tasks) 79 | 80 | 81 | if __name__ == '__main__': 82 | asyncio.run(main()) 83 | -------------------------------------------------------------------------------- /register.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import time 3 | import random 4 | import string 5 | 6 | from loguru import logger 7 | 8 | requests.packages.urllib3.disable_warnings() 9 | 10 | yescaptcha_client_key = '' 11 | 12 | 13 | def reCaptchaV2(): 14 | while True: 15 | json_data = { 16 | "clientKey": yescaptcha_client_key, 17 | "task": 18 | { 19 | "type": "NoCaptchaTaskProxyless", 20 | "websiteURL": "https://www.google.com/recaptcha/api2/reload", 21 | "websiteKey": "6LdyCj0pAAAAAFvvSTRHYOzddUPMPcH232u7a9e0", 22 | "isInvisible": False, 23 | } 24 | } 25 | response = requests.post(url='https://api.yescaptcha.com/createTask', json=json_data).json() 26 | if response['errorId'] != 0: 27 | raise ValueError(response) 28 | task_id = response['taskId'] 29 | time.sleep(5) 30 | for _ in range(30): 31 | data = {"clientKey": yescaptcha_client_key, "taskId": task_id} 32 | response = requests.post(url='https://api.yescaptcha.com/getTaskResult', json=data).json() 33 | if response['status'] == 'ready': 34 | return response['solution']['gRecaptchaResponse'] 35 | else: 36 | time.sleep(2) 37 | 38 | def generate_random_string(length=6): 39 | letters = string.ascii_letters 40 | result_str = ''.join(random.choice(letters) for _ in range(length)) 41 | return result_str 42 | 43 | def register(refcode,password): 44 | session = requests.Session() 45 | 46 | rand_str = generate_random_string() 47 | email = f"{rand_str}@grassmail.com" 48 | recaptcha = reCaptchaV2() 49 | url = 'https://api.getgrass.io/auth/reguser?app=dashboard' 50 | headers = { 51 | "accept": "application/json, text/plain, */*", 52 | "accept-language": "zh-CN,zh;q=0.9", 53 | "content-type": "application/json;charset=UTF-8", 54 | "origin": "https://app.getgrass.io", 55 | "referer": "https://app.getgrass.io/", 56 | "sec-fetch-dest": "empty", 57 | "sec-fetch-mode": "cors", 58 | "sec-fetch-site": "same-site", 59 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/" 60 | } 61 | data = { 62 | "email": email, 63 | "password": password, 64 | "role":"seller", 65 | "referral":refcode, 66 | "username": f"{rand_str}", 67 | "recaptchaToken": recaptcha 68 | } 69 | response = session.post(url, headers=headers,json=data,verify=False).json() 70 | if response['status'] == 'success': 71 | user_id = response['data']['profile']['id'] 72 | logger.info(f"{user_id}注册成功") 73 | with open('account.txt', 'a') as f: 74 | f.write(f"{email}---{password}----{user_id}\n") 75 | else: 76 | logger.error("注册失败") 77 | 78 | if __name__ == '__main__': 79 | num = 100 # 注册数量 80 | password = '' # 密码 81 | refcode = '' # 邀请码 82 | for i in range(num): 83 | register(refcode, password) 84 | time.sleep(2) 85 | --------------------------------------------------------------------------------