typememo.jp

パレオチャンネルブロマガ過去記事全集の作り方

2020.10.12

#life#paleo#python#gmail

Contents


はじめに

先日 パレオチャンネルブロマガ過去記事全集 という記事を投稿しました. その記事の制作過程を紹介したいと思います.

パレオチャンネルブロマガ過去記事全集 を書く時に Gmail API を使いました. Gmail API を叩く時に使った言語は python です. Gmail API の基本的な使い方や gmail 自作ライブラリの使い方は #gmail に譲るとして,メインの処理に絞って紹介したいと思います.

それでは参りましょう!

実装方針

実装は次の要求を満たすようにしました.

実装方法

実装方針が決まったので具体的に実装していきました.

ソースコード全文をご覧になりたい方は次の3ファイルを読んでください.

以下では,次の3つの処理に絞って説明します.

  • 送信者が 鈴木祐 のメールを取得する処理
  • メール本文のデコード処理
  • ブロマガへのリンクの挿入処理

特定の送信者からのメールを取得する方法

特定の送信者からのメールだけに絞るにはクエリーに from:NAME を指定してあげれば良いです. (Gmail で使用できる検索演算子)

今回はパレオな兄貴こと 鈴木祐 さんが送信者のメールだけフィルタリングしたいので次のように書けば良いです.

# Get messages list
msgs = gmail.get_messages(service, userid="me", query="from:鈴木祐")

メール本文のデコード処理

Gmail API で取得したメール本文をデコード処理する方法 – Python 編 をお読みください.

本記事の一部分として扱うにはボリュームがあるので分離させました.

ブロマガへのリンク追加処理

ブロマガへのリンクの追加方法は原始的でして パレオチャンネルブロマガ過去記事全集 (2019年2月~)manuscript.md 内にブロマガの URL が無ければ ## ブロマガ全集 ブロックにリンクを追加するようにしました.

まぁ,こんな実装ですがきちんと動いているので今のところ満足ですね.

D-Lab にブロマガ機能を実装する予定とのことで,心待ちにしています. パレオチャンネルブロマガ過去記事全集 (2019年2月~) には関連する記事を集めたりとか記事検索かけたりする機能はないので. チーム DaiGo の活動を期待しています!

def main():
...
# Add blogpost link
for msg in reversed(msgs):
msg_ = gmail.get_message(service, msg)
blogpost_subject = get_blogpost_subject(msg_)
blogpost_url = get_blogpost_url(msg_)
if not is_included(manuscript_file, blogpost_url):
add_blogpost(manuscript_file, blogpost_subject, blogpost_url)
print("End of the script.")
def add_blogpost(manuscript, subject, url):
"""Add blogpost to manuscript"""
line_number = 0
with open(manuscript, "r") as file:
lines = file.readlines()
for line in lines:
if ("## ブロマガ全集" in line):
lines.insert(line_number + 2, f"- [{subject}]({url})\n")
with open(manuscript, "w") as file:
file.writelines(lines)
print("Add:", subject)
return 0
line_number += 1

おわりに

パレオチャンネルブロマガ過去記事全集 (2019年2月~) の作り方の紹介でした.

へっぽこな実装でも公開していく過程で自分自身からフィードバックをもらえるので記事にしてみました.

たぶんほとんどの人がこの記事は読まないでしょう. もしもこの記事をここまで読んでくれた方がいたら,その人とは友達になれる気がします.笑

最後までお読みいただきありがとうございました.

お手紙 お待ちしております!


山田 武尊 / 立教大学(理学) / ACCESS CO LTD