Skip to content

Latest commit

 

History

History
144 lines (106 loc) · 7.44 KB

File metadata and controls

144 lines (106 loc) · 7.44 KB

Tonnel Api Documentation

Это неофициальная документация по апи тонеля, самой популярной площадке для покупки и продаже телеграм подарков на данный момент.

рабочий код на питоне тут

При заходе на сайт, совершается пост запрос по этому юрл:

https://gifts2.tonnel.network/api/pageGifts

По нему загружаются подарки, выставленные на тонеле!

Но обычного пост запроса не хватит, нужно передать данные для фильтрации подарков в json формате:

json_data = {
    'page': 1,
    'limit': 1,
    'sort': '{"message_post_time":-1,"gift_id":-1}',
    'filter': '{"price":{"$exists":true},"refunded":{"$ne":true},"buyer":{"$exists":false},"export_at":{"$exists":true},"gift_name":"Desk Calendar","model":"Deadline (0.2%)","asset":"TON"}',
    'price_range': None,
    'user_auth': '',
}

Разберём по порядку:

page — Страница с подарками, которую вы хотите увидеть в ответе
limit — Максимальное количество подарков, которое может быть на 1 странице. При значении выше 30 будет возвращать ошибку {'error': 'limit is too big'}
sort — Тип сортировки всех этих подарков (их всего 10) 👇

!!! Для каждого типа сортировки нужно ставить значение -1 либо 1. -1 означает что результат будет в убывании, 1 в возрастании

  • message_post_time — По времени выставления
  • export_at — По времени выставления !! message_post_time со значением 1 даст тот же результат, что и export_at со значением -1, и наоборот !!
  • price — По стоимости
  • gift_num — По номеру подарка (plushpepe-1)
  • modelRarity | backdropRarity | symbolRarity — По процентной редкости аттрибута (модели/фона/узора)
  • rarity — Неизвестно
  • gift_id — Неизвестно

filter — Фильтр для поиска конкретных подарков
Подстроку "price":{"$exists":true},"refunded":{"$ne":true},"buyer":{"$exists":false},"export_at":{"$exists":true}, оставляете как есть, после нее добавляете необязательные параметры для поиска нужного подарка:

  • gift_name - Название
  • model - Модель
  • backdrop - Фон
  • pattern - Узор
  1. Для модели, фона и узора значение нужно указывать в формате regex, чтобы дополнительно не искать процентную редкость. Пример: "gift_name":"Lunar Snake", "model": {"$regex": f"^Albino \\("}
  2. Если же вам лень писать фильтр для регекса или у вас откуда-то есть процентная редкость аттрибута, то указываете: "model": "Albino (1.5%)"
  3. Для поиска по нескольким объектам одного аттрибута(хотите увидеть 5 моделей/фонов), нужно указывать значение в формате списка: "model":{'$in':["Synthwave (0.3%)", "Albino (1.5%)"]}\
  • Альтернативный вариант для regex: "model": {'$regex':f"^({'|'.join(["Synthwave", "Albino"])})"}
    В самом конце фильтра указываете последний фильтр: "asset":"TON", соответственно отвечающий за валюту в которой будут выданы подарки. Может быть TONNEL и USDT, но смысла от такого фильтра я не вижу, результаты будут милипиздрические.

price_range - Диапозон цены в формате списка: 'price_range': [1,1000]. Оставьте None для отключения фильтра по цене.
user_auth - Обязательное поле, в значении пустая строка означает что вы никак не залогинились на сайте и просто просматриваете подарки.

И самое главное - библиотека для запросов

Код будет на питоне, кому надо на другом яп сами подгоняйте

Поскольку тонель делал не коля из 3Б, обычная либка по типу requests/httpx не подойдет. Отлично работает с curl_cffi, также для идеальной работы рекомендую юзать фейк юзерагент.

pip install curl_cffi fake_useragent

Рабочий код на питоне:

import json
from curl_cffi import requests
from fake_useragent import UserAgent

ua = UserAgent()
usag = ua.random


headers = {
    "authority": "gifts2.tonnel.network",
    "accept": "*/*",
    "accept-encoding": "gzip, deflate, br, zstd",
    "accept-language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7",
    "content-type": "application/json",
    "origin": "https://market.tonnel.network",
    "priority": "u=1, i",
    "referer": "https://market.tonnel.network/",
    "sec-ch-ua": '"Google Chrome";v="137", "Chromium";v="137", "Not/A)Brand";v="24"',
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": '"Windows"',
    "sec-fetch-dest": "empty",
    "sec-fetch-mode": "cors",
    "sec-fetch-site": "same-site",
    "user-agent": usag
}


sort_data = {
    'message_post_time': -1,
    'gift_id': -1
}

filter_data = {
    "price":{"$exists": True},
    "refunded":{"$ne":True},
    "buyer":{"$exists": False},
    "export_at":{"$exists": True},
    "gift_name":"Lunar Snake",

    "model": "Albino (1.5%)",
    # Либо юзаем regex если нет возможности взять % редкость
    # "model":{"$regex": "^Albino \\("},

    # Запрос нескольких моделей:

    # "model":{'$in':["Synthwave (0.3%)", "Albino (1.5%)"]},
    # Либо юзаем regex если нет возможности взять % редкость
    # "model": {'$regex':f"^({'|'.join(["Synthwave", "Albino"])})"},
    "asset":"TON"
}

json_data = {
    'page': 1,
    'limit': 5,
    'sort': json.dumps(sort_data),
    'filter': json.dumps(filter_data),
    'price_range': None,
    'user_auth': '',
}



response = requests.post('https://gifts2.tonnel.network/api/pageGifts', json=json_data, impersonate="chrome", headers=headers)
print(response.json())
# Код выведет первую страницу с 5 самыми новыми подарками с именем Lunar Snake, с моделью Albino

P. S. Можете глянуть этот репозиторий уже с полноценной либкой по апи тоннеля (не моей)