基于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的代码返回的礼物不对,大概率是这几个问题导致的:
- 过滤参数格式错误
你在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())
- 缺少目标gift_num的过滤条件
你要找的是#52475(Xmas Stocking),但原来的请求里根本没加这个过滤条件,所以接口返回的是符合通用条件的随机礼物,自然不对。上面的代码里我已经补上了"gift_num": 52475,你可以试试。 - 请求头与权限问题
你的Referer和Origin指向的是tonnel-gift的前端页面,这个接口可能有防盗链校验,或者需要有效的user_auth(你现在传的是空字符串)。如果是需要登录才能访问的接口,空的user_auth可能会导致返回的数据被限制或者不正确。
额外的实用建议
- 加缓存机制:第三方接口稳定性差,而且容易限流,建议把获取到的价格存在DRF的数据库里,定期(比如每10分钟)更新一次,不要每次用户请求都去调用第三方接口,既提升性能又避免被封。
- 反爬应对:如果用爬虫方式,优先用Playwright而不是Selenium,它的反爬绕过能力更强,还能设置自动等待页面加载。另外要加请求间隔,必要时用代理IP池。
- 数据多源验证:不管用哪种方式获取价格,最好对比多个渠道的数据(比如同时用接口和链上数据),或者检查价格的合理性(比如是否在正常区间内),避免把错误数据返回给用户。




