ocean-wechat 0.1.0 → 0.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c84fb045f758d8641894311894135dc3525cdcfc3a17701018bb50debe758d49
4
- data.tar.gz: 7efcc812a28f9c6d355f014c0ee30caf4a037df5dc9c1820578e0a38ca8baa56
3
+ metadata.gz: e0a59062bb573b2b23fbc4a9fd79b1ec0c6bd86da75bdadc7182fbef530e4fd0
4
+ data.tar.gz: 8d5052896d617d42b9d0309fc02d56079aa5eaad991fd7a4333b923a4b2948ab
5
5
  SHA512:
6
- metadata.gz: 6d11c3ffa7e096aab6e83afe347f21ffc941a4f1495f5e433e5511a28df7f85559d79c7662cbe00698e06e6bc865400999669c346cf84a287026dc3af4fc29a4
7
- data.tar.gz: b9497e673889bb38f87e318e9ad19a00166931ccf8fb6391c906e9933f1159359090ce9a3d36265847920a04cc10692383c89028c730ffa0f24d0e03b1d3bf3e
6
+ metadata.gz: 25e273cb62ce790f09e25f0c6002e65aafd5dc9b1f012437a1fe24687fa33c08769571297deb0cf01b1bd47398621edfca16b2bd17929f28c0cada156690a84f
7
+ data.tar.gz: a53b4e5b6e01b8686c897b3d67198ce694a5e592bdae8c2da9a1c9adbd8bdf121d87c0412ebec69e4c043b6756bd207ed2625ed43179084d83326a2388e00aa0
@@ -1,5 +1,5 @@
1
1
  module Ocean
2
2
  module Wechat
3
- VERSION = "0.1.0"
3
+ VERSION = "0.1.1"
4
4
  end
5
5
  end
data/lib/ocean/wechat.rb CHANGED
@@ -3,185 +3,187 @@
3
3
  # Wechat service, View more at: https://mp.weixin.qq.com/wiki
4
4
  # example:
5
5
  # Wechat.notify(event: 'crash', first: 'Your website is not accessible', time: Time.now, reason: 'Connect fail!', remark: 'remark', redirect_url: 'www.baidu.com')
6
- module Wechat
7
- extend self
8
-
9
- BASE_URL = 'https://api.weixin.qq.com/cgi-bin'
10
- ACCESS_TOKEN_FILE = 'tmp/access_token.txt'
11
- NOTIFY_RECIPIENT_FILE = 'config/wechat_notify.yml'
12
- SUCCESS_CODE = 0
13
- ACCESS_TOKEN_EXPIRED_CODE = 420_01
14
- ACCESS_TOKEN_INVALID_CODE = 400_01
15
- NOTIFY_DEFAULT_COLOR = '#173177'
16
- MAX_RETRY_NUM = 5
17
-
18
- def access_token
19
- read_access_token || refresh_access_token
20
- end
6
+ module Ocean
7
+ module Wechat
8
+ extend self
9
+
10
+ BASE_URL = 'https://api.weixin.qq.com/cgi-bin'
11
+ ACCESS_TOKEN_FILE = 'tmp/access_token.txt'
12
+ NOTIFY_RECIPIENT_FILE = 'config/wechat_notify.yml'
13
+ SUCCESS_CODE = 0
14
+ ACCESS_TOKEN_EXPIRED_CODE = 420_01
15
+ ACCESS_TOKEN_INVALID_CODE = 400_01
16
+ NOTIFY_DEFAULT_COLOR = '#173177'
17
+ MAX_RETRY_NUM = 5
18
+
19
+ def access_token
20
+ read_access_token || refresh_access_token
21
+ end
21
22
 
22
- # Use wechat template to send message
23
- def notify(**args)
24
- notify_block = lambda do |open_id|
25
- url = "#{BASE_URL}/message/template/send"
26
- params = {
27
- touser: open_id,
28
- template_id: wechat_notify(args[:event], 'template'),
29
- url: args[:redirect_url],
30
- data: {}
31
- }
23
+ # Use wechat template to send message
24
+ def notify(**args)
25
+ notify_block = lambda do |open_id|
26
+ url = "#{BASE_URL}/message/template/send"
27
+ params = {
28
+ touser: open_id,
29
+ template_id: wechat_notify(args[:event], 'template'),
30
+ url: args[:redirect_url],
31
+ data: {}
32
+ }
32
33
 
33
- args.each { |k, v| params[:data][k] = { value: v, color: NOTIFY_DEFAULT_COLOR } }
34
+ args.each { |k, v| params[:data][k] = { value: v, color: NOTIFY_DEFAULT_COLOR } }
34
35
 
35
- request(url, params, :post)
36
- end
36
+ request(url, params, :post)
37
+ end
37
38
 
