前提・実現したいこと
はてなフォトライフのAPIを利用して、Python3とWSSE認証によって、画像をアップロードしたいと考えています。
発生している問題・エラーメッセージ
Error! status_code: 500 message: <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>500 Internal Server Error</title> </head><body> <h1>Internal Server Error</h1> <p>The server encountered an internal error or misconfiguration and was unable to complete your request.</p> <p>Please contact the server administrator, root@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.</p> <p>More information about this error may be available in the server error log.</p> </body></html>
該当のソースコード
Python
1#!/home/pi/.pyenv/shims/python 2#coding=utf-8 3import sys 4import datetime 5import random 6import hashlib 7import base64 8 9import requests 10from chardet.universaldetector import UniversalDetector 11 12import datetime 13now = datetime.datetime.now() 14dtime = str(now.year)+"""-"""+str(now.month)+"""-"""+str(now.day)+"""T"""+str(now.hour)+""":"""+str(now.minute)+""":"""+str(now.second) 15print(dtime) 16 17# setting ----------------------------------------------------------- 18username = '****user' 19api_key = '****accesstoken' 20blogname = '****brogname' 21 22# main ----------------------------------------------------------- 23def main(): 24 data = create_data() 25 post_hatena(data) 26 27def wsse(username, api_key): 28 created = datetime.datetime.now().isoformat() + "Z" 29 b_nonce = hashlib.sha1(str(random.random()).encode()).digest() 30 b_digest = hashlib.sha1(b_nonce + created.encode() + api_key.encode()).digest() 31 c = 'UsernameToken Username="{0}", PasswordDigest="{1}", Nonce="{2}", Created="{3}"' 32 return c.format(username, base64.b64encode(b_digest).decode(), base64.b64encode(b_nonce).decode(), created) 33 34def create_data(): 35 files = open("./test.png", "rb").read() 36 uploadData = base64.b64encode(files) 37 template = """ 38 <entry xmlns="http://purl.org/atom/ns#"> 39 <title>Sample</title> 40 <content mode="base64" type="image/png">"""+str(uploadData)+"""</content> 41 </entry> 42 """ 43 44 data = base64.b64decode(template) 45 return data 46 47def post_hatena(data): 48 headers = {'X-WSSE': wsse(username, api_key)} 49 url = 'http://f.hatena.ne.jp/atom/post/' 50 r = requests.post(url, data=data, headers=headers) 51 52 if r.status_code != 201: 53 sys.stderr.write('Error!\n' + 'status_code: ' + str(r.status_code) + '\n' + 'message: ' + r.text) 54 55if __name__ == '__main__': 56 main()
試したこと
HTTPやWSSE、requestsモジュール等に関する知識がほぼ無く、何が原因でステータスコード500エラーが出ているのかがあまりよくわかっていません。
はてなサービスにおけるWSSE認証(http://developer.hatena.ne.jp/ja/documents/auth/apis/wsse)
を見た限りでは、認証の仕方に問題はないように思えます。
おそらくcreate_data()関数内のエンコードの仕方に問題があるのではと思っているのですが、いまいち何が間違っているのかよくわかりません。
補足情報(FW/ツールのバージョンなど)
Raspberry Pi3 B+ (Raspbian)
Python 3.6.6
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/13 04:24