takuocean’s diary

備忘録がメインなので、説明が足りないことも多い。もう少し詳しくという人はコメントをお願いします。

Line botの導入の仕方

ここではrailsで実装したサーバーをHerokuで実行してLine botを作っています。
Gitのアカウントは持っている前提で進めます。持っていない人は以下のサイトが参考になると思います。

GitHubアカウント作成とリポジトリの作成手順 - Qiita

1. Developer用のLineアカウントをゲットする

2. Channel SecretとChannel Access Tokenをゲットする

以下サイトを参考にしてアカウント作成からChannel SecretとChannel Aceess Tokenをゲットしてみてくだい。

わずか5分。新LINE Messaging APIでbotを作ってみた手順全公開 - BITA デジマラボ

3. サーバープログラムの作成

今回はLineで呟いたものを返答してくれるbotを作成します。
まずはrailsの初期ファイル群を作成します。

rails new botApp

次にサーバープログラムを作成していきます。
公式サイトでも紹介されている以下のAPIを利用。

github.com

botApp/app/controllers/webhook_controller.rb

require 'line/bot'

class WebhookController < ApplicationController
  protect_from_forgery with: :null_session # CSRF対策無効化

  def client
    @client ||= Line::Bot::Client.new { |config|
      config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
      config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
    }
  end

  def callback
    body = request.body.read

    signature = request.env['HTTP_X_LINE_SIGNATURE']
    # this statement maybe mistake.
    unless client.validate_signature(body, signature)
      error 400 do 'Bad Request' end
    end

    events = client.parse_events_from(body)
    events.each { |event|
      case event
      when Line::Bot::Event::Message
        case event.type
        when Line::Bot::Event::MessageType::Text
          message = {
            type: 'text',
            text: event.message['text']
          }
          response = client.reply_message(event['replyToken'], message)
        when Line::Bot::Event::MessageType::Image, Line::Bot::Event::MessageType::Video
          response = client.get_message_content(event.message['id'])
          tf = Tempfile.open("content")
          tf.write(response.body)
        end
      end
    }

    render status: 200, json: { message: 'OK' }
  end
end

次にGemfileを以下のように修正。

Gemfile
修正前

# Use sqlite3 as the database for Active Record
get 'sqlite3'

修正後

gem 'sqlite3', group: :development
# 本番ではpostgressを使用する
gem 'pg', group: :production
gem 'rails_12factor', group: :productio

また、

gem 'line-bot-api'

も追加。

*注意点
実はこれだけではForbidden 403というエラーが出たのであとで修正をします。

4. 作成したプログラムをgitにコミット

git init
git add .
git commit -m "initial commit"

5. Herokuへのデプロイ

まずはHerokuのアプリを登録するところを確保します。

heroku apps:create botAPPheroku

ここでbotAPPherokuは適当な名前で!他のひとが使っている名前は使えません。

次にこのスペースに先ほど作ったサーバープログラムを登録します。また、その際にLINE_CHANNEL_SECRETとLINE_CHANNEL_TOKENの変数も登録して下さい。

git push heroku master
heroku config:set LINE_CHANNEL_SECRET="Lineのdeveloperアカウントで取得したchannel_secret"
heroku config:set LINE_CHANNEL_TOKEN="Lineのdeveloperアカウントで取得したchannel_token"

git push heroku masterの時点でサーバーアプリは起動します。

6. Fixieアドオンを使う

このFixieアドオンを使うことでプロキシ経由の通信ができます。(Line botHTTPSによる通信でないとできないためこのようなことをします。)

heroku addons:create fixie:tricycle 

これによりherokuのアプリページにfixieアドオンが追加されています。 fixieアドオンのページに飛んでもらい右上のaccountをクリックするとプロキシURLとIPアドレスが作成されています。
これをメモしてください。

heroku config:set FIXIE_URL="example.com"

exmple.comにはプロキシURLを設定してください。

8. LineアカウントでコールバックURLとホワイトリストの設定

アカウントペーにcallback URLという欄があるので以下のように入力してください。隠れているところにはherokuに作ったアプリページ名を。

