rails-ding 0.1.0 → 1.0.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
- SHA1:
3
- metadata.gz: debe361c45d3d2f31ffc34441f971be96072c368
4
- data.tar.gz: ffe453145176f0d7ebb667dd67e3d3203d819614
2
+ SHA256:
3
+ metadata.gz: 4b5e0e4c06a564c281c39f8adf85ecdd196ba46ae667fbc533b476a40023ef3e
4
+ data.tar.gz: 651431931073cf2a247a5bb9f15a7edb655c710393418e44dcd09f83d442d6f5
5
5
  SHA512:
6
- metadata.gz: da7136350d5e35be984831dc3dc18139144a386468191924b90321e46388e743d9a81b62b149470775159f7d2aa4b8a7a55f4eccb9d28e3ea286caf152564a7d
7
- data.tar.gz: e5a8bfe1a0b02ebf9bf715e4171c01cb7d2554813c6152d52486f6170db5f9e0a4866d51811237b41d22905727c71141fd904e3100eb319826465838fadc40c9
6
+ metadata.gz: e309c422dc8da55fc097313bee9b146e0006566bc9ba48e640692125dcffba85782751904437af250f7268e00d3a37886d27dca587c445d6bba5cc729a4f73d8
7
+ data.tar.gz: 46394b220b35b0da8ac7247ad1568109631fc95df26ee96812125a81f9fbe08eca7aa16f5bb785e172b1d0a97f92ba717a999879c3463c8ede075c019f791e20
data/README.md CHANGED
@@ -20,6 +20,15 @@ Or install it yourself as:
20
20
  ```bash
21
21
  $ gem install rails-ding
22
22
  ```
23
+ ## 工作记录
24
+ 2019-09-25
25
+ * 创建项目
26
+ 2019-09-26
27
+ * 转移auth, cache, http, log等功能块,并做适配gem的修改,其中auth并没有完成
28
+ 2019-09-27
29
+ * 转移chat, department, message, user; 添加配置
30
+ ## todolist
31
+ 关于文件缓存及日志,要考虑正式使用时保存位置
23
32
 
24
33
  ## Contributing
25
34
  Contribution directions go here.
data/Rakefile CHANGED
@@ -34,3 +34,7 @@ end
34
34
 
35
35
 
36
36
  task default: :test
37
+
38
+ task :console do
39
+ exec "irb -I ./lib"
40
+ end
@@ -0,0 +1,63 @@
1
+ module Rails
2
+ module Ding
3
+ class AuthService
4
+
5
+ def self.configuration
6
+ Ding::configuration
7
+ end
8
+
9
+ def self.getAccessToken
10
+ # 缓存accessToken。accessToken有效期为两小时,需要在失效前请求新的accessToken(注意:以下代码没有在失效前刷新缓存的accessToken)。
11
+ accessToken = CacheService::getCorpAccessToken()
12
+ if accessToken.blank?
13
+ response = HttpService.get('/gettoken?', {corpid: configuration.corpid, corpsecret: configuration.secret})
14
+ check(response)
15
+ accessToken = response['access_token']
16
+ CacheService::setCorpAccessToken(accessToken)
17
+ end
18
+ return accessToken
19
+ end
20
+
21
+
22
+ def self.getTicket(accessToken)
23
+ jsticket = CacheService::getJsTicket()
24
+ if jsticket.blank?
25
+ response = HttpService.get('/get_jsapi_ticket?', {type: 'jsapi', access_token: accessToken})
26
+ check(response)
27
+ jsticket = response['ticket']
28
+ CacheService::setJsTicket(jsticket)
29
+ end
30
+ return jsticket
31
+ end
32
+
33
+ def self.getConfig(href)
34
+ corpId = configuration.corpid
35
+ agentId = configuration.agentid
36
+ nonceStr = 'abcdefg'
37
+ timeStamp = Time.now.to_i
38
+ url = href
39
+ corpAccessToken = getAccessToken()
40
+ if corpAccessToken.blank?
41
+ LogService.e("[getConfig] ERR: no corp access token")
42
+ end
43
+ ticket = getTicket(corpAccessToken)
44
+ signature = sign(ticket, nonceStr, timeStamp, url)
45
+
46
+ config = {'url' => url,'nonceStr' => nonceStr,'agentId' => agentId, 'timeStamp' => timeStamp, 'corpId' => corpId, 'signature' => signature}
47
+ return config
48
+ end
49
+
50
+ def self.sign(ticket, nonceStr, timeStamp, url)
51
+ plain = "jsapi_ticket=#{ticket}&noncestr=#{nonceStr}&timestamp=#{timeStamp}&url=#{url}"
52
+ return Digest::SHA1.hexdigest(plain);
53
+ end
54
+
55
+ def self.check(res)
56
+ if res["errcode"] != 0
57
+ LogService.e("FAIL: #{res.to_json}")
58
+ end
59
+ end
60
+
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,77 @@
1
+ module Rails
2
+ module Ding
3
+ class CacheService
4
+
5
+ def self.setJsTicket(ticket)
6
+ set("js_ticket", ticket, ex: 7000); # js ticket有效期为7200秒,这里设置为7000秒
7
+ end
8
+
9
+ def self.getJsTicket()
10
+ return get("js_ticket")
11
+ end
12
+
13
+ def self.setCorpAccessToken(accessToken)
14
+ set("corp_access_token", accessToken, ex: 7000) # corp access token有效期为7200秒,这里设置为7000秒
15
+ end
16
+
17
+ def self.getCorpAccessToken
18
+ return get("corp_access_token")
19
+ end
20
+
21
+ # 保存变量
22
+ def self.set_value(name,value)
23
+ set(name, value)
24
+ end
25
+ # 使用变量
26
+ def self.get_value(name)
27
+ get(name)
28
+ end
29
+
30
+ def self.set(key,value,options = {})
31
+ ex = options[:ex] ? Time.now.to_i + options[:ex] : 0
32
+ if key && value
33
+ data = get_file(Rails.root.to_s + "config/filecache.yml")
34
+
35
+ item = {}
36
+ item["#{key}"] = value
37
+ item['expire_time'] = ex
38
+ item['create_time'] = Time.now.to_i
39
+ data["#{key}"] = item
40
+ set_file(Rails.root.to_s + "config/filecache.yml",data.to_json)
41
+ end
42
+ end
43
+
44
+ def self.get(key)
45
+ if key.present?
46
+ data = get_file(Rails.root.to_s + "config/filecache.yml")
47
+ if data.present? && data.has_key?(key)
48
+ item = data["#{key}"]
49
+ return false if !item
50
+ if item['expire_time']>0 && item['expire_time'] < Time.now.to_i
51
+ return false;
52
+ end
53
+ return item["#{key}"]
54
+ else
55
+ return false;
56
+ end
57
+ end
58
+ end
59
+
60
+ def self.get_file(filename)
61
+ if !File.exist?(filename)
62
+ file = File.open(filename, "w")
63
+ file.write("{}")
64
+ file.close
65
+ end
66
+ return YAML.load(File.read(filename))
67
+ end
68
+
69
+ def self.set_file(filename, content)
70
+ file = File.open(filename, "w")
71
+ file.write(content)
72
+ file.close unless file.nil?
73
+ end
74
+
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,22 @@
1
+ module Rails
2
+ module Ding
3
+ class ChatService
4
+
5
+ def self.createChat(accessToken, chatOpt)
6
+ response = HttpService.post("/chat/create?", {access_token: accessToken}, chatOpt.to_json)
7
+ return response
8
+ end
9
+
10
+ def self.bindChat(accessToken, chatid,agentid)
11
+ response = HttpService.get("/chat/bind?",{access_token: accessToken,chatid: chatid,agentid: agentid})
12
+ return response
13
+ end
14
+
15
+ def self.sendmsg(accessToken, opt)
16
+ response = HttpService.post("/chat/send?", {access_token: accessToken}, opt.to_json)
17
+ return response
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,17 @@
1
+ module Rails
2
+ module Ding
3
+ class Configuration
4
+ attr_accessor :oapi_host, :corpid, :secret, :agentid, :encoding_aes_key, :token
5
+
6
+ def initialize
7
+ @oapi_host = "https://oapi.dingtalk.com"
8
+ @corpid = ""
9
+ @secret = ""
10
+
11
+ @agentid = "" #必填,在创建微应用的时候会分配
12
+ @encoding_aes_key = "123456" #加解密需要用到的token,普通企业可以随机填写,例如:123456
13
+ @token = "111111111111111111111111111111111" #数据加密密钥。用于回调数据的加密,长度固定为43个字符,从a-z, A-Z, 0-9共62个字符中选取,您可以随机生成
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,32 @@
1
+ module Rails
2
+ module Ding
3
+ class DepartmentService
4
+
5
+ def self.createDept(accessToken, dept)
6
+ response = HttpService.post("/department/create?", {access_token: accessToken}, dept.to_json)
7
+ return response
8
+ end
9
+
10
+ def self.listDept(accessToken)
11
+ response = HttpService.get("/department/list?", {access_token: accessToken})
12
+ return response
13
+ end
14
+
15
+ def self.list_ids(accessToken)
16
+ response = HttpService.get("/department/list_ids?", {access_token: accessToken})
17
+ return response
18
+ end
19
+
20
+ def self.department_info(accessToken)
21
+ response = HttpService.get("/department/get?", {access_token: accessToken,id: 66950253})
22
+ return response
23
+ end
24
+
25
+ def self.deleteDept(accessToken, id)
26
+ response = HttpService.get("/department/delete?",{access_token: accessToken, id: id})
27
+ return response
28
+ end
29
+
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,38 @@
1
+ module Rails
2
+ module Ding
3
+
4
+ class HttpService
5
+ require 'net/https'
6
+ require 'uri'
7
+
8
+ @@oapi_host = 'https://oapi.dingtalk.com'
9
+
10
+ def self.get(url,params)
11
+ uri = URI.parse("#{@@oapi_host}/#{url}?")
12
+ uri.query = URI.encode_www_form(params)
13
+ res = Net::HTTP.get_response(uri)
14
+ if res.code == "200"
15
+ return resbody = JSON.parse(res.body)
16
+ end
17
+ return nil
18
+ end
19
+
20
+ def self.post(url, params, data)
21
+ res = RestClient.post joinParams(url, params), data, :content_type => :json, :accept => :json
22
+ end
23
+
24
+ def self.joinParams(path,params)
25
+ url = "#{@@oapi_host}#{path}"
26
+ if params.count > 0
27
+ url = url + "?"
28
+ params.each do |key,value|
29
+ url = url + key.to_s + "=" + value.to_s + "&";
30
+ end
31
+ url.last == "&" && url.chop!
32
+ end
33
+ return url
34
+ end
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,23 @@
1
+ module Rails
2
+ module Ding
3
+ class LogService
4
+
5
+ def self.i(msg)
6
+ write("I",msg)
7
+ end
8
+
9
+ def self.e(msg)
10
+ write("E",msg)
11
+ end
12
+
13
+ def self.write(level,msg)
14
+ # TODO: 日志保存位置要修改
15
+ filename = Rails.root.to_s + "./log/my.log"
16
+ file = File.open(filename, "a")
17
+ file.write("#{level}/#{Time.now} #{msg}\n")
18
+ file.close
19
+ end
20
+
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,22 @@
1
+ module Rails
2
+ module Ding
3
+ class MessageService
4
+
5
+ def self.sendToConversation(accessToken, opt)
6
+ response = HttpService.post("/message/send_to_conversation?", {access_token: accessToken}, opt.to_json)
7
+ return response
8
+ end
9
+
10
+ def self.send(accessToken, opt)
11
+ response = HttpService.post("/message/send",{access_token: accessToken}, opt.to_json)
12
+ return response
13
+ end
14
+
15
+ def self.send_chat(accessToken, opt)
16
+ response = HttpService.post("/chat/send",{access_token: accessToken}, opt.to_json)
17
+ return response
18
+ end
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,27 @@
1
+ module Rails
2
+ module Ding
3
+ class UserService
4
+
5
+ def self.getUserInfo(accessToken, code)
6
+ response = HttpService.get("/user/getuserinfo", {access_token: accessToken, code: code});
7
+ return response;
8
+ end
9
+
10
+ def self.get(accessToken, userId)
11
+ response = HttpService.get("/user/get", {access_token: accessToken, userid: userId});
12
+ return response;
13
+ end
14
+
15
+ def self.simplelist(accessToken,deptId)
16
+ response = HttpService.get("/user/simplelist", {access_token: accessToken,department_id: deptId});
17
+ return response;
18
+ end
19
+
20
+ def self.list(accessToken,deptId)
21
+ response = HttpService.get("/user/list", {access_token: accessToken,department_id: deptId})
22
+ return response
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -1,5 +1,5 @@
1
1
  module Rails
