回答編集履歴

4

変更!

2018/08/12 20:10

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -88,9 +88,11 @@
88
88
 
89
89
 
90
90
 
91
- def wsse(username: str, api_key: str):
92
91
 
92
+
93
+ def wsse(username: str, api_key: str) ->str:
94
+
93
- created = now.isoformat() + "Z"
95
+ created = datetime.now().isoformat() + "Z"
94
96
 
95
97
  b_nonce = sha1(str(random.random()).encode()).digest()
96
98
 
@@ -102,19 +104,19 @@
102
104
 
103
105
 
104
106
 
105
- def create_data():
107
+ def create_data(file_name: str='./test.png') ->str:
106
108
 
107
- uploadData = b64encode(Path("./test.png").read_bytes())
109
+ uploadData = b64encode(Path(file_name).read_bytes())
108
110
 
109
- return """
111
+ return """
110
112
 
111
- <entry xmlns="http://purl.org/atom/ns#">
113
+ <entry xmlns="http://purl.org/atom/ns#">
112
114
 
113
- <title>Sample</title>
115
+ <title>Sample</title>
114
116
 
115
- <content mode="base64" type="image/png">""" + uploadData.decode() + """</content>
117
+ <content mode="base64" type="image/png">""" + uploadData.decode() + """</content>
116
118
 
117
- </entry>
119
+ </entry>
118
120
 
119
121
  """
120
122
 

3

decodeも追加

2018/08/12 20:10

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -31,3 +31,137 @@
31
31
 
32
32
 
33
33
  発行しているリクエストはHTMLプロキシソフトで確認してみてくださいな。
34
+
35
+
36
+
37
+ ---
38
+
39
+ 試しにアップロードしてみた所、以下の箇所も修正する必要がありました。
40
+
41
+ ```diff
42
+
43
+ -str(uploadData)
44
+
45
+ +uploadData.decode()
46
+
47
+ ```
48
+
49
+
50
+
51
+ 書き換えたサンプルコードです、ご参考まで。
52
+
53
+ ```Python
54
+
55
+ # -*- coding: utf-8 -*-
56
+
57
+ from base64 import b64encode
58
+
59
+ from datetime import datetime
60
+
61
+ from hashlib import sha1
62
+
63
+ import random
64
+
65
+ import requests
66
+
67
+ import sys
68
+
69
+ from pathlib import Path
70
+
71
+
72
+
73
+ now = datetime.now()
74
+
75
+ dtime = str(now.year)+"""-"""+str(now.month)+"""-"""+str(now.day)+"""T"""+str(now.hour)+""":"""+str(now.minute)+""":"""+str(now.second)
76
+
77
+ print(dtime)
78
+
79
+
80
+
81
+
82
+
83
+ username = '****user'
84
+
85
+ api_key = '****accesstoken'
86
+
87
+ blogname = '****brogname' # ※不要でした。
88
+
89
+
90
+
91
+ def wsse(username: str, api_key: str):
92
+
93
+ created = now.isoformat() + "Z"
94
+
95
+ b_nonce = sha1(str(random.random()).encode()).digest()
96
+
97
+ b_digest = sha1(b_nonce + created.encode() + api_key.encode()).digest()
98
+
99
+ return f'UsernameToken Username="{username}", PasswordDigest="{b64encode(b_digest).decode()}", Nonce="{b64encode(b_nonce).decode()}", Created="{created}"'
100
+
101
+
102
+
103
+
104
+
105
+ def create_data():
106
+
107
+ uploadData = b64encode(Path("./test.png").read_bytes())
108
+
109
+ return """
110
+
111
+ <entry xmlns="http://purl.org/atom/ns#">
112
+
113
+ <title>Sample</title>
114
+
115
+ <content mode="base64" type="image/png">""" + uploadData.decode() + """</content>
116
+
117
+ </entry>
118
+
119
+ """
120
+
121
+
122
+
123
+
124
+
125
+ def post_hatena(data):
126
+
127
+ headers = {'X-WSSE': wsse(username, api_key)}
128
+
129
+ url = 'http://f.hatena.ne.jp/atom/post/'
130
+
131
+ r = requests.post(url, data=data, headers=headers)
132
+
133
+ try:
134
+
135
+ r.raise_for_status()
136
+
137
+ except:
138
+
139
+ sys.stderr.write(f'Error!\nstatus_code: {r.status_code}\nmessage: {r.text}')
140
+
141
+
142
+
143
+
144
+
145
+ def main():
146
+
147
+ data = create_data()
148
+
149
+ post_hatena(data)
150
+
151
+
152
+
153
+
154
+
155
+ if __name__ == '__main__':
156
+
157
+ main()
158
+
159
+
160
+
161
+ ```
162
+
163
+ ■参考情報
164
+
165
+ - [Path#read_bytes](https://docs.python.jp/3/library/pathlib.html#pathlib.Path.read_bytes)
166
+
167
+ - [Pythonのf文字列(フォーマット済み文字列リテラル)の使い方](https://note.nkmk.me/python-f-strings/)

2

送信データはhtmlではなくxmlなので表現を修正

2018/08/12 19:36

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
 
28
28
 
29
- `base64.b64encode(files)`エンコードした後にhtml全体を`base64.b64decode(template)`でデコードする必要はないような。
29
+ `base64.b64encode(files)`エンコードした後にxml全体を`base64.b64decode(template)`でデコードする必要はないような。
30
30
 
31
31
 
32
32
 

1

追記

2018/08/12 17:13

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -26,4 +26,8 @@
26
26
 
27
27
 
28
28
 
29
- base64.b64decode(template)を使って戻す必要はないような。
29
+ `base64.b64encode(files)`エンコードした後にhtml全体を`base64.b64decode(template)`でデコード必要はないような。
30
+
31
+
32
+
33
+ 発行しているリクエストはHTMLプロキシソフトで確認してみてくださいな。