tia-crawler 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/bin/tia-crawler +9 -0
- data/lib/tia-crawler.rb +22 -0
- data/lib/tia/models/credentials.rb +10 -0
- data/lib/tia/models/tia-url.rb +8 -0
- data/lib/tia/models/timetable.rb +43 -0
- data/lib/tia/services/networking.rb +17 -0
- data/lib/tia/services/tia-service.rb +147 -0
- metadata +51 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cd31504cbd760b69af3b4f391fb2db9ca2cd74c3
|
4
|
+
data.tar.gz: 29de4f16599b89eaf1afda7f553a2dc83c0d141c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: bb3fc8f12106af50de8aa17b0a7dc9ece6f96bf2ff1407418d6aab9f15900829b55acf696cc3251b07e537eb86a543c564d349b4a28d4992e8271665fcbf11b2
|
7
|
+
data.tar.gz: 1f4c7fae45f0ca6408997c96b827159446270deb05a06d4ee69110ede4a2ef8e856ce2e766a79c6d8eb2748c47b4d9c43b83afd3eebebf495f0d6224d7714b63
|
data/bin/tia-crawler
ADDED
data/lib/tia-crawler.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'thor'
|
3
|
+
require_relative 'tia/services/tia-service'
|
4
|
+
require_relative 'tia/models/credentials'
|
5
|
+
|
6
|
+
module TiaCrawler
|
7
|
+
class CLI < Thor
|
8
|
+
desc 'horarios', 'Retorna a lista de horarios em formato JSON'
|
9
|
+
def horarios
|
10
|
+
print "Tia: "
|
11
|
+
alumat = STDIN.gets.chomp
|
12
|
+
|
13
|
+
print "Senha: "
|
14
|
+
password = STDIN.noecho(&:gets)
|
15
|
+
|
16
|
+
puts "\nCrawling horarios..."
|
17
|
+
|
18
|
+
credentials = Credentials.new alumat, password, '001'
|
19
|
+
puts TiaService.horarios credentials
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module TiaCrawler
|
2
|
+
class Timetable
|
3
|
+
attr_accessor :seg, :ter, :qua, :qui, :sex, :sab
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@seg = []
|
7
|
+
@ter = []
|
8
|
+
@qua = []
|
9
|
+
@qui = []
|
10
|
+
@sex = []
|
11
|
+
@sab = []
|
12
|
+
end
|
13
|
+
|
14
|
+
def append(dayString, val)
|
15
|
+
if dayString == "Segunda"
|
16
|
+
@seg << val
|
17
|
+
elsif dayString == "Terça"
|
18
|
+
@ter << val
|
19
|
+
elsif dayString == "Quarta"
|
20
|
+
@qua << val
|
21
|
+
elsif dayString == "Quinta"
|
22
|
+
@qui << val
|
23
|
+
elsif dayString == "Sexta"
|
24
|
+
@sex << val
|
25
|
+
elsif dayString == "Sábado"
|
26
|
+
@sab << val
|
27
|
+
else
|
28
|
+
puts "Failed to append"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def as_json
|
33
|
+
return {
|
34
|
+
"seg" => @seg,
|
35
|
+
"ter" => @ter,
|
36
|
+
"qua" => @qua,
|
37
|
+
"qui" => @qui,
|
38
|
+
"sex" => @sex,
|
39
|
+
"sab" => @sab
|
40
|
+
}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'uri'
|
3
|
+
require 'nokogiri'
|
4
|
+
|
5
|
+
module TiaCrawler
|
6
|
+
class Networking
|
7
|
+
def self.post(url, headers, body, ssl = true)
|
8
|
+
uri = URI.parse url
|
9
|
+
https = Net::HTTP.new uri.host, uri.port
|
10
|
+
https.use_ssl = ssl
|
11
|
+
req = Net::HTTP::Post.new uri.path, headers
|
12
|
+
req.set_form_data body unless body.nil?
|
13
|
+
res = https.request req
|
14
|
+
return res
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,147 @@
|
|
1
|
+
require 'io/console'
|
2
|
+
require 'net/http'
|
3
|
+
require 'uri'
|
4
|
+
require 'nokogiri'
|
5
|
+
|
6
|
+
require_relative '../models/tia-url'
|
7
|
+
require_relative '../models/timetable'
|
8
|
+
require_relative 'networking'
|
9
|
+
|
10
|
+
module TiaCrawler
|
11
|
+
class TiaService
|
12
|
+
def self.getAuthCookie(credentials)
|
13
|
+
token, cookie = TiaService.get_login_token_and_cookie
|
14
|
+
newCookie = TiaService.authenticate credentials, token, cookie
|
15
|
+
|
16
|
+
# ???
|
17
|
+
theCookie = "tiaMackenzieWeb=a%3A2%3A%7Bs%3A4%3A%22user%22%3BN%3Bs%3A6%3A%22passwd%22%3BN%3B%7D; #{newCookie}"
|
18
|
+
|
19
|
+
return theCookie
|
20
|
+
end
|
21
|
+
|
22
|
+
# Entra na página de login do tia para pegar
|
23
|
+
# o token e o cookie necessários para o login
|
24
|
+
def self.get_login_token_and_cookie
|
25
|
+
begin
|
26
|
+
# Entra na página de login do TIA
|
27
|
+
uri = URI.parse TiaURL::Login
|
28
|
+
response = Net::HTTP.get_response uri
|
29
|
+
|
30
|
+
# Guarda o cookie recebido na resposta HTTP (PHPSESSID)
|
31
|
+
cookie = response['set-cookie'].split('; ')[0]
|
32
|
+
|
33
|
+
# Guarda o token que está no formulário de login, dentro da página
|
34
|
+
nokogiriHTML = Nokogiri::HTML response.body
|
35
|
+
token = nokogiriHTML.css('[name="token"]')[0]['value']
|
36
|
+
|
37
|
+
return {token: token, cookie: cookie}
|
38
|
+
rescue Exception => e
|
39
|
+
puts "❗️ Failed!"
|
40
|
+
puts e
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Atentica e retorna o cookie da autenticação
|
45
|
+
def self.authenticate(credentials, token, cookie)
|
46
|
+
# Cabeçalho da requisição HTTP para autenticação
|
47
|
+
headers =
|
48
|
+
{
|
49
|
+
'Content-Type' => 'application/x-www-form-urlencoded',
|
50
|
+
'Cookie' => "#{cookie}",
|
51
|
+
'Referer' => TiaURL::Login
|
52
|
+
}
|
53
|
+
|
54
|
+
# Corpo da requisição HTTP para autenticação
|
55
|
+
body = {
|
56
|
+
token: token,
|
57
|
+
alumat: credentials.tia,
|
58
|
+
pass: credentials.password,
|
59
|
+
unidade: credentials.unit
|
60
|
+
}
|
61
|
+
|
62
|
+
# Pega a resposta do POST request do formulário de autenticação
|
63
|
+
res = Networking.post TiaURL::Auth, headers, body, true
|
64
|
+
|
65
|
+
# Pega o novo cookie no header da resposta HTTP
|
66
|
+
# O novo cookie é o que precisa ser usado para fazer os próximos requests
|
67
|
+
newCookie = res['set-cookie'].split('; ')[0]
|
68
|
+
|
69
|
+
return newCookie
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.home(credentials)
|
73
|
+
cookie = TiaService.getAuthCookie credentials
|
74
|
+
# Cabeçalho da requisição HTTP para autenticação
|
75
|
+
headers =
|
76
|
+
{
|
77
|
+
'Cookie' => cookie,
|
78
|
+
'Referer' => TiaURL::Auth
|
79
|
+
}
|
80
|
+
|
81
|
+
res = Networking.post TiaURL::Home, headers, nil, true
|
82
|
+
nokogiriHTML = Nokogiri::HTML res.body
|
83
|
+
|
84
|
+
tia, name = nokogiriHTML.css('center h2').inner_html.split(' - ')
|
85
|
+
subject = nokogiriHTML.css('center h3')
|
86
|
+
puts "#{tia} - #{name}"
|
87
|
+
puts "#{subject}"
|
88
|
+
|
89
|
+
return nokogiriHTML
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.jsonSubjects(html)
|
93
|
+
tables = html.css('.table-responsive')
|
94
|
+
|
95
|
+
theSubjects = {}
|
96
|
+
|
97
|
+
dias = []
|
98
|
+
|
99
|
+
header = tables[0].css('tr')[0].css('strong')
|
100
|
+
header[1...header.size].each do |d|
|
101
|
+
dias << d.inner_html
|
102
|
+
end
|
103
|
+
|
104
|
+
tables.each_with_index do |table, i|
|
105
|
+
rows = table.css('tr')
|
106
|
+
rows[1...rows.size].each_with_index do |row, j|
|
107
|
+
cols = row.css('td div')
|
108
|
+
cols[1...cols.size].each do |c|
|
109
|
+
items = c.inner_html.split('<br>')
|
110
|
+
name = items[0].strip
|
111
|
+
classid = items[1]
|
112
|
+
building = items[2]
|
113
|
+
classroom = items[3]
|
114
|
+
|
115
|
+
if name != "--"
|
116
|
+
dia = dias[j]
|
117
|
+
theSubjects[name] = Timetable.new if theSubjects[name].nil?
|
118
|
+
theSubjects[name].append dia, cols[0].inner_html
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
json = {}
|
125
|
+
theSubjects.each do |key, val|
|
126
|
+
json[key] = val.as_json
|
127
|
+
end
|
128
|
+
|
129
|
+
return json
|
130
|
+
end
|
131
|
+
|
132
|
+
def self.horarios(credentials)
|
133
|
+
cookie = TiaService.getAuthCookie credentials
|
134
|
+
# Cabeçalho da requisição HTTP para autenticação
|
135
|
+
headers =
|
136
|
+
{
|
137
|
+
'Cookie' => cookie,
|
138
|
+
'Referer' => TiaURL::Home
|
139
|
+
}
|
140
|
+
|
141
|
+
res = Networking.post TiaURL::Horarios, headers, nil, true
|
142
|
+
nokogiriHTML = Nokogiri::HTML res.body
|
143
|
+
|
144
|
+
return TiaService.jsonSubjects nokogiriHTML
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
metadata
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tia-crawler
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Aleph Retamal
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-08-14 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Gem para acessar os dados do TIA Mackenzista
|
14
|
+
email: retamal.ph@gmail.com
|
15
|
+
executables:
|
16
|
+
- tia-crawler
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- bin/tia-crawler
|
21
|
+
- lib/tia-crawler.rb
|
22
|
+
- lib/tia/models/credentials.rb
|
23
|
+
- lib/tia/models/tia-url.rb
|
24
|
+
- lib/tia/models/timetable.rb
|
25
|
+
- lib/tia/services/networking.rb
|
26
|
+
- lib/tia/services/tia-service.rb
|
27
|
+
homepage: https://github.com/alaphao/tia-crawler
|
28
|
+
licenses:
|
29
|
+
- MIT
|
30
|
+
metadata: {}
|
31
|
+
post_install_message:
|
32
|
+
rdoc_options: []
|
33
|
+
require_paths:
|
34
|
+
- lib
|
35
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
requirements: []
|
46
|
+
rubyforge_project:
|
47
|
+
rubygems_version: 2.5.1
|
48
|
+
signing_key:
|
49
|
+
specification_version: 4
|
50
|
+
summary: Tia Crawler
|
51
|
+
test_files: []
|