【GAS】RSSフィードから最新のニュースをWordPress へ投稿する(アイキャッチ自動生成)

作ったもの紹介

前提:Google Alertを使って「AI」という単語で自動的に最新のニュースをRSSフィードとして配信するように設定。
GASでそのRSSフィードを利用して、最新のニュースをアイキャッチ付き(DALLE利用)で自動投稿するスクリプト。

RSSフィードはまあどこのやつでも使えると思います。

GPTにほぼ丸投げして作らせて、以下の解説記事すらGPTに作らせたので、色々突っ込みどころはあるかも。
でも大した機能はついてないので、動けばなんでもいいです。

ざっくり主機能要約すると、
・RSSフィードから最新記事整理
・GPTにそれらのニュースタイトルからDALLE(画像生成AI)に送るプロンプトを作らせる
・GPTが作ってくれたプロンプトをDALLEのAPIに投げて画像生成
・ついでに投稿時点の年月日時間を利用して記事タイトルを自動生成
・WordPressのAPIを利用して、画像とともに最新ニュース一覧を記事として投稿

よって、
・OpenAIのAPI
・WordPressの自サイト
が必要になってきます。

コードは自分のところでは動いてるやつをGPTに放り投げてプレースホルダーに置換させたました。
なのでなんか動かなくなってるかもしれやんけど、チェックするの面倒なので、もし変なところあったら教えていただければ修正します。

以下、GPTによる迫真の解説をお楽しみください。

目次

  1. Google Apps Script (GAS) とは
  2. GASの利点
  3. GASの使い方
  4. 時間トリガーの使い方
  5. Google Apps Script (GAS) による WordPress への投稿スクリプトの解説
  6. 1. 主要な機能
  7. 2. スクリプトの詳細な動作
  8. 3. 注意点

Google Apps Script (GAS) とは

Google Apps Script (GAS) は、Googleが提供するスクリプト言語で、Googleのサービス(Google スプレッドシート、Google ドキュメントなど)を自動化するためのものです。JavaScriptベースの言語で、ブラウザ上で実行されるため、特別なソフトウェアのインストールは不要です。

GASの利点

GASを使用する最大の利点は、グーグルドライブが使えれば、簡単なスクリプトならお手軽にサーバーレスで動かせることです。これにより、伝統的なサーバーの設定やメンテナンスの手間を省きつつ、Googleのクラウドインフラストラクチャを活用して、高度な自動化や連携を実現することができます。

GASの使い方

  1. Google ドライブを開き、「+ 新規」ボタンをクリックして「Google Apps Script」を選択します。
  2. 新しいスクリプトエディタが開かれるので、ここにスクリプトを記述します。
  3. スクリプトを記述したら、上部の実行ボタンをクリックしてスクリプトを実行します。
  4. 必要に応じて、トリガーや外部APIとの連携など、高度な機能を利用することもできます。

時間トリガーの使い方

時間トリガーを使用すると、指定した時間や間隔でスクリプトを自動的に実行することができます。

  1. スクリプトエディタの左側の「トリガー」アイコンをクリックします。
  2. 「+ トリガーを追加」ボタンをクリックします。
  3. 実行する関数と、実行のタイミング(日時や間隔)を指定します。
  4. 「保存」ボタンをクリックしてトリガーを設定します。

Google Apps Script (GAS) による WordPress への投稿スクリプト


/**
 * WordPressに投稿するためのGASスクリプト
 */

// OpenAIのAPIキーとWordPressのユーザー名とパスワードを環境変数から取得
const OPENAI_APIKEY = PropertiesService.getScriptProperties().getProperty('OPENAI_APIKEY');
const WP_USERNAME = PropertiesService.getScriptProperties().getProperty('WP_USERNAME');
const WP_PASSWORD = PropertiesService.getScriptProperties().getProperty('WP_PASSWORD');

/**
 * WordPressに最新のAI関連ニュースを投稿する関数
 */
