pexels - Tobi
580 字
3 分鐘
解決 IG Markets 中使用 Python Requests POST 登入時遇到的 HTTP400 問題
問題
我嘗試使用 Python 的 Requests Package 登入 IG Markets 的 Rest API,結果回傳 HTTP 400:
import requestsimport pandas as pd
API_KEY = ...IG_URL = "https://demo-api.ig.com/gateway/deal"ACCOUNT_ID = ...
url = f"{IG_URL}/session"
session = requests.Session()
session.headers.update({ "Content-Type": "application/json; charset=UTF-8", "Accept": "application/json; charset=UTF-8", "Version": "3", "X-IG-API-KEY": API_KEY, "IG-ACCOUNT-ID": ACCOUNT_ID})
data = { "identifier": "XXX, "password": "XXX"}
response = session.post(url, data=data, headers=None)
print(response.status_code)但同樣的行為我用 IG Markets 網站跟 Postman 軟體 測試都是正常…


試錯
我東改西改、拔掉 header 中的各項元素又拔掉測試,但都沒有用。
怎麼可能會只有 Python 程式碼有問題!沒道理啊…難不成是 WSL 的問題?
ChatGPT 助攻
我把程式碼丟到 ChatGPT 中,並問它「上述這段程式會回傳 HTTP 400,請告訴我哪裡出問題了」
ChatGPT 的回覆
- 请求数据格式不正确:根据您的代码,您使用
data=data参数将数据作为字典传递给session.post方法。然而,requests.post方法需要将数据转换为 JSON 格式字符串,并将其作为json参数传递。要解决这个问题,您可以将data参数更改为json=json.dumps(data),这将正确将数据转换为 JSON 格式。
修正后的代码如下:response = session.post(url, json=json.dumps(data), headers=None)
- 请求头缺少必要的信息:您在请求头中设置了一些必要的信息,例如
Content-Type、Accept、Version、X-IG-API-KEY和IG-ACCOUNT-ID。然而,在您的代码中,您将headers参数设置为None,这会导致请求头不被正确地发送。要解决这个问题,您可以直接将请求头传递给session.post方法,而不是将headers参数设置为None。
修正后的代码如下:response = session.post(url, json=json.dumps(data), headers=session.headers)请注意,您需要确保
API_KEY和ACCOUNT_ID的值是正确的,并且与您使用的API服务商的要求相匹配。另外,如果上述修正后的代码仍然无法解决问题,请提供更多关于错误消息或其他相关的错误信息,以便我能够更准确地帮助您找到问题所在。
解決
原來是第 25 行的 response = session.post(url, data=data, headers=None) 中,不該用 data;改用 json 回傳即可。
修正後的完整程式碼:
import requestsimport pandas as pd
API_KEY = ...IG_URL = "https://demo-api.ig.com/gateway/deal"ACCOUNT_ID = ...
url = f"{IG_URL}/session"
session = requests.Session()
session.headers.update({ "Content-Type": "application/json; charset=UTF-8", "Accept": "application/json; charset=UTF-8", "Version": "3", "X-IG-API-KEY": API_KEY, "IG-ACCOUNT-ID": ACCOUNT_ID})
data = { "identifier": "XXX, "password": "XXX"}
response = session.post(url, json=data, headers=None)
print(response.status_code) 解決 IG Markets 中使用 Python Requests POST 登入時遇到的 HTTP400 問題
https://blog.pytreedao.com/posts/igmarkets-rest-api-python-login-requests-http400/ 最後更新於 2023-07-16,距今已過 917 天
部分內容可能已過時