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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Q&A

解決済

1回答

352閲覧

Ruby:多段のハッシュを効率的に書きたい。

taruya

総合スコア8

Ruby

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

0グッド

0クリップ

投稿2018/10/09 02:46

Rubyを用いて、APIを取得してSlackに送信するプログラムを書いているのですが、以下のハッシュの使い方が汚いと感じました。eachメソッドを用いるとうまくデータが取得できず、下記よりも効率的な書き方を、教えて頂きたいです。

lang

1 size.times do |i| 2 vulners_datas[i]['id'] = result['data']['search'][i]['_source']['id'] 3 vulners_datas[i]['title'] = result['data']['search'][i]['_source']['title'] 4 vulners_datas[i]['href'] = result['data']['search'][i]['_source']['href'] 5 vulners_datas[i]['published'] = result['data']['search'][i]['_source']['published'] 6 vulners_datas[i]['modified'] = result['data']['search'][i]['_source']['modified'] 7 vulners_datas[i]['description'] = result['data']['search'][i]['_source']['description'] 8 vulners_datas[i]['cvss_score'] = result['data']['search'][i]['_source']['cvss']['score'] 9 print vulners_datas[i]['id'] + "\t\t" +vulners_datas[i]['modified'] + "\n" 10 end 11

プログラムの内容は以下の通りです。
➀Vulners APIから脆弱情報をJSON形式で取得する。
➁取得したデータをハッシュに格納する。
➂格納したデータをSlackに送信。

APIを取得するURL
https://vulners.com/api/v3/search/lucene%20+%20/?query=type%3Acisco%20%20&sort=order%3Apublished%20%20&size=1

get-vulners.rb

lang

1def get_vulners(size) 2 #1.Vulners APIを取得 3 vulners_datas = Hash.new{ |h,k| h[k] = {}} 4 5 uri = URI.parse("https://vulners.com/api/v3/search/lucene" + "/?query=type%3Acisco" + "&sort=order%3Apublished" + "&size=#{size}") 6 json = Net::HTTP.get(uri) 7 result = JSON.parse(json) 8 9 #返ってきた値をvulners_datasに格納 10 size.times do |i| 11 vulners_datas[i]['id'] = result['data']['search'][i]['_source']['id'] 12 vulners_datas[i]['title'] = result['data']['search'][i]['_source']['title'] 13 vulners_datas[i]['href'] = result['data']['search'][i]['_source']['href'] 14 vulners_datas[i]['published'] = result['data']['search'][i]['_source']['published'] 15 vulners_datas[i]['modified'] = result['data']['search'][i]['_source']['modified'] 16 vulners_datas[i]['description'] = result['data']['search'][i]['_source']['description'] 17 vulners_datas[i]['cvss_score'] = result['data']['search'][i]['_source']['cvss']['score'] 18 print vulners_datas[i]['id'] + "\t\t" +vulners_datas[i]['modified'] + "\n" 19 end 20 #2.Slackの着信Webフック 21 slack = Slack::Incoming::Webhooks.new("ここにトークンを記述") 22 slack.post("新たな脆弱性をキャッチしました。") 23 size.times do |i| 24 slack.post "#{i + 1}件目".to_json 25 slack.post vulners_datas[i]['modified'].to_json 26 slack.post vulners_datas[i]['id'].to_json 27 slack.post vulners_datas[i]['href'].to_json 28 slack.post vulners_datas[i]['cvss_score'].to_json 29 slack.post (vulners_datas[i]['description']).to_json 30 end 31 #TODO Slackに送信できたかどうかを確認してターミナルに出力 32end 33 34print "件数:" 35input = gets.chomp.to_i 36get_vulners(input)

質問自体は表題の通りなのですが、API関連など、もしアドバイスがありましたらそちらも是非お願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

一度vulners_datasに代入する意味が分かりませんので、それをスキップ。

Ruby

1def get_vulners(size) 2 #1.Vulners APIを取得 3 uri = URI.parse("https://vulners.com/api/v3/search/lucene" + "/?query=type%3Acisco" + "&sort=order%3Apublished" + "&size=#{size}") 4 json = Net::HTTP.get(uri) 5 result = JSON.parse(json) 6 7 #2.Slackの着信Webフック 8 slack = Slack::Incoming::Webhooks.new("ここにトークンを記述") 9 slack.post("新たな脆弱性をキャッチしました。") 10 result["data"]["search"].each_with_index do |x,i| 11 data = x["_source"] 12 slack.post "#{i + 1}件目".to_json 13 slack.post data["modified"].to_json 14 slack.post data["id"].to_json 15 slack.post data["href"].to_json 16 slack.post data["cvss"]["score"].to_json 17 slack.post data["description"].to_json 18 puts "#{data["id"]}\t\t#{data["modified"]}" 19 end 20 #TODO Slackに送信できたかどうかを確認してターミナルに出力 21end 22 23print "件数:" 24input = gets.chomp.to_i 25get_vulners(input)

投稿2018/10/09 03:53

otn

総合スコア84555

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

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

taruya

2018/10/14 13:33

なるほど…!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問