Bufferを無料で使い倒す方法 その1

http://www.flickr.com/photos/26650236@N07/6839705522
photo by kenjonbro


Bufferは無料でも使えるけど、10個のポストまでしかバッファリングできないという制限がある。
その制限を気にせずにBufferを使い倒す方法を紹介します。

※その2はこちら→Bufferを無料で使い倒す方法 その2 - 逢えず鳥

Bufferとは

https://si0.twimg.com/profile_images/378800000011898746/4d6c3e26b1b9afe0a82b81c6b131480d.png

こちらの記事でわかりやすく説明されています。

http://blog.quusookagaku.com/wordpress/1892

簡単に言うと「TwitterFacebookなどへのポストをバッファリングできるWebサービスです。

いろんな使い方があるけど、僕は、読んだニュース記事などをツイートするときに、まずBufferに溜めておいて1時間毎くらいでツイートされるようにしています。
Bufferはツイートする時刻を複数予約しておくことができるので、短時間の連続ツイートを防げます
「記事を読み終わった直後にツイートしたいけど、タイムラインが流れてしまってフォロワーさんにウザがられそう」って時に使えます。

iOSアプリもありとても便利なサービスです。

無料で使い倒すとは

「Bufferを無料で使い倒す」とはどういうことか。

冒頭で言ったようにBufferの無料プランにはいくつかの制限があります。
有料プランは月額10ドルです。
いくら便利なサービスだとしても「タダで使えるものはタダで使いたい」と思ってしまうので、これらの制限とうまく付き合っていく必要があります。

個人的に煩わしいと感じる制限は2つ。

登録できるSNSアカウント数の制限

一つのBufferアカウントに対して設定できるSNSアカウントはそれぞれ一つです。
複数のTwitterアカウントを持っていると面倒ですが、アカウント毎にBufferのアカウントを作成してしまえばいいかなと思ってます。

バッファリングできるポスト数の制限

これが厄介で、無料だと10ポストまでしかバッファリングできません。
普通に使ってるとすぐいっぱいになってしまい、いちいちバッファを開放(何件か[SHARE NOW]をポチってツイート)するのは面倒です。
また、予約を多めに設定することはできるけど、Bufferのメリットが弱くなるし連続ツイートになりかねない。
この制限が嫌なら金払えって話なんだろうけど。

2013-10-13 Buffer Error

一応、Bufferを誰かに紹介してその人が登録すると、両者が+1ポスト使えるようになるキャンペーン(?)があります。
だけど、僕は友達がいないので、下のリンクから登録していただけるとぼっちが喜びます。
Pricing | Buffer

このエントリーでは、このポスト数の制限を気にせずにBufferを使う方法を紹介します。

無料で使い倒すには

ポイントはBufferにメールでポストするです。

Bufferにポストする方法はいろいろありますが、メールでポストするといいことがあります。
それは「ポストの失敗をメールで受けられる」ことです。
この失敗メールをトリガーとしてポストを再送信してやります。
定期的にこの再送信を行い、BufferがTwitterでツイートするなどして空きができたら、ポストが成功し失敗メールが来なくなります。

バッファオーバーフローが発生したらリトライをかけてやるSmart Bufferと名付けました。
あまりたいしたことはしないけど。

Smart Bufferの実現方法

Gmail_Buffer

メールの自動返信ができればいいので、様々な実現手段はあると思いますが、僕がやっている方法を紹介します。

利用するサービスは以下の2つ。

GASは初心者のためのGoogle Apps Scriptプログラミング入門 - libroで詳しく説明されています。
簡単に言うと「GmailGoogleカレンダーなどのGoogleアプリをJavaScriptで自動コントロールできる」ものです。
僕も初めて使ったので詳しくはわかりませんが、IDEが用意されていて簡単に使えます。

ちなみに、さっき使うサービスは2つと書きましたが、メールでポストすることに馴染めない僕は他のサービスと連携させて使いやすくしています。
このことについては後述します。

Bufferのメールポスト設定

iOSのBufferアプリでのメールポストの設定はBufferの投稿をスキマ時間にiPhoneからサクッと行う方法 | シゴタノ!で紹介されています。
ブラウザの場合は[My Account]→[Email Settings]の「Buffer By Email」にsecret email addressのリンクがあり、そこに自分のポスト用メールアドレスが記載されています。
このメールアドレスに送信すればBufferにポストできます。
Bufferは、送信元のメールアドレスのチェックなどはせずに、送られてきたメールは全てBufferに追加されるようなので、公開したりしないようご注意ください。

メールは以下の形式で送ります。

  • 件名に「テキスト」
  • 本文に「URL」

Bufferには「テキスト URL」がポストされます。

例えば、
「わらたwww / URLスキームを利用してChromeTumblrをアプリ連携させる - 逢えず鳥 http://aezutori.hatenablog.com/entry/2013/10/04/192654
とポストしたい場合は以下のメールを送信します。

しかし、ここでは以下のような形式でメールを送信します。

  • 件名に「テキストとURL」
  • 本文はなし

本文はブランクにして件名に全部書きます。
理由は後述します。