38
- [].tap do |item|
39
- wechat_notify(args[:event], 'users').each do |open_id|
40
- item << {
41
- open_id: open_id,
42
- success: notify_block.call(open_id)[:errcode] == SUCCESS_CODE
43
- }
39
+ [].tap do |item|
40
+ wechat_notify(args[:event], 'users').each do |open_id|
41
+ item << {
42
+ open_id: open_id,
43
+ success: notify_block.call(open_id)[:errcode] == SUCCESS_CODE
44
+ }
45
+ end
44
46
  end
45
47
  end
46
- end
47
48
 
48
- # Get all notify template
49
- def notify_templates
50
- request("#{BASE_URL}/template/get_all_private_template")
51
- end
49
+ # Get all notify template
50
+ def notify_templates
51
+ request("#{BASE_URL}/template/get_all_private_template")
52
+ end
52
53
 
53
- # Get all followers
54
- def users
55
- request("#{BASE_URL}/user/get")
56
- end
54
+ # Get all followers
55
+ def users
56
+ request("#{BASE_URL}/user/get")
57
+ end
57
58
 
58
- def create_user_tag(name)
59
- params = {
60
- tag: {
61
- name: name
59
+ def create_user_tag(name)
60
+ params = {
61
+ tag: {
62
+ name: name
63
+ }
62
64
  }
63
- }
64
65
 
65
- request("#{BASE_URL}/tags/create", params, :post)
66
- end
66
+ request("#{BASE_URL}/tags/create", params, :post)
67
+ end
67
68
 
68
- # Get all user tag
69
- def user_tags
70
- request("#{BASE_URL}/tags/get")
71
- end
69
+ # Get all user tag
70
+ def user_tags
71
+ request("#{BASE_URL}/tags/get")
72
+ end
72
73
 
73
- def find_users_by_tag(name)
74
- res = request(
75
- "#{BASE_URL}/user/tag/get",
76
- {
77
- tagid: find_tag_id_by_name(name)
78
- },
79
- :post
80
- )
74
+ def find_users_by_tag(name)
75
+ res = request(
76
+ "#{BASE_URL}/user/tag/get",
77
+ {
78
+ tagid: find_tag_id_by_name(name)
79
+ },
80
+ :post
81
+ )
81
82
 
82
- res['count'] == 0 ? [] : res['data']['openid']
83
- end
83
+ res['count'] == 0 ? [] : res['data']['openid']
84
+ end
84
85
 
85
- def find_tag_id_by_name(name)
86
- user_tags[:tags].detect { |item| item['name'] == name }['id']
87
- end
86
+ def find_tag_id_by_name(name)
87
+ user_tags[:tags].detect { |item| item['name'] == name }['id']
88
+ end
88
89
 
89
- def add_tag_for_users(users, tag_id)
90
- params = {
91
- open_list: users,
92
- tagid: tag_id
93
- }
90
+ def add_tag_for_users(users, tag_id)
91
+ params = {
92
+ open_list: users,
93
+ tagid: tag_id
94
+ }
94
95
 
95
- request("#{BASE_URL}/tags/members/batchtagging", params, :post)
96
- end
96
+ request("#{BASE_URL}/tags/members/batchtagging", params, :post)
97
+ end
97
98
 
98
- private
99
+ private
99
100
 
100
- def request(source_url, params = {}, method = :get, retry_num = 0)
101
- url = compose_url(source_url)
101
+ def request(source_url, params = {}, method = :get, retry_num = 0)
102
+ url = compose_url(source_url)
102
103
 
103
- log.debug "Send #{method} request #{params} to #{url}"
104
+ log.debug "Send #{method} request #{params} to #{url}"
104
105
 
105
- res = if method == :get
106
- RestClient.get(url, params)
107
- else
108
- RestClient.post(url, params.to_json, content_type: :json, accept: :json)
109
- end
106
+ res = if method == :get
107
+ RestClient.get(url, params)
108
+ else
109
+ RestClient.post(url, params.to_json, content_type: :json, accept: :json)
110
+ end
110
111
 
111
- res_body = read_content(res)
112
- json = JSON.parse force_encoding(res_body)
112
+ res_body = read_content(res)
113
+ json = JSON.parse force_encoding(res_body)
113
114
 
114
- json.symbolize_keys!
115
+ json.symbolize_keys!
115
116
 
116
- if json[:errcode] == ACCESS_TOKEN_EXPIRED_CODE || json[:errcode] == ACCESS_TOKEN_INVALID_CODE
117
- # Try again five times at most
118
- return if retry_num == MAX_RETRY_NUM
117
+ if json[:errcode] == ACCESS_TOKEN_EXPIRED_CODE || json[:errcode] == ACCESS_TOKEN_INVALID_CODE
118
+ # Try again five times at most
119
+ return if retry_num == MAX_RETRY_NUM
119
120
 
120
- log.info("Access token is expired or invalid, retry #{retry_num} ...")
121
+ log.info("Access token is expired or invalid, retry #{retry_num} ...")
121
122
 
122
- refresh_access_token
123
+ refresh_access_token
123
124
 
124
- # Control call frequency
125
- sleep(retry_num * 10)
126
- retry_num += 1
127
- return request(source_url, params, method, retry_num)
128
- elsif json[:errcode] && json[:errcode] != SUCCESS_CODE
129
- raise "Request #{url}, errmsg: #{json[:errmsg]}, errcode: #{json[:errcode]}"
130
- else
125
+ # Control call frequency
126
+ sleep(retry_num * 10)
127
+ retry_num += 1
128
+ return request(source_url, params, method, retry_num)
129
+ elsif json[:errcode] && json[:errcode] != SUCCESS_CODE
130
+ raise "Request #{url}, errmsg: #{json[:errmsg]}, errcode: #{json[:errcode]}"
131
+ else
132
+ json
133
+ end
134
+ rescue StandardError => ex
135
+ log.error("Call wechat api error: #{ex}\n #{ex.backtrace.join("\n")}")
131
136
  json
132
137
  end
133
- rescue StandardError => ex
134
- log.error("Call wechat api error: #{ex}\n #{ex.backtrace.join("\n")}")
135
- json
136
- end
137
138
 
138
- # Remove not UTF-8 encoding
139
- def force_encoding(data)
140
- data.force_encoding('UTF-8').gsub(/[\u0000-\u001f\u007f\u0080-\u009f]+/, '*')
141
- end
139
+ # Remove not UTF-8 encoding
140
+ def force_encoding(data)
141
+ data.force_encoding('UTF-8').gsub(/[\u0000-\u001f\u007f\u0080-\u009f]+/, '*')
142
+ end
142
143
 
143
- def read_content(res)
144
- if res['content-encoding'].present? && res['content-encoding'] == 'gzip'
145
- Zlib::GzipReader.new(StringIO.new(res.body), encoding: 'UTF-8').read
146
- else
147
- res.body
144
+ def read_content(res)
145
+ if res['content-encoding'].present? && res['content-encoding'] == 'gzip'
146
+ Zlib::GzipReader.new(StringIO.new(res.body), encoding: 'UTF-8').read
147
+ else
148
+ res.body
149
+ end
148
150
  end
149
- end
150
151
 
151
- def compose_url(source_url)
152
- source_url.include?('?') ? source_url : "#{source_url}?access_token=#{access_token}"
153
- end
152
+ def compose_url(source_url)
153
+ source_url.include?('?') ? source_url : "#{source_url}?access_token=#{access_token}"
154
+ end
154
155
 
155
- def refresh_access_token
156
- params = {
157
- grant_type: 'client_credential',
158
- appid: ENV.fetch('WECHAT_APP_ID'),
159
- secret: ENV.fetch('WECHAT_APP_SECRET')
160
- }
156
+ def refresh_access_token
157
+ params = {
158
+ grant_type: 'client_credential',
159
+ appid: ENV.fetch('WECHAT_APP_ID'),
160
+ secret: ENV.fetch('WECHAT_APP_SECRET')
161
+ }
161
162
 
162
- res = request("#{BASE_URL}/token?#{params.to_query}", {}, 'GET')
163
- save_access_token(res[:access_token]) if res[:access_token]
164
- res[:access_token]
165
- end
163
+ res = request("#{BASE_URL}/token?#{params.to_query}", {}, 'GET')
164
+ save_access_token(res[:access_token]) if res[:access_token]
165
+ res[:access_token]
166
+ end
166
167
 
167
- def save_access_token(token)
168
- file = File.new(ACCESS_TOKEN_FILE, 'w')
169
- file.write(token)
170
- rescue IOError => ex
171
- log.error("Write access_token fail: #{ex}")
172
- ensure
173
- file.close
174
- end
168
+ def save_access_token(token)
169
+ file = File.new(ACCESS_TOKEN_FILE, 'w')
170
+ file.write(token)
171
+ rescue IOError => ex
172
+ log.error("Write access_token fail: #{ex}")
173
+ ensure
174
+ file.close
175
+ end
175
176
 
176
- def read_access_token
177
- File.exist?(ACCESS_TOKEN_FILE) ? File.read(ACCESS_TOKEN_FILE) : nil
178
- end
177
+ def read_access_token
178
+ File.exist?(ACCESS_TOKEN_FILE) ? File.read(ACCESS_TOKEN_FILE) : nil
179
+ end
179
180
 
180
- def wechat_notify(event, key)
181
- File.exist?(NOTIFY_RECIPIENT_FILE) ? YAML.load_file(NOTIFY_RECIPIENT_FILE)[event.to_s][key] : []
182
- end
181
+ def wechat_notify(event, key)
182
+ File.exist?(NOTIFY_RECIPIENT_FILE) ? YAML.load_file(NOTIFY_RECIPIENT_FILE)[event.to_s][key] : []
183
+ end
183
184
 
184
- def log
185
- Rails.logger
185
+ def log
186
+ Rails.logger
187
+ end
186
188
  end
187
189
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ocean-wechat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - bestjane