teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

変更!

2018/08/12 20:10

投稿

umyu
umyu

スコア5846

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("./test.png").read_bytes())
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も追加

2018/08/12 20:10

投稿

umyu
umyu

スコア5846

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なので表現を修正

2018/08/12 19:36

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -12,6 +12,6 @@
12
12
  return data
13
13
  ```
14
14
 
15
- `base64.b64encode(files)`エンコードした後にhtml全体を`base64.b64decode(template)`でデコードする必要はないような。
15
+ `base64.b64encode(files)`エンコードした後にxml全体を`base64.b64decode(template)`でデコードする必要はないような。
16
16
 
17
17
  発行しているリクエストはHTMLプロキシソフトで確認してみてくださいな。

1

追記

2018/08/12 17:13

投稿

umyu
umyu

スコア5846

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プロキシソフトで確認してみてくださいな。