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.
- checksums.yaml +5 -5
- data/.gitignore +0 -1
- data/README.md +7 -0
- data/lib/wework.rb +15 -10
- data/lib/wework/api/agent.rb +15 -79
- data/lib/wework/api/base.rb +24 -32
- data/lib/wework/api/contact.rb +1 -75
- data/lib/wework/api/corp.rb +29 -0
- data/lib/wework/api/methods/agent.rb +49 -0
- data/lib/wework/api/methods/approval.rb +16 -0
- data/lib/wework/api/methods/batch.rb +34 -0
- data/lib/wework/api/methods/checkin.rb +19 -0
- data/lib/wework/api/methods/department.rb +27 -0
- data/lib/wework/api/methods/media.rb +20 -0
- data/lib/wework/api/methods/menu.rb +21 -0
- data/lib/wework/api/methods/message.rb +52 -0
- data/lib/wework/api/methods/provider.rb +16 -0
- data/lib/wework/api/methods/suite.rb +53 -0
- data/lib/wework/api/methods/user.rb +35 -0
- data/lib/wework/api/provider.rb +13 -0
- data/lib/wework/api/suite.rb +72 -0
- data/lib/wework/cipher.rb +3 -0
- data/lib/wework/mock_api.rb +34 -0
- data/lib/wework/request.rb +3 -1
- data/lib/wework/token/app_token.rb +21 -0
- data/lib/wework/token/base.rb +59 -0
- data/lib/wework/token/corp_token.rb +20 -0
- data/lib/wework/token/js_ticket.rb +25 -0
- data/lib/wework/token/provider_token.rb +21 -0
- data/lib/wework/token/suite_token.rb +21 -0
- data/lib/wework/version.rb +1 -1
- data/mock_responses/agent/get.json +29 -0
- data/mock_responses/agent/list.json +16 -0
- data/mock_responses/agent/set.json +4 -0
- data/mock_responses/batch/getresult.json +8 -0
- data/mock_responses/department/list.json +24 -0
- data/mock_responses/error.json +4 -0
- data/mock_responses/files/party.csv +12 -0
- data/mock_responses/files/sample.amr +0 -0
- data/mock_responses/files/sample.mp4 +0 -0
- data/mock_responses/files/sample.txt +1 -0
- data/mock_responses/files/user.csv +2 -0
- data/mock_responses/files/zhiren.png +0 -0
- data/mock_responses/get_jsapi_ticket.json +6 -0
- data/mock_responses/gettoken.json +6 -0
- data/mock_responses/menu/get.json +24 -0
- data/mock_responses/service/get.json +0 -0
- data/mock_responses/service/get_corp_token.json +4 -0
- data/mock_responses/service/get_login_info.json +34 -0
- data/mock_responses/service/get_permanent_code.json +54 -0
- data/mock_responses/service/get_pre_auth_code.json +6 -0
- data/mock_responses/service/get_provider_token.json +4 -0
- data/mock_responses/service/get_suite_token.json +4 -0
- data/mock_responses/success.json +4 -0
- data/mock_responses/user/convert_to_openid.json +6 -0
- data/mock_responses/user/convert_to_userid.json +5 -0
- data/mock_responses/user/get.json +18 -0
- data/mock_responses/user/getuserdetail.json +10 -0
- data/mock_responses/user/getuserinfo.json +8 -0
- data/mock_responses/user/list.json +22 -0
- data/mock_responses/user/simplelist.json +11 -0
- data/wework.gemspec +6 -2
- metadata +114 -19
- data/lib/wework/engine.rb +0 -31
- data/lib/wework/js_ticket/redis_store.rb +0 -41
- data/lib/wework/js_ticket/store.rb +0 -36
- data/lib/wework/provider.rb +0 -39
- data/lib/wework/token/redis_store.rb +0 -41
- data/lib/wework/token/store.rb +0 -36
@@ -0,0 +1,16 @@
|
|
1
|
+
require "erb"
|
2
|
+
|
3
|
+
module Wework
|
4
|
+
module Api
|
5
|
+
module Methods
|
6
|
+
module Approval
|
7
|
+
def get_approval_data start_time, end_time, next_spnum=nil
|
8
|
+
# https://work.weixin.qq.com/api/doc#11228
|
9
|
+
payload = {starttime: start_time, endtime: end_time}
|
10
|
+
payload[:next_spnum] = next_spnum unless next_spnum.nil?
|
11
|
+
post 'corp/getapprovaldata', payload
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Wework
|
2
|
+
module Api
|
3
|
+
module Methods
|
4
|
+
module Batch
|
5
|
+
def batch_syncuser media_id, callback_url=nil, token=nil, encodingaeskey=nil
|
6
|
+
post 'batch/syncuser', batch_params(media_id, callback_url, token, encodingaeskey)
|
7
|
+
end
|
8
|
+
|
9
|
+
def batch_replaceuser media_id, callback_url=nil, token=nil, encodingaeskey=nil
|
10
|
+
post 'batch/replaceuser', batch_params(media_id, callback_url, token, encodingaeskey)
|
11
|
+
end
|
12
|
+
|
13
|
+
def batch_replaceparty media_id, callback_url=nil, token=nil, encodingaeskey=nil
|
14
|
+
post 'batch/replaceparty', batch_params(media_id, callback_url, token, encodingaeskey)
|
15
|
+
end
|
16
|
+
|
17
|
+
def batch_getresult job_id
|
18
|
+
get 'batch/getresult', params: {jobid: job_id}
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def batch_params media_id, callback_url, token, encodingaeskey
|
24
|
+
params = {media_id: media_id}
|
25
|
+
if callback_url.present? && token.present? && encodingaeskey.present?
|
26
|
+
params[:callback] = {url: callback_url, token: token, encodingaeskey: encodingaeskey}
|
27
|
+
end
|
28
|
+
|
29
|
+
params
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require "erb"
|
2
|
+
|
3
|
+
module Wework
|
4
|
+
module Api
|
5
|
+
module Methods
|
6
|
+
module Checkin
|
7
|
+
def get_checkin_data start_time, end_time, userid_list=[], checkin_type=3
|
8
|
+
# https://work.weixin.qq.com/api/doc#11196
|
9
|
+
post 'checkin/getcheckindata', {
|
10
|
+
opencheckindatatype: checkin_type,
|
11
|
+
starttime: start_time,
|
12
|
+
endtime: end_time,
|
13
|
+
useridlist: userid_list,
|
14
|
+
}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Wework
|
2
|
+
module Api
|
3
|
+
module Methods
|
4
|
+
module Department
|
5
|
+
def department_create data={}
|
6
|
+
post 'department/create', data
|
7
|
+
end
|
8
|
+
|
9
|
+
def department_update department_id, data={}
|
10
|
+
post 'department/update', data.merge(id: department_id)
|
11
|
+
end
|
12
|
+
|
13
|
+
def department_delete department_id
|
14
|
+
get 'department/delete', params: {id: department_id}
|
15
|
+
end
|
16
|
+
|
17
|
+
def department_list department_id=nil
|
18
|
+
if department_id.nil?
|
19
|
+
get 'department/list'
|
20
|
+
else
|
21
|
+
get 'department/list', params: {id: department_id}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Wework
|
2
|
+
module Api
|
3
|
+
module Methods
|
4
|
+
module Media
|
5
|
+
# public API
|
6
|
+
def media_upload(type, file)
|
7
|
+
post_file 'media/upload', file, params: { type: type }
|
8
|
+
end
|
9
|
+
|
10
|
+
def media_get(media_id)
|
11
|
+
get 'media/get', params: { media_id: media_id }, as: :file
|
12
|
+
end
|
13
|
+
|
14
|
+
def get_media_url(media_id)
|
15
|
+
"#{API_ENDPOINT}media/get?access_token=#{access_token}&media_id=#{media_id}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "erb"
|
2
|
+
|
3
|
+
module Wework
|
4
|
+
module Api
|
5
|
+
module Methods
|
6
|
+
module Menu
|
7
|
+
def menu_create menu
|
8
|
+
post 'menu/create', menu, params: {agentid: agent_id}
|
9
|
+
end
|
10
|
+
|
11
|
+
def menu_get
|
12
|
+
get 'menu/get', params: {agentid: agent_id}
|
13
|
+
end
|
14
|
+
|
15
|
+
def menu_delete
|
16
|
+
get 'menu/delete', params: {agentid: agent_id}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require "erb"
|
2
|
+
|
3
|
+
module Wework
|
4
|
+
module Api
|
5
|
+
module Methods
|
6
|
+
module Message
|
7
|
+
def miniprogram_message_send user_id, miniprogram_notice={}
|
8
|
+
notice = miniprogram_notice.merge(appid: agent_id)
|
9
|
+
post 'message/send', { touser: user_id, msgtype: 'miniprogram_notice', miniprogram_notice: notice }
|
10
|
+
end
|
11
|
+
|
12
|
+
def text_message_send user_ids, department_ids, content
|
13
|
+
message_send user_ids, department_ids, {text: {content: content}, msgtype: 'text'}
|
14
|
+
end
|
15
|
+
|
16
|
+
def image_message_send user_ids, department_ids, media_id
|
17
|
+
message_send user_ids, department_ids, {image: {media_id: media_id}, msgtype: 'image'}
|
18
|
+
end
|
19
|
+
|
20
|
+
def voice_message_send user_ids, department_ids, media_id
|
21
|
+
message_send user_ids, department_ids, {voice: {media_id: media_id}, msgtype: 'voice'}
|
22
|
+
end
|
23
|
+
|
24
|
+
def file_message_send user_ids, department_ids, media_id
|
25
|
+
message_send user_ids, department_ids, {file: {media_id: media_id}, msgtype: 'file'}
|
26
|
+
end
|
27
|
+
|
28
|
+
def video_message_send user_ids, department_ids, video={}
|
29
|
+
message_send user_ids, department_ids, {video: video, msgtype: 'video'}
|
30
|
+
end
|
31
|
+
|
32
|
+
def textcard_message_send user_ids, department_ids, textcard={}
|
33
|
+
message_send user_ids, department_ids, {textcard: textcard, msgtype: 'textcard'}
|
34
|
+
end
|
35
|
+
|
36
|
+
def news_message_send user_ids, department_ids, news=[]
|
37
|
+
message_send user_ids, department_ids, {news: {articles: news}, msgtype: 'news'}
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def message_send user_ids, department_ids, payload={}
|
43
|
+
payload[:agentid] = agent_id
|
44
|
+
payload[:touser] = Array.wrap(user_ids).join('|') if user_ids.present?
|
45
|
+
payload[:toparty] = Array.wrap(department_ids).join('|') if department_ids.present?
|
46
|
+
|
47
|
+
post 'message/send', payload
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Wework
|
2
|
+
module Api
|
3
|
+
module Methods
|
4
|
+
module Provider
|
5
|
+
def sso_authorize_url(redirect_uri, user_type='admin', state='qywxlogin')
|
6
|
+
uri = ERB::Util.url_encode(redirect_uri)
|
7
|
+
"#{SSO_AUTHORIZE_ENDPOINT}?appid=#{corp_id}&redirect_uri=#{uri}&state=#{state}&usertype=#{user_type}"
|
8
|
+
end
|
9
|
+
|
10
|
+
def get_login_info auth_code
|
11
|
+
post 'service/get_login_info', {auth_code: auth_code}
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Wework
|
2
|
+
module Api
|
3
|
+
module Methods
|
4
|
+
module Suite
|
5
|
+
def corp_authorize_url(redirect_uri, state="corp_authorize")
|
6
|
+
"#{APP_AUTHORIZE_ENDPOINT}?suite_id=#{suite_id}&pre_auth_code=#{get_pre_auth_code}&redirect_uri=#{redirect_uri}&state=#{state}"
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_pre_auth_code
|
10
|
+
result = get 'service/get_pre_auth_code'
|
11
|
+
return result.pre_auth_code if result.success?
|
12
|
+
end
|
13
|
+
|
14
|
+
def set_session_info pre_auth_code, session_info={}
|
15
|
+
post 'service/set_session_info', {pre_auth_code: pre_auth_code, session_info: session_info}
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_permanent_code auth_code
|
19
|
+
post 'service/get_permanent_code', {auth_code: auth_code}
|
20
|
+
end
|
21
|
+
|
22
|
+
def get_auth_info auth_corpid, permanent_code
|
23
|
+
post 'service/get_auth_info', {auth_corpid: auth_corpid, permanent_code: permanent_code}
|
24
|
+
end
|
25
|
+
|
26
|
+
def get_corp_token auth_corpid, permanent_code
|
27
|
+
post 'service/get_corp_token', {suite_id: suite_id, auth_corpid: auth_corpid, permanent_code: permanent_code}
|
28
|
+
end
|
29
|
+
|
30
|
+
def get_admin_list auth_corpid, agentid
|
31
|
+
post 'service/get_admin_list', {auth_corpid: auth_corpid, agentid: agentid}
|
32
|
+
end
|
33
|
+
|
34
|
+
def authorize_url(redirect_uri, scope="snsapi_base", state="wxwork")
|
35
|
+
uri = ERB::Util.url_encode(redirect_uri)
|
36
|
+
"#{AUTHORIZE_ENDPOINT}?appid=#{suite_id}&redirect_uri=#{uri}&response_type=code&scope=#{scope}&state=#{state}#wechat_redirect"
|
37
|
+
end
|
38
|
+
|
39
|
+
def get_oauth_userinfo(code)
|
40
|
+
get 'service/getuserinfo3rd', params: {access_token: access_token, code: code}
|
41
|
+
end
|
42
|
+
|
43
|
+
def get_user_detail(user_ticket)
|
44
|
+
post "service/getuserdetail3rd?access_token=#{access_token}", {user_ticket: user_ticket}
|
45
|
+
end
|
46
|
+
|
47
|
+
def get_session_with_jscode(js_code, grant_type='authorization_code')
|
48
|
+
post 'service/miniprogram/jscode2session', {}, params: {js_code: js_code, grant_type: grant_type}
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Wework
|
2
|
+
module Api
|
3
|
+
module Methods
|
4
|
+
module User
|
5
|
+
def user_create data={}
|
6
|
+
post 'user/create', data
|
7
|
+
end
|
8
|
+
|
9
|
+
def user_get userid
|
10
|
+
get 'user/get', params: {userid: userid}
|
11
|
+
end
|
12
|
+
|
13
|
+
def user_update userid, data={}
|
14
|
+
post 'user/update', data.merge(userid: userid)
|
15
|
+
end
|
16
|
+
|
17
|
+
def user_delete userid
|
18
|
+
get 'user/delete', params: {userid: userid}
|
19
|
+
end
|
20
|
+
|
21
|
+
def user_batchdelete useridlist=[]
|
22
|
+
post 'user/batchdelete', {useridlist: useridlist}
|
23
|
+
end
|
24
|
+
|
25
|
+
def user_simplelist department_id, fetch_child=0
|
26
|
+
get 'user/simplelist', params: {department_id: department_id, fetch_child: fetch_child}
|
27
|
+
end
|
28
|
+
|
29
|
+
def user_list department_id, fetch_child=0
|
30
|
+
get 'user/list', params: {department_id: department_id, fetch_child: fetch_child}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'builder'
|
2
|
+
|
3
|
+
module Wework
|
4
|
+
module Api
|
5
|
+
class Suite < Base
|
6
|
+
|
7
|
+
include Wework::Cipher
|
8
|
+
include Methods::Suite
|
9
|
+
|
10
|
+
attr_reader :encoding_aes_key, :suite_id, :suite_secret, :suite_token
|
11
|
+
|
12
|
+
def initialize(options={})
|
13
|
+
@suite_id = options.delete(:suite_id)
|
14
|
+
@suite_secret = options.delete(:suite_secret)
|
15
|
+
@suite_token = options.delete(:suite_token)
|
16
|
+
@encoding_aes_key = options.delete(:encoding_aes_key)
|
17
|
+
super(options)
|
18
|
+
end
|
19
|
+
|
20
|
+
def msg_decrypt message
|
21
|
+
unpack(decrypt(Base64.decode64(message), encoding_aes_key))[0]
|
22
|
+
end
|
23
|
+
|
24
|
+
def msg_encrypt message
|
25
|
+
Base64.strict_encode64(encrypt(pack(message, corp_id), encoding_aes_key))
|
26
|
+
end
|
27
|
+
|
28
|
+
def signature(timestamp, nonce, encrypt)
|
29
|
+
array = [suite_token, timestamp, nonce]
|
30
|
+
array << encrypt unless encrypt.nil?
|
31
|
+
Digest::SHA1.hexdigest array.compact.collect(&:to_s).sort.join
|
32
|
+
end
|
33
|
+
|
34
|
+
def generate_xml(msg, timestamp, nonce)
|
35
|
+
encrypt = msg_encrypt(msg)
|
36
|
+
{
|
37
|
+
Encrypt: encrypt,
|
38
|
+
MsgSignature: signature(timestamp, nonce, encrypt),
|
39
|
+
TimeStamp: timestamp,
|
40
|
+
Nonce: nonce
|
41
|
+
}.to_xml(root: 'xml', children: 'item', skip_instruct: true, skip_types: true)
|
42
|
+
end
|
43
|
+
|
44
|
+
def suite_ticket= ticket
|
45
|
+
Wework.redis.set ticket_key, ticket
|
46
|
+
end
|
47
|
+
|
48
|
+
def suite_ticket
|
49
|
+
Wework.redis.get ticket_key
|
50
|
+
end
|
51
|
+
|
52
|
+
def corp(corp_id, permanent_code)
|
53
|
+
Wework::Api::Corp.new(suite: self, corp_id: corp_id, permanent_code: permanent_code)
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def token_params
|
59
|
+
{suite_access_token: access_token}
|
60
|
+
end
|
61
|
+
|
62
|
+
def ticket_key
|
63
|
+
"SUITE_TICKET_#{suite_id}"
|
64
|
+
end
|
65
|
+
|
66
|
+
def token_store
|
67
|
+
@token_store ||= Token::SuiteToken.new self
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/lib/wework/cipher.rb
CHANGED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'sinatra/base'
|
3
|
+
|
4
|
+
module Wework
|
5
|
+
class MockApi < Sinatra::Base
|
6
|
+
get '/cgi-bin/media/get' do
|
7
|
+
send_file mock_file_path('files/zhiren.png'), :type => :jpg
|
8
|
+
end
|
9
|
+
|
10
|
+
get '/cgi-bin/*' do |api|
|
11
|
+
json_response "#{api}.json"
|
12
|
+
end
|
13
|
+
|
14
|
+
%i(get post).each do |http_method|
|
15
|
+
send http_method, '/cgi-bin/*/*' do |category, api|
|
16
|
+
json_response "#{category}/#{api}.json"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def json_response file_name
|
23
|
+
content_type :json
|
24
|
+
status 200
|
25
|
+
file_path = mock_file_path(file_name)
|
26
|
+
file_path = mock_file_path('success.json') unless File.exist?(file_path)
|
27
|
+
File.open(file_path, 'rb').read
|
28
|
+
end
|
29
|
+
|
30
|
+
def mock_file_path path
|
31
|
+
File.join(File.expand_path('../../../mock_responses/', __FILE__), path)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|