f:id:takuocean:20161108214429p:plain

ホワイトリストは左のメニューバーに
「Server IP Whitelist」
があるので選択。
表示されるページにIPアドレスを入力できるスペースがあるので先ほどfixieで取得したIPアドレスを入力。

7. サーバーアプリのログを見る

heroku logs -t

ここで紐づけられたLineアカウントにコメントしてみましょー
おそらく何も返ってこないでしょう。

はい、足りないものがありました。

8. プログラムの修正

プロキシを通す際には設定がhttpクラスに設定が必要でした。

botApp/app/controllers/webhook_controller.rbに以下の行を追加。

module Line
  module Bot
    class HTTPClient
      def http(uri)
        proxy = URI(ENV["FIXIE_URL"])
        http = Net::HTTP.new(uri.host, uri.port, proxy.host, proxy.port, proxy.user, proxy.password)
        if uri.scheme == "https"
          http.use_ssl = true
        end

        http
      end
    end
  end
end

...

修正後、gitに追加、コミット、herokuへpushすると、、、

f:id:takuocean:20161108221601p:plain

こんな感じでつぶやきが返ってきました。

次はこれをIFTTTとの連携に活かしてみます。

この記事は以下も参考にしました。

github.com

Hakell 導入

はじめまして、まだまだぴよぴよのエンジニアです。

経歴からいうと、大学では機械工学科で学び、材料力学を得意としてました。ただ画像処理をしてみたかったので、研究室では医療系の画像処理の研究に携わり、プログラマ人生がスタートしました!!!!現在は精密機械メーカーでプログラマをやってます。

主にC言語を業務では利用し、最近Haskellを勉強し始めました。

動機としては

    • 関数型言語をやってみたい
    • 周りの人がやっていない
    • このブログでべた褒めだった(笑)

      postd.cc

 

からです。

 

ということで、まずは環境作りから始めました。

  1. Haskellのインストール
  2. パッケージ管理ツール(stack)のインストール
  3. エディタ(vim)の導入

の順で説明します。OSはUbuntu14.04です。

 

1.Haskellのインストール

まずはHaskellをインストールします。

$ sudo apt-get install haskell-platform

このコマンドで以下を一括でインストールできます。

ghcはhakellで一番使われるコンパイラインタプリタ(ghci)です。 

 

2.パッケージ管理ツール(stack)のインストール

次にHaskellのパケージ管理ツールであるstackをインストールします。

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 575159689BEFBh442
echo 'deb http://download.fpcomplete.com/ubuntu trusty main'|sudo tee /etc/apt/sources.list.d/fpco.list
sudo apt-get update && sudo apt-get install stack -y
stack setup

ubuntuでいうapt-getみたいなものなのかな?

stack path

でstackに関するPathが表示されます。

 

3.エディタ(vim)の導入

最後にエディタを導入します。僕は普段エディタはvimを使うので、vimをこれからもvimを使った説明をしていきます。vimをいれたい人は以下のコマンドでインストールしてください。

sudo apt-get install vim

これでhaskellを動かせます。試しに与えた引数の約数を求めるプログラムを動かしてみます。sample.hsと書いてみてください。

vim sample.hs

ここに約数を求めるfactors関数を記述していきます。vim初めての人は上のコマンドを実行した後,「i」を押して以下のソースを入力します。

factors :: Int -> [Int]
factors n = [x | x <- [1..n], n `mod` x == 0]

入力後、「Esc」→「:wq!」の順で入力していきます。vimについては後日書いていきたいと思います。

ghciを立ち上げて

ghci

以下のコマンドを実行します。

:l sample.hs

これで先ほどのfactorsがロードされました。

factors 10

とすると、[1,2,5,10]という結果が返ってきます。確かに、この4つの数字は10の約数ですね。

 

プログラムを動かすところまでできました。では、また!

 

初投稿

エンジニアとしてステップアップするためにブログを始めました。

Linuxについて

Haskellの書き方、エディター

・セキュリティについて

について書きたいと思います。

他にも、学んだことや備忘録などいろいろ書きます。

 

宜しくお願いします。