回答編集履歴
4
変更!
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(
|
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も追加
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なので表現を修正
test
CHANGED
@@ -26,7 +26,7 @@
|
|
26
26
|
|
27
27
|
|
28
28
|
|
29
|
-
`base64.b64encode(files)`エンコードした後に
|
29
|
+
`base64.b64encode(files)`エンコードした後にxml全体を`base64.b64decode(template)`でデコードする必要はないような。
|
30
30
|
|
31
31
|
|
32
32
|
|
1
追記
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プロキシソフトで確認してみてくださいな。
|