США API Трейд Питон Учетная Запись Хэш

Вопрос или проблема

Я пытаюсь настроить API, который позволит мне торговать акциями через мой аккаунт Schwab. Похоже, что Schwab требует от меня сначала получить хеш моего аккаунта, прежде чем я смогу отправить какие-либо торговые заявки. Я попытался использовать следующий код на Python, чтобы получить хеш моего аккаунта, но получаю ошибку 500 Internal Server Error, и это продолжается уже несколько дней.

Я не уверен, является ли это внутренней проблемой сервера API Schwab или я что-то делаю неправильно в своем коде. Мог бы кто-то помочь мне проверить это и дать какие-либо советы?

#Код

    import requests
    import json
    import base64

# Логируем начало процесса

    print("Начинаем процесс обновления токенов...")

# Загружаем токены из JSON-файла

    with open('C:/######/tokens.json') as f:
        tokens = json.load(f)

# Получаем токены обновления и доступа напрямую

    refresh_token = tokens['refresh_token']
    access_token = tokens['access_token']

    print("Токены успешно загружены.")

# Подготавливаем заголовки и данные для обновления токена

    client_id = "############################"  # Ключ приложения Schwab
    client_secret = "###################"  # Секрет приложения Schwab

    credentials = f"{client_id}:{client_secret}"
    base64_credentials = base64.b64encode(credentials.encode("utf-8")).decode("utf-8")
    
    headers = {
        "Authorization": f"Basic {base64_credentials}",
        "Content-Type": "application/x-www-form-urlencoded"
    }
    
    payload = {
        "grant_type": "refresh_token",
        "refresh_token": refresh_token
    }
    
    print("Обновление токена доступа...")

# Обновляем токен
    response = requests.post("https://api.schwabapi.com/v1/oauth/token", headers=headers, data=payload)
    
    if response.status_code == 200:
        print("Токен успешно обновлен.")
        new_tokens = response.json()
    
        # Сохраняем новые токены
        with open('C:/#################/tokens.json', 'w') as f:
            json.dump(new_tokens, f)
        print("Новые токены успешно сохранены.")
    else:
        print(f"Не удалось обновить токен. Код статуса: {response.status_code}")
        print(f"Сообщение об ошибке: {response.text}")
        exit()
    
# Используем новый токен доступа для получения хеша аккаунта
    new_access_token = new_tokens['access_token']
    headers = {
        "Authorization": f"Bearer {new_access_token}",
        "Content-Type": "application/json"
    }
    
    print("Получаем хеш аккаунта...")
    
# Делаем запрос для получения хеша аккаунта
    response = requests.get("https://api.schwabapi.com/trader/v1/accounts/accountNumbers", headers=headers)
    
    if response.status_code == 200:
        account_data = response.json()
        account_hash = account_data['hashValue']  # Проверяем правильный ключ
        print(f"Хеш аккаунта: {account_hash}")
    else:
        print(f"Не удалось получить хеш аккаунта. Код статуса: {response.status_code}")
        print(f"Сообщение об ошибке: {response.text}")

#Сообщение об ошибке консоли:

C:\#################\main.py 
Начинаем процесс обновления токенов...
Токены успешно загружены.
Обновление токена доступа...
Токен успешно обновлен.
Новые токены успешно сохранены.
Получаем хеш аккаунта...
Не удалось получить хеш аккаунта. Код статуса: 400
Сообщение об ошибке: 
            { "errors": [ { "id": "5ce0a10c-b84a-733b-c46f-7b773fae7d59", "status": 500, "title": "Internal Server Error" } ] }
        

Процесс завершен с кодом выхода 0

Ответ или решение

Получение хеша аккаунта через API Schwab на Python

Введение

Ваша задача заключается в получении хеша аккаунта для совершения торговых операций через API Schwab. Однако вы столкнулись с проблемой: при попытке выполнить запрос на получение хеша аккаунта, вы получаете ошибку 500 Internal Server Error. Давайте проанализируем ваш код и возможные источники этой проблемы.

Проанализируем ваш код

