Загрузка...

Help me make a Rate Limit in a request

Thread in Python created by argoars Dec 22, 2024. 257 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. argoars Topic starter
      august, ну да 5 запросов в секунду, но я не могу это никак ограничить
    2. cdcauxklan
      argoars, нет, ты указал 5 запросов для конкретной пачки из "потоков" (async всё-таки), и не указал конкретную задержку для них
    3. View the next comments (5)
  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...