株式会社Abby エビイ 社員募集

弊社は少数で頑張っている会社です。(qiitaには東京本社のエンジニアが登録しています) qiita.com

勤務時間は、定時を 10:00〜19:00 と定めていますが各自にスケジューリングは任せていますので、自宅作業だったり私用を済ませて午後から出社したり自由度はとても高いです。
服装については、特に決まりはありません。
打合せに関してはオンラインにて Google HangoutSkype で完結しますし、対面での打ち合わせが必要な場合は私が行きますのでスーツは不要です。

現在はアプリの開発がメインで、システムの開発もやっていますが今回の募集はアプリ開発になります。

株式会社 Abby エビイ

募集要項

東京本社でプログラマを募集しています。

iOS向けアプリも全てJavaで開発しているのでJavaの開発経験がある人を特に必要としています。
開発では、AndroidStudioNetBeansEclipse またはエディタを使っており開発環境は各自自由に決めて下さい。
Javaの開発基盤には libGDX を採用しており、UIに関わる部分はJava + libGDX で開発することになります。
サーバ側の処理は全て Go で開発していますので、JavaGo を書きたい!という方は是非連絡してください。
開発のやり方としては、SlackSkype でやり取りしながら、Backlog というタスク管理サービスを利用してプロジェクトを進めます。

一緒にアプリ開発をしてみたい方は、info@abby.co.jp にメールするか TwitterFacebookで私(@yone098)までDMなどで連絡をしてください。

何卒よろしくお願い致します!

Facebook Messanger Platform での BOT の作り方

Facebook Messanger Platform が公開されて Facebook Messanger でも BOT を作っていたので手順などをまとめました。

BOT を作るまでなら公式ドキュメントを見ればだいたい分かると思います。

作成したものは golang + goji を heroku で動かしています。 LINE BOT 作成時よりも半分ほどの時間で簡単に作れました。

github.com

f:id:yone098:20160414041036p:plain:w300

手順

基本的には公式ドキュメントの通りですが公式ドキュメントは、英語版ダッシュボードなので実際に試してみると少し戸惑うかもしれませんが手順としては以下の通りです。

  1. Facebook ページを作成
  2. コールバック用のAPIを作成する
  3. facebook for developer の管理画面の左下の Messagenger を選択し Webhooks (コールバック)の設定
  4. facebook for developer の管理画面の左下の Messagenger を選択し 作成したFacebookページをプルダウンから選択しアクセストークンを生成
  5. メッセージ送信 BOT を作成する
コールバック作成

Webhooks の設定でコールバック URL を設定します。 Setup Webhooks ボタンを押すとダイアログが表示されるのでコールバックURLを入力し、verify tokenを自身で設定してください。
例)MY_VERIFY_TOKEN
コールバック URL の設定画面で、コールバック URL が正しいものが確認するために Facebook platform とやりとりする必要があります。
簡単に言うと、コールバック URL に特定のパラメータを飛ばすから、お前の作ったシステムからこっちが送ったものを正常に返せよ。それが正しかったら Webhook の設定認めるよというものになります。
特定の GET パラメータでリクエストされてくるので、対応したレスポンスを返すように作ってください。

golang だと以下のようになります。(goji 使ってます)

func handleGetCallback(c web.C, w http.ResponseWriter, r *http.Request) {
    log.Println("called callback GET")

    if err := r.ParseForm(); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    // get parameter
    token := r.Form.Get("hub.verify_token")
    log.Println("hub.verify_token:", token)

    challenge := r.Form.Get("hub.challenge")
    log.Println("hub.challenge:", challenge)

    if token == facebookVerifyToken {
        fmt.Fprintf(w, challenge)
        return
    }
    fmt.Fprintf(w, "OK")
}

正常にコールバックを返せていれば設定画面で正常に保存されて管理画面の方で完了アイコンが表示されるので、まずはコールバック連携として完了アイコンが表示されるまでは頑張ってみましょう。

f:id:yone098:20160414035023p:plain:w600

bot でメッセージを受信する

メッセージを受信するには、コールバックに設定したURLにPOSTされてくるのでメッセージをパースして受け取ります。
LINE BOT と同じで結局メッセージの構造を実際のデータを見ながら読み解くところが一番時間かかるところだと思います。

POST されてくる JSON は以下になります。

{
    "entry": [
        {
            "id": 1583495931963063, 
            "messaging": [
                {
                    "message": {
                        "mid": "mid.1460572581000:cc8dc67dbaa3b39316", 
                        "seq": 40, 
                        "text": "こんにちは"
                    }, 
                    "recipient": {
                        "id": 1583495931963063
                    }, 
                    "sender": {
                        "id": 1036935553049492
                    }, 
                    "timestamp": 1460572581014
                }
            ], 
            "time": 1460572581050
        }
    ], 
    "object": "page"
}

これをパースすればメッセージを取得出来ます。

