自分でも作ってみた
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()