🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
LINE Messaging API

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

Ruby

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

Ruby on Rails

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

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

2回答

1444閲覧

rubyでAPIを叩きたい。

sekimori0802

総合スコア15

LINE Messaging API

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

Ruby

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

Ruby on Rails

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

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2019/10/02 10:45

編集2019/10/03 01:05

前提・実現したいこと

叩いたJSON形式のAPIをrubyで取得したいです。

発生している問題・エラーメッセージ

APIを」叩きurlを所得したのですがその部分でnil class
とエラーが出ており困っております。

エラーメッセージI, [2019-10-03T00:56:21.711041 #4] INFO -- : [eb3f8fb8-27c3-413a-93cf-c2b167063968] Completed 500 Internal Server Error in 922ms 2019-10-03T00:56:21.711691+00:00 app[web.1]: F, [2019-10-03T00:56:21.711621 #4] FATAL -- : [eb3f8fb8-27c3-413a-93cf-c2b167063968] 2019-10-03T00:56:21.711762+00:00 app[web.1]: F, [2019-10-03T00:56:21.711705 #4] FATAL -- : [eb3f8fb8-27c3-413a-93cf-c2b167063968] NoMethodError (undefined method `sample' for nil:NilClass): 2019-10-03T00:56:21.711817+00:00 app[web.1]: F, [2019-10-03T00:56:21.711765 #4] FATAL -- : [eb3f8fb8-27c3-413a-93cf-c2b167063968] 2019-10-03T00:56:21.711880+00:00 app[web.1]: F, [2019-10-03T00:56:21.711829 #4] FATAL -- : [eb3f8fb8-27c3-413a-93cf-c2b167063968] app/controllers/linebot_controller.rb:48:in `block in callback' 2019-10-03T00:56:21.711881+00:00 app[web.1]: [eb3f8fb8-27c3-413a-93cf-c2b167063968] app/controllers/linebot_controller.rb:28:in `each' 2019-10-03T00:56:21.711883+00:00 app[web.1]: [eb3f8fb8-27c3-413a-93cf-c2b167063968] app/controllers/linebot_controller.rb:28:in `callback' sasaotookinoAir:ra-mennapp sasaotoyoki$

該当のソースコード

events.each { |event| if event.message['text'] != nil place = event.message['text'] #ここでLINEで送った文章を取得 result = `curl -X GET https://api.gnavi.co.jp/RestSearchAPI/v3/?keyid=78d2d49f3aa8747a6cc03da01cf41bdd&category_s=RSFST08008&category_s=RSFST08009&#{place}`#ここでぐるなびAPIを叩く else latitude = event.message['latitude'] longitude = event.message['longitude'] result = `curl -X GET https://api.gnavi.co.jp/RestSearchAPI/v3/?keyid=78d2d49f3aa8747a6cc03da01cf41bdd&category_s=RSFST08008category_s=RSFST08009&latitude=#{latitude}longitude=#{longitude}` #ここでぐるなびAPIを叩く end hash_result = JSON.parse result #レスポンスが文字列なのでhashにパースする shops = hash_result["rest"] #ここでお店情報が入った配列となる shop = shops.sample #任意のものを一個選ぶ

全体ソースコード

class LinebotController < ApplicationController require 'line/bot' # gem 'line-bot-api' require "json" # callbackアクションのCSRFトークン認証を無効 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) error 400 do 'Bad Request' end end events = client.parse_events_from(body) #ここでlineに送られたイベントを検出している # messageのtext: に指定すると、返信する文字を決定することができる #event.message['text']で送られたメッセージを取得することができる events.each { |event| if event.message['text'] != nil place = event.message['text'] #ここでLINEで送った文章を取得 result = `curl -X GET https://api.gnavi.co.jp/RestSearchAPI/v3/?keyid=78d2d49f3aa8747a6cc03da01cf41bdd&category_s=RSFST08008&category_s=RSFST08009&#{place}`#ここでぐるなびAPIを叩く#{place} else latitude = event.message['latitude'] longitude = event.message['longitude'] puts event.message['latitude'] puts event.message['longitude'] puts event.message['latitude'].class result = `curl -X GET https://api.gnavi.co.jp/RestSearchAPI/v3/?keyid=78d2d49f3aa8747a6cc03da01cf41bdd&category_s=RSFST08008&category_s=RSFST08009&latitude=#{latitude}&longitude=#{longitude}`#ここでぐるなびAPIを叩くlatitude=#{latitude}longitude=#{longitude} end hash_result = JSON.parse(result)#レスポンスが文字列なのでhashにパースする shops = hash_result["rest"] #ここでお店情報が入った配列となる shop = shops.sample #任意のものを一個選ぶ puts shop 店の情報 url = shop["url_mobile"] #サイトのURLを送る shop_name = shop["name"] #店の名前 category = shop["category"] #カテゴリー open_time = shop["opentime"] #空いている時間 holiday = shop["holiday"] #定休日 if open_time.class != String #空いている時間と定休日の二つは空白の時にHashで返ってくるので、文字列に直そうとするとエラーになる。そのため、クラスによる場合分け。 open_time = "" end if holiday.class != String holiday = "" end response = "【店名】" + shop_name + "\n" + "【カテゴリー】" + category + "\n" + "【営業時間と定休日】" + open_time + "\n" + holiday + "\n" + url case event #case文 caseの値がwhenと一致する時にwhenの中の文章が実行される(switch文みたいなもの) when Line::Bot::Event::Message case event.type when Line::Bot::Event::MessageType::Text,Line::Bot::Event::MessageType::Location message = { type: 'text', text: response } client.reply_message(event['replyToken'], message) end end } head :ok end end

試したこと

NET::htmlを試したり、このサイトのapi関連の記事を読み自分なりに実行してみましたが解決せず。

補足情報

hash_result = JSON.parse result までは値が入っているのですが、shopsにnilが出てしまいます。
文法的なミスを探したのですが、特に該当しそうな部分がなく質問させていただきました。

大変稚拙な質問で恐縮なのですがお答えいただけると幸いです。

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

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

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

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

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

guest

回答2

0

この質問だけ見た場合

keyidがテスト用なので、おそらく使えない
変数placeに入る文字列が不明だが、相当面倒くさい

おそらく、hash_result["error"]["message"]にエラーメッセージが入っているので表示してみてはいかがでしょうか?

投稿2019/10/02 13:57

asm

総合スコア15149

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

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

sekimori0802

2019/10/03 01:06

拙い質問にお答えいただきありがとうございます。ぐるなびキーは登録時のものを使用し、エラーメッセージの方確認してみます。
guest

0

shopsnilということなので、hash_resultが期待通りの内容でないということです。
よく見ましょう。(としか言いようがない。情報がないので)

#追記
あと、

Ruby

1result = `curl -X GET https://~~~` 2```のようなGETメソッドであれば、 3```Ruby 4require "open-uri" 5 6result = open("https://~~~",&:read) 7```と、外部コマンドを呼ばないで書けます。

投稿2019/10/02 13:49

編集2019/10/03 06:02
otn

総合スコア85893

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

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

sekimori0802

2019/10/03 01:07

わかりづらい質問にご丁寧にお答えいただきありがとうございます。json型で取ってきたapiのコードをハッシュに変換出来ていないみたいなのですが、調べてみます。
otn

2019/10/03 05:55

JSON.parse で、エラーが出ていないので、JSON形式の文字列が得られていることは大丈夫です。 おそらくエラーを通知するデータになっていて、"rest"のキーがないのでしょう。 hash_result = JSON.parse result の前に、 p result を入れてみるという発想が出てくるようにしましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問