Я пытаюсь реализовать аутентификацию для подключения к криптобирже NIMLAB, следуя их официальной документации: NIMLAB API Docs.
Однако я продолжаю сталкиваться с проблемами с аутентификацией и подписью. поколение. К сожалению, решения, которые я пробовал до сих пор, не работают.
Команда поддержки NIMLAB предоставила пример Python, который, по их утверждению, работает отлично:
import json
import hashlib
import asyncio
import aiohttp
import logging
from aiohttp.client_exceptions import ContentTypeError, ClientConnectorError
from urllib.parse import urlencode, quote
class NIMLABAPI:
def __init__(self, apiUrl, apiKey, apiSecret):
if not apiUrl:
raise ValueError('apiUrl is required in class ExchangerAPI')
if not apiKey:
raise ValueError('apiKey is required in class ExchangerAPI')
if not apiSecret:
raise ValueError('apiSecret is required in class ExchangerAPI')
self.config = {
"apiUrl": apiUrl,
"apikey": apiKey,
"secret": apiSecret
}
self.session = aiohttp.ClientSession()
def generate_hash(self, get_params, post_params):
for key in get_params:
if isinstance(get_params[key], list):
get_params[key] = [str(value) for value in get_params[key]]
else:
get_params[key] = str(get_params[key])
params = {**get_params, **post_params}
checksum_params = hashlib.sha256(json.dumps(params, ensure_ascii=False, separators=(',', ':')).encode()).hexdigest()
HASH = hashlib.sha256((checksum_params + self.config['secret']).encode()).hexdigest()
return HASH
async def call(self, method, param=None, rewriteConfig=None):
if param is None:
param = {}
get = param.get('get', {})
post = param.get('post', {})
post_out = json.dumps(post, ensure_ascii=False)
if not isinstance(get, dict):
return {"errorCode": 20, "message": 'Error invalid "get" params must be object'}
if not isinstance(post, dict):
return {"errorCode": 21, "message": 'Error invalid "post" params must be object'}
configService = {**self.config, **(rewriteConfig or {})}
method_parts = method.split(':')
typeMethod = 'POST'
if len(method_parts) == 2:
typeMethod, method = method_parts[0].upper(), method_parts[1]
else:
method = method_parts[0]
if typeMethod == 'GET':
get['time'] = int(1000 * asyncio.get_event_loop().time())
url_params = "&".join(f"{key}={value}" if not isinstance(value, list) else "&".join(f"{key}[]={item}" for item in value) for key, value in get.items())
url = f"{configService['apiUrl']}{method}?{url_params}" if url_params else f"{configService['apiUrl']}{method}"
HASH = self.generate_hash(get, post)
print(f"URL: {url}")
async with self.session.request(typeMethod, url, headers={
'cache-control': 'no-cache',
'apikey': configService['apikey'],
'hash': HASH,
'Content-Type': 'application/json'
}, data=post_out) as response:
while True:
try:
if response.status in [502, 504, 409]:
logging.warning(f"Error {response.status}: {response.reason}. Retrying in a while...")
await asyncio.sleep(15)
continue
if response.status != 200:
cf_mitigated = response.headers.get('cf-mitigated')
if cf_mitigated:
ray_id = response.headers.get('cf-ray', 'unknown')
raise Exception(f'CloudFlare mitigation required "{cf_mitigated}". RayID: {ray_id}. '
'Ask support to whitelist your IP.')
reason = response.reason or 'Unknown error'
raise Exception(f'Error API: {response.status} - {reason}')
if 'application/json' not in response.headers.get("content-type", ""):
text = await response.text()
raise Exception(f'Error: Response not JSON: {text}')
text = await response.text()
response_data = json.loads(text)
if not response_data.get('success') or not response_data.get('data'):
error_msg = response_data.get('error', 'Unknown error')
raise Exception(f'Error API: {error_msg}')
return json.dumps(response_data.get('data', {}))
except aiohttp.ClientError as error:
logging.exception("API call error", exc_info=error)
async def close(self):
await self.session.close()
Мне нужно адаптировать эту логику к PHP. Я уже пробовал использовать hash_hmac и различные подходы для создания подписи, но ничего не помогает.
Может ли кто-нибудь помочь мне преобразовать этот код в PHP или руководство узнать, как правильно реализовать аутентификацию с генерацией подписи?
API DOC: https://nimlab.eu/service/api-docs/#/
Заранее спасибо!
Да, Я забыл включить код:
Подробнее здесь: https://stackoverflow.com/questions/792 ... api-in-php
Как реализовать аутентификацию с помощью API NIMLAB Crypto Exchange в PHP? ⇐ Php
Кемеровские программисты php общаются здесь
1734085029
Anonymous
Я пытаюсь реализовать аутентификацию для подключения к криптобирже NIMLAB, следуя их официальной документации: NIMLAB API Docs.
Однако я продолжаю сталкиваться с проблемами с аутентификацией и подписью. поколение. К сожалению, решения, которые я пробовал до сих пор, не работают.
Команда поддержки NIMLAB предоставила пример Python, который, по их утверждению, работает отлично:
import json
import hashlib
import asyncio
import aiohttp
import logging
from aiohttp.client_exceptions import ContentTypeError, ClientConnectorError
from urllib.parse import urlencode, quote
class NIMLABAPI:
def __init__(self, apiUrl, apiKey, apiSecret):
if not apiUrl:
raise ValueError('apiUrl is required in class ExchangerAPI')
if not apiKey:
raise ValueError('apiKey is required in class ExchangerAPI')
if not apiSecret:
raise ValueError('apiSecret is required in class ExchangerAPI')
self.config = {
"apiUrl": apiUrl,
"apikey": apiKey,
"secret": apiSecret
}
self.session = aiohttp.ClientSession()
def generate_hash(self, get_params, post_params):
for key in get_params:
if isinstance(get_params[key], list):
get_params[key] = [str(value) for value in get_params[key]]
else:
get_params[key] = str(get_params[key])
params = {**get_params, **post_params}
checksum_params = hashlib.sha256(json.dumps(params, ensure_ascii=False, separators=(',', ':')).encode()).hexdigest()
HASH = hashlib.sha256((checksum_params + self.config['secret']).encode()).hexdigest()
return HASH
async def call(self, method, param=None, rewriteConfig=None):
if param is None:
param = {}
get = param.get('get', {})
post = param.get('post', {})
post_out = json.dumps(post, ensure_ascii=False)
if not isinstance(get, dict):
return {"errorCode": 20, "message": 'Error invalid "get" params must be object'}
if not isinstance(post, dict):
return {"errorCode": 21, "message": 'Error invalid "post" params must be object'}
configService = {**self.config, **(rewriteConfig or {})}
method_parts = method.split(':')
typeMethod = 'POST'
if len(method_parts) == 2:
typeMethod, method = method_parts[0].upper(), method_parts[1]
else:
method = method_parts[0]
if typeMethod == 'GET':
get['time'] = int(1000 * asyncio.get_event_loop().time())
url_params = "&".join(f"{key}={value}" if not isinstance(value, list) else "&".join(f"{key}[]={item}" for item in value) for key, value in get.items())
url = f"{configService['apiUrl']}{method}?{url_params}" if url_params else f"{configService['apiUrl']}{method}"
HASH = self.generate_hash(get, post)
print(f"URL: {url}")
async with self.session.request(typeMethod, url, headers={
'cache-control': 'no-cache',
'apikey': configService['apikey'],
'hash': HASH,
'Content-Type': 'application/json'
}, data=post_out) as response:
while True:
try:
if response.status in [502, 504, 409]:
logging.warning(f"Error {response.status}: {response.reason}. Retrying in a while...")
await asyncio.sleep(15)
continue
if response.status != 200:
cf_mitigated = response.headers.get('cf-mitigated')
if cf_mitigated:
ray_id = response.headers.get('cf-ray', 'unknown')
raise Exception(f'CloudFlare mitigation required "{cf_mitigated}". RayID: {ray_id}. '
'Ask support to whitelist your IP.')
reason = response.reason or 'Unknown error'
raise Exception(f'Error API: {response.status} - {reason}')
if 'application/json' not in response.headers.get("content-type", ""):
text = await response.text()
raise Exception(f'Error: Response not JSON: {text}')
text = await response.text()
response_data = json.loads(text)
if not response_data.get('success') or not response_data.get('data'):
error_msg = response_data.get('error', 'Unknown error')
raise Exception(f'Error API: {error_msg}')
return json.dumps(response_data.get('data', {}))
except aiohttp.ClientError as error:
logging.exception("API call error", exc_info=error)
async def close(self):
await self.session.close()
Мне нужно адаптировать эту логику к PHP. Я уже пробовал использовать [b]hash_hmac[/b] и различные подходы для создания подписи, но ничего не помогает.
Может ли кто-нибудь помочь мне преобразовать этот код в PHP или руководство узнать, как правильно реализовать аутентификацию с генерацией подписи?
API DOC: https://nimlab.eu/service/api-docs/#/
Заранее спасибо!
Да, Я забыл включить код:
Подробнее здесь: [url]https://stackoverflow.com/questions/79277911/how-to-implement-authentication-with-the-nimlab-crypto-exchange-api-in-php[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия