netcity 0.3.5 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e74345b40482be87c3f32bfe664bf3fd78011b07f9a13929284a280acb14b4d2
4
- data.tar.gz: abfcbee97e017fff139458d3ee8cb6fc906f121b93dd67bfce9cb20018ca5226
3
+ metadata.gz: 24de9d2d19d1e4fbb099524730790458a61d98f2dc75fc139c74b6c86b636b05
4
+ data.tar.gz: 1fbf557670cebc5faa508d18fde393c26b95c2ae3fcd5dcce1b4c8fb8011b3b2
5
5
  SHA512:
6
- metadata.gz: 7493df8082793fc00598852edf70dc4fff77372179db218d36a481aeeb0247db621e825626fe05e97301ee1e6d7b17a4ac3ade38471a9114b3cb42496495ca85
7
- data.tar.gz: c5e0a9b422e8784328adc8340240ace60147f07fa25899b728589227572e7dcdb38b3c44ae96476805f05078ef753af745fcfb9c3d7f8e6fd83f88265fe8f297
6
+ metadata.gz: 73002751295a82ab78a9f4af076f2b33fc9307b6af3aff75b4708b604cce17e8d44f54091e6f6f0b35b1bdf3e6c74d4bc01b252402c38feea7953b0a90e94361
7
+ data.tar.gz: 1713737e21a113d0f0068f0205d3d71df483e719e982e34cdd73904e7df35a27263a0f5abb39d704480c4812f773cb6d384231ee8eaaa3879f97d4439ac23617
data/Gemfile CHANGED
@@ -1,7 +1,5 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- # Specify your gem's dependencies in test.gemspec
4
3
  gemspec
5
4
 
6
- gem "rake", "~> 13.0"
7
5
  gem "http", "~> 4.4.1"
data/README.md CHANGED
@@ -1,7 +1,21 @@
1
1
  # netcity
2
2
 
3
- [![Build Status](https://travis-ci.com/tulen34/netcity.svg?branch=main)](https://travis-ci.com/tulen34/netcity)
4
3
  [![Gem Version](https://badge.fury.io/rb/netcity.svg)](https://badge.fury.io/rb/netcity)
4
+ ![Gem](https://img.shields.io/gem/dt/netcity)
5
5
  [![License](https://img.shields.io/github/license/tulen34/netcity)](https://github.com/tulen34/netcity/blob/main/LICENSE)
6
6
 
7
7
  **API** клиент для "Сетевого города". Он позволяет легко взаимодействовать с **электронным дневником**.
8
+
9
+ ### Установка
10
+
11
+ ```bash
12
+ gem install netcity
13
+ ```
14
+
15
+ ### :warning: Внимание
16
+
17
+ Клиент разрабатывался изначально для **Волгоградской области**, поэтому, возможно, у вас он может **не работать**
18
+
19
+ ### :love_letter: Благодарность
20
+
21
+ Меня вдохновил **[проект другого человека](https://github.com/nm17/netschoolapi)**. Я лишь **адаптировал** его под свой регион и на любимом языке.
data/lib/netcity.rb CHANGED
@@ -1,75 +1,4 @@
1
- require "http"
2
- require "digest"
3
-
4
- require "netcity/data.rb"
5
- require "netcity/errors.rb"
6
-
7
- class NetCity
8
- attr_accessor :client, :user_name, :password, :school_address
9
-
10
- def initialize(base_url, state, province, city, func, school,
11
- user_name, password)
12
- @client = HTTP["user-agent": "netcity/#{VERSION}", referer: base_url]
13
- .persistent(base_url)
14
-
15
- @user_name = user_name
16
- @password = password
17
- @school_address = SchoolAddress.new(state, province, city, func, school)
18
- end
19
-
20
- def login
21
- form = JSON.parse(@client.get("/webapi/prepareloginform"))
22
- .keep_if { |k| %w(cid sid pid cn sft scid).include?(k) }
23
-
24
- queue = form.keys[...-1].each_index
25
- .zip(@school_address.members)
26
-
27
- queue.each do |index, member|
28
- concrete_form = JSON.parse(@client.get("/webapi/loginform", params: {
29
- lastname: form.keys[index]
30
- }.merge(form)))
31
-
32
- match = concrete_form["items"].find do |item|
33
- item["name"] == @school_address[member]
34
- end or raise LoginFormError.new(member, @school_address[member])
35
-
36
- form.update(form.keys[index + 1] => match["id"])
37
- end
38
-
39
- data = {}.tap do |h|
40
- responce = @client.post("/webapi/auth/getdata")
41
- @client = @client.cookies(responce.cookies)
42
- h.update(JSON.parse(responce))
43
- end
44
-
45
- encoded_password = Digest::MD5.new.tap do |md5|
46
- md5 << data.delete("salt") << Digest::MD5.hexdigest(@password)
47
- end.hexdigest
48
-
49
- info = {}.tap do |h|
50
- responce = @client.post("/webapi/login", form: {
51
- logintype: 1,
52
- un: @user_name,
53
- pw: encoded_password[...@password.size],
54
- pw2: encoded_password
55
- }.merge(form, data))
56
-
57
- @client = @client.cookies(responce.cookies)
58
- h.update(JSON.parse(responce))
59
- end
60
-
61
- raise Error, info["message"] unless info.include?("at")
62
- @client = @client.headers(at: info["at"])
63
-
64
- students, id = JSON.parse(@client.get("/webapi/student/diary/init"))
65
- .values_at("students", "currentStudentId")
66
-
67
- @student_id = students[id]["studentId"]
68
- @year_id = JSON.parse(@client.get("/webapi/context"))["schoolYearId"]
69
- end
70
-
71
- def logout
72
- @client.post("/webapi/auth/logout")
73
- nil
74
- end
75
- end
1
+ require 'netcity/netcity'
2
+ require 'netcity/data'
3
+ require 'netcity/errors'
4
+ require 'netcity/version'
data/lib/netcity/data.rb CHANGED
@@ -1,5 +1,21 @@
1
1
  class NetCity
2
- VERSION = "0.3.5"
3
-
4
2
  SchoolAddress = Struct.new(:state, :province, :city, :func, :school)
3
+
4
+ class Context
5
+ attr_reader :full_name, :user_id, :year_id
6
+
7
+ def initialize(data)
8
+ @full_name = data['user']['name']
9
+ @user_id = data['user']['id']
10
+ @year_id = data['schoolYearId']
11
+ end
12
+ end
13
+
14
+ class Diary
15
+ attr_reader :week_start, :week_end, :schedule
16
+
17
+ def initilaize(data)
18
+
19
+ end
20
+ end
5
21
  end
@@ -5,15 +5,15 @@ class NetCity
5
5
  def initialize(member, value)
6
6
  @member = case member
7
7
  when :state
8
- "Регион"
8
+ 'Регион'
9
9
  when :province
10
- "Городской округ / Муниципальный район"
10
+ 'Городской округ / Муниципальный район'
11
11
  when :city
12
- "Населённый пункт"
12
+ 'Населённый пункт'
13
13
  when :func
14
- "Тип ОО"
14
+ 'Тип ОО'
15
15
  when :school
16
- "Образовательная организация"
16
+ 'Образовательная организация'
17
17
  end
18
18
 
19
19
  @value = value
@@ -23,10 +23,4 @@ class NetCity
23
23
  "Отсутствует #{@member} со значением #{@value}"
24
24
  end
25
25
  end
26
-
27
- class LoginDataError < Error
28
- def to_s
29
- "Неправильный логин или пароль"
30
- end
31
- end
32
26
  end
@@ -0,0 +1,85 @@
1
+ require 'http'
2
+ require 'digest'
3
+
4
+ class NetCity
5
+ attr_accessor :client, :user_name, :password, :school_address
6
+ attr_reader :context
7
+
8
+ def initialize(base_url,
9
+ state, province, city, func, school,
10
+ user_name, password)
11
+ @client = HTTP["user-agent": "netcity/#{VERSION}", referer: base_url]
12
+ .persistent(base_url)
13
+
14
+ @user_name = user_name
15
+ @password = password
16
+ @school_address = SchoolAddress.new(state, province, city, func, school)
17
+ end
18
+
19
+ def diary(options = {})
20
+
21
+ end
22
+
23
+ def session
24
+ login
25
+ yield self
26
+ ensure
27
+ logout
28
+ end
29
+
30
+ def login
31
+ form = JSON.parse(@client.get('/webapi/prepareloginform')).keep_if do |k|
32
+ %w[cid sid pid cn sft scid].include?(k)
33
+ end
34
+
35
+ queue = form
36
+ .keys[...-1]
37
+ .each_index
38
+ .zip(@school_address.members)
39
+
40
+ queue.each do |i, member|
41
+ current_form = JSON.parse(@client.get('/webapi/loginform', params: {
42
+ lastname: form.keys[i]
43
+ }.merge(form)))
44
+
45
+ match = current_form['items'].find do |item|
46
+ item['name'] == @school_address[member]
47
+ end or raise LoginFormError.new(member, @school_address[member])
48
+
49
+ form.update(form.keys[i + 1] => match['id'])
50
+ end
51
+
52
+ data = {}.tap do |h|
53
+ responce = @client.post('/webapi/auth/getdata')
54
+ @client = @client.cookies(responce.cookies)
55
+ h.update(JSON.parse(responce))
56
+ end
57
+
58
+ md5 = Digest::MD5.new.tap do |md5|
59
+ md5 << data.delete("salt") << Digest::MD5.hexdigest(@password)
60
+ end.hexdigest
61
+
62
+ info = {}.tap do |h|
63
+ responce = @client.post('/webapi/login', form: {
64
+ logintype: 1,
65
+ un: @user_name,
66
+ pw: md5[...@password.size],
67
+ pw2: md5
68
+ }.merge(form, data))
69
+
70
+ @client = @client.cookies(responce.cookies)
71
+ h.update(JSON.parse(responce))
72
+ end
73
+
74
+ raise Error, info['message'] unless info.include?('at')
75
+ @client = @client.headers(at: info['at'])
76
+
77
+ @context = Context.new(JSON.parse(@client.get('/webapi/context')))
78
+ nil
79
+ end
80
+
81
+ def logout
82
+ @client.post('/webapi/auth/logout')
83
+ nil
84
+ end
85
+ end
@@ -0,0 +1,3 @@
1
+ class NetCity
2
+ VERSION = "0.4.0"
3
+ end
data/netcity.gemspec CHANGED
@@ -1,5 +1,4 @@
1
- require "rake/file_list"
2
- require_relative "lib/netcity/data.rb"
1
+ require_relative "lib/netcity/version.rb"
3
2
 
4
3
  Gem::Specification.new do |s|
5
4
  s.name = "netcity"
@@ -17,8 +16,18 @@ Gem::Specification.new do |s|
17
16
  s.metadata = {
18
17
  "source_code_uri" => "https://github.com/tulen34/netcity"
19
18
  }
20
-
21
- s.files = Rake::FileList["**/*"].exclude(*File.read(".gitignore").split)
19
+ s.files = [
20
+ "bin/netcity",
21
+ "lib/netcity.rb",
22
+ "lib/netcity/netcity.rb",
23
+ "lib/netcity/version.rb",
24
+ "lib/netcity/data.rb",
25
+ "lib/netcity/errors.rb",
26
+ "Gemfile",
27
+ "LICENSE",
28
+ "netcity.gemspec",
29
+ "README.md",
30
+ ]
22
31
  s.executables = s.files.grep(/^bin\/.+/) { |f| File.basename(f) }
23
32
 
24
33
  s.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: netcity
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Glushonkov Ilya
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-03 00:00:00.000000000 Z
11
+ date: 2021-03-08 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |
14
14
  API клиент для "Сетевого города". Он позволяет легко взаимодействовать с
@@ -16,7 +16,6 @@ description: |
16
16
  email: pulsar04040@gmail.com
17
17
  executables:
18
18
  - netcity
19
- - test
20
19
  extensions: []
21
20
  extra_rdoc_files: []
22
21
  files:
@@ -24,10 +23,11 @@ files:
24
23
  - LICENSE
25
24
  - README.md
26
25
  - bin/netcity
27
- - bin/test
28
26
  - lib/netcity.rb
29
27
  - lib/netcity/data.rb
30
28
  - lib/netcity/errors.rb
29
+ - lib/netcity/netcity.rb
30
+ - lib/netcity/version.rb
31
31
  - netcity.gemspec
32
32
  homepage: https://rubygems.org/gems/netcity
33
33
  licenses:
data/bin/test DELETED
@@ -1,15 +0,0 @@
1
- #!/usr/bin/ruby
2
-
3
- require "netcity"
4
-
5
- client = NetCity.new("https://sgo.volganet.ru",
6
- "Волгоградская обл",
7
- "Городской округ Волжский",
8
- "Волжский, г.",
9
- "Общеобразовательная",
10
- "МОУ СШ № 28",
11
- "Глушонков",
12
- "22081979As")
13
- client.login
14
- pp client
15
- client.logout