プログラミングで出来ること



私たちの班は、「10年前の今日、どんなニュースがあったのかをメールで送信してくれる」コードを作ることをテーマにした。
   

ソースコード


  1. import requests
  2. import feedparser
  3. from datetime import datetime
  4. from dateutil.relativedelta import relativedelta
  5. import win32com.client
  6. # RSSフィードのURL(Yahoo!ニュース トップ)
  7. RSS_URL = "https://news.yahoo.co.jp/rss/topics/top-picks.xml"
  8. # RSSフィードからニュースを取得
  9. def get_japanese_news():
  10.     try:
  11.         feed = feedparser.parse(RSS_URL)
  12.         if feed.entries:
  13.             news_list = [
  14.                 f"{entry.published}: {entry.title}\n{entry.link}"
  15.                 for entry in feed.entries[:5] # 上位5件のニュースを取得
  16.             ]
  17.             return "\n\n".join(news_list)
  18.         else:
  19.             return "ニュースを取得できませんでした。"
  20.     except Exception as e:
  21.         print(f"ニュース取得エラー: {e}")
  22.         return "ニュース取得中にエラーが発生しました。"
  23. # Wayback MachineのAPIで過去のURLを取得
  24. def get_wayback_url(base_url, target_date):
  25.     wayback_api = "http://archive.org/wayback/available"
  26.     params = {"url": base_url, "timestamp": target_date}
  27.     try:
  28.         response = requests.get(wayback_api, params=params)
  29.         if response.status_code == 200:
  30.             data = response.json()
  31.             snapshots = data.get("archived_snapshots", {})
  32.             closest = snapshots.get("closest", {})
  33.             if closest:
  34.                 return closest["url"]
  35.             else:
  36.                 return None
  37.         else:
  38.             print(f"Wayback Machine APIエラー: ステータスコード {response.status_code}")
  39.             return None
  40.     except Exception as e:
  41.         print(f"Wayback Machineリクエストエラー: {e}")
  42.         return None
  43. # Wayback MachineのURLからニュース情報をスクレイプ
  44. def scrape_news_from_wayback(wayback_url):
  45.     # 実際にニュースをスクレイプする処理をここに追加
  46.     # 現時点ではサンプルとしてダミーのニュースを返す
  47.     return f"過去のニュース({wayback_url})を取得しました。"
  48. # Outlookを使用したメール送信関数
  49. def send_outlook_email(subject, body, to_email):
  50.     try:
  51.         outlook = win32com.client.Dispatch("Outlook.Application")
  52.         mail = outlook.CreateItem(0) # 0はメールアイテムを示す
  53.         mail.To = to_email
  54.         mail.Subject = subject
  55.         mail.Body = body
  56.         mail.Send()
  57.         print("Outlook経由でメールが送信されました。")
  58.     except Exception as e:
  59.         print(f"Outlookメール送信エラー: {e}")
  60. # メイン処理
  61. def main():
  62.     # 10年前の日付を正確に計算
  63.     ten_years_ago = datetime.now() - relativedelta(years=10)
  64.     today = ten_years_ago.strftime("%Y年%m月%d日")
  65.     
  66.     # Wayback Machineで10年前のアーカイブURLを取得
  67.     base_url = "https://news.yahoo.co.jp/topics"
  68.     target_date = ten_years_ago.strftime("%Y%m%d") # 10年前の日付をYYYYMMDD形式で取得
  69.     
  70.     # Wayback Machineから10年前のYahoo!ニュースのアーカイブURLを取得
  71.     wayback_url = get_wayback_url(base_url, target_date)
  72.     if wayback_url:
  73.         news = scrape_news_from_wayback(wayback_url)
  74.     else:
  75.         news = "10年前のアーカイブが見つかりませんでした。"
  76.     # メールの件名と本文を設定
  77.     subject = f"10年前の今日 ({today}) の日本のニュース"
  78.     body = f"10年前の{today}の最新日本ニュース:\n\n{news}"
  79.     # 送信先メールアドレスを指定
  80.     to_email = "r202401795pu@jindai.jp"
  81.     send_outlook_email(subject, body, to_email)
  82. if __name__ == "__main__":
  83.     main()

       >ソースコードのダウンロードはこちら
   

解説


   ChatGPTを参考にして作成した。メールの内容が英語で送られてきてしまったり、そもそも「ニュースを取得できませんでした」というメールしか送られてこなかったりしたので、
   何回も改善を重ねた。しかし、最終的には10年前のニュースのサイトに飛ぶことが出来ても、その詳細をクリックしてもエラーで見られない形となってしまった。私にはこれが限界…😭すみません💧