消化器内科takoitaのメモ

消化器内科医takoitaのメモ

消化器内科医のメモ用ブログ 自分用のまとめなので記事が重複している場合があります。なにかご指摘や追加の情報あればご連絡ください。

Google APPs Scriptを使用して、Feedlyの新着論文をchatGPTで翻訳し毎朝メールしてくれる

概要:

chatGPTとやり取りを続けてコードを書いてもらいました。自分はコードとか一切わかりません。

24時間以内に新規に取得したfeedlyの新着RSSをタイトルと見出しのみchatGPTで翻訳に決まった時間に毎日自分にメールしてくれます。

どういうRSSを取得するかにもよりますが、ジャーナルの記事が英語で全く読む気がしないので、タイトルと見出しだけでも日本語にしたら意欲がわくかと書きました。

 

手順:

Google App Script

まずスクリプト.gsに下記追加する。

 

const FEEDLY_ACCESS_TOKEN = '***FEEDLY ACSESS TOKEN を書いて下さい***';
const FEEDLY_STREAM_ID = "***STREAM_ID を書いて下さい***";
const OPENAI_API_KEY = PropertiesService.getScriptProperties().getProperty("OPENAI_API_KEY");
const EMAIL_RECIPIENT = "********@gmail.com";
const EMAIL_SUBJECT = "新着論文のお知らせ";
const EMAIL_SENDER = "論文要約bot";

 

function main() {
  if (!OPENAI_API_KEY) {
    console.log("ERROR: OPEN_API_KEY を指定してください");
    return;
  }

 

  const feedlyContents = getFeedlyContents();
  const translations = feedlyContents.map(content => {
    const input = content.title + "\n" + content.description;
    return callChatGPTForTranslation(input, content.link);
  });

 

  const emailBody = formatEmailBody(translations);
  sendEmail(emailBody);
}

 

function getFeedlyContents() {
  const currentTime = new Date().getTime();
  const twentyFourHoursAgo = currentTime - (24 * 60 * 60 * 1000);

 

  const url = `https://cloud.feedly.com/v3/streams/contents?streamId=${FEEDLY_STREAM_ID}&count=10&newerThan=${twentyFourHoursAgo}`;
  const headers = {
    'Authorization': `Bearer ${FEEDLY_ACCESS_TOKEN}`,
    'Content-Type': 'application/json'
  };
  const options = {
    'method': 'get',
    'headers': headers
  };
  const responseText = UrlFetchApp.fetch(url, options).getContentText();
  const response = JSON.parse(responseText);

 

  return response.items.map(item => ({
    title: item.title,
    description: item.summary?.content || item.content?.content,
    link: item.canonicalUrl || item.originId
  }));
}

 

function callChatGPTForTranslation(input, link) {
  const promptForTranslation = "あなたは熟練の消化器内科医です。内容は医学、特に消化器内科に関する最新の医学論文です。内容を把握した上で、①タイトル(英語の原題と翻訳後の日本語タイトルいずれも記載してください)、②本文を日本語で箇条書き形式で翻訳、を行ってください。:\n" + input;
  const messages = [
    {
      role: "user",
      content: promptForTranslation,
    }
  ];

 

  const response = callChatGPT(messages);
  return response[0] + "\n\n[元の記事を読む](" + link + ")";
}

 

function callChatGPT(messages) {
  const options = {
    "method": "post",
    "headers": {
      "Authorization": `Bearer ${OPENAI_API_KEY}`,
      "Content-Type": "application/json",
    },
    "payload": JSON.stringify({
      model: "gpt-3.5-turbo",
      messages,
    }),
  };

 

  const responseText = UrlFetchApp.fetch(url, options).getContentText();
  const response = JSON.parse(responseText);
  return response.choices.map*1;
}

 

function formatEmailBody(translations) {
  const header = "新着論文のお知らせ\n\n";
  const footer = "\n\nこれらの翻訳は自動生成されたものです。詳細は元の論文をご参照ください。";
  const separator = "\n\n-----------------------\n\n";

 

  const body = translations.join(separator);
  return header + body + footer;
}

 

function sendEmail(body) {
  const options = { name: EMAIL_SENDER };
  GmailApp.sendEmail(EMAIL_RECIPIENT, EMAIL_SUBJECT, body, options);
}

)

 

②OPEN API KEYを取得する。

GASのプロジェクトの設定の下にあるスクリプトプロパティ内にプロパティOPEN_API_KEYと値(個人によって異なります)を入れて下さい。

 

FEEDLY ACCESS TOKEN、FEEDLY_STREAM_IDを取得する。

やり方は調べてみて下さい。

Google APPS ScriptでサービスからGmail APIドキュメントのサービスを追加する。

⑤コード4行目の下記にメールアドレスを記載する。

const EMAIL_RECIPIENT = "********@gmail.com";

Google APPS Scriptのトリガー追加

GASのトリガー項目からトリガー追加を選択。

上記で決定するとこの画面が出るのでAdvancedを選択する。

 

Go to ******(unsafe)を押せば確定されます。

 

感想:

改良の余地は非常に多いと思います。

deeplの翻訳に投げた方が良い日本語訳になると考えましたが、色々他のコードも試す内にchat GPTで翻訳していました。そのため、精度はやや低いです。また、chat GPTのAPIを使用する事でわずかですかトークン使用量が発生します。gpt4エンジンを使用すればもう少し賢いかもしれませんが金額があがるためturbo3.5使用しています。

Feedlyの無料アカウントではアクセス制限が150/日?とかあるようなので気をつけて下さい。

少しでも論文を探す作業に役にたてばと思います。

 

 

 

*1:c) => c.message.content.trim(