ウェブサービス

【GAS】ブログ記事をスクレイピングして投稿!Twitter Botの作成方法

gas-blog-twitter-bot

ブログ記事をスクレイピングして投稿するTwitter Botの作成方法の紹介です。

少し手を加えて、記事に関するハッシュタグと時報の記述も追加してみました。

参考

こちらの記事を参考にGASを使って、はてなブログの記事をスクレイピング。

それをTwitter APIを利用してつぶやきます。

【コピペ導入】はてなブログ用 過去記事TweetBot【全自動】 – 野良ジニアのスクラップブック

注意点

f:id:min0124:20180408140021p:plain

Twitter APIを利用を利用するには電話認証が必要です。Twitterの設定で認証しましょう。

そしてちゃんと認証番号を入れても、「電話認証機能を有効にしてください!」とログが表示されてエラーが発生するのですが、

F5押して何回も根気よく認証番号を入力すると成功します。

変更箇所

スクレイピング

はてなブログから取得したい情報を取り出して、スプレッドシートに書き込みます。

【】で囲まれたタイトルの一部がハッシュタグとして利用したいので、半角スペースを消します。

  • scraipingHatenaBlog()
// 文字列抽出
function fetchString(str, pre, suf) {
var reg = new RegExp(pre + '.*?' + suf);
var data = str.match(reg)[0]
.replace(pre, '')
.replace(suf, '')
.replace(/\s+/g, "");
return data;
}

.replace(/\s+/g, "");を追加して、空白部分を削除しました。

// Spreadsheet 書き込み
function writeData(sheet, matchData) {
var published = fetchString(matchData, "<published>", "<\/published>")
var updated = fetchString(matchData, "<updated>", "<\/updated>")
var title = fetchString(matchData, "<title>", "<\/title>")
var tag = fetchString(matchData, "【", "】")
var link = fetchString(matchData, "<link href=\"", "\"\/>")
var row = sheet.getLastRow() + 1
sheet.getRange(row, 1).setValue(published);
sheet.getRange(row, 2).setValue(updated);
sheet.getRange(row, 3).setValue(title);
sheet.getRange(row, 4).setValue(link);
sheet.getRange(row, 5).setValue(tag);
}

【】で囲まれた部分を抽出

記事投稿

投稿したい内容を変更しています。はてなブログ投稿時の並びと一緒にしました。

  • postOldEntry()
  // スプレッドシートからデータ取得
var publishDates = sheet.getRange("A1").offset(0, 0, lastRow).getValues();
var updateDates = sheet.getRange("B1").offset(0, 0, lastRow).getValues();
var titles = sheet.getRange("C1").offset(0, 0, lastRow).getValues();
var urls = sheet.getRange("D1").offset(0, 0, lastRow).getValues();
var tags = sheet.getRange("E1").offset(0, 0, lastRow).getValues();

E列のハッシュタグで使用する文字を取得

  // ランダムに情報抽出
var is_exclude = false;
while(is_exclude == false) {
var rand = Math.ceil(Math.random() * lastRow - 1);
var url = urls[rand][0];
var ex_row = findRow(ss.getSheetByName(EXCLUDE_SHEET), url, 1);
if(ex_row === 0) {
is_exclude = true;
}
}
var publishedStr = publishDates[rand][0]
var updatedStr = updateDates[rand][0]
var title = titles[rand][0];
var tag = tags[rand][0];

変数を作成

  // 日時フォーマット変更
var current = Utilities.formatDate(new Date(), "JST","HH:mm");
var tweetStr = ""
tweetStr += current + "になりました。本日の過去記事紹介です。" + "#" + tag + " #はてなブログ \n"
tweetStr += title + "\n"
tweetStr += url + "\n"

現在時刻を取得して、時報とハッシュタグをつけて記事投稿。

f:id:min0124:20180408135711p:plain

更新・投稿設定

f:id:min0124:20180408140617p:plain

日曜日になったら、全記事の情報を再取得。

毎日、時報も兼ねて14時と19時に過去記事投稿する設定に。

追記

トリガーをセットすることで、正確な時間の投稿ができます。

function afternoonSetTrigger() {
var triggerDay = new Date();
triggerDay.setHours(14);
triggerDay.setMinutes(00);
ScriptApp.newTrigger("main").timeBased().at(triggerDay).create();
}
function deleteTrigger() {
var triggers = ScriptApp.getProjectTriggers();
for(var i=0; i < triggers.length; i++) {
if (triggers[i].getHandlerFunction() == "main") {
ScriptApp.deleteTrigger(triggers[i]);
}
}
}
function main() {
deleteTrigger();
postOldEntry();
}

まとめ

3年経ったので記事整理しはじめたのですが、

消した記事を投稿したくないので以前のtwittbotは停止。

代わりに、常に情報更新・投稿してくれるタイプのBOTを入れてみました。

まとめ記事の紹介
ABOUT ME
すいみん
東京在住。デザイナー寄りのテクニカルデザイナー。 ブログは技術検証の備忘録として書いています。