繁体   English   中英

如何在 python 中使用 wordpress REST api 上传图像?

How to upload images using wordpress REST api in python?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我想我已经完成了 90% 的工作,但它最终“上传”了一个空白的透明图像。 上传后我收到 201 响应。 我认为这可能是 WP 发现丢失图像的代理。 我不确定我是否错误地传递了图像(即它没有离开我的电脑)或者我没有正确地标记它以符合 WP 的喜好。

from base64 import b64encode
import json
import requests

def imgUploadREST(imgPath):
    url = 'https://www.XXXXXXXXXX.com/wp-json/wp/v2/media'
    auth = b64encode('{}:{}'.format('USERNAME','PASS'))
    payload = {
        'type': 'image/jpeg',  # mimetype
        'title': 'title',
        "Content":"content",
        "excerpt":"Excerpt",
    }
    headers = {
        'post_content':'post_content',
        'Content':'content',
        'Content-Disposition' : 'attachment; filename=image_20170510.jpg',
        'Authorization': 'Basic {}'.format(auth),
    }
    with open(imgPath, "rb") as image_file:
        files = {'field_name': image_file}
        r = requests.post(url, files=files, headers=headers, data=payload) 
        print r
        response = json.loads(r.content)
        print response
    return response

我在 php 或 node.js 中看到了相当多的答案,但我无法理解 python 中的语法。 感谢您的任何帮助!

5 个回复

我想通了!

使用此功能,我可以通过 WP REST api 将图像上传到我的站点( Photo Gear Hunter。 )该函数返回图像的 ID。 然后,您可以将该 id 传递给新的 post call 并将其设为特色图像,或者使用它做任何您想做的事情。

def restImgUL(imgPath):
    url='http://xxxxxxxxxxxx.com/wp-json/wp/v2/media'
    data = open(imgPath, 'rb').read()
    fileName = os.path.basename(imgPath)
    res = requests.post(url='http://xxxxxxxxxxxxx.com/wp-json/wp/v2/media',
                        data=data,
                        headers={ 'Content-Type': 'image/jpg','Content-Disposition' : 'attachment; filename=%s'% fileName},
                        auth=('authname', 'authpass'))
    # pp = pprint.PrettyPrinter(indent=4) ## print it pretty. 
    # pp.pprint(res.json()) #this is nice when you need it
    newDict=res.json()
    newID= newDict.get('id')
    link = newDict.get('guid').get("rendered")
    print newID, link
    return (newID, link)

处理文件名中的非 ASCII的改进版本(例如希腊字母)。 它的作用是将所有非 ASCII 字符转换为 UTF-8 转义序列。 (来自@my Year Of Code 的原始代码)

def uploadImage(filePath):
    data = open(filePath, 'rb').read()
    
    fileName = os.path.basename(filePath)
    
    espSequence = bytes(fileName, "utf-8").decode("unicode_escape")  
    # Convert all non ASCII characters to UTF-8 escape sequence

    res = requests.post(url='http://xxxxxxxxxxxxx.com/wp-json/wp/v2/media',
                        data=data,
                        headers={'Content-Type': 'image/jpeg',
                                 'Content-Disposition': 'attachment; filename=%s' % espSequence,
                                 },
                        auth=('authname', 'authpass'))
    newDict=res.json()
    newID= newDict.get('id')
    link = newDict.get('guid').get("rendered")
    print newID, link
    return (newID, link)

据我了解,POST HEADER 只能包含 ASCII 字符

要指定 api 支持的其他字段,例如 alt 文本、描述等:

from requests_toolbelt.multipart.encoder import MultipartEncoder
import requests
import os
fileName = os.path.basename(imgPath)
multipart_data = MultipartEncoder(
    fields={
        # a file upload field
        'file': (fileName, open(imgPath, 'rb'), 'image/jpg'),
        # plain text fields
        'alt_text': 'alt test',
        'caption': 'caption test',
        'description': 'description test'
    }
)

response = requests.post('http://example/wp-json/wp/v2/media', data=multipart_data,
                         headers={'Content-Type': multipart_data.content_type},
                         auth=('user', 'pass'))

感谢@my Year Of Code

我的最终工作代码:

