先日体脂肪率が20%を超えた、技術担当の齋藤です。
1年半前にこの会社に転職してから約10kg太りました。これまでも何度もダイエットをしようと思ったのですが毎度続かず失敗に終わってます。なんと意思が弱いことか…
何かを継続するには以下二つのいずれかが必要だと私は思っています。
- モチベーション
- 強制力
今の私の状況はと言うと、現在は特にスポーツをやっている訳でもなく、また海にいく機会もほぼないことからダイエットするモチベーションがほぼありません。なので私には強制力が必要です。そこで強制的にダイエットをさせる何かを作ろうと思いました。
サボると自分の肉体がSNSに晒される
ダイエットをサボると自分の体がSNSに勝手にアップロードされる、という仕組みなら嫌でもやるだろうということでそれを今せっせと作っています。
カレンダー形式で毎日自分の画像をアップして、日にちを指定してBefore -> Afterの比較ができるだけのシンプルなアプリです。ただ数日サボると勝手にTwitterにそれらの画像がアップされる、という仕様です。
その際にTwitterAPIを使ったのでメモがてらブログにまとめておきます。
Twitterログインができるところまで実装しておく
今回はFirebaseを使ってTwitterログインし、その時得られたアクセストークンとアクセストークンシークレットを使ってAPIを叩きます。
公式のチュートリを見ながらTwitterログインをするところまで実装します。
アクセストークンとアクセストークンシークレットをメモる
let logInButton = TWTRLogInButton(logInCompletion: { session, error in if (session != nil) { let authToken = session.authToken let authTokenSecret = session.authTokenSecret // ... } else { // ... } })
上記リンク先から抜粋したものですが、session.authTokenとsession.authTokenSecret の値をメモってください。
ここからが本題
自分のタイムラインを取得する
javascriptでやってみます。
適当なところにtwitter_api.jsを作ります。
const Twitter = require('twitter')
const consumer_key = 'APIキー'
const consumer_secret = 'APIシークレット'
const access_token_key = 'アクセストークン'
const access_token_secret = 'アクセストークンシークレット'
const client = new Twitter({
  consumer_key,
  consumer_secret,
  access_token_key,
  access_token_secret
})
const params = {count: 50}
client.get('statuses/home_timeline.json', params, (error, tweets, response) => {
  if (!error) {
    console.log(tweets)
  }
})
twitterというモジュールが必要なのでインストールします。
$ npm install twitter
そして実行してみます。
$ node twitter_api.js
[ { created_at: 'Sun Jul 08 06:22:08 +0000 2018',
    id: 1015843457619746800,
    id_str: '1015843457619746816',
    text: 'あいええお',
省略...
ちゃんと取れてきてるみたいです。
では次に投稿のAPIを叩いてみます。
何か投稿してみる。
先ほどのタイムライン取得の処理はコメントアウトします。
代わりにpostParamsとpostの処理を新しく追記します。
satatus: "投稿テスト"
のようにstatusというキーに投稿内容のテキストを指定すればいいみたいです。
const postParams = {status: "投稿テスト"}
// client.get('statuses/home_timeline.json', params, (error, tweets, response) => {
//   if (!error) {
//     console.log(tweets)
//   }
// })
client.post('statuses/update.json', postParams, (error, tweets, response) => {
  if (!error) {
    console.log(tweets)
  }
})
実行します。
$ node twitter_api.js

ちゃんと「投稿テスト」というテキストで投稿されています。
では次が本当の本題の画像投稿です。
画像を投稿してみる
画像の投稿は若干まわりくどいです。
- 画像をアップロードする
- 画像をアップロードした時に得られるメディアIDを普通のテキスト投稿時に紐づける
という流れになります。
GitHubからの写経です。
https://github.com/desmondmorris/node-twitter/tree/master/examples#media
const fs = require('fs');
// ファイルを読み込みます。test.jpgというファイルをtwitter_api.jsと同じ階層に配置しておきます。
var data = require('fs').readFileSync('test.jpg');
// まず画像のアップロードをします。
client.post('media/upload', {media: data}, function(error, media, response) {
  if (!error) {
    // アップロードに成功したらmediaオブジェクトが返ってきます。
    console.log(media);
    // メディアIDをmedia_idsというキーにセットします。
    var status = {
      status: 'I am a tweet',
      media_ids: media.media_id_string
    }
   // ポストします。
    client.post('statuses/update', status, function(error, tweet, response) {
      if (!error) {
        console.log(tweet);
      }
    });
  }
});

できましたね。
これで「ダイエットをサボったら自動で画像を晒す」という機能ができそうです。
一種のスパムみたいなものなのでAppleの審査が通るかはわかりませんがとりあえず作ってみようと思います。
以上、FirebaseのTwitter認証およびTwitterAPIを使ってみたでした。



