前回,さくらサーバー上のJulia言語でGET,POSTを受け取るところまでできました.
Julia言語をさくらサーバーで使ってみる.
今回はついにLINEからのメッセージに自動で応答してみたいと思います.
LINE Botの作成にはLINEの公式アカウントを作成する必要がありますが,その辺りの詳細は他の記事にお任せします.
#ものすごく応答が遅いです.どなたか対処方法をご存知でしたら教えてください.
Julia言語(サーバー)側の設定
# 以下は処理をわかりやすくするためにシンプルにしています.本番に適用させるのであれば工夫が必要になるかと思います.
処理のイメージとしては以下となるかと思います.
1.LINEからのPOSTを受け取る
2.POSTのbody(JSON形式)にあるreplyTokenを取得する.
3.HeaderにLINE Developersで事前に取得しているアクセストークンを設定,bodyに2.で取得したreplyTokenと応答したい内容を設定(JSON形式)して以下のURLにPOST
https://api.line.me/v2/bot/message/reply
以下,実際の内容です.
Julia言語をさくらサーバーで使ってみる.ここまではすでにできている想定です.
1.LINEからのPOSTを受け取る
HTTPからのリクエストMethodがGETかPOSTかは環境変数に含まれており,以下で取得できます.
# ENVの中に環境変数が入っておりその中に"REQUEST_METHOD" GET or POST(またはそのほか)が含まれている
ENV["REQUEST_METHOD"]
2.POSTのbody(JSON形式)にあるreplyTokenを取得する.
LINEからのPOSTに返信するためにはbody(JSON形式)に含まれるreplyTokenを設定して返す必要があります.
したがってこれを取得しておくのは必須かと思います.
またそのほか,個人的にbodyの中で必要かと思うのは,text(ユーザーから送られた内容),messageID(ユーザーから画像が送られてきた際に画像を取得するのに必要)になります.
# bodyの内容を取得
req = readline()
# JSON形式に変換
req_json = JSON.parse(req)
# replyTokenの取得.返信には必須
replyToken = req_json["events"][1]["replyToken"]
# ユーザーから送られてきたTextを取得.(送信内容がtextだった場合)
text = req_json["events"][1]["message"]["text"]
# MessageIDの取得.画像などは取得する際に必要となる
messageID = req_json["events"][1]["message"]["id"]
# ユーザーから送られてきたType(textか画像かスタンプかなど)を取得
messageType = req_json["events"][1]["message"]["type"]
3.情報を設定してLINEに応答をする
2.で取得したreplyTokenを使用して実際に応答します.
# POST先のURLを設定
url = "https://api.line.me/v2/bot/message/reply"
# ヘッダー情報の設定.事前に取得しているLINE TOKENを設定する必要がある(本当はベタがきは良くない)
headers = Dict("Content-Type" => "application/json;charset=UTF-8"
, "Authorization" => "Bearer *** 事前に取得しているアクセストークン ***")
# 返答したい内容の設定
text = "Hello World!!!"
# 2.でした取得したreplyTokenとtext(返答したい内容)を設定してbodyを作成
body = Dict(
"replyToken" => replyToken,
"messages" =>[ Dict(
"type" => "text",
"text" => text
)]
)
# POST
HTTP.request("POST", url, headers , JSON.json(body) )
1つにまとめると以下のようになるかと思います.
#!//home/analytics-piyo/local/julia-1.5.4/bin/julia
using HTTP
using JSON
# POSTされた場合,本当はLINE以外からのPOSTを除外する必要がある
if ENV["REQUEST_METHOD"] == "POST"
# bodyの内容を取得
req = readline()
req_json = JSON.parse(req)
replyToken = req_json["events"][1]["replyToken"]
messageID = req_json["events"][1]["message"]["id"]
messageType = req_json["events"][1]["message"]["type"]
text = req_json["events"][1]["message"]["text"]
# POSTデータの作成
url = "https://api.line.me/v2/bot/message/reply"
headers = Dict("Content-Type" => "application/json;charset=UTF-8"
, "Authorization" => "Bearer *** 事前に取得しているアクセストークン ***")
text = "Hello World!!!"
body = Dict(
"replyToken" => replyToken,
"messages" =>[ Dict(
"type" => "text",
"text" => text
)]
)
# 実際にPOST
HTTP.request("POST", url, headers , JSON.json(body) )
end
ちなみに僕はDebugのやり方がわからず苦労したのですが,textファイルに都度書き込んで確認していました.
以下のように.
open("debug.txt", "a") do fp
println(fp, @show req)
end
LINE側の設定(Developers)
以下のサイトでLINE公式アカウントを作成します.
(詳細は他のサイトにお任せします.正直数年前に作成したので忘れました)
LINE Developers
・アカウントを作成したらアクセストークンを取得します.
・次にWebhookの設定をします.
Webhook URLにはindex.cgiファイルが置いてあるパスを指定します.
※注意※
“検証”をした際に正しくURLを設定して,正しくファイルを作成できていても以下のようなエラーが出ます.
“Webhookイベントオブジェクト送信時にタイムアウトが発生しました”
これは検証用の記述を入れておかないと起きます.
ちゃんと検証していないですが,以下の場合の処理を作成する必要があるのかもしれません.
(過去の自分のnode.jsで作成した時の記述を見ると)
replyToken == “00000000000000000000000000000000”
個人的にはわざわざここの検証の機能を使用して確認する必要はないと思うので,無視でいいと思います.
終わりに
以下が今回のLINE Botになります.メッセージをおくると”Hello Wolrd!!!”と返します.
# 常にいじっているので動かない時もあるかもしれないです.その時はそういうタイミングなんだなと思ってください.
# 応答が遅いです.改善策を求めています
7月から始めてやっとここまできました.
Julia言語になれるために開発をしていましたが,そろそろ飽きてきたのでデータを扱うこともやり始めたいなと思います.
この記事が80億分の1の誰かに役立てば嬉しいなと思います.