質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

0回答

1040閲覧

line apiを使い現在地の天気を返せるようにしたい。

wassa-

総合スコア0

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2020/07/16 11:17

以下のコードは適当なテキストを送信すると東京の降水確率を返してくれるコードです。
以下のコードでは正常に動作しました。

no1 class LinebotController < ApplicationController require 'line/bot' # gem 'line-bot-api' require 'open-uri' require 'kconv' require 'rexml/document' # callbackアクションのCSRFトークン認証を無効 protect_from_forgery :except => [:callback] def callback body = request.body.read signature = request.env['HTTP_X_LINE_SIGNATURE'] unless client.validate_signature(body, signature) return 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 # event.message['text']:ユーザーから送られたメッセージ input = event.message['text'] url = "https://www.drk7.jp/weather/xml/13.xml" xml = open( url ).read.toutf8 doc = REXML::Document.new(xml) xpath = 'weatherforecast/pref/area[4]/' # 当日朝のメッセージの送信の下限値は20%としているが、明日・明後日雨が降るかどうかの下限値は30%としている min_per = 30 case input # 「明日」or「あした」というワードが含まれる場合 when /.*(明日|あした).*/ # info[2]:明日の天気 per06to12 = doc.elements[xpath + 'info[2]/rainfallchance/period[2]'].text per12to18 = doc.elements[xpath + 'info[2]/rainfallchance/period[3]'].text per18to24 = doc.elements[xpath + 'info[2]/rainfallchance/period[4]'].text if per06to12.to_i >= min_per || per12to18.to_i >= min_per || per18to24.to_i >= min_per push = "明日の天気だよね。\n明日は雨が降りそうだよ(>_<)\n今のところ降水確率はこんな感じだよ。\n  6〜12時 #{per06to12}%\n 12〜18時  #{per12to18}%\n 18〜24時 #{per18to24}%\nまた明日の朝の最新の天気予報で雨が降りそうだったら教えるね!" else push = "明日の天気?\n明日は雨が降らない予定だよ(^^)\nまた明日の朝の最新の天気予報で雨が降りそうだったら教えるね!" end when /.*(明後日|あさって).*/ per06to12 = doc.elements[xpath + 'info[3]/rainfallchance/period[2]l'].text per12to18 = doc.elements[xpath + 'info[3]/rainfallchance/period[3]l'].text per18to24 = doc.elements[xpath + 'info[3]/rainfallchance/period[4]l'].text if per06to12.to_i >= min_per || per12to18.to_i >= min_per || per18to24.to_i >= min_per push = "明後日の天気だよね。\n何かあるのかな?\n明後日は雨が降りそう…\n当日の朝に雨が降りそうだったら教えるからね!" else push = "明後日の天気?\n気が早いねー!何かあるのかな。\n明後日は雨は降らない予定だよ(^^)\nまた当日の朝の最新の天気予報で雨が降りそうだったら教えるからね!" end when /.*(かわいい|可愛い|カワイイ|きれい|綺麗|キレイ|素敵|ステキ|すてき|面白い|おもしろい|ありがと|すごい|スゴイ|スゴい|好き|頑張|がんば|ガンバ).*/ push = "ありがとう!!!\n優しい言葉をかけてくれるあなたはとても素敵です(^^)" when /.*(こんにちは|こんばんは|初めまして|はじめまして|おはよう).*/ push = "こんにちは。\n声をかけてくれてありがとう\n今日があなたにとっていい日になりますように(^^)" else per06to12 = doc.elements[xpath + 'info/rainfallchance/period[2]l'].text per12to18 = doc.elements[xpath + 'info/rainfallchance/period[3]l'].text per18to24 = doc.elements[xpath + 'info/rainfallchance/period[4]l'].text if per06to12.to_i >= min_per || per12to18.to_i >= min_per || per18to24.to_i >= min_per word = ["雨だけど元気出していこうね!", "雨に負けずファイト!!", "雨だけどああたの明るさでみんなを元気にしてあげて(^^)"].sample push = "今日の天気?\n今日は雨が降りそうだから傘があった方が安心だよ。\n  6〜12時 #{per06to12}%\n 12〜18時  #{per12to18}%\n 18〜24時 #{per18to24}%\n#{word}" else word = ["天気もいいから一駅歩いてみるのはどう?(^^)", "今日会う人のいいところを見つけて是非その人に教えてあげて(^^)", "素晴らしい一日になりますように(^^)", "雨が降っちゃったらごめんね(><)"].sample push = "今日の天気?\n今日は雨は降らなさそうだよ。\n#{word}" end end # テキスト以外(画像等)のメッセージが送られた場合 else push = "テキスト以外はわからないよ〜(;;)" end message = { type: 'text', text: push } client.reply_message(event['replyToken'], message) # LINEお友達追された場合(機能②) when Line::Bot::Event::Follow # 登録したユーザーのidをユーザーテーブルに格納 line_id = event['source']['userId'] User.create(line_id: line_id) # LINEお友達解除された場合(機能③) when Line::Bot::Event::Unfollow # お友達解除したユーザーのデータをユーザーテーブルから削除 line_id = event['source']['userId'] User.find_by(line_id: line_id).destroy end } head :ok end private def client @client ||= Line::Bot::Client.new { |config| config.channel_secret = ENV["LINE_CHANNEL_SECRET"] config.channel_token = ENV["LINE_CHANNEL_TOKEN"] } end end コード

no1のコードに現在地を送信するとそこの天気を返してくれる機能を追加したい。そこで以下のno2のコードをno1のコードのどこかに追加しようと思っている。

no2 when Line::Bot::Event::MessageType::Location       # LINEの位置情報から緯度経度を取得 latitude = event.message['latitude'] longitude = event.message['longitude'] appId = "取得したAPI KEY" url= "http://api.openweathermap.org/data/2.5/forecast?lon=#{longitude}&lat=#{latitude}&APPID=#{appId}&units=metric&mode=xml" # XMLをパースしていく xml = open( url ).read.toutf8 doc = REXML::Document.new(xml) xpath = 'weatherdata/forecast/time[1]/' nowWearther = doc.elements[xpath + 'symbol'].attributes['name'] nowTemp = doc.elements[xpath + 'temperature'].attributes['value'] case nowWearther      # 条件が一致した場合、メッセージを返す処理。絵文字も入れています。 when /.*(clear sky|few clouds).*/ push = "現在地の天気は晴れです\u{2600}\n\n現在の気温は#{nowTemp}℃です\u{1F321}" when /.*(scattered clouds|broken clouds|overcast clouds).*/ push = "現在地の天気は曇りです\u{2601}\n\n現在の気温は#{nowTemp}℃です\u{1F321}" when /.*(rain|thunderstorm|drizzle).*/ push = "現在地の天気は雨です\u{2614}\n\n現在の気温は#{nowTemp}℃です\u{1F321}" when /.*(snow).*/ push = "現在地の天気は雪です\u{2744}\n\n現在の気温は#{nowTemp}℃です\u{1F321}" when /.*(fog|mist|Haze).*/ push = "現在地では霧が発生しています\u{1F32B}\n\n現在の気温は#{nowTemp}℃です\u{1F321}" else push = "現在地では何かが発生していますが、\nご自身でお確かめください。\u{1F605}\n\n現在の気温は#{nowTemp}℃です\u{1F321}" end コード

しかし、no1のコードのどこにno2のコードを追加したら良いかわかりません。
実際に入れてみたのですがうまく動きませんでした。文字数の関係で実際に入れたコードを載せることはかないません。よろしくお願いします。
参考にしたサイト
https://qiita.com/shimpex/items/00afb96211d143415f00

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問