function postToWordPress() {
  // GoogleアラートのRSSフィードのURLリスト
  var rssFeedUrls = [
    'RSS_FEED_URL_1',
    'RSS_FEED_URL_2',
    'RSS_FEED_URL_3'
  ];

  // WordPressのサイトURLとAPIエンドポイント
  var siteUrl = 'YOUR_WORDPRESS_SITE_URL';
  var apiEndpoint = '/wp-json/wp/v2/posts';

  // 認証ヘッダーの設定
  var headers = {
    "Authorization": "Basic " + Utilities.base64Encode(WP_USERNAME + ':' + WP_PASSWORD)
  };

  var allEntries = [];
  // 各RSSフィードからエントリを取得
  rssFeedUrls.forEach(function(url) {
    var xml = UrlFetchApp.fetch(url).getContentText();
    var document = XmlService.parse(xml);
    var root = document.getRootElement();
    var atom = XmlService.getNamespace('http://www.w3.org/2005/Atom');

    var entries = root.getChildren('entry', atom);
    entries.forEach(function(entry) {
      var title = entry.getChild('title', atom).getText();
      var link = entry.getChild('link', atom).getAttribute('href').getValue();
      var published = entry.getChild('published', atom).getText();

      allEntries.push({
        title: title,
        link: link,
        published: new Date(published)
      });
    });
  });

  // エントリを公開日時でソート
  allEntries.sort(function(a, b) {
    return b.published - a.published;
  });

  // 上位20件のエントリを取得
  var topEntries = allEntries.slice(0, 20);
  var titleList = topEntries.map(function(entry) {
    return '- ' + entry.title;
  }).join('\n');

  // GPT-3.5でニュースタイトルの要約を取得
  var gptPrompt = "Summarize the overarching theme or trend from the entire list of news titles provided in one single sentence.: " + "\n" + titleList;
  var gptResponse = requestGpt35Completion(gptPrompt);

  // DALL·Eで画像を生成
  var dallEImageURL = requestDallEImage(gptResponse);
  var imageBlob = UrlFetchApp.fetch(dallEImageURL).getBlob();

  // 画像をWordPressにアップロード
  var imageId = uploadImageToWordpress(imageBlob);

  // 投稿のコンテンツを作成
  var content = topEntries.map(function(entry) {
    return '' + entry.title + ' (' + entry.published + ')';
  }).join('');

  // 投稿のタイトルを現在の日時でフォーマット
  var now = new Date();
  var year = now.getFullYear();
  var month = now.getMonth() + 1;
  var day = now.getDate();
  var weekDay = ["日", "月", "火", "水", "木", "金", "土"][now.getDay()];
  var hours = now.getHours();
  var formattedDate = '【' + (month < 10 ? '0' : '') + month + '/' + (day < 10 ? '0' : '') + day + '/' + weekDay + '/' + (hours < 10 ? '0' : '') + hours + '時】現時点でのAI関連最新ニュース一覧【' + year + '】';

  // 投稿データを設定
  var data = {
    title: formattedDate,
    content: content,
    status: 'publish',
    categories: [2],
    featured_media: imageId
  };

  // WordPressに投稿
  UrlFetchApp.fetch(siteUrl + apiEndpoint, {
    method: 'POST',
    headers: headers,
    payload: JSON.stringify(data),
    contentType: 'application/json'
  });
}

/**
 * GPT-3.5での完了リクエストを行う関数
 * @param {string} prompt - GPT-3.5に送信するプロンプト
 * @return {string} GPT-3.5の応答
 */
function requestGpt35Completion(prompt) {
  const apiUrl = 'https://api.openai.com/v1/chat/completions';
  const headers = {
    'Authorization':'Bearer '+ OPENAI_APIKEY,
    'Content-type': 'application/json',
    'X-Slack-No-Retry': 1
  };
  const options = {
    'muteHttpExceptions' : true,
    'headers': headers, 
    'method': 'POST',
    'payload': JSON.stringify({
      'model': 'gpt-3.5-turbo',
      'max_tokens' : 1000,
      'temperature' : 0.9,
      'messages': [{'role': 'user', 'content': prompt}]}),
  };
  const responseText = UrlFetchApp.fetch(apiUrl, options).getContentText();
  const response = JSON.parse(responseText);
  
  // 応答の形式を確認
  if (response && response.choices && response.choices[0] && response.choices[0].message && response.choices[0].message.content) {
    return response.choices[0].message.content;
  } else {
    // デバッグのための完全な応答をログに出力
    Logger.log(responseText);
    throw new Error('Unexpected GPT-3 API response.');
  }
}

/**
 * DALL·Eで画像を生成する関数
 * @param {string} prompt - DALL·Eに送信するプロンプト
 * @return {string} 生成された画像のURL
 */
