wework 0.3.4 → 1.1.0

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.
Files changed (69) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +0 -1
  3. data/README.md +7 -0
  4. data/lib/wework.rb +15 -10
  5. data/lib/wework/api/agent.rb +15 -79
  6. data/lib/wework/api/base.rb +24 -32
  7. data/lib/wework/api/contact.rb +1 -75
  8. data/lib/wework/api/corp.rb +29 -0
  9. data/lib/wework/api/methods/agent.rb +49 -0
  10. data/lib/wework/api/methods/approval.rb +16 -0
  11. data/lib/wework/api/methods/batch.rb +34 -0
  12. data/lib/wework/api/methods/checkin.rb +19 -0
  13. data/lib/wework/api/methods/department.rb +27 -0
  14. data/lib/wework/api/methods/media.rb +20 -0
  15. data/lib/wework/api/methods/menu.rb +21 -0
  16. data/lib/wework/api/methods/message.rb +52 -0
  17. data/lib/wework/api/methods/provider.rb +16 -0
  18. data/lib/wework/api/methods/suite.rb +53 -0
  19. data/lib/wework/api/methods/user.rb +35 -0
  20. data/lib/wework/api/provider.rb +13 -0
  21. data/lib/wework/api/suite.rb +72 -0
  22. data/lib/wework/cipher.rb +3 -0
  23. data/lib/wework/mock_api.rb +34 -0
  24. data/lib/wework/request.rb +3 -1
  25. data/lib/wework/token/app_token.rb +21 -0
  26. data/lib/wework/token/base.rb +59 -0
  27. data/lib/wework/token/corp_token.rb +20 -0
  28. data/lib/wework/token/js_ticket.rb +25 -0
  29. data/lib/wework/token/provider_token.rb +21 -0
  30. data/lib/wework/token/suite_token.rb +21 -0
  31. data/lib/wework/version.rb +1 -1
  32. data/mock_responses/agent/get.json +29 -0
  33. data/mock_responses/agent/list.json +16 -0
  34. data/mock_responses/agent/set.json +4 -0
  35. data/mock_responses/batch/getresult.json +8 -0
  36. data/mock_responses/department/list.json +24 -0
  37. data/mock_responses/error.json +4 -0
  38. data/mock_responses/files/party.csv +12 -0
  39. data/mock_responses/files/sample.amr +0 -0
  40. data/mock_responses/files/sample.mp4 +0 -0
  41. data/mock_responses/files/sample.txt +1 -0
  42. data/mock_responses/files/user.csv +2 -0
  43. data/mock_responses/files/zhiren.png +0 -0
  44. data/mock_responses/get_jsapi_ticket.json +6 -0
  45. data/mock_responses/gettoken.json +6 -0
  46. data/mock_responses/menu/get.json +24 -0
  47. data/mock_responses/service/get.json +0 -0
  48. data/mock_responses/service/get_corp_token.json +4 -0
  49. data/mock_responses/service/get_login_info.json +34 -0
  50. data/mock_responses/service/get_permanent_code.json +54 -0
  51. data/mock_responses/service/get_pre_auth_code.json +6 -0
  52. data/mock_responses/service/get_provider_token.json +4 -0
  53. data/mock_responses/service/get_suite_token.json +4 -0
  54. data/mock_responses/success.json +4 -0
  55. data/mock_responses/user/convert_to_openid.json +6 -0
  56. data/mock_responses/user/convert_to_userid.json +5 -0
  57. data/mock_responses/user/get.json +18 -0
  58. data/mock_responses/user/getuserdetail.json +10 -0
  59. data/mock_responses/user/getuserinfo.json +8 -0
  60. data/mock_responses/user/list.json +22 -0
  61. data/mock_responses/user/simplelist.json +11 -0
  62. data/wework.gemspec +6 -2
  63. metadata +114 -19
  64. data/lib/wework/engine.rb +0 -31
  65. data/lib/wework/js_ticket/redis_store.rb +0 -41
  66. data/lib/wework/js_ticket/store.rb +0 -36
  67. data/lib/wework/provider.rb +0 -39
  68. data/lib/wework/token/redis_store.rb +0 -41
  69. data/lib/wework/token/store.rb +0 -36
