メインコンテンツへスキップ
  1. 記事一覧/

APIキー不要のInstagramハッシュタグ・スライドショーを作る

· loading · loading ·
仁才徳
著者
仁才徳
韓国ソウル在住のリーダー兼ソフトウェアエンジニア

まえがき
#

旧正月の連休、皆さんはいかがお過ごしでしたか。私は龍仁市の韓国民俗村に行ってきて、大いに楽しみました。この時期は韓国にとって特別な季節ですが、実はキウイ(ニュージーランド人)が「ワイタンギ・デー」を祝う時期でもあるんです!

韓国民俗村

はじめに
#

在韓ニュージーランド商工会議所(Kiwi Chamber)は、ニュージーランドの祝日に合わせてさまざまなイベントを開いています。次に控えているのがワイタンギ・デーです。どんな団体でもそうですが、マーケティングとオーガニックな露出は、「また来たい」と思ってもらえるイメージを保つうえで欠かせません。ところが実際には、多くの団体やグループがリピーターの確保に苦労していて、参加者の入れ替わりが激しいのが現状です。

イベントの成功をどう測るか
#

イベントは本質的にソーシャルなものです。リアルでも、オンラインでも。そしてイベントの成否には、マーケティングが大きく関わってきます。イベントのマーケティングというと事前の告知や準備ばかりに目が行きがちですが、開催中と終了後のマーケティングも同じくらい考えるべきです。たとえばエンゲージメントや満足度は、そのままKPI(重要業績評価指標)になり得ます。

大事なKPIはこのあたりです。
#

  • 参加者のイベントエンゲージメント
  • ソーシャルメディアのエンゲージメント - イベント用ハッシュタグを使えば、参加者がイベントについてどう発信しているか、SNS上のデータをたっぷり集められます。ハッシュタグ以外にも、スポンサーと参加者のエンゲージメント測定にもSNSは使えます。アクティベーション施策としてスポンサーに提供している場合は特に重要です。
  • 顧客獲得単価(CPA)
  • 新規参加者とリピーターの比率 - 新規とリピーターの流れが健全かどうかを見るための指標です。時間が経てばイベントへの関心が薄れる人も出てきますし、ある程度の離脱はうまくいっているビジネスでも自然なことです。ただ、参加者のほぼ全員が新規だとしたら、それは何かがおかしいというサインです。

見えてきた問題
#

私が関わっているグループや、自分が参加してきたイベントで気づいたのは、参加者の大部分が初参加だということです。そして交流の薄さや物足りなさから、その後のイベントには戻ってきません。新規の来場者が絶えず流れ込んでくるおかげで、なんとか回っている場すらあります。主催者と参加者の間にほとんど交流がなかったから不満につながったのか。それとも、イベントの趣旨や目的が参加者にきちんと伝わっていなかったのか。

いずれにせよ、エンゲージメントに問題があり、イベントの目的が誤解されていたのは明らかでした。二つ目に、イベント開催中に団体の活動をアピールする努力がまったくされていませんでした。せっかくのオーガニックな露出のチャンスを逃しているわけです。三つ目は、会場設備の使い方がもったいないこと。会場にはたいていプロジェクターがあり、ゲストスピーカーの講演中は字幕(한국어と英語)の表示に使われるのですが、それ以降はずっと遊んだままです。スマートなツールを使えば、会場をもっと盛り上げられるはずです。

解決策
#

そこで、主催者と参加者のエンゲージメントを高める方法として、参加者の写真を集めてプロジェクターに映し出すディスプレイを作ることにしました。イベントで何をしているかを、他の参加者にも、Instagramの友達にも見せられるというわけです!

Instagramを使えば、日頃から日常を発信しているユーザーは、主催者と交流し、フィードバックを送り、さらにはKiwi Chamberのイベントの趣旨を友達の友達にまで広めるためのツールを、すでにスマホの中に持っていることになります。

というわけで、#waitangikorea の付いた画像をInstagramから取ってくる小さなWebアプリを作るのが私の目標になりました。

ハッシュタグのディスプレイ

技術的な話
#

フロントエンド
#

使ったツール:
#

1ページだけのアプリなので、ページ内のDOMを操作する役はJQueryに任せました。

JQueryで画面上の画像の状態を管理するために、写真の枠数と同じ長さの配列を用意しました。画像を画面に表示するたびに、そのURLを配列の該当インデックスに入れておきます。新しい写真を追加するときは、同じ画像がすでに配列にないかを確認する、という仕組みです。コードの例はこちら。

var img_on_screen = new Array(number_of_photo_squares);
var post_index = 0;

javascript.js
while (img_on_screen.includes(post_data['img'])) {
        if( post_index > post_count - 1 ) {
            post_index = 0;
        }
        post_data = posts[post_index];
        post_index = post_index + 1;
      }
    img_on_screen[curr_index-1] = post_data['img'];
    update_img(curr_index, post_data);
    }

バックエンド
#

使ったツール:
#

InstaLooter
#

InstaLooterは、ユーザー名もパスワードもなしでInstagramから画像をスクレイピングできるアプリです。自分の認証情報をネット上に晒すリスクなしにInstagramの画像が欲しい、という場合にぴったりです。

これを選んだ一番の理由は、ネットにある他のスクレイパーと違って、ユーザー名とパスワードの入力が要らないことでした。

scraper.py

print(insta_api)
if insta_api == 1:
    subprocess.call("python -m instalooter hashtag " + hashtag +" "+ path_to_json +" -d",shell=True)

Flask
#

Flaskを選んだそもそもの理由は、セットアップが簡単だからです。静的ファイルの配信にだけ使っていたのですが、キャッシュの問題に悩まされました。クライアントが更新されたJSONファイルをリクエストしても、返ってくるのは前回とまったく同じファイル。おかげでユーザー側では写真の表示がずれてしまいます。そこで、クライアントから静的ファイルを直接リクエストするのをやめ、ハッシュタグと画像ファイル名を受け取るルートをFlask側に作りました。こうすることで cache_timeout=-1 を設定でき、ファイルがキャッシュされないようにできました。

ファイル構成
#

@app.route('/update', methods= ['GET'])
def get_file():
    # cache_timeoutはsend_fileオプションから秒単位です
    return send_from_directory("data/img", "data.json", cache_timeout=-1)
Glob
#

Globは、ルールに合致するファイルを選び出すのに便利なツールです。たとえば複数のJSONファイルを結合したいとき。中身をマージする前に、まずすべてのJSONファイルを読み込む必要があります。

scraper.py

for f in glob.glob(path_to_json+"*.json"):
    with open(f, "rb") as infile:
        result.append(json.load(infile))

イベントにて!

ここまで読んでくださってありがとうございます!
#

質問があれば、お気軽にメールしてください!