【问题标题】:Convert cURL to Python - Upload A File将 cURL 转换为 Python - 上传文件
【发布时间】:2020-06-28 03:41:47
【问题描述】:

我似乎无法将 cURL 转换为 python。来自文档:

curl -i --upload-file ~/Desktop/Myimage.jpg -H 'Authorization: Bearer Redacted' "https://api.linkedin.com/mediaUpload/C5522AQHn46pwH96hxQ/feedshare-uploadedImage/0?ca=vector_feedshare&cn=uploads&m=AQLKRJOn_yNw6wAAAW2T0DWnRStny4dzsNVJjlF3aN4-H3ZR9Div77kKoQ&app=1983914&sync=0&v=beta&ut=1Dnjy796bpjEY1

我尝试使用文件而不是数据无济于事。

下面的当前代码创建了正确的响应 201,但它是空白的(没有 JSON 详细信息以及用于未来 API 调用的图像)。让我在不使用多部分表单(即“files=”)的情况下通过 PUT 请求上传文件需要进行哪些更改

uploadUrl = data["value"]["uploadMechanism"]["com.linkedin.digitalmedia.uploading.MediaUploadHttpRequest"]["uploadUrl"]

filename = "ffadfads.jpeg"
media_url = "https://1000logos.net/wp-content/uploads/2017/03/LinkedIn-Logo.png"
request = requests.get(media_url, stream=True)
if request.status_code == 200:
    with open(filename, 'wb') as image:
        for chunk in request:
            image.write(chunk)
    #files = {'fileupload': open(filename)}
    files = {"fileupload":(filename,open(filename,"rb"),'application-type')}
    image_headers = {
        'Accept': 'image/jpeg,image/png,image/gif',
        'Authorization': 'Bearer ' + real_token
    }
    response = requests.request("PUT", uploadUrl, data=open(filename,"rb"), headers=image_headers)
    print response
    print response.text
    print response.json()

【问题讨论】:

  • 试试这个curl.trillworks.com
  • @bharatk,那是我去的第一个地方,但没有帮助
  • 为什么将Accept 标头设置为image/jpeg,image/png,image/gif?如果您期望来自服务器的 JSON,您会认为它应该设置为 application/json。当您的浏览器执行请求时,请求的标头(包括 cookie)是什么?
  • @GordonAitchJay 我尝试为 Accept 标头调整不同的内容(图像/jpeg 是最新的)。所有的调整都没有奏效。标头很好,我收到 201 响应。领英很奇怪。你以前通过表单上传效果很好,现在这种新方式让我很困惑,因为 cURL 如何转换为 python。
  • 您是否尝试过使用 cURL 来了解它是否有效? (我认为它不起作用)我只是在阅读Rich Media Shares - LinkedIn | Microsoft Docs,如果我阅读正确,您首先需要向https://api.linkedin.com/v2/assets?action=registerUpload 发出一个POST 请求,并将Content-Type 标头设置为application/json带有 JSON 有效负载。然后,服务器将使用具有 uploadUrl 键的 JSON 进行响应,然后您可以使用该键的值来实际上传图像。

标签: python curl linkedin linkedin-api


【解决方案1】:

尽量不要混淆请求和响应。

response1 = requests.get(media_url, stream=True)
if response1.status_code == 200:
    response2 = requests.request("PUT", uploadUrl,
                                 data=response1.iter_content(),
                                 headers=image_headers)

【讨论】:

  • 更改变量名不会影响输出。
  • 没错,但它确实使代码更容易理解。
【解决方案2】:

如果您未绑定使用 requests 库,您可以尝试直接从 python 运行 curl 命令,对于 Python 3 使用 subprocess.run()shlex.split()

使用您问题中的示例 curl 命令(在末尾添加缺少的双引号),以下代码将运行它并将响应捕获为文本。

import shlex
import subprocess

curl_command_line = '''curl -i --upload-file ~/Desktop/Myimage.jpg \
-H 'Authorization: Bearer Redacted' \
"https://api.linkedin.com/mediaUpload/C5522AQHn46pwH96hxQ/feedshare-uploadedImage/0?ca=vector_feedshare&cn=uploads&m=AQLKRJOn_yNw6wAAAW2T0DWnRStny4dzsNVJjlF3aN4-H3ZR9Div77kKoQ&app=1983914&sync=0&v=beta&ut=1Dnjy796bpjEY1"'''

args = shlex.split(curl_command_line)
response = subprocess.run(args, capture_output=True, text=True).stdout

对于 Python 2.7,将最后一行替换为:

response = subprocess.call(args)

【讨论】:

  • 我使用的是 python 2.7;尝试转换,但这不起作用:/
  • 在 Python 2.7 中没有 run() 函数,但您可以使用 call() 代替。我已经编辑了我的答案以包含两个 python 版本。
  • 无论我使用 cURL 还是 python,我都可以发送 201 消息,但它实际上并没有发布到 LinkedIn。他们的 API 是最差的。没有代码sn-ps。没有示例响应。只是一个 cURL 示例。
  • 为了更清楚,我收到 201(已创建)响应,但它是空白的。它不显示帖子详细信息,也不发布到 LinkedIn
  • 201 响应,即使是空白正文,也应该是成功上传。您是否尝试过Retrieve Shares 步骤来查看您是否可以访问您的上传?
猜你喜欢
  • 2020-05-20
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2016-05-28
  • 1970-01-01
相关资源
最近更新 更多