function requestDallEImage(prompt) {
  const apiUrl = 'https://api.openai.com/v1/images/generations';
  let headers = {
    'Authorization':'Bearer '+ OPENAI_APIKEY,
    'Content-type': 'application/json',
    'X-Slack-No-Retry': 1
  };
  let options = {
    'muteHttpExceptions' : true,
    'headers': headers, 
    'method': 'POST',
    'payload': JSON.stringify({
      'n': 1,
      'size' : '1024x1024',
      'prompt': prompt})
  };
  const responseText = UrlFetchApp.fetch(apiUrl, options).getContentText();
  const response = JSON.parse(responseText);

  // APIの応答をログに出力
  Logger.log(responseText);

  // 応答の形式を確認
  if (!response.data || !response.data[0] || !response.data[0].url) {
    throw new Error('Unexpected API response.');
  }

  return response.data[0].url;
}

/**
 * 画像をWordPressにアップロードする関数
 * @param {Blob} blob - アップロードする画像のBlob
 * @return {number} アップロードされた画像のID
 */
function uploadImageToWordpress(blob) {
  var siteUrl = 'YOUR_WORDPRESS_SITE_URL';
  var apiEndpoint = '/wp-json/wp/v2/media';

  var headers = {
    "Authorization": "Basic " + Utilities.base64Encode(WP_USERNAME + ':' + WP_PASSWORD),
    "Content-Disposition": 'attachment; filename="image.png"'
  };

  var options = {
    method: 'POST',
    headers: headers,
    payload: blob,
    muteHttpExceptions: true
  };

  var response = UrlFetchApp.fetch(siteUrl + apiEndpoint, options);
  var responseData = JSON.parse(response.getContentText());
  return responseData.id;
}

/**
 * WordPressからメディアのURLを取得する関数
 * @param {number} mediaId - 取得するメディアのID
 * @return {string} メディアのURL
 */
function getMediaUrl(mediaId) {
  var siteUrl = 'YOUR_WORDPRESS_SITE_URL';
  var apiEndpoint = '/wp-json/wp/v2/media/' + mediaId;
  
  var headers = {
    "Authorization": "Basic " + Utilities.base64Encode(WP_USERNAME + ':' + WP_PASSWORD)
  };

  var options = {
    method: 'GET',
    headers: headers,
    muteHttpExceptions: true
  };

  var response = UrlFetchApp.fetch(siteUrl + apiEndpoint, options);
  var responseData = JSON.parse(response.getContentText());
  return responseData.source_url;
}

このスクリプトは、Google Apps Script (GAS) を使用して、AI関連の最新ニュースを自動的にWordPressに投稿するためのものです。以下に、スクリプトの主要な機能とその動作を詳細に説明します。

1. 主要な機能

  • GoogleアラートのRSSフィードからAI関連のニュースを取得
  • 取得したニュースのタイトルをGPT-3.5を使用して要約
  • DALL·Eを使用して画像を生成
  • 生成した画像をWordPressにアップロード
  • 最新のニュースと生成した画像を使用してWordPressに投稿

2. スクリプトの詳細な動作

2.1 postToWordPress関数

この関数は、スクリプトのメイン関数として、上記の主要な機能を順番に実行します。特に、環境変数からWordPressの認証情報やOpenAIのAPIキーを取得しています。

2.2 requestGpt35Completion関数

この関数は、GPT-3.5のAPIを使用して、指定されたプロンプトに基づいてテキストを生成します。環境変数からOpenAIのAPIキーを取得しています。

2.3 requestDallEImage関数

この関数は、DALL·EのAPIを使用して、指定されたプロンプトに基づいて画像を生成します。環境変数からOpenAIのAPIキーを取得しています。

2.4 uploadImageToWordpress関数

この関数は、指定された画像のBlobを使用して、画像をWordPressにアップロードします。環境変数からWordPressの認証情報を取得しています。

2.5 getMediaUrl関数

この関数は、指定されたメディアIDを使用して、WordPressからメディアのURLを取得します。環境変数からWordPressの認証情報を取得しています。

3. 注意点

  • スクリプト内のプレースホルダー(例: RSS_FEED_URL_1、YOUR_WORDPRESS_SITE_URL)は、実際の値に置き換える必要があります。
  • WordPressのユーザー名やパスワード、OpenAIのAPIキーなどのセンシティブな情報は、環境変数に保存することが推奨されています。これにより、情報の漏洩リスクを低減できます。

以上が、GASを使用してWordPressにAI関連の最新ニュースを自動投稿するスクリプトの詳細な解説です。このスクリプトを使用することで、手動でのニュースの収集や投稿の手間を省き、最新の情報を自動的にブログにアップデートすることができます。

コメント

タイトルとURLをコピーしました