【发布时间】:2016-12-30 18:51:08
【问题描述】:
我一直试图让这个东西工作好几天,但没有运气。我已经解决了大部分问题,但我现在遇到了一个新错误,我不知道为什么。
我已经阅读了多篇帖子,甚至一路上问了一些问题,但现在我完全被难住了,似乎我搜索的任何内容都没有帮助。
这里是场景:
- 我需要登录一个网站(我们称之为 site_A)并提取报告
- 接下来,我需要登录一个单独的网站 (site_B),以便上传该报告
- 使用 site_B,我需要登录,获取会话 ID,然后使用它 上传文件的会话 ID
这一切都是通过 API https POST 调用完成的......(是的,API 需要 POST 来处理所有事情)。
site_A 完美运行 - 我登录并提取数据,这给了我一个 XML 文件。由于 site_B 仅接受 .csv,因此该文件随后被转换为 CSV 文件。
site_B 然而,给了我错误。
使用 BURP,我能够截获公司发布的测试 API 的原始数据。这个原始数据看起来像这样(删除了一些数据):
POST /api/import HTTP/1.1
Host: hostURL
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
X-Requested-With: XMLHttpRequest
Content-Type: multipart/form-data; boundary=---------------------------28791504620783
Cookie: asc_session_id=sessionToken; SkipBrowserCheck=True; JSESSIONID=sessionStuff; ASP.NET_SessionId=ASPSession
Connection: close
-----------------------------28791504620783
Content-Disposition: form-data; name="token"
sessionToken
-----------------------------28791504620783
Content-Disposition: form-data; name="Name"
WH
-----------------------------28791504620783
Content-Disposition: form-data; name="uploadedfile"; filename="data.csv"
Content-Type: application/vnd.ms-excel
data,data,data,data
data,data,data,data
-----------------------------28791504620783--
我已将其转换为以下 python 程序:
# Login - get session token
app = requests.Session()
loginResponse = app.post(loginURL, headers=headers, data=json.dumps(post_body), verify=False)
if loginResponse.status_code != 200:
print ('Login attempt failed. Please try again later.')
else:
userData = json.loads(loginResponse.text)
sessionToken = userData["sessionId"]
print ('Login successful! Attempting to upload file...')
# Now try to upload file
uploadURL = 'uploadURL/'
headers = {
'token': sessionToken,
'Name': 'WH',
'POST': '/api/import/285/2 HTTP/1.1',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'en-US,en;q=0.5',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'close'
}
files = {'data.csv': open('data.csv', newline='')}
uploadResponse = app.post(uploadURL, headers=headers, files=files, verify=False)
if uploadResponse.status_code != 200:
print ('Status report: %i' % uploadResponse.status_code)
else:
print ('Upload Complete')
我试图移动一些东西,并将一些东西放在正文而不是标题中。但这也会给我带来登录错误或文件类型不正确。我已经确定我需要在标头中使用令牌和名称。我不确定是否必须在 python 请求中使用“files”变量(files='whatever')
但是从这一点开始,我收到了 500 错误。
有人可以指点我正确的方向吗?
我已阅读以下帖子,虽然它们有所帮助,但在这里却无济于事: Post 1、Post 2、Post 3
注意:我尚未确认问题不在服务器上。它可能根本不在我的代码中。但似乎由于网站上的 API 测试代码可以工作,它应该也可以在 python 中工作。
【问题讨论】:
-
files = {'file':open(..)或files = {'file': ('data.csv', open(..) -
@PadraicCunningham 仍然会导致 500 错误。
-
嗯,这是正确的做法,我没有意识到你收到了 500 错误,所以问题似乎出在服务器上,api 是公开的吗?
-
@PadraicCunningham 不。遗憾的是,它不公开。我可以在 REST API 插件中重新创建帖子,但不能在 python 中。所以...我正在尝试一种新方法或制作一个超长的字符串并将其放入体内。
-
一切似乎都是正确的,唯一可能缺少的是将
"X-Requested-With: XMLHttpRequest"添加到标头或未发送某些cookie
标签: python python-3.x csv post python-requests