
つぶやきも同期させてみた話。
たまには、少しだけ技術的な記事を書きます。
勉強がてら、あまり業務で触ったことがない Python というプログラミング言語を使って、簡単なスクリプトを書いています。
以前、いくつか記事にもしたのですが、そのスクリプトの中で、
note に投稿した記事をはてなブログに同期する
note の新着記事を Twitter で宣伝する
Twitter でその日のできごとなどをつぶやく
といったことをしています。同期タイミングは定期実行ではなくて、私の気が向いたときに手動実行したり、私用PC立ち上げ時とかに自動実行するよう仕掛けています。
※詳しくはこちら。
https://note.com/furokun/m/md1994df308b3
で、せっかくなので、note にある「つぶやき」機能、こちらも Twitter に同期するようにしてみました。
最初にコードを載せますと、ざっくりこんな感じにしました。
def get_note_entry(n_id):
#""""""""""""""""""""""""""""""""""""""
#""" note から記事情報を取得 """
#""" <戻り値> """
#""" [0] note_type:タイプ"""
#""" [1] title:タイトル"""
#""" [2] key:記事ID"""
#""" [3] body:本文"""
#""" [4] uri:記事リンクURL"""
#""" [5] publish:投稿日時"""
#""" [6] tags:タグ"""
#""""""""""""""""""""""""""""""""""""""
res=[]
s = req.Session()
# 記事一覧(最大251記事。1ページあたり6記事)
for page in range(1,43):
n_list_url=f"https://note.com/api/v2/creators/{n_id}/contents?kind=note&page={str(page)}"
# API
res_dict=s.get(n_list_url).json()
for i in range(len(res_dict["data"]["contents"])):
l = res_dict["data"]["contents"][i]
note_type = l["type"] # タイプ
title = "つぶやき" if note_type == 'TalkNote' else l["name"] # タイトル
key = l["key"] # key
body = get_note_entry_body(key) # 本文(# 上記APIでは記事本文全てが取得できなかったのでKeyをもとに別のAPIを呼ぶ)
uri = l["noteUrl"] # URL
publish = l["publishAt"] # 投稿日時
tags = [ i["hashtag"]["name"] for i in l["hashtags"] ] # タグ一覧
res.append([note_type,title,key,body,uri,publish,tags])
return res
ポイントは、note API を叩いた際に、返ってくるレスポンスの中に「"type"」というプロパティがあって、そこで、「記事」なのか「つぶやき」なのかが分かるっぽいです。
実際に、デバッグした中身を見てみますと、こんなふうになっていました。

"type"プロパティを突っ込みました
ちょっと分かりにくいですけど、
「TalkNote」なら「つぶやき」
「TextNote」なら「記事」
のようです。
コードの中では、「つぶやき」の場合の "name"プロパティ(記事で言うところのタイトル)は空っぽになっているようで、そこに便宜的に「つぶやき」という文字列をセットしています。
この部分です。
title = "つぶやき" if note_type == 'TalkNote' else l["name"]
これは、スクリプトの中で、ローカルDBにも同期していて、そこの「タイトル」カラムを Not Null で作ってしまったので。なので本当に便宜的です。深い意味はありません・・。
あとは、上記のコードと同じように「TalkNote」だったら、はてなブログに同期しないとか、つぶやき内容をそのままツイートする、といった条件分岐を他の処理にも加えてあげて終了です。
反省点と言いますか改善点としては、res 配列の先頭要素に今回の「"type"」を追加してしまったんですよね。そのため、後続の処理では、配列の番号を一つ一つ手直していかなければならなかったので若干面倒でした。その辺りは、もう少し工夫して改修しても良かったのかなと。
ちなみに、つぶやき Twitter 同期はこんな感じになりました。

リアルタイムのつぶやきになりませんが。
といった感じで、簡単ではありますが、久々の技術(っぽい)記事でした。
Twitter に関しては雑感を含めて一度記事にしたい考えがありますので、今回はこのくらいでやめておきます。おしまい。