Skip to content

Instantly share code, notes, and snippets.

@esmerino
Created May 7, 2018 10:28
Show Gist options
  • Save esmerino/80a0a68f5f471690093eb457a94ca2b9 to your computer and use it in GitHub Desktop.
Save esmerino/80a0a68f5f471690093eb457a94ca2b9 to your computer and use it in GitHub Desktop.
require 'watir'
require 'nokogiri'
require 'json'
require 'open-uri'
class Sptrans
attr_accessor :operator
def initialize(params = {})
@operator = params.fetch(:operator)
end
def data
begin
browser = Watir::Browser.new :phantomjs, :args => ['--ignore-ssl-errors=yes', '--ssl-protocol=TLSv1']
login(user: operator.user, password: operator.password, browser: browser)
operator.cards.map(&:destroy) unless redis.smembers("#{operator.name.split.join("-").downcase}-page").present?
pages(browser: browser).map do |page|
page_blocks = JSON.parse(page)
page_blocks[1].map do |page_block|
browser.goto("https://lv.sbe.sptrans.com.br/Empregado.jsp?filtroNome=&filtroRg=&filtroCpf=&filtroRgDigito=&codigoEmpregador=241014&codigoSUS=&actualBar=#{page_blocks[0]}&pageIndex=#{page_block}&")
Watir::Wait.until(timeout:9000){browser.table(class:"box_list").present?}
html = browser.body.html
Nokogiri::HTML(html).css("table.box_list").css("tr")[1..-1].map do |tr|
registe_employee = tr.css("a")[0]['href'].split("&").map{|a| a.gsub(/[^\d]/, "")}
browser.goto("https://lv.sbe.sptrans.com.br/#{tr.css("a")[0]['href']}")
html = browser.body.html
name_employee = Nokogiri::HTML(html).at('input[@name="nomeEmpregado"]')['value']
cpf_employee = Nokogiri::HTML(html).at('input[@name="cpf"]')['value']
Nokogiri::HTML(html).css("table.box_list").css("tr")[1..-1].map do |tr|
if tr.css('td')[0].text.size == 9
next if Card.where("data @>'#{{logic_number:tr.css('td')[0].text}.to_json}'").present?
ActiveRecord::Base.transaction do
Card.create!({
data: {
name: name_employee,
document: cpf_employee,
uniq_identify: registe_employee[5],
logic_number: tr.css('td')[0].text,
card_type: tr.css('td')[1].text,
card_type_cod: set_card_type_cod(tr.css('td')[1].text),
physical_number: tr.css('td')[2].text,
status: tr.css('td')[3].text,
status_cod: set_status_cod(tr.css('td')[3].text),
created: format_created(tr.css('td')[4].text),
item_code: ["0846", "0843", "0840", "0001", "0002", "0008", "0013"],
},
operator_id: operator.id
})
end
end
end
end
end
redis.srem("#{operator.name.split.join("-").downcase}-page", page)
end
rescue => e
$stderr.puts "#{operator.name}:#{e}"
browser.close if browser
raise StandardError, "processing data"
end
end
private
def login(params = {})
params[:browser].goto("https://lv.sbe.sptrans.com.br/Login.jsp")
params[:browser].text_field(name:'txtLogin').set(params[:user])
params[:browser].text_field(name:'txtSenha').set(params[:password])
params[:browser].execute_script('logar();')
sleep(2)
end
def pages(params = {})
unless redis.smembers("#{operator.name.split.join("-").downcase}-page").present?
datas = []
params[:browser].goto("https://lv.sbe.sptrans.com.br/Empregado.jsp")
html = params[:browser].body.html
(1..Nokogiri::HTML(html).css('table.main_box')[2].css('tr')[1].css('strong').text.split(" ")[-2].to_i/182).to_a.map do |a|
datas << [a,(a == 1 ? (a..a+9).to_a : (datas.last[1].last).to_i+1..datas.last[1].last+10).to_a]
end
datas.map do |data|
redis.sadd("#{operator.name.split.join("-").downcase}-page", "#{data}")
end
end
redis.smembers("#{operator.name.split.join("-").downcase}-page")
end
def redis
Redis.new(url: "redis://localhost:6379/0")
end
def set_card_type_cod(tipo)
case tipo
when "M. Paulist."
"0071"
when "V.T. Comum"
"0059"
when "VT-BUT"
"0100"
end
end
def set_status_cod(tipo)
case tipo
when "Ativo"
"1"
when "Cancelado"
"2"
when "Pendente"
"3"
end
end
def format_created(date)
d = date.split("/")[0]
m = date.split("/")[1]
y = date.split("/")[2]
"#{y}#{m}#{d}"
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment