「いいね」で飛ぶシャボン玉

今回やること

Twitterでツイートがいいねされるたび、バブルガンからシャボン玉を発射します。

用意するもの

  • obniz Board
  • モバイルバッテリーなど
  • バブルガン
  • 石鹸水

組み立て方

バブルガンの電池ボックスの蓋を開け、プラス極側をobniz Boardの0番に、マイナス極側を1番に繋ぎます。 (一般的なアルカリ電池の電圧は1つにつき1.5Vですが、obniz Boardから加えられる電圧は3Vまたは5Vです。バブルガンの仕様の電池数に対応する電圧を超えて印加しないようにご注意ください。また、お使いのバブルガンによっては電流が足りない可能性があります。)

obniz バブルガン
0 プラス極
1 マイナス極

obniz Boardに電源を繋ぎ、バブルガンに石鹸水をつけます。 

プログラム

自分の一番最新のツイートにいいねをされるたびにバブルガンからシャボン玉が発射されるようにします。

ツイートのいいね数を取得するために、Twitter Developerに登録します。その後TwitterのDeveloperページより、「consumer_key」「consumer_secret」「access_token_key」「access_token_secret」の4つを取得し、 secret.json として以下のように保存して、プログラムと同じ階層においてください。

{
  "consumer_key"        :"YOUR_CONSUMER_KEY",
  "consumer_secret"     :"YOUR_CONSUMER_SECRET",
  "access_token_key"    :"YOUR_ACCESS_TOKEN_KEY",
  "access_token_secret" :"YOUR_ACCESS_TOKEN_SECRET"
}

プログラムの以下の部分で、Developer登録したユーザー(自分)のタイムラインを取得しています。 

await client.get(
  "statuses/user_timeline",
  async (error, tweets, response) => {
    ...
  }
);

この関数内で let currentLikeCount = tweets[0].favorite_count; とすると、最新ツイートのいいね数を取得できます。

完成したプログラム

このプログラムはNode.jsでかかれています。

const fs = require("fs");
const Obniz = require("obniz");
const obniz = new Obniz("OBNIZ_ID_HERE");
const Twitter = require("twitter");
const client = new Twitter(JSON.parse(fs.readFileSync("secret.json", "utf-8")));
let connected = await obniz.connectWait({ timeout: 10 });
const ROTATE_TIME = 1500; 
const STOP_TIME = 1000; 
let isBlowing = false;
let prevLikeCount = 0;

if (connected) {
  obniz.repat(async () => {
    if (isBlowing) {
      return;
    }
    await client.get( "statuses/user_timeline", async (error, tweets, response) => {
      if (error) {
        console.log(error);
        return;
      }
      let currentLikeCount = tweets[0].favorite_count;
      console.log("currentLikeCount:" + currentLikeCount);
      if (currentLikeCount <= prevLikeCount) {
        console.log("not like added");
        prevLikeCount = currentLikeCount;
        return;
      }
      let diffLikeCount = currentLikeCount - prevLikeCount;
      //likeの増加分だけシャボン玉飛ばす
      await blowBubbles(diffLikeCount);
      console.log("like added!");
      console.log("like count:" + currentLikeCount);
      prevLikeCount = currentLikeCount;
    }); }, 10000);

    async function blowBubbles(count) {
      isBlowing = true;
      for (let i = 0; i < count; i++) {
        await obniz.com0.output(true);
        await obniz.com1.output(false);
        await obniz.wait(ROTATE_TIME);
        await obniz.com0.output(false);
        await obniz.wait(STOP_TIME);
      }
      isBlowing = false;
    }
}