wechat 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +6 -3
- data/bin/wechat +10 -0
- data/lib/wechat.rb +1 -1
- data/lib/wechat/api.rb +8 -0
- data/lib/wechat/corp_api.rb +8 -0
- data/lib/wechat/message.rb +1 -1
- data/lib/{action_controller → wechat}/responder.rb +11 -18
- data/lib/wechat/signature.rb +10 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 15c91eb2d65ed9645ca79ace9245f8b37951dd04
|
4
|
+
data.tar.gz: ce52424a06ecbd344c18f4a2113dbf7af9507a9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7d7c44d220b7467482271b757dddc50e71f19df8a2d2bde28d6e2d3a3c8f9eaf2cebb70adaa6df73ad9b86c34314f013c0803d3def5cd47dd933e82d1d86408b
|
7
|
+
data.tar.gz: 988540c451e81e64e44c2959d46197e420bfe1ed32756e4a15b33b68ad523abf9a32afb50fd9ddeb3e117c98fd6bf16c83eb77b750161976fec40b0dec0f309a
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## v0.4.1 (released at 9/6/2015)
|
4
|
+
|
5
|
+
* Limit news articles collection to 10, close #5
|
6
|
+
* Resolve the conflict with gem "responders" by @seamon #45
|
7
|
+
|
3
8
|
## v0.4.0 (released at 9/5/2015)
|
4
9
|
|
5
10
|
* Enable the verify SSL for enterprise mode by default, as security is more importent than speed, but still can switch off by configure
|
data/README.md
CHANGED
@@ -154,6 +154,8 @@ Wechat commands:
|
|
154
154
|
wechat invite_user [USER_ID] # 邀请成员关注
|
155
155
|
wechat material [MEDIA_ID, PATH] # 永久媒体下载
|
156
156
|
wechat material_add [MEDIA_TYPE, PATH] # 永久媒体上传
|
157
|
+
wechat material_count # 获取素材总数
|
158
|
+
wechat material_delete [MEDIA_ID] # 删除永久素材
|
157
159
|
wechat media [MEDIA_ID, PATH] # 媒体下载
|
158
160
|
wechat media_create [MEDIA_TYPE, PATH] # 媒体上传
|
159
161
|
wechat menu # 当前菜单
|
@@ -343,9 +345,10 @@ class WechatsController < ApplicationController
|
|
343
345
|
|
344
346
|
# 当请求的文字信息内容为'<n>条新闻'时, 使用这个responder处理, 并将n作为第二个参数
|
345
347
|
on :text, with: /^(\d+)条新闻$/ do |request, count|
|
346
|
-
|
347
|
-
|
348
|
-
|
348
|
+
# 微信最多显示10条新闻,大于10条将只取前10条
|
349
|
+
news = (1..count.to_i).each_with_object([]) { |n, memo| memo << {title: "新闻标题", content: "第#{n}条新闻的内容#{n.hash}"} }
|
350
|
+
request.reply.news(news) do |article, n, index| # 回复"articles"
|
351
|
+
article.item title: "#{index} #{n[:title]}", description: n[:content], pic_url: "http://www.baidu.com/img/bdlogo.gif", url:"http://www.baidu.com/"
|
349
352
|
end
|
350
353
|
end
|
351
354
|
|
data/bin/wechat
CHANGED
@@ -165,6 +165,16 @@ HELP
|
|
165
165
|
puts Helper.with(options).material_add(type, file)
|
166
166
|
end
|
167
167
|
|
168
|
+
desc 'material_delete [MEDIA_ID]', '删除永久素材'
|
169
|
+
def material_delete(media_id)
|
170
|
+
puts Helper.with(options).material_delete(media_id)
|
171
|
+
end
|
172
|
+
|
173
|
+
desc 'material_count', '获取素材总数'
|
174
|
+
def material_count
|
175
|
+
puts Helper.with(options).material_count
|
176
|
+
end
|
177
|
+
|
168
178
|
desc 'message_send [OPENID, TEXT_MESSAGE]', '发送文字消息(仅企业号)'
|
169
179
|
def message_send(openid, text_message)
|
170
180
|
puts Helper.with(options).message_send openid, text_message
|
data/lib/wechat.rb
CHANGED
@@ -4,7 +4,7 @@ require 'action_controller/wechat_responder'
|
|
4
4
|
|
5
5
|
module Wechat
|
6
6
|
autoload :Message, 'wechat/message'
|
7
|
-
autoload :Responder, '
|
7
|
+
autoload :Responder, 'wechat/responder'
|
8
8
|
autoload :Cipher, 'wechat/cipher'
|
9
9
|
|
10
10
|
class AccessTokenExpiredError < StandardError; end
|
data/lib/wechat/api.rb
CHANGED
@@ -75,10 +75,18 @@ module Wechat
|
|
75
75
|
get 'material/get', params: { media_id: media_id }, base: FILE_BASE, as: :file
|
76
76
|
end
|
77
77
|
|
78
|
+
def material_count
|
79
|
+
get 'material/get_materialcount'
|
80
|
+
end
|
81
|
+
|
78
82
|
def material_add(type, file)
|
79
83
|
post 'material/add_material', { upload: { media: file } }, params: { type: type }, base: FILE_BASE
|
80
84
|
end
|
81
85
|
|
86
|
+
def material_delete(media_id)
|
87
|
+
post 'material/del_material', media_id: media_id
|
88
|
+
end
|
89
|
+
|
82
90
|
def custom_message_send(message)
|
83
91
|
post 'message/custom/send', message.to_json, content_type: :json
|
84
92
|
end
|
data/lib/wechat/corp_api.rb
CHANGED
@@ -60,6 +60,10 @@ module Wechat
|
|
60
60
|
get 'media/get', params: { media_id: media_id }, as: :file
|
61
61
|
end
|
62
62
|
|
63
|
+
def material_count
|
64
|
+
get 'material/get_count', params: { agentid: agentid }
|
65
|
+
end
|
66
|
+
|
63
67
|
def media_create(type, file)
|
64
68
|
post 'media/upload', { upload: { media: file } }, params: { type: type }
|
65
69
|
end
|
@@ -72,6 +76,10 @@ module Wechat
|
|
72
76
|
post 'material/add_material', { upload: { media: file } }, params: { type: type, agentid: agentid }
|
73
77
|
end
|
74
78
|
|
79
|
+
def material_delete(media_id)
|
80
|
+
get 'material/del', params: { media_id: media_id, agentid: agentid }
|
81
|
+
end
|
82
|
+
|
75
83
|
def message_send(openid, message)
|
76
84
|
post 'message/send', Message.to(openid).text(message).agent_id(agentid).to_json, content_type: :json
|
77
85
|
end
|
data/lib/wechat/message.rb
CHANGED
@@ -94,7 +94,7 @@ module Wechat
|
|
94
94
|
def news(collection, &block)
|
95
95
|
if block_given?
|
96
96
|
article = ArticleBuilder.new
|
97
|
-
collection.
|
97
|
+
collection.take(10).each_with_index { |item, index| yield(article, item, index) }
|
98
98
|
items = article.items
|
99
99
|
else
|
100
100
|
items = collection.collect do |item|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'English'
|
2
|
+
require 'wechat/signature'
|
2
3
|
|
3
4
|
module Wechat
|
4
5
|
module Responder
|
@@ -14,11 +15,11 @@ module Wechat
|
|
14
15
|
attr_accessor :wechat, :token, :corpid, :agentid, :encrypt_mode, :skip_verify_ssl, :encoding_aes_key
|
15
16
|
|
16
17
|
def on(message_type, with: nil, respond: nil, &block)
|
17
|
-
fail 'Unknow message type' unless
|
18
|
+
fail 'Unknow message type' unless [:text, :image, :voice, :video, :location, :link, :event, :fallback].include?(message_type)
|
18
19
|
config = respond.nil? ? {} : { respond: respond }
|
19
20
|
config.merge!(proc: block) if block_given?
|
20
21
|
|
21
|
-
if with.present? && !
|
22
|
+
if with.present? && ![:text, :event].include?(message_type)
|
22
23
|
fail 'Only text and event message can take :with parameters'
|
23
24
|
else
|
24
25
|
config.merge!(with: with) if with.present?
|
@@ -104,22 +105,14 @@ module Wechat
|
|
104
105
|
def verify_signature
|
105
106
|
signature = params[:signature] || params[:msg_signature]
|
106
107
|
|
107
|
-
|
108
|
-
end
|
109
|
-
|
110
|
-
def content_to_verify
|
111
|
-
array = [self.class.token, params[:timestamp], params[:nonce]]
|
108
|
+
msg_encrypt = params[:echostr] if self.class.corpid.present?
|
112
109
|
|
113
|
-
|
114
|
-
if params[:signature].blank? && params[:msg_signature]
|
115
|
-
if params[:echostr].present?
|
116
|
-
array << params[:echostr]
|
117
|
-
else
|
118
|
-
array << request_encrypt_content
|
119
|
-
end
|
120
|
-
end
|
110
|
+
msg_encrypt ||= request_encrypt_content if self.class.encrypt_mode
|
121
111
|
|
122
|
-
|
112
|
+
render text: 'Forbidden', status: 403 if signature != Signature.hexdigest(self.class.token,
|
113
|
+
params[:timestamp],
|
114
|
+
params[:nonce],
|
115
|
+
msg_encrypt)
|
123
116
|
end
|
124
117
|
|
125
118
|
def post_xml
|
@@ -155,7 +148,7 @@ module Wechat
|
|
155
148
|
def process_response(response)
|
156
149
|
msg = response.to_xml
|
157
150
|
|
158
|
-
if self.class.encrypt_mode
|
151
|
+
if self.class.encrypt_mode
|
159
152
|
encrypt = Base64.strict_encode64(encrypt(pack(msg, @app_id), self.class.encoding_aes_key))
|
160
153
|
msg = gen_msg(encrypt, params[:timestamp], params[:nonce])
|
161
154
|
end
|
@@ -164,7 +157,7 @@ module Wechat
|
|
164
157
|
end
|
165
158
|
|
166
159
|
def gen_msg(encrypt, timestamp, nonce)
|
167
|
-
msg_sign =
|
160
|
+
msg_sign = Signature.hexdigest(self.class.token, timestamp, nonce, encrypt)
|
168
161
|
|
169
162
|
{ Encrypt: encrypt,
|
170
163
|
MsgSignature: msg_sign,
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module Wechat
|
2
|
+
module Signature
|
3
|
+
def self.hexdigest(token, timestamp, nonce, msg_encrypt)
|
4
|
+
array = [token, timestamp, nonce]
|
5
|
+
array << msg_encrypt unless msg_encrypt.nil?
|
6
|
+
dev_msg_signature = array.compact.collect(&:to_s).sort.join
|
7
|
+
Digest::SHA1.hexdigest(dev_msg_signature)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wechat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Skinnyworm
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-09-
|
12
|
+
date: 2015-09-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -79,7 +79,6 @@ files:
|
|
79
79
|
- README.md
|
80
80
|
- Rakefile
|
81
81
|
- bin/wechat
|
82
|
-
- lib/action_controller/responder.rb
|
83
82
|
- lib/action_controller/wechat_responder.rb
|
84
83
|
- lib/wechat.rb
|
85
84
|
- lib/wechat/access_token.rb
|
@@ -90,6 +89,8 @@ files:
|
|
90
89
|
- lib/wechat/corp_api.rb
|
91
90
|
- lib/wechat/jsapi_ticket.rb
|
92
91
|
- lib/wechat/message.rb
|
92
|
+
- lib/wechat/responder.rb
|
93
|
+
- lib/wechat/signature.rb
|
93
94
|
homepage: https://github.com/Eric-Guo/wechat
|
94
95
|
licenses:
|
95
96
|
- MIT
|