1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Python]定期的にRSSの更新を検知し、Gmailメール通知+CSV保存する方法 メモ

Posted at
  • 定期的にRSSをパースし、更新があれば、その内容をGmail通知とCSV保存する方法についてメモする※N番煎じ記事
  • 先日試した定期処理を学習目的で拡張した。
  • 利用ライブラリ
    • 定期実行:schedule
    • メール送信:smtplib
    • RSSパース:feedparser

コード

  • run.py

    import csv
    from schedule import every, repeat, run_pending
    import time
    import feedparser
    import datetime as dt
    from email.mime.text import MIMEText
    from email.utils import formatdate
    import smtplib
    import pytz
    
    # RSS URL
    RSS_URL = "RSS_URL"
    # メール送信元
    FROM_ADDR = "FROM_ADDRESS"
    # メール送信先
    TO_ADDR = "TO_ADDRESS"
    # Gmailアドレス
    USERNAME = "YOUR_GMAIL_ADDRESS"
    # Googleアプリパスワードを指定
    # https://support.google.com/accounts/answer/185833?hl=ja
    PASSWORD = "YOUR_APP_PASSWORD"
    
    # メッセージ生成
    def create_message(from_addr, to_addr, subject, updated_entries):
        # メール本文
        message_body = "Updated NEWS:\n"
        for entry in updated_entries:
            joined_entry = " ".join(entry)+"\n"
            message_body += joined_entry
        msg = MIMEText(message_body)
        # その他
        msg['Subject'] = subject
        msg['From'] = from_addr
        msg['To'] = to_addr
        msg['Date'] = formatdate()
        return msg
    
    # Gメール通知
    def send_mail(body_msg):
        smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
        smtpobj.starttls()
        # Gmailログイン
        smtpobj.login(USERNAME, PASSWORD)
        # メール通知
        smtpobj.send_message(body_msg)
        smtpobj.close()
    
    # CSVファイル書き込み
    def write_csv(updated_entries):
        with open("updated_entries.csv", "a", newline='', encoding='utf_8') as f:
            writer = csv.writer(f)
            for updated_entry in updated_entries:
                print(updated_entry)
                writer.writerow(updated_entry)
    
    # 主要処理
    # RSS読み込み → 更新検知 → CSV保存+メール通知
    @ repeat(every(6).hours)
    def job():
        updated_entries = []
        d = feedparser.parse(RSS_URL)
        jst = pytz.timezone('Asia/Tokyo')
        # 各エントリーの確認
        for entry in d.entries:
            # 現在日時
            now = dt.datetime.now(tz=jst)
            # 更新日時
            entry_time = dt.datetime.strptime(
                entry.updated, '%Y-%m-%dT%H:%M:%S.%fZ')
            # 前回確認日時
            last_checked = now - dt.timedelta(hours=6)
            # 更新日比較( 前回確認日時 <= 更新日時 < 現在日時 )
            if last_checked <= jst.localize(entry_time) < now:
                updated_entries.append(
                    [entry.title, entry.link, str(jst.localize(entry_time))])
        # 更新が検知された場合...
        if len(updated_entries) > 0:
            print("Updated Entries")
            # CSV書き込み
            write_csv(updated_entries)
            # 通知内容生成
            msg = create_message(FROM_ADDR, TO_ADDR,
                                 "Updated Entries Notification", updated_entries)
            # 通知
            send_mail(msg)
    
    
    # 定期実行
    while True:
        run_pending()
        time.sleep(1)
    
    

動作確認

  • Yahoo News RSSで動作確認を行った。

  • 実行

    python run.py
    Updated Entries
    ['東京五輪きょう開幕 夜に開会式', 'https://news.yahoo.co.jp/pickup/6399458?source=rss', '2021-07-22 22:35:48+09:00']
    ['名誉最高顧問に森氏 組織委検討', 'https://news.yahoo.co.jp/pickup/6399463?source=rss', '2021-07-22 23:16:02+09:00']
    ['五輪雰囲気ない 冷めた街の声も', 'https://news.yahoo.co.jp/pickup/6399466?source=rss', '2021-07-22 23:42:40+09:00']
    ['1歳が熱中症で死亡か 母を逮捕', 'https://news.yahoo.co.jp/pickup/6399460?source=rss', '2021-07-22 22:31:03+09:00']
    ['開会式プログラム発売中止 角川', 'https://news.yahoo.co.jp/pickup/6399461?source=rss', '2021-07-22 22:51:59+09:00']
    ['ギニアが一転、東京五輪参加へ', 'https://news.yahoo.co.jp/pickup/6399459?source=rss', '2021-07-22 22:28:45+09:00']
    ['開会式に海老蔵 MISIAは君が代', 'https://news.yahoo.co.jp/pickup/6399462?source=rss', '2021-07-22 22:52:53+09:00']
    ...
    
  • メール通知内容(Gmail本文)

    Updated Entries:
    東京五輪きょう開幕 夜に開会式 https://news.yahoo.co.jp/pickup/6399458?source=rss 2021-07-22 22:35:48+09:00
    名誉最高顧問に森氏 組織委検討 https://news.yahoo.co.jp/pickup/6399463?source=rss 2021-07-22 23:16:02+09:00
    五輪雰囲気ない 冷めた街の声も https://news.yahoo.co.jp/pickup/6399466?source=rss 2021-07-22 23:42:40+09:00
    ...
    
  • CSV保存結果(updated_entries.csv)

    東京五輪きょう開幕 夜に開会式,https://news.yahoo.co.jp/pickup/6399458?source=rss,2021-07-22 22:35:48+09:00
    名誉最高顧問に森氏 組織委検討,https://news.yahoo.co.jp/pickup/6399463?source=rss,2021-07-22 23:16:02+09:00
    五輪雰囲気ない 冷めた街の声も,https://news.yahoo.co.jp/pickup/6399466?source=rss,2021-07-22 23:42:40+09:00
    ...
    

参考情報

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?