func handlePostCallback(c web.C, w http.ResponseWriter, r *http.Request) {
    log.Println("recieve message from facebook messagenger")
    var msg facebookMsg
    b, err := ioutil.ReadAll(r.Body)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    log.Println("msg:", string(b))
    err = json.Unmarshal(b, &msg)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    for _, event := range msg.Entry[0].Messaging {
        if event.Message != nil {
            log.Println("Recieved msg:", event.Message.Text)
        }
    }

    fmt.Fprintf(w, "OK")
}

メッセージにImage や Video or Audio Attachment がある場合のメッセージフォーマットは以下を確認してください。

Webhook Reference - Messenger Platform - 参考資料 - 開発者向けFacebook

bot でメッセージ送信

送信時にはページのトークンを設定するだけで、メッセージのフォーマットさえ合わせればすんなり送信出来ます。

           m := sendMessage{
                Recipient: &id{ID: senderID},
                Message:   &text{Text: "ハゲ"},
            }
            b, err := json.Marshal(m)
            if err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
            }
            req, err := http.NewRequest("POST", facebookPostURL+facebookToken, bytes.NewBuffer(b))
            if err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
            }

            req.Header.Add("Content-Type", "application/json; charset=UTF-8")
            client := &http.Client{}
            res, err := client.Do(req)
            if err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
            }
            defer res.Body.Close()

今回は、簡単なテキストメッセージを送信する BOT でしたが画像なども送れるので企業用 BOT を作るには良さそうです。

LINE BOT API でのハマりどころ

LINE BOT API

こんにちは、🌸満開で花見日和ですね。 LINE BOT API が公開されたので golangbot を一番手軽に出来そうな環境 heroku 上で作ってみました。
プログラム自体は JSON をコールバックで受け取り、メッセージを送るにはセキュリティ情報を設定し所定のフォーマットで JSON を POST するだけなので特に難しいところはないですが環境面や設定でハマりそうなポイントがあったので、まとめておきます。
ソースコードのサンプルは PHP であれば、ネット上にたくさんあるようなので Qiita などで参考にしてみてください。

github.com

手順

  1. LINE developer に登録し BOT API を利用出来る準備を整える LINE Developers

  2. BOT が LINE メッセージを受け取った際のコールバック実装
    LINE BOT には証明書および固定 IP アドレスが必要になるので、手軽なのは heroku + Fixie で試すのが良いと思います。

ハマりポイント

LINE developer 登録などに関しては特に問題はないと思います。先着で人数制限があるようなので試したい方は早めに登録をした方が良いでしょう。
コールバック実装において私がすんなりいかなかったポイントを本BLOGに記載しておきます。 コールバック以外の API 実装に関しては、とにかく LINE からのレスポンスを確認すること。これに尽きます。ステータスコードとエラー内容(レスポンスの BODY)を常にデバッグ出力して API コール時の何に不備があるか確認してください。だいたいは以下のようになるでしょう。
・セキュリティの設定が不正(CHANNEL関連のキーを正しく HTTP ヘッダに設定出来ていない)
API コール時のパラメータが不正(メッセージを送る際に宛先が配列だったのに string 単体で送っていたのでメッセージ送信は何度か失敗しました)
・IP アドレスのホワイトリストが正しくない

Callback URL

LINE develper の設定画面から Callback URL を設定するのですが、ここで指定する URL は https であることと :443 のポート番号指定をする必要があります。
例)

https://yourdomain.com:443/bot/callback

設定し保存時に Not secure URL or port number not sepcified. とエラーメッセージが出た場合はプロトコルとポート番号を確認しましょう。

設定したコールバックが呼ばれない

私は1日ほどして正常にコールバックが呼ばれるようになりましたが、作成当初は bot にLINE メッセージをしてもコールバックが呼ばれず、何が悪いのか検討もつかなかったです。 しかし翌日になると正常にコールバックが呼ばれるようになったので、LINE developer で Callback URL を設定しても即反映ではなさそうですので気をつけてください。

Server IP Whitelist

BOT がメッセージ送信する際に許可する IP アドレスを登録するのですが、これも反映まで時間がかかるようです。
BOT がメッセージを送信した際に、LINE サーバからこのIPアドレスは許可してないよというレスポンスが届くのですがこちらも Fixie の画面から得られる IP アドレスを LINE developer 設定画面から設定してしばらくするまでは正常に BOT が機能しませんでしたので気をつけてください。 しばらくはメッセージ送信時には以下のようなレスポンスが返ってきます。([X.X.X.X]は実際のIPアドレス)

{"statusCode":"427","statusMessage":"Your ip address [X.X.X.X] is not allowed to access this API."}
成功時

メッセージの送信が成功した場合は以下のような JSON がレスポンスとして返ってくるので、このレスポンスが返ってくるまで諦めずに頑張りましょう。

{"failed":[],"messageId":"1460222924676","timestamp":1460222924676,"version":1}

f:id:yone098:20160410031824p:plain:w300

LINE さんに要望

コールバックが呼ばれない間は、何が問題で呼ばれないのかさっぱり分からずここで断念する人が結構いるのでは?と思いました。
管理コンソールなどで、エラーログだけ見られるようにしてもらえると非常に良いと思いました。