@@ -1,5 +1,6 @@
1
1
  # Reference this: https://github.com/Eric-Guo/wechat/blob/master/lib/wechat/http_client.rb
2
2
  require 'http'
3
+ require 'wework/global_code'
3
4
 
4
5
  module Wework
5
6
  class Request
@@ -51,6 +52,7 @@ module Wework
51
52
  parse_response(response, as || :json) do |parse_as, data|
52
53
  break data unless parse_as == :json
53
54
  result = Wework::Result.new(data)
55
+ Rails.logger.info "[WEWORK] request path(#{url_base}#{path}): #{result.inspect}" if defined?(Rails)
54
56
  raise AccessTokenExpiredError if result.token_expired?
55
57
  result
56
58
  end
@@ -96,7 +98,7 @@ module Wework
96
98
  end
97
99
 
98
100
  def throw_error
99
- raise ResultErrorException.new(message || errmsg) unless success?
101
+ raise ResultErrorException.new(full_message) unless success?
100
102
  end
101
103
 
102
104
  def success?
@@ -0,0 +1,21 @@
1
+ require 'wework/token/base'
2
+
3
+ module Wework
4
+ module Token
5
+ class AppToken < Base
6
+
7
+ def redis_key
8
+ @redis_key ||= Digest::MD5.hexdigest "WX_APP_TOKEN_#{client.corp_id}_#{client.secret}"
9
+ end
10
+
11
+ def token_key
12
+ 'access_token'
13
+ end
14
+
15
+ def refresh_token
16
+ client.request.get 'gettoken', params: {corpid: client.corp_id, corpsecret: client.secret}
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,59 @@
1
+ module Wework
2
+ module Token
3
+ class Base
4
+ attr_accessor :client
5
+
6
+ def initialize(client)
7
+ @client = client
8
+ raise RedisNotConfigException if redis.nil?
9
+ end
10
+
11
+ def token
12
+ update_token if expired?
13
+ redis.hget(redis_key, token_key)
14
+ end
15
+
16
+ def update_token
17
+ result = refresh_token
18
+ value = result.send(token_key)
19
+ if value.nil?
20
+ puts "#{self.class.name} refresh token error: #{result.inspect}"
21
+ else
22
+ expires_at = Time.now.to_i + result.expires_in.to_i - Wework.expired_shift_seconds
23
+
24
+ redis.hmset(
25
+ redis_key,
26
+ token_key, value,
27
+ "expires_at", expires_at
28
+ )
29
+
30
+ redis.expireat(redis_key, expires_at)
31
+ end
32
+
33
+ value
34
+ end
35
+
36
+ private
37
+
38
+ def redis
39
+ Wework.redis
40
+ end
41
+
42
+ def redis_key
43
+ raise NotImplementedError
44
+ end
45
+
46
+ def token_key
47
+ raise NotImplementedError
48
+ end
49
+
50
+ def refresh_token
51
+ raise NotImplementedError
52
+ end
53
+
54
+ def expired?
55
+ redis.hvals(redis_key).empty? || redis.hget(redis_key, 'expires_at').to_i <= Time.now.to_i
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,20 @@
1
+ require 'wework/token/base'
2
+
3
+ module Wework
4
+ module Token
5
+ class CorpToken < Base
6
+
7
+ def redis_key
8
+ @redis_key ||= Digest::MD5.hexdigest "WX_CORP_TOKEN_#{client.corp_id}_#{client.permanent_code}"
9
+ end
10
+
11
+ def token_key
12
+ 'access_token'
13
+ end
14
+
15
+ def refresh_token
16
+ client.suite.get_corp_token(client.corp_id, client.permanent_code)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,25 @@
1
+ require 'wework/token/base'
2
+
3
+ require 'wework/token/base'
4
+
5
+ module Wework
6
+ module Token
7
+ class JsTicket < Base
8
+
9
+ alias_method :ticket, :token
10
+
11
+ def redis_key
12
+ @redis_key ||= Digest::MD5.hexdigest "WX_JS_TICKET_#{client.corp_id}_#{client.agent_id}"
13
+ end
14
+
15
+ def token_key
16
+ 'ticket'
17
+ end
18
+
19
+ def refresh_token
20
+ client.get 'get_jsapi_ticket'
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,21 @@
1
+ require 'wework/token/base'
2
+
3
+ module Wework
4
+ module Token
5
+ class ProviderToken < Base
6
+
7
+ def redis_key
8
+ @redis_key ||= Digest::MD5.hexdigest "WX_PROVIDER_TOKEN_#{client.corp_id}_#{client.secret}"
9
+ end
10
+
11
+ def token_key
12
+ 'provider_access_token'
13
+ end
14
+
15
+ def refresh_token
16
+ client.request.post 'service/get_provider_token', {corpid: client.corp_id, provider_secret: client.secret}
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ require 'wework/token/base'
2
+
3
+ module Wework
4
+ module Token
5
+ class SuiteToken < Base
6
+
7
+ def redis_key
8
+ @redis_key ||= Digest::MD5.hexdigest "WX_SUITE_TOKEN_#{client.suite_id}_#{client.suite_secret}_#{client.suite_token}"
9
+ end
10
+
11
+ def token_key
12
+ 'suite_access_token'
13
+ end
14
+
15
+ def refresh_token
16
+ client.request.post 'service/get_suite_token', {suite_id: client.suite_id, suite_secret: client.suite_secret, suite_ticket: client.suite_ticket}
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -1,3 +1,3 @@
1
1
  module Wework
