[ruby-fatecsp] Script de exemplo em Ruby

8 views
Skip to first unread message

Bruno Coimbra

unread,
Dec 16, 2009, 9:55:18 AM12/16/09
to Ruby Fatec-SP
Povo,

Segue abaixo um exemplo de script em Ruby.

Ele foi escrito, pois não vou mto com a cara de ficar entrando no site da
fatec pra verificar se os professores já lançaram os conceitos.

São necessárias as gems nokogiri, htmlentities, mechanize e highline.

<code>
# encoding: iso-8859-1
require 'rubygems'
require 'mechanize'
require 'highline/import'
require 'htmlentities'

### Solicita o nro da matricula e senha do site da FATEC-SP
user = ask('matricula: ')
pass = ask("senha: " ) { |c| c.echo = "*" }

exit 1 if user.empty? or pass.empty?

### inicializa o Mechanize
browser = WWW::Mechanize.new
uri = URI.parse('http://san.fatecsp.br')

### solicita a página
page = browser.get uri

### pede, gentilmente, para o mechanize achar o formulário de login
login_form = page.form('login')

### seta os valores
login_form.userid = user
login_form.password = pass

### envia o formulário
page = browser.submit(login_form)

### solicita a página dos conceitos finais
con_page = browser.click page.link_with(:href => "?task=conceitos_finais")

### Faz o parse da página
conceitos = con_page.body
dis_ary = conceitos.scan(/<td class="sigla"[^>]*>([^<]+)<\/td>/).flatten
con_ary = conceitos.scan(/<td
class="conceito"[^>]*>\s*\n([^\n]+)\n\s*<\/td>/m).flatten
con_ary.map{|e| e.gsub!(/<[^>]+>/,'')}

### Escreve o Resultado
coder = HTMLEntities.new
dis_ary.each_with_index do |elem, i|
puts "#{elem} => #{coder.decode(con_ary[i].strip)}"
end

### desloga do site
browser.click page.link_with(:text => "Logout")

exit 0
</code>

[]s
--
Bruno Coimbra a.k.a. sceadugenga
bbco...@gmail.com

Existem 11 tipos de pessoa:
as que entendem binário,
as que acham que entendem,
e as que não entendem

Nelson Minor Haraguchi Jr

unread,
Dec 16, 2009, 10:00:15 AM12/16/09
to ruby-f...@googlegroups.com
Lembrando que o nokogiri não funciona no Windows então para os que
usam ruby no windows esse script nao funcionará.

Nelson Minor Haraguchi Junior
---
"Senhas são como peças íntimas. Você não deve deixá-las para fora onde
as pessoas podem vê-los. Você deve troca-las regularmente. E você não
deve empresta-las para estranhos."

Twitter: http://twitter.com/nelsonmhjr
Gtalk: nelso...@gmail.com



2009/12/16 Bruno Coimbra <bbco...@gmail.com>:

Nelson Minor Haraguchi Jr

unread,
Dec 16, 2009, 10:02:39 AM12/16/09
to ruby-f...@googlegroups.com
Ou talvez funcione, testem ai e mandem seus resultados.

[]'s

Nelson Minor Haraguchi Junior
---
"Senhas são como peças íntimas. Você não deve deixá-las para fora onde
as pessoas podem vê-los. Você deve troca-las regularmente. E você não
deve empresta-las para estranhos."

Twitter: http://twitter.com/nelsonmhjr
Gtalk: nelso...@gmail.com



2009/12/16 Nelson Minor Haraguchi Jr <nelso...@gmail.com>:

Nelson Minor Haraguchi Jr

unread,
Dec 16, 2009, 12:22:49 PM12/16/09
to ruby-f...@googlegroups.com
Fiz uma alteração para ele salvar as credenciais num arquivo para nao
ter que digitar toda vez.

está ai o codigo.

<code>
# encoding: iso-8859-1
require 'rubygems'
require 'mechanize'
require 'highline/import'
require 'htmlentities'

CONF_ARQ = __FILE__ + '-config.txt'

def get_credentials
user = ask('matricula: ')
pass = ask("senha: " ) { |c| c.echo = "*" }

exit 1 if user.empty? or pass.empty?
[user,pass]
end

def save_credentials(user,pass)
if agree('salvar dados para consulta?')
config = File.new(CONF_ARQ, 'w')
config.puts "{\"#{user}\"}={\"#{pass}\"}"
end
end


File.new(CONF_ARQ, 'w').close unless File.exist?(CONF_ARQ)
config = File.readlines(CONF_ARQ)
if config.size == 1
config.first.match(/\{"([0-9]*)"\}=\{"(.*)"\}/)
user = $1
pass = $2

### Solicita o nro da matricula e senha do site da FATEC-SP
unless agree('usar dados da ultima consulta?')
user,pass = get_credentials
save_credentials(user,pass)
end
else
user,pass = get_credentials
save_credentials(user,pass)
end

### inicializa o Mechanize
browser = WWW::Mechanize.new
uri = URI.parse('http://san.fatecsp.br')

### solicita a página
page = browser.get uri

### pede, gentilmente, para o mechanize achar o formulário de login
login_form = page.form('login')

### seta os valores
login_form.userid = user
login_form.password = pass

### envia o formulário
page = browser.submit(login_form)

### solicita a página dos conceitos finais
begin
con_page = browser.click page.link_with(:href => "?task=conceitos_finais")
rescue
puts "Erro no Login"
exit 1
end
### Faz o parse da página
conceitos = con_page.body
dis_ary = conceitos.scan(/<td class="sigla"[^>]*>([^<]+)<\/td>/).flatten
con_ary = conceitos.scan(/<td
class="conceito"[^>]*>\s*\n([^\n]+)\n\s*<\/td>/m).flatten
con_ary.map{|e| e.gsub!(/<[^>]+>/,'')}

### Escreve o Resultado
coder = HTMLEntities.new
dis_ary.each_with_index do |elem, i|
puts "#{elem} => #{coder.decode(con_ary[i].strip)}"
end

### desloga do site
browser.click page.link_with(:text => "Logout")

exit 0
</code>

Reply all
Reply to author
Forward
0 new messages