You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

基于Python、Aiogram与DRF开发Telegram WebApp机器人:获取NFT礼物真实价格的技术方案问询

基于Python、Aiogram与DRF开发Telegram WebApp机器人:获取NFT礼物真实价格的技术方案问询

Hey there! 👋 我看你正在用Python、Aiogram和DRF开发Telegram WebApp机器人,卡在了获取Telegram礼物真实价格的问题上——官方市场和API的价格确实不准,这圈子最近确实火,好多人都在做类似的工具。我来给你捋捋可行的方案,还有针对你找到的那段代码的问题分析。

可行的真实价格获取途径

目前有三类比较靠谱的方式能拿到真实成交价格,你可以根据自己的需求选:

  • 第三方数据聚合接口:像你找到的tonnel-gift相关接口就属于这类,这类平台会爬取全网的Telegram礼物交易数据,聚合后提供API。但缺点是大多没有公开文档,参数和接口规则容易变,得自己抓包分析。
  • 模拟交易平台爬虫(Playwright/Selenium):直接模拟用户访问用户真实交易的第三方礼物市场,用Playwright或Selenium爬取页面上的实时报价。这种方式能拿到和普通用户看到的完全一致的价格,但要处理反爬机制(比如验证码、IP限制),而且页面结构变了就得改代码。
  • 链上数据监听(TON系礼物):现在多数Telegram礼物是基于TON链的NFT,你可以通过TON的公开区块链API监听对应礼物NFT合约的交易记录,直接从链上提取真实成交价格——这是最准确的方式,完全不受第三方平台的限制。比如TON的API可以查询合约的交易事件,过滤礼物NFT的转让、售卖交易,提取价格字段。

针对你提供的代码的问题排查

你贴的那段用curl_cffi的代码返回的礼物不对,大概率是这几个问题导致的:

  1. 过滤参数格式错误
    你在json_data里的filter是一个字符串化的JSON,而后台接口可能期望直接接收JSON对象,不是字符串。把字符串改成Python字典试试:
import curl_cffi
import json

headers = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:138.0) Gecko/20100101 Firefox/138.0",
    "Accept": "*/*",
    "Accept-Language": "en-US,en;q=0.5",
    "Referer": "https://tonnel-gift.vercel.app/",
    "Content-Type": "application/json",
    "Origin": "https://tonnel-gift.vercel.app",
    "Connection": "keep-alive",
    "Sec-Fetch-Dest": "empty",
    "Sec-Fetch-Mode": "cors",
    "Sec-Fetch-Site": "cross-site",
    "Sec-GPC": "1",
    "Priority": "u=4",
}

json_data = {
    "page": 1,
    "limit": 30,
    "sort": {"message_post_time": -1, "gift_id": -1},
    "filter": {
        "price": {"$exists": True},
        "refunded": {"$ne": True},
        "buyer": {"$exists": False},
        "export_at": {"$exists": True},
        "asset": "TON",
        # 加上你要找的gift_num过滤条件
        "gift_num": 52475
    },
    "ref": 0,
    "price_range": None,
    "user_auth": "",
}

session = curl_cffi.Session(impersonate="chrome131")
response = session.post(
    "https://gifts2.tonnel.network/api/pageGifts",
    headers=headers,
    json=json_data
)
print(response.json())
  1. 缺少目标gift_num的过滤条件
    你要找的是#52475(Xmas Stocking),但原来的请求里根本没加这个过滤条件,所以接口返回的是符合通用条件的随机礼物,自然不对。上面的代码里我已经补上了"gift_num": 52475,你可以试试。
  2. 请求头与权限问题
    你的RefererOrigin指向的是tonnel-gift的前端页面,这个接口可能有防盗链校验,或者需要有效的user_auth(你现在传的是空字符串)。如果是需要登录才能访问的接口,空的user_auth可能会导致返回的数据被限制或者不正确。

额外的实用建议

  • 加缓存机制:第三方接口稳定性差,而且容易限流,建议把获取到的价格存在DRF的数据库里,定期(比如每10分钟)更新一次,不要每次用户请求都去调用第三方接口,既提升性能又避免被封。
  • 反爬应对:如果用爬虫方式,优先用Playwright而不是Selenium,它的反爬绕过能力更强,还能设置自动等待页面加载。另外要加请求间隔,必要时用代理IP池。
  • 数据多源验证:不管用哪种方式获取价格,最好对比多个渠道的数据(比如同时用接口和链上数据),或者检查价格的合理性(比如是否在正常区间内),避免把错误数据返回给用户。

火山引擎 最新活动