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是正确的十六进制表示:
修正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)确保ENML的
hash正确 :的hash属性需要是上述二进制hash对应的十六进制字符串(注意大小写要一致,Evernote通常接受小写),直接使用你的 hex_hash即可:<en-media type="text/plain" hash="40b1cff005bf6b92c8e9f3fa14cf0276" />完整的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
相关产品推荐
相关产品推荐

