AIニュースソース

zenn.dev

自分でも作ってみた

import tkinter as tk
from tkinter.scrolledtext import ScrolledText
import threading
import feedparser
from openai import OpenAI

# APIキーの設定(ご自身のキーに変更してください)
client = OpenAI(api_key="APIキー")

# 集約対象のRSSフィード一覧
rss_feeds = [
    {"name": "THE DECODER", "url": "https://the-decoder.com/feed/"},
    {"name": "The Batch", "url": "https://www.deeplearning.ai/the-batch/feed/"},
    {"name": "Hugging Face Blog", "url": "https://huggingface.co/blog/feed.xml"},
    {"name": "Google Research Blog", "url": "https://research.google/blog/rss/"},
    {"name": "Apple Machine Learning Research Blog", "url": "https://machinelearning.apple.com/rss.xml"},
    {"name": "QwenLM Blogs", "url": "https://qwenlm.github.io/blog/index.xml"},
    {"name": "DeepMind Blog", "url": "https://deepmind.google/blog/rss.xml"},
    {"name": "PyTorch Blog", "url": "https://pytorch.org/feed.xml"},
    {"name": "NVIDIA Developer Blog", "url": "https://developer.nvidia.com/blog/feed"},
    {"name": "Salesforce AI Research Blog", "url": "https://www.salesforce.com/blog/category/ai-research/feed/"},
    {"name": "OpenAI News", "url": "https://openai.com/news/rss.xml"},
    {"name": "Microsoft AI Blogs", "url": "https://www.microsoft.com/en-us/ai/blog/feed/"}
]

def fetch_feed_entries(feed_url, max_entries=5):
    """
    指定されたRSSフィードから最新の記事を取得
    """
    feed = feedparser.parse(feed_url)
    return feed.entries[:max_entries]

def aggregate_feeds(feeds):
    """
    複数のRSSフィードから記事タイトルとリンクを集約して1つのテキストにまとめる
    """
    aggregated_text = ""
    for feed in feeds:
        aggregated_text += f"=== {feed['name']} ===\n"
        entries = fetch_feed_entries(feed["url"])
        for entry in entries:
            title = entry.title
            link = entry.link
            aggregated_text += f"- {title} ({link})\n"
        aggregated_text += "\n"
    return aggregated_text

def translate_to_japanese(text):
    """
    ChatGPT API を利用して英語のテキストを日本語に翻訳する
    """
    messages = [
        {"role": "system", "content": "You are a helpful translator. Translate the following text to Japanese."},
        {"role": "user", "content": text}
    ]
    try:
        response = client.chat.completions.create(
            model="gpt-4o-mini",  # 必要に応じてモデル名を変更してください
            messages=messages,
            max_tokens=1500,
            temperature=0.5,
            n=1
        )
        translated_text = response.choices[0].message.content.strip()
    except Exception as e:
        translated_text = "エラーが発生しました: " + str(e)
    return translated_text

def query_and_translate():
    # RSSフィードを集約して英語のテキストを作成
    aggregated_text = aggregate_feeds(rss_feeds)
    # 入力欄に集約結果を表示(デバッグ用)
    input_text.delete("1.0", tk.END)
    input_text.insert(tk.END, aggregated_text)
    # ChatGPT APIで日本語に翻訳
    translated_text = translate_to_japanese(aggregated_text)
    update_output(translated_text)

def query_and_translate_thread():
    # API呼び出しを別スレッドで実行
    threading.Thread(target=query_and_translate).start()

def update_output(text):
    # 出力欄を更新
    output_text.delete("1.0", tk.END)
    output_text.insert(tk.END, text)

# Tkinterウィンドウの設定
root = tk.Tk()
root.title("AI RSS 翻訳ツール")
frame = tk.Frame(root, padx=10, pady=10)
frame.pack(fill=tk.BOTH, expand=True)

# 入力欄ウィジェット(集約されたRSSフィードの英語テキスト)
input_label = tk.Label(frame, text="集約されたRSSフィード (英語)")
input_label.pack(anchor="w")
input_text = ScrolledText(frame, wrap=tk.WORD, width=80, height=15)
input_text.pack(pady=(0, 10))

# 翻訳開始ボタン
start_button = tk.Button(frame, text="翻訳開始", command=query_and_translate_thread)
start_button.pack(pady=(0, 10))

# 出力欄ウィジェット(日本語翻訳結果)
output_label = tk.Label(frame, text="翻訳結果 (日本語)")
output_label.pack(anchor="w")
output_text = ScrolledText(frame, wrap=tk.WORD, width=80, height=15)
output_text.pack()

# Tkinterのメインループ開始
root.mainloop()