2
2
  module Ding
3
- VERSION = '0.1.0'
3
+ VERSION = '1.0.0'
4
4
  end
5
5
  end
data/lib/rails/ding.rb CHANGED
@@ -1,7 +1,43 @@
1
1
  require "rails/ding/engine"
2
+ require "rails/ding/configuration"
3
+ require "rails/ding/http_service"
4
+ require "rails/ding/log_service"
5
+ require "rails/ding/cache_service"
6
+ require "rails/ding/auth_service"
7
+ require "rails/ding/chat_service"
8
+ require "rails/ding/department_service"
9
+ require "rails/ding/message_service"
10
+ require "rails/ding/user_service"
11
+
12
+ begin
13
+ require "pry"
14
+ rescue LoadError
15
+ end
2
16
 
3
17
  module Rails
4
18
  module Ding
5
- # Your code goes here...
19
+ # puts "test"
20
+ # Rails::Ding::LogService.e("[getConfig] ERR: no corp access token");
21
+ # Rails::Ding::CacheService::setCorpAccessToken('2222')
22
+ # puts Rails::Ding::HttpService::get('/gettoken?', {corpid: 'ding4e97ac09cf15a1d2', corpsecret: 'jQOqko0rIUGRSBV4APykM9horY317-7TTtPdmKeyhIjnDPYxkfMMAJnwixllLCBx'})
23
+ class << self
24
+ attr_writer :configuration
25
+ end
26
+
27
+ def self.configuration
28
+ @configuration ||= Rails::Ding::Configuration.new
29
+ end
30
+
31
+ def self.reset
32
+ @configuration = Rails::Ding::Configuration.new
33
+ end
34
+
35
+ def self.configure
36
+ yield(configuration)
37
+ end
38
+
39
+ # accessToken = AuthService.getAccessToken
40
+ # l = DepartmentService.listDept(accessToken)
41
+ # binding.pry
6
42
  end
7
43
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-ding
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ''
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-24 00:00:00.000000000 Z
11
+ date: 2019-09-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 5.1.6
27
+ - !ruby/object:Gem::Dependency
28
+ name: rest-client
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: sqlite3
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -38,7 +52,21 @@ dependencies:
38
52
  - - ">="
39
53
  - !ruby/object:Gem::Version
40
54
  version: '0'
41
- description: DingDing API
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: 提供钉钉开发服务端API
42
70
  email:
43
71
  - ''
44
72
  executables: []
@@ -59,7 +87,16 @@ files:
59
87
  - app/views/layouts/rails/ding/application.html.erb
60
88
  - config/routes.rb
61
89
  - lib/rails/ding.rb
90
+ - lib/rails/ding/auth_service.rb
91
+ - lib/rails/ding/cache_service.rb
92
+ - lib/rails/ding/chat_service.rb
93
+ - lib/rails/ding/configuration.rb
94
+ - lib/rails/ding/department_service.rb
62
95
  - lib/rails/ding/engine.rb
96
+ - lib/rails/ding/http_service.rb
97
+ - lib/rails/ding/log_service.rb
98
+ - lib/rails/ding/message_service.rb
99
+ - lib/rails/ding/user_service.rb
63
100
  - lib/rails/ding/version.rb
64
101
  - lib/tasks/rails/ding_tasks.rake
65
102
  homepage: http://www.liuxiaodao.top
@@ -81,8 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
81
118
  - !ruby/object:Gem::Version
82
119
  version: '0'
83
120
  requirements: []
84
- rubyforge_project:
85
- rubygems_version: 2.5.2.1
121
+ rubygems_version: 3.0.6
86
122
  signing_key:
87
123
  specification_version: 4
88
124
  summary: Ding API