2
- VERSION = '0.3.4'.freeze
2
+ VERSION = '1.1.0'.freeze
3
3
  end
@@ -0,0 +1,29 @@
1
+ {
2
+ "errcode":0,
3
+ "errmsg": "ok",
4
+ "agentid": "1",
5
+ "name": "NAME",
6
+ "square_logo_url": "xxxxxxxx",
7
+ "description": "desc",
8
+ "allow_userinfos": {
9
+ "user":[
10
+ {
11
+ "userid":"id2"
12
+ },
13
+ {
14
+ "userid":"id3"
15
+ }
16
+ ]
17
+ },
18
+ "allow_partys":{
19
+ "partyid": [1]
20
+ },
21
+ "allow_tags":{
22
+ "tagid": [1,2,3]
23
+ },
24
+ "close": 0,
25
+ "redirect_domain": "www.qq.com",
26
+ "report_location_flag": 0,
27
+ "isreportenter": 0,
28
+ "home_url": "http://www.qq.com"
29
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "errcode":0,
3
+ "errmsg":"ok" ,
4
+ "agentlist":[
5
+ {
6
+ "agentid":1,
7
+ "name":"NAME",
8
+ "square_logo_url":"xxxxxxxx"
9
+ },
10
+ {
11
+ "agentid":2,
12
+ "name":"NAME",
13
+ "square_logo_url":"xxxxxxxx"
14
+ }
15
+ ]
16
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "errcode":0,
3
+ "errmsg":"ok"
4
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "errcode": 0,
3
+ "errmsg": "ok",
4
+ "status": 1,
5
+ "type": "replace_user",
6
+ "total": 3,
7
+ "percentage": 33,
8
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "errcode": 0,
3
+ "errmsg": "ok",
4
+ "department": [
5
+ {
6
+ "id": 1,
7
+ "name": "杭州知人",
8
+ "parentid": 0,
9
+ "order": 10
10
+ },
11
+ {
12
+ "id": 2,
13
+ "name": "广州研发中心",
14
+ "parentid": 1,
15
+ "order": 11
16
+ },
17
+ {
18
+ "id": 3,
19
+ "name": "邮箱产品部",
20
+ "parentid": 2,
21
+ "order": 12
22
+ }
23
+ ]
24
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "errcode": -1,
3
+ "errmsg": "Invalid input"
4
+ }
@@ -0,0 +1,12 @@
1
+ 部门名称,部门ID,父部门ID,排序
2
+ A管理组,18,1,0
3
+ A产品组,19,1,-1024
4
+ A系统组,20,1,0
5
+ A客服组,1715,1,0
6
+ A成都销售组,1716,1,0
7
+ ATower组,4693,1,1024
8
+ A上海销售组,5883,1,4096
9
+ A北京销售组,5884,1,5120
10
+ A杭州销售组,5885,1,6144
11
+ A广深销售组,7160,1,7168
12
+ A运营组,11052,1,8192
Binary file
Binary file
@@ -0,0 +1 @@
1
+ Wework is a ruby API wrapper for work wechat
@@ -0,0 +1,2 @@
1
+ 姓名,帐号,手机号,邮箱,所在部门,职位
2
+ 李丽,lili1983,13438802101,22705030@qq.com,1,财务
Binary file
@@ -0,0 +1,6 @@
1
+ {
2
+ "errcode":0,
3
+ "errmsg":"ok",
4
+ "ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
5
+ "expires_in":7200
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "errcode":0,
3
+ "errmsg":"",
4
+ "access_token": "accesstoken000001",
5
+ "expires_in": 7200
6
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "button":[
3
+ {
4
+ "type":"click",
5
+ "name":"今日歌曲",
6
+ "key":"V1001_TODAY_MUSIC"
7
+ },
8
+ {
9
+ "name":"菜单",
10
+ "sub_button":[
11
+ {
12
+ "type":"view",
13
+ "name":"搜索",
14
+ "url":"http://www.soso.com/"
15
+ },
16
+ {
17
+ "type":"click",
18
+ "name":"赞一下我们",
19
+ "key":"V1001_GOOD"
20
+ }
21
+ ]
22
+ }
23
+ ]
24
+ }
File without changes
@@ -0,0 +1,4 @@
1
+ {
2
+ "access_token": "xxxxxx",
3
+ "expires_in": 7200
4
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "usertype": 1,
3
+ "user_info": {
4
+ "userid": "xxxx",
5
+ "name": "xxxx",
6
+ "avatar": "xxxx",
7
+ "email": "xxxx"
8
+ },
9
+ "corp_info": {
10
+ "corpid": "wx6c698d13f7a409a4"
11
+ },
12
+ "agent": [
13
+ {
14
+ "agentid": 0,
15
+ "auth_type": 1
16
+ },
17
+ {
18
+ "agentid": 1,
19
+ "auth_type": 1
20
+ },
21
+ {
22
+ "agentid": 2,
23
+ "auth_type": 1
24
+ }
25
+ ],
26
+ "auth_info": {
27
+ "department": [
28
+ {
29
+ "id": "2",
30
+ "writable": "true"
31
+ }
32
+ ]
33
+ }
34
+ }
@@ -0,0 +1,54 @@
1
+ {
2
+ "access_token": "xxxxxx",
3
+ "expires_in": 7200,
4
+ "permanent_code": "xxxx",
5
+ "auth_corp_info":
6
+ {
7
+ "corpid": "xxxx",
8
+ "corp_name": "name",
9
+ "corp_type": "verified",
10
+ "corp_square_logo_url": "yyyyy",
11
+ "corp_user_max": 50,
12
+ "corp_agent_max": 30,
13
+ "corp_full_name":"full_name",
14
+ "verified_end_time":1431775834,
15
+ "subject_type": 1,
16
+ "corp_wxqrcode": "zzzzz"
17
+ },
18
+ "auth_info":
19
+ {
20
+ "agent" :
21
+ [
22
+ {
23
+ "agentid":1,
24
+ "name":"NAME",
25
+ "round_logo_url":"xxxxxx",
26
+ "square_logo_url":"yyyyyy",
27
+ "appid":1,
28
+ "privilege":
29
+ {
30
+ "level":1,
31
+ "allow_party":[1,2,3],
32
+ "allow_user":["zhansan","lisi"],
33
+ "allow_tag":[1,2,3],
34
+ "extra_party":[4,5,6],
35
+ "extra_user":["wangwu"],
36
+ "extra_tag":[4,5,6]
37
+ }
38
+ },
39
+ {
40
+ "agentid":2,
41
+ "name":"NAME2",
42
+ "round_logo_url":"xxxxxx",
43
+ "square_logo_url":"yyyyyy",
44
+ "appid":5
45
+ }
46
+ ]
47
+ },
48
+ "auth_user_info":
49
+ {
50
+ "email":"xxxx@aaa.com",
51
+ "mobile":"1234567890",
52
+ "userid":"aa"
53
+ }
54
+ }