import 
HOST = "https://www.crifan.com"
API_MEDIA = HOST + "/wp-json/wp/v2/media"
JWT_TOKEN = "eyJxxxxxxxxjLYB4"

    imgMime = gImageSuffixToMime[imgSuffix] # 'image/png'
    imgeFilename = "%s.%s" % (processedGuid, imgSuffix) # 'f6956c30ef0b475fa2b99c2f49622e35.png'
    authValue = "Bearer %s" % JWT_TOKEN
    curHeaders = {
        "Authorization": authValue,
        "Content-Type": imgMime,
        'Content-Disposition': 'attachment; filename=%s' % imgeFilename,
    }
    # curHeaders={'Authorization': 'Bearer eyJ0xxxyyy.zzzB4', 'Content-Type': 'image/png', 'Content-Disposition': 'attachment; filename=f6956c30ef0b475fa2b99c2f49622e35.png'}
    uploadImgUrl = API_MEDIA
    resp = requests.post(
        uploadImgUrl,
        # proxies=cfgProxies,
        headers=curHeaders,
        data=imgBytes,
    )

返回201表示Created OK

响应 json 看起来像:

{
  "id": 70393,
  "date": "2020-03-07T18:43:47",
  "date_gmt": "2020-03-07T10:43:47",
  "guid": {
    "rendered": "https://www.crifan.com/files/pic/uploads/2020/03/f6956c30ef0b475fa2b99c2f49622e35.png",
    "raw": "https://www.crifan.com/files/pic/uploads/2020/03/f6956c30ef0b475fa2b99c2f49622e35.png"
  },
...

更多详情参考我的(中文)帖子: 【已解决】用Python通过WordPress的REST API上传图片

这是我从本地图像或 url 将图像上传到 WordPress 的工作代码。 希望有人觉得它有用。

import requests, json, os, base64

def wp_upload_image(domain, user, app_pass, imgPath):
    # imgPath can be local image path or can be url
    url = 'https://'+ domain + '/wp-json/wp/v2/media'
    filename = imgPath.split('/')[-1] if len(imgPath.split('/')[-1])>1 else imgPath.split('\\')[-1]
    extension = imgPath[imgPath.rfind('.')+1 : len(imgPath)]
    if imgPath.find('http') == -1:
        try: data = open(imgPath, 'rb').read()
        except:
            print('image local path not exits')
            return None
    else:
        rs = requests.get(imgPath)
        if rs.status_code == 200:
            data = rs.content
        else:
            print('url get request failed')
            return None
    headers = { "Content-Disposition": f"attachment; filename={filename}" , "Content-Type": str("image/" + extension)}
    rs = requests.post(url, auth=(user, app_pass), headers=headers, data=data)
    print(rs)
    return (rs.json()['source_url'], rs.json()['id'])

2 如何在wordpress中使用API

我想将一个Razorpay Payment API与WordPress连接,API使用用户名和密码进行身份验证令牌。 WordPress中是否有任何内置功能可以调用和处理响应? ...

3 在python中使用rest_api获取推文

我正在尝试获得10条推文。 我将计数设置为5并对其应用“在range(2)中”。 这意味着它最多只能检索10条推文。 但是,这给了我15条推文,其中推文1至5的推文ID出现了两次。 在此图像中,一些推文ID在重复,并给了我10条以上的推文。 是否有人可以帮助我在此蟒使用rest_ ...

5 如何在 URL 中正确调用带有 * 的 REST-API

我搜索了互联网(和stackoverflow:D)以找到以下问题的答案 - 并没有找到我理解的答案。 背景: 我们想使用 python 脚本将我们公司的 CMDB 与我们的 AWX/Ansible 基础设施连接起来。 CMDB 有一个REST API支持(中途)正确导出。 我目前坚持执行正确的 ...

6 如何在dspace中使用rest-api注册电子人

我想在此网站中使用dspace-rest创建数字图书馆: https : //wiki.duraspace.org/display/DSDOC6x/REST+API 。 我已经找到了登录api并成功进行了身份验证,但是我不知道如何注册电子人。 谢谢! ...

2019-02-10 13:06:28 1 36   dspace
8 使用带有rest-api插件的WordPress中的媒体API将文件上传到单独的文件夹

说明:我有一个将文件上传到WordPress的要求。 现在,我正在使用rest-api插件,并使用/ media端点上传文件。 但是我只能将文件上传到固定文件夹。 要求:我需要将文件上传到WordPress中的其他文件夹。 问题:如何使用客户端通过媒体API传递的一些参数将文件上 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM