回答編集履歴
4
変更!
answer
CHANGED
@@ -43,20 +43,21 @@
|
|
43
43
|
api_key = '****accesstoken'
|
44
44
|
blogname = '****brogname' # ※不要でした。
|
45
45
|
|
46
|
+
|
46
|
-
def wsse(username: str, api_key: str):
|
47
|
+
def wsse(username: str, api_key: str) ->str:
|
47
|
-
created = now.isoformat() + "Z"
|
48
|
+
created = datetime.now().isoformat() + "Z"
|
48
49
|
b_nonce = sha1(str(random.random()).encode()).digest()
|
49
50
|
b_digest = sha1(b_nonce + created.encode() + api_key.encode()).digest()
|
50
51
|
return f'UsernameToken Username="{username}", PasswordDigest="{b64encode(b_digest).decode()}", Nonce="{b64encode(b_nonce).decode()}", Created="{created}"'
|
51
52
|
|
52
53
|
|
53
|
-
def create_data():
|
54
|
+
def create_data(file_name: str='./test.png') ->str:
|
54
|
-
uploadData = b64encode(Path(
|
55
|
+
uploadData = b64encode(Path(file_name).read_bytes())
|
55
|
-
return """
|
56
|
+
return """
|
56
|
-
<entry xmlns="http://purl.org/atom/ns#">
|
57
|
+
<entry xmlns="http://purl.org/atom/ns#">
|
57
|
-
<title>Sample</title>
|
58
|
+
<title>Sample</title>
|
58
|
-
<content mode="base64" type="image/png">""" + uploadData.decode() + """</content>
|
59
|
+
<content mode="base64" type="image/png">""" + uploadData.decode() + """</content>
|
59
|
-
</entry>
|
60
|
+
</entry>
|
60
61
|
"""
|
61
62
|
|
62
63
|
|
3
decodeも追加
answer
CHANGED
@@ -14,4 +14,71 @@
|
|
14
14
|
|
15
15
|
`base64.b64encode(files)`エンコードした後にxml全体を`base64.b64decode(template)`でデコードする必要はないような。
|
16
16
|
|
17
|
-
発行しているリクエストはHTMLプロキシソフトで確認してみてくださいな。
|
17
|
+
発行しているリクエストはHTMLプロキシソフトで確認してみてくださいな。
|
18
|
+
|
19
|
+
---
|
20
|
+
試しにアップロードしてみた所、以下の箇所も修正する必要がありました。
|
21
|
+
```diff
|
22
|
+
-str(uploadData)
|
23
|
+
+uploadData.decode()
|
24
|
+
```
|
25
|
+
|
26
|
+
書き換えたサンプルコードです、ご参考まで。
|
27
|
+
```Python
|
28
|
+
# -*- coding: utf-8 -*-
|
29
|
+
from base64 import b64encode
|
30
|
+
from datetime import datetime
|
31
|
+
from hashlib import sha1
|
32
|
+
import random
|
33
|
+
import requests
|
34
|
+
import sys
|
35
|
+
from pathlib import Path
|
36
|
+
|
37
|
+
now = datetime.now()
|
38
|
+
dtime = str(now.year)+"""-"""+str(now.month)+"""-"""+str(now.day)+"""T"""+str(now.hour)+""":"""+str(now.minute)+""":"""+str(now.second)
|
39
|
+
print(dtime)
|
40
|
+
|
41
|
+
|
42
|
+
username = '****user'
|
43
|
+
api_key = '****accesstoken'
|
44
|
+
blogname = '****brogname' # ※不要でした。
|
45
|
+
|
46
|
+
def wsse(username: str, api_key: str):
|
47
|
+
created = now.isoformat() + "Z"
|
48
|
+
b_nonce = sha1(str(random.random()).encode()).digest()
|
49
|
+
b_digest = sha1(b_nonce + created.encode() + api_key.encode()).digest()
|
50
|
+
return f'UsernameToken Username="{username}", PasswordDigest="{b64encode(b_digest).decode()}", Nonce="{b64encode(b_nonce).decode()}", Created="{created}"'
|
51
|
+
|
52
|
+
|
53
|
+
def create_data():
|
54
|
+
uploadData = b64encode(Path("./test.png").read_bytes())
|
55
|
+
return """
|
56
|
+
<entry xmlns="http://purl.org/atom/ns#">
|
57
|
+
<title>Sample</title>
|
58
|
+
<content mode="base64" type="image/png">""" + uploadData.decode() + """</content>
|
59
|
+
</entry>
|
60
|
+
"""
|
61
|
+
|
62
|
+
|
63
|
+
def post_hatena(data):
|
64
|
+
headers = {'X-WSSE': wsse(username, api_key)}
|
65
|
+
url = 'http://f.hatena.ne.jp/atom/post/'
|
66
|
+
r = requests.post(url, data=data, headers=headers)
|
67
|
+
try:
|
68
|
+
r.raise_for_status()
|
69
|
+
except:
|
70
|
+
sys.stderr.write(f'Error!\nstatus_code: {r.status_code}\nmessage: {r.text}')
|
71
|
+
|
72
|
+
|
73
|
+
def main():
|
74
|
+
data = create_data()
|
75
|
+
post_hatena(data)
|
76
|
+
|
77
|
+
|
78
|
+
if __name__ == '__main__':
|
79
|
+
main()
|
80
|
+
|
81
|
+
```
|
82
|
+
■参考情報
|
83
|
+
- [Path#read_bytes](https://docs.python.jp/3/library/pathlib.html#pathlib.Path.read_bytes)
|
84
|
+
- [Pythonのf文字列(フォーマット済み文字列リテラル)の使い方](https://note.nkmk.me/python-f-strings/)
|
2
送信データはhtmlではなくxmlなので表現を修正
answer
CHANGED
@@ -12,6 +12,6 @@
|
|
12
12
|
return data
|
13
13
|
```
|
14
14
|
|
15
|
-
`base64.b64encode(files)`エンコードした後に
|
15
|
+
`base64.b64encode(files)`エンコードした後にxml全体を`base64.b64decode(template)`でデコードする必要はないような。
|
16
16
|
|
17
17
|
発行しているリクエストはHTMLプロキシソフトで確認してみてくださいな。
|
1
追記
answer
CHANGED
@@ -12,4 +12,6 @@
|
|
12
12
|
return data
|
13
13
|
```
|
14
14
|
|
15
|
-
base64.b64decode(template)
|
15
|
+
`base64.b64encode(files)`エンコードした後にhtml全体を`base64.b64decode(template)`でデコードする必要はないような。
|
16
|
+
|
17
|
+
発行しているリクエストはHTMLプロキシソフトで確認してみてくださいな。
|