CG・映像デザイナー技術ブログ

【Twitter】過去記事をランダム・指定間隔で投稿するBotの作り方

ツイッターを始めてみたものの、記事を書いたらつぶやくわけでもないので、ほとんど意味をなしてないなということで

今回から記事を書いたら、ちゃんとつぶやいて見ようと思います。

そして書いた本人も大半忘れている過去記事ですが、twittbotを使って、1日1記事とか紹介してみようと思います。



twitter-summary-article


Twitterが超捗る!5つのおすすめの便利機能・サービスまとめ

この記事の著者
CGブロガー すいみん

CGブロガー

すいみん

Suimin

プロフィール

某美大の油絵科を卒業後、大手CG映像プロダクションに入社。
その後ゲーム業界に転職。
現在は技術系のCGデザイナーをしています。 書籍:Unity デザイナーズ・バイブル
プロフィール詳細はこちら

TwittBotでツイートする過去記事をランダム・指定間隔で投稿する方法

まずはツイートする記事を作成します。

  • ツイートは1行に
  • 140文字以内に
  • ハッシュタグもつけたい

TwittBot張付用文字列作成ツール

Google Analyticsから、記事をエクスポートしても良いのですが、重複やら抜けが出てしまいます。(+チェックやら、エクセルで加工やらで時間もかかる)

一番ベストなのは、下記の記事のツールを使うと抜けもれなく、記事とURLを1行で抽出することができます。

TwittBot張付用文字列作成ツール

使い方は自分のサイトのURLを貼り付けて、生成された記事をコピー。記事数が多いならarchiveページ数を切り替える必要があります。

ハッシュタグの作成

記事タイトルに【ABC】あいうえおというように【】の中にカテゴリーを記述していたので、抽出は簡単でした。

エクセルにA1に生成した記事をコピペ、B1に

=" #"&MID(A1,FIND("【",A1)+1,FIND("】",A1)-FIND("【",A1,1)-1)

を記述すると先頭に#をつけて、次に【】内の文字がつながり、#ABCというハッシュタグが抽出できます。

※ハッシュタグはスペースで区切らないこと!

つぶやく記事の作成

最後に生成された記事とハッシュタグをつなげて完成

=CONCATENATE(A1,B1)

twittbotの設定

まず自分のツイッターと連携します。

参考 twittbottwittbot

つぶやき登録

先に作った1行1ツイートの記事をすべてコピー。

複数行登録の文字をクリックして、ペーストします。

以上で登録完了。

すべて消したい場合は詳細設定の下の方で消せます。

詳細設定

  • つぶやく
  • ランダムでつぶやく
  • 時間間隔を設定

以上で、15分くらいしたら、BOTがつぶやいてくれました。

自作Botでブログ記事を全取得、整形してTwitterへ自動投稿する方法

応用編です。全記事をGASで取得して、内容を整形してツイートします。

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

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

下記の記事を参考にTwitter APIも利用してつぶやいてます。

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

注意点

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

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

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

変更箇所

参考記事のGASの記述を一部変更しています。

スクレイピング

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

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

  • 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"

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

更新・投稿設定

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

毎日、時報も兼ねて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();
}

以上、すいみん(@cg_method)でした!