質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1648閲覧

はてなブログAPIとPython3を利用した、記事の投稿について

shut9

総合スコア14

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/08/14 12:12

編集2018/08/15 02:57

前提・実現したいこと

はてなブログAPIとPython3.6.6を利用して、記事を投稿しようとしています。
$ python sourcecode.py textfile.txt
というように、テキストファイルを引数として渡して実行するような形です。
いずれはこのプログラムに渡すテキストファイルをhtmlで記述し、
テキストファイルの本文に

<p><img class="hatena-fotolife" title="f:id:username:****:plain" src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/username/*****.png" alt="f:id:username:****:plain" /></p> (****.pngはあらかじめはてなフォトライフにアップロードしておいた写真) といった記述をして、写真を自動で投稿できるようにしようとしています。

発生している問題

記事の投稿自体は出来ているのですが、本文の改行や、記事の記法(x-markdown、html、x-hatena-syntax)が反映されていない現状です。

該当のソースコード

#!/home/pi/.pyenv/shims/python #coding=utf-8 import sys import datetime import random import hashlib import base64 import requests from chardet.universaldetector import UniversalDetector import datetime now = datetime.datetime.now() dtime = str(now.year)+"""-"""+str(now.month)+"""-"""+str(now.day)+"""T"""+str(now.hour)+""":"""+str(\ now.minute)+""":"""+str(now.second) print(dtime) # setting ----------------------------------------------------------- username = '*****username' api_key = '*****accesstoken' blogname = '*****brogname.hatenadiary.jp' draft = 'yes' # yes or no # main ----------------------------------------------------------- def main(): if len(sys.argv) != 2: sys.exit('Usage: %s file-name' % sys.argv[0]) file = sys.argv[1] charset = check_encoding(file) title, body = parse_text(file, charset) data = create_data(title, body) print(title) print(body) print(len(body)) post_hatena(data) def wsse(username, api_key): created = datetime.datetime.now().isoformat() + "Z" b_nonce = hashlib.sha1(str(random.random()).encode()).digest() b_digest = hashlib.sha1(b_nonce + created.encode() + api_key.encode()).digest() c = 'UsernameToken Username="{0}", PasswordDigest="{1}", Nonce="{2}", Created="{3}"' return c.format(username, base64.b64encode(b_digest).decode(), base64.b64encode(b_nonce).decode(\ ), created) def create_data(title,body): template = """<?xml version="1.0" encoding="utf-8"?> <entry xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app"> <title>{0}</title> <author><name>{1}</name></author> <content type="text/x-markdown"> {2} </content> <updated>{3}</updated> <category term="" /> <app:control> <app:draft>{4}</app:draft> </app:control> </entry> """ data = template.format(title, username, body, dtime, draft).encode() return data def parse_text(file, charset): with open(file, encoding=charset) as f: obj = f.readlines() title = "" body = "" for i, line in enumerate(obj): if i == 0: title = line else: body = body + line return title, body def check_encoding(file): detector = UniversalDetector() with open(file, mode='rb') as f: for binary in f: detector.feed(binary) if detector.done: break detector.close() charset = detector.result['encoding'] return charset def post_hatena(data): headers = {'X-WSSE': wsse(username, api_key)} url = 'http://blog.hatena.ne.jp/{0}/{1}/atom/entry'.format(username, blogname) r = requests.post(url, data=data, headers=headers) if r.status_code != 201: sys.stderr.write('Error!\n' + 'status_code: ' + str(r.status_code) + '\n' + 'message: ' + r.\ text) if __name__ == '__main__': main()

読み込むテキストファイル

ここにブログタイトルをいれる ** 文章開始 テスト文章 ### 見出し 本文... > 引用文章

試したこと

create_data関数の{2}にテキストファイルの内容を直で書いた場合も、同様の現象が起きています。
content type="text/x-markdown"を、
type="text/x-markdown": markdown記法モードで投稿した場合
type=text/html:見たまま/htmlモードで投稿した場合
text/x-hatena-syntax: はてな記法で投稿した場合
に変えても同様です。

補足情報(FW/ツールのバージョンなど)

Raspberry Pi3 B+ (Raspbian)
Python 3.6.6

参考

http://developer.hatena.ne.jp/ja/documents/blog/apis/atom
https://karaage.hatenadiary.jp/entry/2016/01/25/073000
https://tadaken3.hatenablog.jp/entry/post-hatena-blog

補足(umyu様)

教えていただいたサイトを元に、以下のように書き換えてみましたが、添付画像のように投稿されています。
(すみません、本サイトの表示の都合上、行頭に「.」を入れていますが、実際にはいれていません。)
ソースコードを以下に置きます。
https://www.dropbox.com/s/7sbnsw11imlxblh/source.py?dl=0

"""
template = """<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app">
<title>{0}</title>
<author><name>{1}</name></author>
<content type="text/x-markdown">
. # 見出し1 #################################
. ## 見出し2
. ### 見出し3
. #### 見出し4
. 段落途中の改行は →
. ← 無視される。
. 行末に半角スペースを2個以上入れると →
. ← 改行になる。
. 強調記法、その1
. 強調記法、その2
. 強調記法、その3
</content>
<updated>{3}</updated>
<category term="" />
app:control
app:draft{4}</app:draft>
</app:control>
</entry>
"""
"""
見たまま

HTML

プレビュー

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

入力ファイルがMarkdown記法として正しくないのでは。

はてなで使えるMarkdown記法まとめ
段落内で改行したい場合、行末に2つ以上の半角スペースをつける

diff

1-** 文章開始 2+## 文章開始

手元の環境で上記2点を修正してブログ投稿のテストをしてみましたが、表示されました。
あと以下は.jpではなく.comでした。

Python

1blogname = '*****brogname.hatenadiary.jp'

投稿2018/08/14 19:26

umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shut9

2018/08/15 02:56

ご回答ありがとうございます。教えていただいたサイトの記法を元に書き換えて見ましたが(本文の補足をご参照ください)、うまく投稿できませんでした。ソースコードをアップしたDropboxのURLを補足に書いておりますので、何かお気づきの点がございましたら、ご教示いただけないでしょうか。宜しくお願いいたします。
umyu

2018/08/15 03:04

@shut9さんへ 添付画像の編集モードが「みたままモード」です。Markdownモードに変更して再度確認してみてくださいな。 設定|基本設定|編集モード|Markdownモード
umyu

2018/08/15 03:21

@shut9さんへ コードみました。うーん、特に同じだと思うので。 Raspberry PI環境がないので、ぐぐり情報だけですが。nc -l -v 1234としてみて、サーバーを建ててPythonスクリプトから送られてくる、post情報を確認してみては。
shut9

2018/08/15 04:43

コメントありがとうございます。 > Markdownモードに変更して再度確認してみてくださいな。 どうやら、これが問題だったようです。編集モードの設定をMarkdownモードにした状態で記事を投稿すると、きちんと記法が反映されました。 大変助かりました。umyu様、毎度ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問