Ваш код выглядит довольно правильно, однако есть несколько аспектов, которые стоит уточнить и проверить:

  1. Проверка токенов: Убедитесь, что значения refresh_token и access_token, извлекаемые из файла tokens.json, являются актуальными. Если ваши токены просрочены, это может вызвать проблемы с аутентификацией.

  2. Обработка ошибок: У вас есть обработка ошибок для проверки статуса ответа. Однако ошибка 400 может указывать на проблему с запросом, а 500 говорит о внутренней ошибке сервера. Возможно, проблема не в вашем запросе, а в сервере Schwab.

  3. Формат запроса: Вы делаете запрос, чтобы получить хеш аккаунта. Убедитесь, что у вас есть все необходимые разрешения и доступ к этому ресурсу. Также проверьте, корректен ли формат URL и соответствуют ли путь и метод спецификациям API Schwab.

  4. Тестирование на другом уровне: Попробуйте выполнить ваш запрос с помощью cURL или Postman, чтобы выяснить, возвращает ли сервер тот же ответ, что и Python-код. Это поможет вам исключить ошибки в коде.

Рекомендации

  1. Логи API: Проверьте логи API на наличие сообщений об ошибках или предупреждений. Это может дать больше информации о том, что именно идет не так.

  2. Контакт с поддержкой Schwab: Если проблема сохраняется после всех проверок, вам следует обратиться в службу поддержки Schwab с подробным описанием возникшей ошибки и запросом о статусе API.

  3. Повторите попытку позже: Ошибка 500 указывает на возможные временные проблемы на стороне сервера, поэтому стоит попробовать выполнить запрос позже.

  4. Документация: Ознакомьтесь с последней документацией API Schwab для поиска возможных изменений или обновлений, касающихся аутентификации и получения данных аккаунта.

Пример обновленного кода для отладки

Вот пример, как можно улучшить отладочную информацию в вашем коде:

import requests
import json
import base64

print("Starting token refresh process...")

# Открываем и загружаем токены
with open('C:/######/tokens.json') as f:
    tokens = json.load(f)

refresh_token = tokens['refresh_token']
access_token = tokens['access_token']

print("Tokens loaded successfully.")

# Подготовка заголовков и полезной нагрузки
client_id = "############################"
client_secret = "###################"

credentials = f"{client_id}:{client_secret}"
base64_credentials = base64.b64encode(credentials.encode("utf-8")).decode("utf-8")

headers = {
    "Authorization": f"Basic {base64_credentials}",
    "Content-Type": "application/x-www-form-urlencoded"
}

# Обновление токена
response = requests.post("https://api.schwabapi.com/v1/oauth/token", headers=headers, data={
    "grant_type": "refresh_token",
    "refresh_token": refresh_token
})

if response.status_code == 200:
    print("Token refreshed successfully.")
    new_tokens = response.json()

    with open('C:/#################/tokens.json', 'w') as f:
        json.dump(new_tokens, f)
    print("New tokens saved successfully.")
else:
    print(f"Failed to refresh token. Status Code: {response.status_code}, Error: {response.text}")
    exit()

# Использование нового токена для получения хеша аккаунта
new_access_token = new_tokens['access_token']
headers = {
    "Authorization": f"Bearer {new_access_token}",
    "Content-Type": "application/json"
}

print("Fetching account hash...")

response = requests.get("https://api.schwabapi.com/trader/v1/accounts/accountNumbers", headers=headers)

if response.status_code == 200:
    account_data = response.json()
    account_hash = account_data['hashValue']
    print(f"Account Hash: {account_hash}")
else:
    print(f"Failed to retrieve account hash. Status Code: {response.status_code}, Error: {response.text}")

Заключение

Используйте представленные рекомендации и улучшения кода для решения вашей проблемы. Обязательно гарантируйте, что ваши токены действительны и что вы правильно формируете свои запросы. Если проблема сохраняется, рекомендуется обратиться за поддержкой к Schwab, поскольку ситуация может быть связана с их внутренними ошибками или изменениями в API.

Оцените материал
Добавить комментарий

Капча загружается...