さっきの例だと以下のようにします。

ポスト失敗メールの形式

ポストに失敗すると以下のようなメールが送られてきます。

  • 差出人: hello@bufferapp.com
  • 件名: Oh no! Your Buffer is full to the brim.
  • 本文:

buffer_failed_1

ここで注目すべきは赤枠で囲った所です。
ここにポスト内容が書かれていてどのポストが失敗したかわかるようになっています。
このポスト内容を使ってリトライします。

ただし、実はここには件名に書いた文字列しか記載されません。
つまり、本文にURLを書いてしまうと、その情報は取得できません。
これが先ほど件名に"テキストとURL"を書いた理由です。
こうしておけば、この部分をそのまま再送信することができます。

buffer_failed_2

GmailとGASを使って自動再送信

ポストメールはGmailで送信します。
すると、ポスト失敗メールは送信したGmailのメールアドレスに送られてきます。

GASを使ってメールのチェックと再送信をします。
GASの使い方はクグってもらうとして、以下のようなJavaScriptのコードを書きました。
先に言い訳しておくと、GASは初めて使うしJavaScriptも初心者なのでご了承ください。

var bufferErrorAddress = "hello@bufferapp.com"; // ポスト失敗メールのアドレス
var bufferErrorSubject = "Your Buffer is full to the brim"; // ポスト失敗メールの件名
var bufferPostAddress = "buffer-xxxxxxxxxxxxxxxxxxxx@to.bufferapp.com"; // ポスト用メールのアドレス ※要修正
var maxPostNumber = 3; // 最大ポスト数 ※適宜修正

function retryBuffer() {
  // get all threads in inbox
  var threads = GmailApp.getInboxThreads();
  for (var i = 0; i < threads.length; i++) {
    var thread = threads[i];
    if (!thread.isUnread()) { // スレッドが既読なら次のスレッドへ
      continue;
    }
    // get all messages in a given thread
    var messages = threads[i].getMessages();
    // iterate over each message
    var postCount = 0;
    for (var j = 0; j < messages.length; j++) {
      var message = messages[j];
      if (message.getFrom().indexOf(bufferErrorAddress) == -1) { // 差出人がポスト失敗メールのアドレスでなければ抜ける
        break;
      }
      if (message.isUnread() && // メッセージが未読 かつ
         (message.getSubject().indexOf(bufferErrorSubject) != -1)) { // ポスト失敗メールの件名なら再ポストする
        var xmlBody = Xml.parse(message.getBody(), true);
        var result = xmlBody.getElement().getElement().getElement('div').getElement('table').getElement('tr').getElement('td').getElements('table')[0].getElements('tr')[1].getElement('td').getElement('table').getElements('tr')[3].getElement('td').getElements('p')[2];
        var postText = result.getText();
        var postUrl = result.getElement('a').getAttribute('href').getValue();
        var sendSubject = postText + postUrl;
        Logger.log("Subject: " + sendSubject);
        MailApp.sendEmail(bufferPostAddress, sendSubject, ""); // メール送信
        message.markRead(); // メッセージを既読にしておく
        postCount++;
        if (postCount >= maxPostNumber) { // 最大ポスト数に達したら抜ける
          Logger.log("The number of posts: " + postCount);
          break;
        }        
      }
    }
  }
};

簡単に何をしているのかと言うと

  1. ポスト失敗メールが来ているかチェック
  2. 来ていればポスト内容を取得して再送信

だけです。
これを1時間毎とか適当な間隔で実行されるようにGASのIDEで設定します。
時間の間隔はBufferのスケジュールやポストの頻度によるので自分に合った値を設定してください。

コードの修正が必須なのは、ポスト用メールアドレスです。
自分のポスト用メールアドレスに書き換えてください。

再送信するポスト数には制限を設けています。
いっぱいになっているところに何個も送ってもまた失敗する可能性が高いので。
これも変数で定義して簡単に変えられるようにしてあるので、自分に合った値にしてください。

また、「ポスト失敗メールのチェック」と「ポスト内容の取得」はBufferから送信されるメールの形式に依存しているので、注意が必要です。
形式が変更されると動かなくなります。
これが微妙なところだけど、仕方ないかとも思っています。

異常系などは深く考えていないので、自己責任でご利用ください。

ちなみに、「ポスト内容の取得」でXPathとか使ってもっとシンプルに書きたかったんだけど、GASの使い方がよくわからないので、長ったらしいコードになってます。
いい書き方があったら教えてください。

このエントリー長いな。なんだこれは。誰も見てないのになんでこんなに書いてるんだ

と感じてきたので、続きは別エントリーか追記します。
と言っても、Smart Bufferの部分はできたので、残りは実際に使う時の他サービスとの連携方法の紹介です。
僕はメールでポストするのはちょっとめんどくさいので、いろいろ使って簡単にしています。
これはかなり楽になるし、Smart Bufferなんて使わねーよって人にもおすすめ。
具体的にはPocket、Delicious、IFTTTを使ってます。

続き→Bufferを無料で使い倒す方法 その2 - 逢えず鳥