【问题标题】:python POST with file - convert from RAW data带有文件的python POST - 从RAW数据转换
【发布时间】: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 1Post 2Post 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


【解决方案1】:

我不确定是 API 的问题,还是我搞砸了,但在这种情况下,我必须创建一个看起来类似于 RAW 数据的主体。我的印象是“files=”会为我做这件事,但显然它没有。

我在多部分/表单中定义了一个边界,然后用它来添加我的部分。

最终结果类似于:

headers = {
            'Content-Type': 'multipart/form-data; boundary=159753',
            'asc_xsrf_token': sessionToken,
        }   

        with open('data.csv', newline='') as csvFile:
            post_body = (
                "\n--159753\n"
                "Content-Disposition: form-data; name=\"asc_xsrf_token\"\n\n"
                + sessionToken + 
                "\n--159753\n"
                "Content-Disposition: form-data; name=\"Name\"\n\n"
                "WH\n"
                "--159753\n"
                "Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"data.csv\"\n"
                "Content-Type: application/vnd.ms-excel\n\n"
                + csvFile.read() + 
                "\n--159753--"
                )
            csvFile.close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-18
    • 2014-07-26
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 2015-10-10
    • 2019-07-27
    相关资源
    最近更新 更多