Загрузка...

Help me make a Rate Limit in a request

Thread in Python created by argoars Dec 22, 2024. 255 views

  1. argoars
    argoars Topic starter Dec 22, 2024 2 Jun 24, 2023
    Привет, помогите пожалуйста сделать Rate Limit для запроса. Я делаю для себя маленький проект с api крипто-биржи Bybit и я хочу отправлять запрос о получении данных о определенной монете, но api делает ограничение в 5 req/s я использую асинхронные запросы и как я уже не пробовал сделать эту задержку у меня не получается. Пытался сделать задержку при составлении задач или перед отправкой запроса. Ничего не помогает, как появлялась ошибка о превышении rate limit, так и появляется. Вот скрипт:
    Python
    from settings import api_key, api_secret, base_url
    import aiohttp
    import asyncio
    import json
    import time
    import hmac
    import hashlib


    def generate_signature(query_string, timestamp):
    sign = str(timestamp) + str(api_key) + str(400000) + str(query_string)
    signature = hmac.new(api_secret.encode(), sign.encode(), hashlib.sha256).hexdigest()
    return signature


    async def get_timestamp(session):
    async with session.get(base_url + '/v5/market/time') as response:
    data = await response.json()
    timestamp = str(int(data['result']['timeSecond']) * 1000)
    return timestamp


    async def get_symbols(session):
    symbols = []
    async with session.get(base_url + '/v5/market/tickers?category=spot') as response:
    data = await response.json()
    for i in data['result']['list']:
    symbol = i.get('symbol')
    if 'USDT' in symbol:
    symbols.append(symbol)
    return symbols


    async def coin_info(session, symbol, semaphore):
    timestamp = await get_timestamp(session)
    symbol_w = symbol.replace('USDT', '')
    query_string = f'coin={symbol_w}'
    signature = generate_signature(query_string, timestamp)
    headers = {
    'X-BAPI-API-KEY': api_key,
    'X-BAPI-RECV-WINDOW': '400000',
    'X-BAPI-SIGN': signature,
    'X-BAPI-TIMESTAMP': timestamp
    }
    async with semaphore:
    async with session.get(base_url + f'/v5/asset/coin/query-info?coin={symbol_w}', headers=headers) as response:
    if response.status == 200:
    data_coin_info = await response.json()
    if data_coin_info['retCode'] != 0:
    print(data_coin_info)
    else:
    print('все хорошо')
    return data_coin_info


    async def main():
    coin_info_rate_limit = 5
    semaphore = asyncio.Semaphore(coin_info_rate_limit)
    async with aiohttp.ClientSession() as session:
    symbols = await get_symbols(session)
    tasks = []
    lenn = len(symbols)
    i = 0
    for symbol in symbols:
    i +=1
    print(f'{i}/{lenn}')
    tasks.append(coin_info(session, symbol, semaphore))
    data_coin_info = await asyncio.gather(*tasks)
    print(data_coin_info)


    if __name__ == "__main__":
    asyncio.run(main())
    Помогите пожалуйста, если нужна документация к api, то вот - https://bybit-exchange.github.io/docs/v5/rate-limit
     
  2. argoars
    argoars Topic starter Dec 23, 2024 2 Jun 24, 2023
    Всё, если что, я решил это) Можно было отправить всего 1 запрос на получения инфы о монетах, а не по каждому проходится и отправлять.
     
  3. august
    august Dec 22, 2024 голые альтушки - https://lolz.live/threads/8317967/ 8810 Dec 8, 2021
    это же не то совсем, это вроде скок запросов можно отправить за раз, если не ошибаюсь
     
    1. View previous comments (1)
    2. cdcauxklan
      argoars, нет, ты указал 5 запросов для конкретной пачки из "потоков" (async всё-таки), и не указал конкретную задержку для них
    3. argoars Topic starter
      cdcauxklan, я указывал задержку в самой функции coin_info и при создании задач*. Просто код отправил без этого
    4. august
      argoars, а проблема решается при 4 запросах?
    5. View the next comments (3)
  4. argoars
    argoars Topic starter Dec 23, 2024 2 Jun 24, 2023
    Пока что ничего не помогло)
     
  5. AS7RID
    AS7RID Dec 23, 2024 в статус ставить - https://t.me/Kanalchik_alexa :rooster_talk: 13,861 Jun 11, 2019
    asyncio.Semaphore лишь кол-во одновременных выполнений функции ограничивает, про затраченное время тут ни коим образом речи не идет. Свой хендлер для этого напиши, который будет считать запросы и время между ними и при необходимости уходить в сон, благо на питоне это просто

    Если совсем впадлу, то можешь время считать время входа в async with semaphore и время завершения, и потом в нем же вызывать асинхронный сон на 1 - разницу во времени. Ленивый метод, но рабочий. В идеале уводить запросы в сон на старте выполнения, а не в конце :emm:
     
    1. argoars Topic starter
      AS7RID, я так и делал, просто кол прикрепил без задержки. Но это не помогало
    2. AS7RID
      argoars, Значит ты насрал в коде, ибо должно было помочь. Судя по инфе которую они оставили, там за промежуток чекается кол-во запросов, можешь хидеры выводить и дебажить где ты проебался :emm: [IMG]
Top
Loading...