おはよう〇〇ちゃんの'半'自動化

この記事は "地下アイドル"と"おたく"の Advent Calendar 2018 の10日目の記事です。

前: 12月だし地下アイドル紅白歌合戦でも1人で開催しようと思う 〜白組編〜
次:

 

皆さんこんにちは。週末は素敵なオタクライフを楽しみましたか?僕は楽しみました笑
今日は、技術的なことを書こうと決めていたのでこのタイトルにしました。

 

私の毎朝の日課

これです。

 可愛いですね。はい。

これを毎朝(たまにサボりますが)ツイートしているのですが、朝は何かと忙しいものです。

私は、推しメンの画像をgoogleフォトに保存しているので、忙しい朝の時間に次のプロセスでツイートしなければなりませんでした。

  1. googleフォトから推しメンの任意の画像を保存する
  2. 保存した画像をツイッターアプリでハッシュタグをつけて投稿する

文字に起こすと大したことないですが、画像をダウンロードするのに数タップ必要だったり、重複していない画像を選ばなきゃいけなかったりと結構大変ですね。

なんとか自動化できないかなぁと思っていて部屋を眺めていたら、ありました。

そう、Amazon Dash Buttonです。

それ何よって人は調べてください。

これを使って毎朝の画像ツイートをボタン一つで行うようにしていきます。

必要なもの

  1. Amazon Dash Button(まあね、そのための記事なのでw)
  2. Node.jsが動く環境(ボタン押下をフックします)
  3. Google Apps Script
  4. 推しメンの画像が詰まった愛のgoogleフォトアルバム
  5. twitterAPIキー

3.のGASはNode.jsでも代用できますが、googleフォトのOAuth周りのコードを書くのが面倒だったため使用しました。これによって、もはやボタンがなくても時刻をトリガーにして動作させることも可能です(愛がないですね(は?))

GAS

GASちゃんは本当に便利ですね。Twitterのライブラリもgoogleフォト(?)のライブラリもあってどちらも簡単に利用できます。

今回使用したライブラリは次のふたつです。

  1. PicasaApp(1RHjbqdEN-WvQxqSFr6hdtECfIqZlEEyCfrxvF4UKnKeVPnRX-dyg0dS7)
  2. TwitterWebService(1rgo8rXsxi1DxI_5Xgo_t3irTw1Y5cxl2mGSkbozKsSXf2E_KBBPC3xTF)

このふたつのライブラリを追加したら下記のコードが動くはずです。


var twitterAPIKey = 'TwitterのAPIキー' 
var twitterAPISecret = 'APIシークレット'
var albumId = 'googleフォトのアルバムID'
var text = '投稿するテキスト'

function doGet() {
  var album = PicasaApp.getAlbumById(albumId) 
  var photos = album.getPhotos()
  var number = Math.floor(Math.random()*photos.length)
  var photo = Utilities.base64Encode(photos[number].getBlob().getBytes())
  var twitter  = TwitterWebService.getInstance(twitterAPIKey,twitterAPISecret).getService()
  var response = JSON.parse(twitter.fetch('https://upload.twitter.com/1.1/media/upload.json',{
    method: 'post',
    payload:{'media_data':photo }
  }))
  var payload = {
    'status' : text,
    'media_ids':response.media_id_string
  }
  twitter.fetch('https://api.twitter.com/1.1/statuses/update.json', {
    method: 'post',
    payload: payload
  })
}

頭の4行にAPIキーとアルバムID、投稿するテキストなどを書いておきます。

各値の取得方法なんかはググってください。

Twitterは先にauthorizeする関数の実行が必要ですが、私は別のスクリプトで実行しているため今回は記述しませんでした。ググってください(人任せ)

なんやかんややると、doGet関数が実行された時にアルバム内からランダムに取得した画像をツイッターにポストします。

今回はWebアプリケーションとして導入してURLを発行し、そこにGETリクエストし実行していますが、ボタンなんてないわ!!って方は他の方法でリクエストを飛ばすこともできますし、なんならdoGet関数に時間主導型のトリガーを設定することもできます。少しは人間の手で投稿してる感を出していこうという愛ですね笑

発行したURLにリクエストを行うだけで投稿が完了してしまうので、URLの取り扱いには注意が必要です。

Node.js

Node.js側はいたって簡単で、ボタンが押された時、GASのdoGet関数を実行するためのURLにGETリクエストを叩きつけるだけです。


const url = 'GASのURL'
const MACaddress = 'ボタンのMACアドレス'
const https = require('https');
const dash_button = require('node-dash-button');
const button = dash_button(MACaddress, null, null, 'all');

button.on('detected', () => {
    var req = https.request(url, (res) => {
        res.on('data', (chunk) => {
            console.log(`return: ${chunk}`);
        });
        res.on('end', () => {
            console.log('No more response data.');
        });
    })

    req.on('error', (e) => {
        console.error(`ERR: ${e.message}`);
    });

    req.end();
});

 はい。ボタンのアドレスも調べ方は(以下略)

まあ、ボタンが押されたのを検知してGETリクエストするだけです。

あっさり半自動化できましたね。

これで朝30秒長く寝れるようになりました。

朝起きたらボタンを押すだけで、推しメンが喜んでくれる、素敵ですね。

 

 

 

 

っていうここまでの話は夢の話でして、、、

本当は、朝推しメンの画像をみて「今日も頑張ろう」っていう気になるタイプなので、どの写真を投稿しようかなあと選ぶ時間が必要だったりします...

ということで、明日からも手動ですね()