Slackの分報でブログを簡単に書きたかった【負けた】

トキワの森Advent Calenderの10日目です。(間が空いた場合も換算するんですかね?)

前回はピンチヒッターの脱脂綿さんの「12/5「「転職の思考法」 de ABD」参加してきました!」でした。 ABDという単語を初めて聞きましたが、面白そうですね。
全員で一冊ではなく、いくつかの論文を輪読した研究室時代を思い出しました。

さて、皆さんは分報をご存知でしょうか? かく言う私も最近知ったのですが、こちらが分報に関して書かれている記事で最初ですかね?
Slackで簡単に「日報」ならぬ「分報」をチームで実現する3ステップ〜Problemが10分で解決するチャットを作ろう

分報からブログにする思いつきに至ったのは、Everyone Outputer#1 「ぼくのわたしのセイチョウ・ジャーニー」での しんくうさん( @shinkuFencer )の発表でした。
『セイチョウのための一歩 ブログ習慣化のあゆみ』という内容で登壇してきました。

blogというかアウトプットができない自分にとって、Slackに投げておいて、勝手にブログの内容をまとめてくれれば楽だな、と思った次第です。

ただし、すでにタイトルでオチているのですが、途中でエラーにやられて完成できませんでした。

  • 目的
    • 何かを書くのにまだハードルを感じる自分が、簡単にブログを作る方法を見つける
  • 手段
    • 身近にあるSlackに書いた内容を、まとめて記事にしてブログの下書きを作る。 あとは公開をするだけ。

構成図としては、以下の予定です。
ブログとなると、パッと思いついたのがはてなブログだったというのが選択理由です。

構成図

パッと技術周りを調べて似たようなことをやっているのを見つけたのですが・・・ https://twitter.com/taskforce_Hisui/status/1064558999830327296

先にリポジトリだけ上げて、晒します。
https://github.com/TSLEFK/time4blog

github.com

aws CloudWatch eventで20時の日時バッチとしてセット。

Python3.6.6を使っています。
実行時間からその一日前までの指定したチャンネルの投稿を取得します。

https://github.com/TSLEFK/time4blog/blob/master/main.py#L37
37行目で取得内容は取れていたので、ここまではOKというのは確認できました。

f:id:satarn-sherlock:20181210205752p:plain

出力結果

E:\aws\Lambda\times4blog>python main.py
<https://taskforce-hisui.hateblo.jp/>
comp

Oauthでの認証のために、下記のページを参考にしました。
はてなのOAuth API用のアクセストークンを簡単に取得する [python]
こちらはpython2系だったので、3系に修正しています。
多くの修正は、response.split → response.decode().split でした。

ここからが問題でpythonはてなブログの記事を投稿するAtomPubで負けました。 https://github.com/TSLEFK/time4blog/blob/master/test2.py#L39

data = create_data("test title", "test Body")

data_escaped = escape(data)

resp = client.request(uri='https://blog.hatena.ne.jp/satarn-sherlock/taskforce-hisui.hateblo.jp/atom/entry',
                                method="POST", body=data_escaped)
print(resp)
  1. 「400 XML Parse Failed」 って何がだよ・・・
    エンジニアと名乗るからには、ブログの自動投稿くらい実装してるよな😇? escape処理が必要なのを知ったので、XMLエスケープしてみる
data_escaped = escape(data)
  1. 「a bytes-like object is required, not 'str'」 bytes型にしてるのに、strとしてエラーが出てる?

型確認をする

print(type(data))
data_escaped = escape(data)

結果

<class 'bytes'>
Traceback (most recent call last):
  File "test2.py", line 45, in <module>
    data_escaped = escape(data)
  File "C:\Users\TSLEFK\AppData\Local\Programs\Python\Python36\lib\xml\sax\saxutils.py", line 27, in escape
    data = data.replace("&", "&amp;")
TypeError: a bytes-like object is required, not 'str'

encode()でbyteにしているし、前の行でも型確認してるんだけど・・・? ここで時間切れでした。

まとめ

AtomPubに対してXMLを投げるところでのエラーで躓いてしまいました。 解決したらこの記事を修正するか、解決の流れのままの分報をまとめた記事をブログにアップする予定です。 結局、CloudWatchまで設定してLambdaで実行できなかった・・・ しかし、Slack APIを使ったコードは一通り触れたので、Slack関連の知識は得れましたかね。

追記。 ここでまとめて気が付きましたが、はてなブログが必須ということではないと気づいたので、他のサービスを使うのも一手かも・・・と。
Slackの別のチャンネルに下書きだけ送信するのもありでしたね。
MardownをAPIで投げるだけで記事にしてくれるようなブログサービスってないのかな・・・