Python通过OAuth 1.0连接NetSuite报INVALID_LOGIN及JSON载荷读取问题
NetSuite接口调用问题解决方案
一、INVALID_LOGIN 401错误修复
你当前代码的核心问题是直接复制了Postman生成的静态OAuth授权头,NetSuite的OAuth1.0认证要求每次请求必须生成三个动态参数:oauth_timestamp(10位当前时间戳)、oauth_nonce(随机一次性字符串)、oauth_signature(结合所有参数和密钥动态计算的签名),静态值几秒后就会失效,这是Postman调用正常、Python调用失败的核心原因。
推荐直接使用成熟的OAuth1签名库自动生成授权头,避免手动拼接参数出错:
- 先安装依赖库:
pip install requests requests_oauthlib
- 正确代码示例:
import requests from oauthlib.oauth1 import Client # 替换为你自己的NetSuite认证参数 NETSUITE_ACCOUNT_ID = "5559796_SB1" CONSUMER_KEY = "你的consumer key" CONSUMER_SECRET = "你的consumer secret" TOKEN_ID = "你的token id" TOKEN_SECRET = "你的token secret" BASE_URL = "https://5559796-sb1.suitetalk.api.netsuite.com/services/rest/record/v1/qbc_pqr_1234" # 自动生成OAuth1签名和授权头 oauth_client = Client( client_key=CONSUMER_KEY, client_secret=CONSUMER_SECRET, resource_owner_key=TOKEN_ID, resource_owner_secret=TOKEN_SECRET, realm=NETSUITE_ACCOUNT_ID, signature_method="HMAC-SHA256" ) uri, headers, body = oauth_client.sign(BASE_URL, http_method="POST", body='{}', headers={"Content-Type": "application/json"}) # 提交单条数据示例 payload = {"aaa":"AN","bbb":"OA","ccc":1,"ddd":False,"eee":114.01,"fff":"OAOTWH","ggg":"hhh","hhh":18,"iii":2,"jjj":"2021-07-31","kkk":3257.29,"lll":"Intra-Brand Stay - 3.5%"} response = requests.post(BASE_URL, headers=headers, json=payload) print(response.status_code, response.text)
如果修改后还是报错,排查以下点:
- NetSuite后台开启了IP限制,你运行Python代码的机器IP没有加入白名单
- 认证参数对应的角色没有该自定义记录的新增权限
- 账号ID、consumer key、token等参数写错,注意所有值不要带多余的空格、引号
二、多记录JSON文件读取实现
假设你存储载荷的JSON文件data.json结构为数组格式,示例如下:
[ {"aaa":"AN","bbb":"OA","ccc":1}, {"aaa":"BN","bbb":"OB","ccc":2}, {"aaa":"CN","bbb":"OC","ccc":3} ]
批量读取提交的代码示例:
import json import requests from oauthlib.oauth1 import Client # 上面的认证参数配置部分保持不变 NETSUITE_ACCOUNT_ID = "5559796_SB1" CONSUMER_KEY = "你的consumer key" CONSUMER_SECRET = "你的consumer secret" TOKEN_ID = "你的token id" TOKEN_SECRET = "你的token secret" BASE_URL = "https://5559796-sb1.suitetalk.api.netsuite.com/services/rest/record/v1/qbc_pqr_1234" oauth_client = Client( client_key=CONSUMER_KEY, client_secret=CONSUMER_SECRET, resource_owner_key=TOKEN_ID, resource_owner_secret=TOKEN_SECRET, realm=NETSUITE_ACCOUNT_ID, signature_method="HMAC-SHA256" ) # 读取JSON文件中的所有记录 with open("data.json", "r", encoding="utf-8") as f: record_list = json.load(f) # 遍历提交每条记录 for index, record in enumerate(record_list): uri, headers, body = oauth_client.sign(BASE_URL, http_method="POST", body='{}', headers={"Content-Type": "application/json"}) response = requests.post(BASE_URL, headers=headers, json=record) print(f"第{index+1}条记录提交结果:{response.status_code}, {response.text}")
内容的提问来源于stack exchange,提问作者Tessy
相关产品推荐
相关产品推荐

