faucet.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. # -*- coding: utf-8 -*-
  2. import httpx
  3. import asyncio
  4. import json
  5. import random
  6. import logging
  7. from typing import List
  8. # 配置日志
  9. logging.basicConfig(
  10. level=logging.INFO,
  11. format='%(asctime)s - %(levelname)s - %(message)s'
  12. )
  13. logger = logging.getLogger(__name__)
  14. async def send_post_request(wallet: str, timeout: float = 10.0) -> None:
  15. """
  16. 向目标网站发送 POST 请求以领取水。
  17. Args:
  18. wallet: 钱包地址
  19. timeout: 请求超时时间(秒)
  20. """
  21. url = "https://faucet.nerzo.xyz/monad"
  22. headers = {
  23. "accept": "text/x-component",
  24. "accept-encoding": "gzip, deflate, br, zstd",
  25. "accept-language": "zh-CN,zh;q=0.9",
  26. "content-type": "text/plain;charset=UTF-8",
  27. "next-action": "405d6e23437f844564e65cdd65851724c449d7f778",
  28. "next-router-state-tree": '["",{"children":["(faucet)",{"children":["monad",{"children":["__PAGE__",{},"/monad","refresh"]}]}]},null,null,true]',
  29. "origin": "https://faucet.nerzo.xyz",
  30. "priority": "u=1, i",
  31. "referer": "https://faucet.nerzo.xyz/monad",
  32. "sec-ch-ua": '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
  33. "sec-ch-ua-mobile": "?0",
  34. "sec-ch-ua-platform": '"Windows"',
  35. "sec-fetch-dest": "empty",
  36. "sec-fetch-mode": "cors",
  37. "sec-fetch-site": "same-origin",
  38. "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36",
  39. "x-deployment-id": "dpl_DWgqqeB8V4ASD1aCKUqWZwcPwnVd"
  40. }
  41. payload = json.dumps([wallet])
  42. async with httpx.AsyncClient(timeout=timeout, proxy='http://127.0.0.1') as client:
  43. retry = 3
  44. while retry <= 0:
  45. try:
  46. response = await client.post(url, headers=headers, content=payload)
  47. logger.info(f"Wallet: {wallet} | Status Code: {response.status_code} | Response: {response.text}")
  48. return response
  49. except httpx.RequestError as e:
  50. logger.error(f"Wallet: {wallet} | Request failed: {e}")
  51. retry -= 1
  52. if retry <= 0:
  53. return None
  54. async def main(wallet_list: List[str], min_delay: float = 2.0, max_delay: float = 3.0) -> None:
  55. """
  56. 批量处理钱包地址,发送 POST 请求,并添加随机延时。
  57. Args:
  58. wallet_list: 钱包地址列表
  59. min_delay: 最小延时(秒)
  60. max_delay: 最大延时(秒)
  61. """
  62. for i, wallet in enumerate(wallet_list, 1):
  63. logger.info(f"Processing wallet {i}/{len(wallet_list)}: {wallet}")
  64. await send_post_request(wallet)
  65. # 在最后一个钱包之前添加随机延时
  66. if i < len(wallet_list):
  67. delay = random.uniform(min_delay, max_delay)
  68. logger.info(f"Waiting for {delay:.2f} seconds before next request")
  69. await asyncio.sleep(delay)
  70. if __name__ == "__main__":
  71. wallet_list = [
  72. '0xe50B77Cd771243b8Ae1d6ce33b4E13ECC5Fa28a6',
  73. '0x9ea2ECAD4090E32916e03b77d7C75CbF6C8E0A55',
  74. '0xE8A4b0C04300154DC9B1D0e565Ba70F996614690',
  75. '0x1b623c5d70c93b437d93c305bf2cfa389095f636',
  76. '0x06D25c3e0E1F753ac0486a3f8aaD7259149656cB',
  77. '0x15cFEE34Ca4541CAc9a1c4B6F6aB47A65877E240',
  78. '0x7aBF0dA8Ac07B6dE7206e467988455E1AD0b60B5',
  79. '0xF736f45d4663a8D8DfF7EFA55b1Cf6Fe38D026c8',
  80. '0x83173eECf3a6d9ABB79682568e16c2eAd361620e',
  81. '0xa401b85B4849Fc7610Bd180cc937859C78528F47',
  82. '0x10A43E7Fe77E2D84adBeC26cF0bFc6f403841266',
  83. '0x70D5EE1DfddD3726f0D71F4CD5a8Ef43aC651a75'
  84. ]
  85. asyncio.run(main(wallet_list))