初心者がseleniumを使ってInstagramをエゴサするBotを作るお話(実行部分編)
・はじめに
前回までで作ったクラスを引き継いで実行する部分を作ります。それだけ。
・実装
require './selenium'
require './Google_spreadsheet'
require 'net/https'
require 'json'
def slack_chat_post(item_url,image_url,post_text,author_name,author_icon,post_date)
uri = URI.parse("https://slack.com/api/chat.postMessage")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
req = Net::HTTP::Post.new(uri.path)
attachments = [{"text": post_text,
"image_url": image_url,
"author_name": author_name,
"author_icon": author_icon,
"footer":post_date
}].to_json
req.set_form_data({"token": TOKEN,
"channel": "sns_reaction",
"text": item_url,
"icon_emoji": ":instagram:",
"username": "InstaBot",
"attachments": attachments
})
http.request(req)
end
spreadsheet_id = SPREADSHEET_ID
range_name = 'master!A1:G'
username = INSTA_EMAIL
password = INSTA_PASSWORD
keywords = [keyword1,keyword2,keyword3]
values = []
spreadsheet = GoogleSpreadsheet.new(spreadsheet_id,range_name)
insta_bot = InstaBot.new(username,password)
lastpost = spreadsheet.get_lastpost_date
keywords.each do |keyword|
values += insta_bot.search_and_scrape_values(keyword,lastpost)
end
if values.empty?
puts "new post isn't exist"
else
values.uniq!
values.sort_by!(&:last)
spreadsheet.append(values)
values.each {|value| slack_chat_post(value[0],value[1],value[2],value[3],value[4],value[5])}
end
instagramはURLをslackのチャンネルに投げても展開されず、中身がわからないのでattachmentsを使ってそれっぽく投稿されるようにしました。参考にしたのはこちら。
・解説
slackのAPIを叩いてチャンネルに投稿したいが、それだけならgemを導入するよりも書いたほうがシンプルかな?と思い、書きました。ほとんど以下の記事の写経です。
クラスに渡す引数の設定、クラスの初期化などを済ませた後、設定したkeywordを順にsearch_and_scrape_valuesメソッドに渡して繰り返し、得られた配列をuniq、sort_by(&:last)で整えたらspreadsheetとslackに投げ込む。見たまんまですね。
始めはvalues.empty?での条件分岐がなかったのですが、instagramに対象の新規投稿がないとエラーを吐いてしまうため慌てて追加しました。もうちょっと慣れていきたいところです……
・感想
最近競プロでrubyを修行しているおかげで配列の扱いや繰り返しに慣れたのでいい感じにできました。chat_postメソッドに渡している引数の形が汚いので小綺麗にしたかったがうまくできなくて悲しい、配列の数と仮引数の数があっていれば配列を渡しても大丈夫と見たのですがエラーが出てしまいました。
めんどくさいので整えず次の作業に移ったのですが、うまいやり方がありましたら教えてください。
この記事が気に入ったらサポートをしてみませんか?