如何上传/操作Apple News JSON文件?

lb3vh1jj  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(82)

我是Apple News的独立发布者,使用News Publisher创建文章。我正在寻找文章格式和呈现方式的灵活性,并想知道如何为未来的文章上传JSON文档-我以前从未使用过它。
我怎么才能把这样的东西和苹果新闻联系起来呢?我已经看过他们的帮助部分了,但是看起来问题比答案还多。

pbossiut

pbossiut1#

一篇基本的文章看起来像这样

{
    "version": "1.4",
    "identifier": "sketchyTech_Demo",
    "title": "My First Article",
    "language": "en",
    "layout": {},
    "components": [
        {
            "role": "title",
            "text": "My First Article"
        },    
        {
            "role": "body",
            "text": "This is just over the minimum amount of JSON required to create a valid article in Apple News Format. If you were to delete the dictionary enclosing this text, you'd be there."
        }
    ],
    "componentTextStyles": {}
}

并且始终保存为article.json。在组件数组中,您可以使用任何Apple News组件。(注意:你不需要使用纯json,你可以使用markdown或html来代替文本,以简化样式。
我在GitHub上整理了这组更广泛的示例,您还可以在其中找到有关使用News Preview测试文章的详细信息,这将通过列出错误等来帮助您。
一旦你准备好上传到你使用的服务API已经注册这样做,在Python中提供了实现代码的例子。你可以上传单独的文章或包含文章及其链接文件的捆绑包。

编辑:使用Python上传文章

将以下代码复制并粘贴到文本编辑器中,并保存为upload.py

#!/usr/bin/python

import requests
import base64
from hashlib import sha256
import hmac
from datetime import datetime
import glob
import argparse
import os
import mimetypes
from requests.packages.urllib3.filepost import encode_multipart_formdata
from requests.packages.urllib3.fields import RequestField

arg_parser = argparse.ArgumentParser(description='Publish an article using the Apple News API')
arg_parser.add_argument('article_directory', metavar='ARTICLE_DIR', type=str, help='A directory containing an article.json file and resources')
args = arg_parser.parse_args()

channel_id = '[YOUR CHANNEL-ID]'
api_key_id = '[YOUR API-KEY]'
api_key_secret = '[YOUR API KEY-SECRET]'
method = 'POST'
url = 'https://news-api.apple.com/channels/%s/articles' % channel_id
session = requests.Session()
session.verify = False

def part(filename):
    name = os.path.basename(filename)
    with open(filename) as f:
        data = f.read()
    part = RequestField(name, data)
    part.headers['Content-Disposition'] = 'form-data; filename="%s"; size=%d'  % (name, os.stat(filename).st_size)
    part.headers['Content-Type'] = 'application/json' if name.endswith('.json') else 'application/octet-stream'
    return part

def send_signed_request(method, url, filenames):
    body, content_type = encode_multipart_formdata([part(f) for f in filenames])
    req = requests.Request(method, url, data=body, headers={'Content-Type': content_type})
    req = req.prepare()
    date = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ')
    canonical_request = method + url + str(date) + content_type + body
    key = base64.b64decode(api_key_secret)
    hashed = hmac.new(key, canonical_request, sha256)
    signature = hashed.digest().encode('base64').rstrip('\n')
    authorization = 'HHMAC; key=%s; signature=%s; date=%s' % (api_key_id, str(signature), date)
    req.headers['Authorization'] = authorization
    return session.send(req)

response = send_signed_request(method, url, glob.glob('%s/*' % args.article_directory))

print response.status_code
print response.text

接下来,将以下元素的值更改为Apple提供给您的值:

channel_id = '[YOUR CHANNEL-ID]'
api_key_id = '[YOUR API-KEY]'
api_key_secret = '[YOUR API KEY-SECRET]'

最后打开终端,从Finder中将您创建的upload.py文件拖动到命令行,然后在包含article.json文件的文件夹中拖动之前留出一个空间,以便在一行上显示两个路径(第一个是upload.py文件的位置,第二个是包含article.json文件的文件夹)。最后按Enter。
您应该会看到一些返回的JSON。现在打开www.example.com中的News PublisheriCloud.com,并导航到Articles > Drafts from CMS,以获取有关预览和发布上传文章的说明。

相关问题