Вопрос или проблема
Я пытаюсь настроить 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. Давайте проанализируем ваш код и возможные источники этой проблемы.
Проанализируем ваш код
Ваш код выглядит довольно правильно, однако есть несколько аспектов, которые стоит уточнить и проверить:
-
Проверка токенов: Убедитесь, что значения
refresh_token
иaccess_token
, извлекаемые из файлаtokens.json
, являются актуальными. Если ваши токены просрочены, это может вызвать проблемы с аутентификацией. -
Обработка ошибок: У вас есть обработка ошибок для проверки статуса ответа. Однако ошибка 400 может указывать на проблему с запросом, а 500 говорит о внутренней ошибке сервера. Возможно, проблема не в вашем запросе, а в сервере Schwab.
-
Формат запроса: Вы делаете запрос, чтобы получить хеш аккаунта. Убедитесь, что у вас есть все необходимые разрешения и доступ к этому ресурсу. Также проверьте, корректен ли формат URL и соответствуют ли путь и метод спецификациям API Schwab.
-
Тестирование на другом уровне: Попробуйте выполнить ваш запрос с помощью cURL или Postman, чтобы выяснить, возвращает ли сервер тот же ответ, что и Python-код. Это поможет вам исключить ошибки в коде.
Рекомендации
-
Логи API: Проверьте логи API на наличие сообщений об ошибках или предупреждений. Это может дать больше информации о том, что именно идет не так.
-
Контакт с поддержкой Schwab: Если проблема сохраняется после всех проверок, вам следует обратиться в службу поддержки Schwab с подробным описанием возникшей ошибки и запросом о статусе API.
-
Повторите попытку позже: Ошибка 500 указывает на возможные временные проблемы на стороне сервера, поэтому стоит попробовать выполнить запрос позже.
-
Документация: Ознакомьтесь с последней документацией 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.