You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Evernote Python 2.x API创建带附件笔记报错DATA_REQUIRED(错误码5)

解决Evernote Python 2.x API创建带附件笔记时的DATA_REQUIRED错误

你遇到的EDAMUserException(errorCode=5, parameter='[3430623163666630303562663662393263386539663366613134636630323736]')错误,核心原因是你传递的哈希值是十六进制字符串格式,但Evernote API要求的是二进制字节数组。

具体问题点

从你打印的ourNote参数可以看到两处关键错误:

  • Resource的Data.bodyHash是字符串:你传的是'40b1cff005bf6b92c8e9f3fa14cf0276'(十六进制字符串),但Evernote的Data对象要求bodyHash是SHA-1哈希的二进制字节,不是字符串。
  • ENML中的hash属性与Resource哈希不匹配:虽然的hash确实是十六进制字符串,但它必须和Resource.data.bodyHash的二进制值完全对应,而你当前因为bodyHash类型错误,触发了API的校验失败。

修复步骤

在Python 2.x中,你需要把十六进制字符串转换为二进制字节数组,同时确保ENML中的hash是正确的十六进制表示:

  1. 修正Resource的Data.bodyHash:
    把你的十六进制hash字符串转换为二进制,用decode('hex')方法:

    # 假设你已经计算出内容的SHA-1十六进制字符串
    hex_hash = '40b1cff005bf6b92c8e9f3fa14cf0276'
    binary_hash = hex_hash.decode('hex')
    # 然后创建Data对象时使用binary_hash作为bodyHash
    data = Data(body='This is the content of testfile, aaa, bbb\n\n', bodyHash=binary_hash, size=44)
    
  2. 确保ENML的hash正确:
    的hash属性需要是上述二进制hash对应的十六进制字符串(注意大小写要一致,Evernote通常接受小写),直接使用你的hex_hash即可:

    <en-media type="text/plain" hash="40b1cff005bf6b92c8e9f3fa14cf0276" />
    
  3. 完整的Resource创建示例(推荐):
    为了避免手动计算哈希出错,建议用Python的hashlib直接计算内容的SHA-1二进制哈希:

    import hashlib
    
    file_content = 'This is the content of testfile, aaa, bbb\n\n'
    # 计算SHA-1哈希(二进制,用于Data.bodyHash)
    sha1_binary = hashlib.sha1(file_content).digest()
    # 转换为十六进制字符串(用于ENML的<en-media>hash)
    sha1_hex = hashlib.sha1(file_content).hexdigest()
    
    # 创建Resource对象
    resource = Resource(
        mime='text/plain',
        data=Data(
            body=file_content,
            bodyHash=sha1_binary,
            size=len(file_content)
        ),
        attributes=ResourceAttributes(
            fileName='testfile.txt',  # 建议加上文件名,让附件显示更友好
            attachment=True  # 标记为附件,确保Evernote识别为附件而非内嵌媒体
        )
    )
    
    # 构建ENML内容
    enml_content = '''<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">
    <en-note>testbody<br /><br />Attachment with hash {sha1_hex}: <br />
    <en-media type="text/plain" hash="{sha1_hex}" /><br />
    </en-note>'''.format(sha1_hex=sha1_hex)
    
    # 创建Note对象
    ourNote = Note()
    ourNote.title = 'testtitel2'
    ourNote.content = enml_content
    ourNote.resources = [resource]
    

额外注意事项

  • 验证资源的size参数是否和内容的实际字节长度一致(Python 2.x中len(file_content)对于字符串直接返回字节数,没问题)。
  • 确保Resource.attributes.attachment设置为True,这样Evernote会把这个资源识别为独立附件,而非内嵌在笔记内容里的媒体。

按照上述步骤修改后,再调用noteStore.createNote应该就能成功创建带附件的笔记了。

内容的提问来源于stack exchange,提问作者Volker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:56:21