1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

LaTeX表記の数式を画像で返送するLINE botの作成

$ax^2+bx+c=0$のように$記号でLaTeX表記の数式を囲むと、画像が返送されます。なお、1つのメッセージにつき1つの数式を返すことができます。
スクリーンショット 2020-07-19 23.26.59.png
LaTeX表記については、http://www.latex-cmd.com をご覧ください。

友だち追加

ここから友だち追加をすることができます。

開発

以下の参考を読み、実装しました。

参考

Google Chart APIの数式は非推奨となったようなので、いつ使えなくなるかはわかりません。
CGIモジュールを使用しているのは、+などの記号をエンコードする必要があるためです。

callback.rb
class LinebotController < ApplicationController
  require 'line/bot'
  require 'cgi'

  protect_from_forgery :except => [:callback]

  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']
    unless client.validate_signature(body, signature)
      head :bad_request
    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
          if event.message['text'].include?('$')
            formula = CGI.escape(event.message['text'].match(/(?<=\$)(.*)(?=\$)/).to_s())
            message = {
              type: "image",
              originalContentUrl: "https://chart.apis.google.com/chart?cht=tx&chl=#{formula}",
              previewImageUrl: "https://chart.apis.google.com/chart?cht=tx&chl=#{formula}"
            }
            client.reply_message(event['replyToken'], message)
          end
        end
      end
    }

    head :ok
  end
end
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
1
Help us understand the problem. What are the problem?