arXivの最新論文をSlackに自動通知する!Google Apps Scriptで作るシンプルBot3

IT・プログラミング

英語の論文を日本語に翻訳してSlackに投稿しよう

SlackにarXivの論文を自動投稿するBotが完成しましたが、多くのarXiv論文は英語です。
「内容は気になるけど英語はちょっと…」という人のために、自動翻訳でタイトルと要旨を日本語化して一緒に投稿する機能を追加してみましょう。

今回のゴール

  • arXivの論文タイトルとアブストラクトを日本語に翻訳
  • 翻訳前の英語も併記(読み比べできる)
  • 投稿内容をSlackで見やすく整形

使用する機能:LanguageApp.translate()

Google Apps Script には翻訳用の便利な関数があります。

LanguageApp.translate(text, sourceLang, targetLang);

使い方:

  • text:翻訳する文章
  • sourceLang:原文の言語(今回は "en" = 英語)
  • targetLang:翻訳先の言語(今回は "ja" = 日本語)

この関数は、GASから直接Google翻訳を使えるようなイメージです。

🛠️ コード解説:翻訳付きSlack投稿

以下が完成版の関数です:

function postArxivToSlack() {
  const settings = getSettings();
  const SLACK_WEBHOOK_URL = settings['SLACK_WEBHOOK_URL'];
  const CATEGORY = settings['CATEGORY'] || 'cs.CL';
  const MAX_RESULTS = parseInt(settings['MAX_RESULTS'], 10) || 5;

  const postedIds = getPostedIds();

  const url = `http://export.arxiv.org/api/query?search_query=cat:${CATEGORY}&sortBy=submittedDate&sortOrder=descending&max_results=${MAX_RESULTS}`;
  const response = UrlFetchApp.fetch(url);
  const xml = response.getContentText();
  const doc = XmlService.parse(xml);
  const entries = doc.getRootElement().getChildren('entry', doc.getRootElement().getNamespace());

  entries.forEach(entry => {
    const ns = doc.getRootElement().getNamespace();
    const arxivId = entry.getChildText('id', ns).trim();

    if (postedIds.includes(arxivId)) {
      Logger.log(`Already posted: ${arxivId}`);
      return;
    }

    const title = entry.getChildText('title', ns).trim();
    const summary = entry.getChildText('summary', ns).trim();

    // 🌍 翻訳部分(英語→日本語)
    const titleJa = LanguageApp.translate(title, 'en', 'ja');
    const summaryJa = LanguageApp.translate(summary, 'en', 'ja');

    // 📝 Slack向け整形メッセージ
    const payload = {
      text: `*${titleJa}*\n_${title}_\n\n${summaryJa}\n\n_${summary}_\n<${arxivId}|Read more>`
    };

    const options = {
      method: 'post',
      contentType: 'application/json',
      payload: JSON.stringify(payload)
    };

    // 🚀 Slackに投稿
    UrlFetchApp.fetch(SLACK_WEBHOOK_URL, options);

    // 🗃️ 投稿済みとして記録
    savePostedId(arxivId);
  });
}

🔎 メッセージの構成(Slack表示イメージ)

Slackでは以下のような構成で表示されます:

(翻訳済みタイトル)
(原文タイトル)

(翻訳済みアブストラクト)

(原文アブストラクト)

🔗 リンク(Read more)

⚠️ 翻訳の注意点

1. 文字数制限とクォータ

  • Google Apps Script には1日あたりの翻訳回数上限があります(約50,000文字程度)。
  • 多くの論文を扱うときは、翻訳の対象を制限するなどの工夫が必要。

2. 翻訳の精度

  • 論文の専門用語や表現は、日本語訳が多少不自然になることもあります。
  • とはいえ、概要の理解には十分な精度です。

3. 翻訳エラー対応

翻訳APIにアクセス失敗したときに備えて try-catch を使うのもおすすめです:

let titleJa = title;
let summaryJa = summary;
try {
  titleJa = LanguageApp.translate(title, 'en', 'ja');
  summaryJa = LanguageApp.translate(summary, 'en', 'ja');
} catch (e) {
  Logger.log('翻訳失敗: ' + e.message);
}
タイトルとURLをコピーしました