wx_ext 0.1.4 → 0.1.5

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
2
  SHA1:
3
- metadata.gz: b09d3e31cfa73aba2eb5b058c17163dc97a25ffa
4
- data.tar.gz: 11d8bb8534f855c0154099411f46d43181ed1cd2
3
+ metadata.gz: 203fdbfdf2af62627187c6032990c5197801c986
4
+ data.tar.gz: d5b91a0de4da6424b4a7eb3dce028b3ddcc83b2c
5
5
  SHA512:
6
- metadata.gz: 7b458d4545f22d2f7679e0640887c367483446765c688a5745faebf50cb4e089faf5b7765facef32251d087dae2683b5c1c21e5850be7144aedf00e124de81c5
7
- data.tar.gz: 936ae911d89043aa9ab3765e238ead59b58b7004867b6a58f6c9f60c944f2780f9550167560b74416899a7ea496108ef39c639528f3b164e031ff4082800abb7
6
+ metadata.gz: 5321d5ffd737870b445b26493bbfe6c64c440d41a05b9af6224d99264896993fcc861ff6aa191942a9428a910421e5ed5ac0b7955cc93e4a18fb20235a93f00f
7
+ data.tar.gz: 0185ceab9c0dc273315275f3a88d9c596698e3c274ce55066b85f27f78b0c0447f58ed0e594e70034a72aa11e0e7ed4a6321af85525b5d545fadb9c1fcf23e1c
data/README.md CHANGED
@@ -24,6 +24,10 @@ And then execute:
24
24
  2. rspec spec/wx_ext/weixin_spec.rb
25
25
  3. rspec spec/wx_ext/sougou_weixin_spec.rb
26
26
 
27
+ ## yard
28
+
29
+ `yardoc lib/*.rb lib/wx_ext/*.rb lib/wx_ext/api/*.rb lib/wx_ext/api/user/*.rb`
30
+
27
31
  ## Contributing
28
32
 
29
33
  1. Fork it ( https://github.com/FlowerWrong/wx_ext/fork )
@@ -1,37 +1,42 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'digest'
4
3
  require 'rest_client'
5
- require 'json'
6
- require 'wx_ext/helper'
7
4
 
8
5
  module WxExt
6
+ # Weixin api
7
+ #
8
+ # @author FuShengYang
9
9
  module Api
10
-
11
- # 微信扩展接口, 模拟登陆微信公众平台
10
+ # User api of weixin.
11
+ #
12
12
  # @author FuShengYang
13
13
  module Base
14
14
  class << self
15
- # Get the access_token for other apis.
16
- # http://mp.weixin.qq.com/wiki/11/0e4b294685f817b95cbed85ba5e82b8f.html
15
+ # Get the access_token for other apis via get.
17
16
  #
18
- # @param [String] appid
19
- # @param [String] secret
20
- # @param [String] grant_type, default is 'client_credential'
21
- # @return [Hash] {"access_token":"ACCESS_TOKEN","expires_in":7200}
17
+ # @param [Enumerable<String>] appid
18
+ # @param [Enumerable<String>] secret
19
+ # @param [Enumerable<String>] grant_type
20
+ # @return [Hash] "access_token":"ACCESS_TOKEN","expires_in":7200
22
21
  def get_access_token(appid, secret, grant_type = 'client_credential')
23
22
  url = 'https://api.weixin.qq.com/cgi-bin/token'\
24
23
  "?grant_type=#{grant_type}&appid=#{appid}&secret=#{secret}"
25
24
  Helper.http_get(url, { accept: :json })
26
25
  end
27
26
 
28
- # { "ip_list":["127.0.0.1","127.0.0.1"] }
27
+ # Get weixin server ips.
28
+ #
29
+ # @param [Enumerable<String>] access_token
30
+ # @return [Hash] A json parse hash.
29
31
  def get_weixin_ips(access_token)
30
32
  url = 'https://api.weixin.qq.com/cgi-bin/getcallbackip'\
31
33
  "?access_token=#{access_token}"
32
34
  Helper.http_get(url, { accept: :json })
33
35
  end
34
36
 
37
+ # Get weixin error_code and msg map.
38
+ #
39
+ # @return [Hash] A json parse hash.
35
40
  def code_msg
36
41
  {
37
42
  -1 => '系统繁忙,此时请开发者稍候再试',
@@ -130,18 +135,22 @@ module WxExt
130
135
  end
131
136
 
132
137
  # Upload media to weixin.
133
- # http://mp.weixin.qq.com/wiki/10/78b15308b053286e2a66b33f0f0f5fb6.html
134
138
  #
135
- # @param [String] access_token
136
- # @param [String] type, 媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
137
- # @param [String] media, form-data中媒体文件标识,有filename、filelength、content-type等信息
138
- # @return [Hash] {"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789}
139
+ # @param [Enumerable<String>] access_token
140
+ # @param [Enumerable<String>] type 媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
141
+ # @param [File] media form-data中媒体文件标识,有filename、filelength、content-type等信息
142
+ # @return [Hash] "type":"TYPE","media_id":"MEDIA_ID","created_at":123456789
139
143
  def upload_media(access_token, type, media)
140
144
  url = 'http://file.api.weixin.qq.com/cgi-bin/media/upload'\
141
145
  "?access_token=#{access_token}&type=#{type}"
142
146
  Helper.http_post(url, {file: media})
143
147
  end
144
148
 
149
+ # Download media from weixin.
150
+ #
151
+ # @param [Enumerable<String>] access_token
152
+ # @param [Enumerable<String>] media_id
153
+ # @return [Image] Download img.
145
154
  def download_media(access_token, media_id)
146
155
  url = 'http://file.api.weixin.qq.com/cgi-bin/media/get'\
147
156
  "?access_token=#{access_token}&media_id=#{media_id}"
@@ -0,0 +1,33 @@
1
+ # encoding: UTF-8
2
+
3
+ module WxExt
4
+ # Weixin api
5
+ #
6
+ # @author FuShengYang
7
+ module Api
8
+ # User api of weixin.
9
+ #
10
+ # @author FuShengYang
11
+ module CustomerService
12
+ class << self
13
+ # Reply msg via post.
14
+ #
15
+ # @param [Enumerable<String>] access_token
16
+ # @param [Enumerable<String>] to_user_openid
17
+ # @param [Enumerable<String>] msg_type
18
+ # @param [Hash] msg_hash
19
+ # @return [Hash] Json based hash.
20
+ def reply_msg(access_token, to_user_openid, msg_type, msg_hash)
21
+ url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send'\
22
+ "?access_token=#{access_token}"
23
+ msg_hash = {
24
+ :touser => to_user_openid,
25
+ :msgtype => msg_type,
26
+ "#{msg_type}".to_sym => msg_hash
27
+ }
28
+ Helper.http_post(url, msg_hash.to_json)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
data/lib/wx_ext/api/js.rb CHANGED
@@ -1,21 +1,32 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  require 'digest'
4
- require 'rest_client'
5
- require 'json'
6
4
 
7
5
  module WxExt
6
+ # Weixin api
7
+ #
8
+ # @author FuShengYang
8
9
  module Api
9
-
10
- # 微信扩展接口, 模拟登陆微信公众平台
10
+ # User api of weixin.
11
+ #
11
12
  # @author FuShengYang
12
13
  module Js
13
14
  class << self
15
+ # Get js api ticket.
16
+ #
17
+ # @param [Enumerable<String>] access_token
18
+ # @return [Hash] Json based hash.
14
19
  def get_jsapi_ticket(access_token)
15
20
  url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=#{access_token}&type=jsapi"
16
21
  Helper.http_get(url, { accept: :json })
17
22
  end
18
23
 
24
+ # Get js api config hash.
25
+ #
26
+ # @param [Enumerable<String>] access_token
27
+ # @param [Enumerable<String>] url
28
+ # @param [Enumerable<String>] app_id
29
+ # @return [Hash] Json based hash.
19
30
  def get_jsapi_config(access_token, url, app_id)
20
31
  config_hash = {}
21
32
  jsapi_ticket_hash = get_jsapi_ticket(access_token)
@@ -37,10 +48,16 @@ module WxExt
37
48
 
38
49
  private
39
50
 
51
+ # Set the noncestr of 16 byte.
52
+ #
53
+ # @return [String] 16 byte str.
40
54
  def set_noncestr
41
55
  [*'a'..'z',*'0'..'9',*'A'..'Z'].sample(16).join
42
56
  end
43
57
 
58
+ # Set the timestamp.
59
+ #
60
+ # @return [String] timestamp str.
44
61
  def set_timestamp
45
62
  Time.now.to_i.to_s
46
63
  end
@@ -0,0 +1,81 @@
1
+ # encoding: UTF-8
2
+
3
+ module WxExt
4
+ # Weixin api
5
+ #
6
+ # @author FuShengYang
7
+ module Api
8
+ # User api of weixin.
9
+ #
10
+ # @author FuShengYang
11
+ module Mass
12
+ class << self
13
+ # Upload news to weixin server via post.
14
+ #
15
+ # @param [Enumerable<String>] access_token
16
+ # @param [Hash] news_hash
17
+ # @return [Hash] Json based hash.
18
+ def upload_news(access_token, news_hash)
19
+ url = 'https://api.weixin.qq.com/cgi-bin/media/uploadnews'\
20
+ "?access_token=#{access_token}"
21
+ Helper.http_post(url, news_hash.to_json)
22
+ end
23
+
24
+ # Mass to users by filter group via post.
25
+ #
26
+ # @param [Enumerable<String>] access_token
27
+ # @param [Hash] filter_hash
28
+ # @return [Hash] Json based hash.
29
+ def mass_by_filter_group(access_token, filter_hash)
30
+ url = 'https://api.weixin.qq.com/cgi-bin/message/mass/sendall'\
31
+ "?access_token=#{access_token}"
32
+ Helper.http_post(url, filter_hash.to_json)
33
+ end
34
+
35
+ # Mass to users by openid via post.
36
+ #
37
+ # @param [Enumerable<String>] access_token
38
+ # @param [Hash] openid_hash
39
+ # @return [Hash] Json based hash.
40
+ def mass_by_openid(access_token, openid_hash)
41
+ url = 'https://api.weixin.qq.com/cgi-bin/message/mass/send'\
42
+ "?access_token=#{access_token}"
43
+ Helper.http_post(url, openid_hash.to_json)
44
+ end
45
+
46
+ # Del mass via post.
47
+ #
48
+ # @param [Enumerable<String>] access_token
49
+ # @param [String] msg_id
50
+ # @return [Hash] Json based hash.
51
+ def del_mass(access_token, msg_id)
52
+ url = 'https://api.weixin.qq.com/cgi-bin/message/mass/delete'\
53
+ "?access_token=#{access_token}"
54
+ Helper.http_post(url, { msg_id: msg_id }.to_json)
55
+ end
56
+
57
+ # Preview mass via post.
58
+ #
59
+ # @param [Enumerable<String>] access_token
60
+ # @param [Hash] preview_hash
61
+ # @return [Hash] Json based hash.
62
+ def preview_mass(access_token, preview_hash)
63
+ url = 'https://api.weixin.qq.com/cgi-bin/message/mass/preview'\
64
+ "?access_token=#{access_token}"
65
+ Helper.http_post(url, preview_hash.to_json)
66
+ end
67
+
68
+ # Get mass status via post.
69
+ #
70
+ # @param [Enumerable<String>] access_token
71
+ # @param [String] msg_id
72
+ # @return [Hash] Json based hash.
73
+ def get_mass_status(access_token, msg_id)
74
+ url = 'https://api.weixin.qq.com/cgi-bin/message/mass/get'\
75
+ "?access_token=#{access_token}"
76
+ Helper.http_post(url, { msg_id: msg_id }.to_json)
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -1,25 +1,41 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module WxExt
4
+ # Weixin api
5
+ #
6
+ # @author FuShengYang
4
7
  module Api
5
-
6
- # 微信扩展接口, 模拟登陆微信公众平台
8
+ # User api of weixin.
9
+ #
7
10
  # @author FuShengYang
8
11
  module Menu
9
12
  class << self
10
13
 
14
+ # Create menu via post.
15
+ #
16
+ # @param [Enumerable<String>] access_token
17
+ # @param [Hash] menu_hash
18
+ # @return [Hash] Json based hash.
11
19
  def create_menu(access_token, menu_hash)
12
20
  url = 'https://api.weixin.qq.com/cgi-bin/menu/create'\
13
21
  "?access_token=#{access_token}"
14
- Helper.http_post(url, menu_hash)
22
+ Helper.http_post(url, menu_hash.to_json)
15
23
  end
16
24
 
25
+ # Get menus via get.
26
+ #
27
+ # @param [Enumerable<String>] access_token
28
+ # @return [Hash] Json based hash.
17
29
  def menus(access_token)
18
30
  url = 'https://api.weixin.qq.com/cgi-bin/menu/get'\
19
31
  "?access_token=#{access_token}"
20
32
  Helper.http_get(url, { accept: :json })
21
33
  end
22
34
 
35
+ # Del menu via get.
36
+ #
37
+ # @param [Enumerable<String>] access_token
38
+ # @return [Hash] Json based hash.
23
39
  def del_menu(access_token)
24
40
  url = 'https://api.weixin.qq.com/cgi-bin/menu/delete'\
25
41
  "?access_token=#{access_token}"
@@ -1,18 +1,47 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'digest'
4
-
5
3
  module WxExt
4
+ # Weixin api
5
+ #
6
+ # @author FuShengYang
6
7
  module Api
7
-
8
- # 微信扩展接口, 模拟登陆微信公众平台
8
+ # User api of weixin.
9
+ #
9
10
  # @author FuShengYang
10
- module Msg
11
+ module Qrcode
11
12
  class << self
12
13
 
13
- def check_signature(signature, timestamp, nonce, token)
14
- array = [token, timestamp, nonce].sort
15
- signature == Digest::SHA1.hexdigest(array.join) ? true : false
14
+ # Create ticket via post.
15
+ #
16
+ # @param [Enumerable<String>] access_token
17
+ # @param [Hash] ticket_hash
18
+ # @return [Hash] Json based hash.
19
+ def create_ticket(access_token, ticket_hash)
20
+ url = 'https://api.weixin.qq.com/cgi-bin/qrcode/create'\
21
+ "?access_token=#{access_token}"
22
+ Helper.http_post(url, ticket_hash.to_json)
23
+ end
24
+
25
+ # Get the qrcode via ticket.
26
+ #
27
+ # @param [Enumerable<String>] ticket
28
+ # @return [Hash] Json based hash.
29
+ def get_qrcode_by_ticket(ticket)
30
+ url = 'https://mp.weixin.qq.com/cgi-bin/showqrcode'\
31
+ "?ticket=#{ticket}"
32
+ Helper.http_get url
33
+ end
34
+
35
+ # Long url to short url via post.
36
+ #
37
+ # @param [Enumerable<String>] access_token
38
+ # @param [Enumerable<String>] action
39
+ # @param [Enumerable<String>] long_url
40
+ # @return [Hash] Json based hash.
41
+ def long_url_2_short(access_token, action='long2short', long_url)
42
+ url = 'https://api.weixin.qq.com/cgi-bin/shorturl'\
43
+ "?access_token=#{access_token}"
44
+ Helper.http_post(url, { action: action, long_url: long_url }.to_json)
16
45
  end
17
46
  end
18
47
  end
@@ -0,0 +1,23 @@
1
+ # encoding: UTF-8
2
+
3
+ module WxExt
4
+ # Weixin api
5
+ #
6
+ # @author FuShengYang
7
+ module Api
8
+ # User api of weixin.
9
+ #
10
+ # @author FuShengYang
11
+ module Msg
12
+ class << self
13
+ # Check the signature before send msg.
14
+ #
15
+ # @return [Boolean] Check the signature true or false.
16
+ def check_signature(signature, timestamp, nonce, token)
17
+ array = [token, timestamp, nonce].sort
18
+ signature == Digest::SHA1.hexdigest(array.join) ? true : false
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,27 @@
1
+ # encoding: UTF-8
2
+
3
+ module WxExt
4
+ # Weixin api
5
+ #
6
+ # @author FuShengYang
7
+ module Api
8
+ # User api of weixin.
9
+ #
10
+ # @author FuShengYang
11
+ module Semantic
12
+ class << self
13
+
14
+ # Create semantic search via post.
15
+ #
16
+ # @param [Enumerable<String>] access_token
17
+ # @param [Hash] semantic_hash
18
+ # @return [Hash] Json based hash.
19
+ def semantic_search(access_token, semantic_hash)
20
+ url = 'https://api.weixin.qq.com/semantic/semproxy/search'\
21
+ "?access_token=#{access_token}"
22
+ Helper.http_post(url, semantic_hash.to_json)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,50 @@
1
+ # encoding: UTF-8
2
+
3
+ module WxExt
4
+ # Weixin api
5
+ #
6
+ # @author FuShengYang
7
+ module Api
8
+ # User api of weixin.
9
+ #
10
+ # @author FuShengYang
11
+ module TemplateMsg
12
+ class << self
13
+
14
+ # Set the industry via post.
15
+ #
16
+ # @param [Enumerable<String>] access_token
17
+ # @param [Enumerable<String>] industry_id1
18
+ # @param [Enumerable<String>] industry_id2
19
+ # @return [Hash] Json based hash.
20
+ def set_industry(access_token, industry_id1, industry_id2)
21
+ url = 'https://api.weixin.qq.com/cgi-bin/template/api_set_industry'\
22
+ "?access_token=#{access_token}"
23
+ Helper.http_post(url, { industry_id1: industry_id1, industry_id2: industry_id2 }.to_json)
24
+ end
25
+
26
+ # Get the template ID via post.
27
+ #
28
+ # @param [Enumerable<String>] access_token
29
+ # @param [Enumerable<String>] template_id_short
30
+ # @return [Hash] Json based hash.
31
+ def get_template_id(access_token, template_id_short)
32
+ url = 'https://api.weixin.qq.com/cgi-bin/template/api_add_template'\
33
+ "?access_token=#{access_token}"
34
+ Helper.http_post(url, { template_id_short: template_id_short })
35
+ end
36
+
37
+ # Send the template msg via post.
38
+ #
39
+ # @param [Enumerable<String>] access_token
40
+ # @param [Hash] template_msg_hash
41
+ # @return [Hash] Json based hash.
42
+ def send_template_msg(access_token, template_msg_hash)
43
+ url = 'https://api.weixin.qq.com/cgi-bin/message/template/send'\
44
+ "?access_token=#{access_token}"
45
+ Helper.http_post(url, template_msg_hash.to_json)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -1,43 +1,73 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'rest_client'
4
-
5
3
  module WxExt
4
+ # Weixin api
5
+ #
6
+ # @author FuShengYang
6
7
  module Api
7
-
8
- # 微信扩展接口, 模拟登陆微信公众平台
8
+ # User api of weixin.
9
+ #
9
10
  # @author FuShengYang
10
11
  module User
12
+ # User group api of weixin.
13
+ #
14
+ # @author FuShengYang
11
15
  module Group
12
16
  class << self
17
+ # Create user group via post.
18
+ #
19
+ # @param [Enumerable<String>] access_token
20
+ # @param [Enumerable<String>] group_name
21
+ # @return [Hash] A json parse hash.
13
22
  def create_group(access_token, group_name)
14
23
  url = 'https://api.weixin.qq.com/cgi-bin/groups/create'\
15
24
  "?access_token=#{access_token}"
16
25
  Helper.http_post(url, { group: { name: group_name } }.to_json)
17
26
  end
18
27
 
28
+ # Get all groups via get.
29
+ #
30
+ # @param [Enumerable<String>] access_token
31
+ # @return [Hash] A json parse hash.
19
32
  def groups(access_token)
20
33
  url = 'https://api.weixin.qq.com/cgi-bin/groups/get'\
21
34
  "?access_token=#{access_token}"
22
- Helper.http_get(url, { accept: :json })
35
+ Helper.http_get(url, { accept: :json }.to_json)
23
36
  end
24
37
 
38
+ # Get user of group via post.
39
+ #
40
+ # @param [Enumerable<String>] access_token
41
+ # @param [Enumerable<String>] openid
42
+ # @return [Hash] A json parse hash.
25
43
  def user_of_group(access_token, openid)
26
44
  url = 'https://api.weixin.qq.com/cgi-bin/groups/getid'\
27
45
  "?access_token=#{access_token}"
28
- Helper.http_post(url, { openid: openid })
46
+ Helper.http_post(url, { openid: openid }.to_json)
29
47
  end
30
48
 
49
+ # Update user group name via post.
50
+ #
51
+ # @param [Enumerable<String>] access_token
52
+ # @param [Enumerable<String>] id
53
+ # @param [Enumerable<String>] name
54
+ # @return [Hash] A json parse hash.
31
55
  def update_group_name(access_token, id, name)
32
56
  url = 'https://api.weixin.qq.com/cgi-bin/groups/update'\
33
57
  "?access_token=#{access_token}"
34
- Helper.http_post(url, { group: { id: id, name: name } })
58
+ Helper.http_post(url, { group: { id: id, name: name } }.to_json)
35
59
  end
36
60
 
61
+ # Move user group via post.
62
+ #
63
+ # @param [Enumerable<String>] access_token
64
+ # @param [Enumerable<String>] openid
65
+ # @param [Enumerable<String>] to_groupid
66
+ # @return [Hash] A json parse hash.
37
67
  def mv_user_group(access_token, openid, to_groupid)
38
68
  url = 'https://api.weixin.qq.com/cgi-bin/groups/members/update'\
39
69
  "?access_token=#{access_token}"
40
- Helper.http_post(url, { openid: openid, to_groupid: to_groupid })
70
+ Helper.http_post(url, { openid: openid, to_groupid: to_groupid }.to_json)
41
71
  end
42
72
  end
43
73
  end
@@ -1,41 +1,94 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'digest'
4
- require 'rest_client'
5
- require 'json'
6
- require 'wx_ext/api/user/group'
7
-
8
3
  module WxExt
4
+ # Weixin api
5
+ #
6
+ # @author FuShengYang
9
7
  module Api
10
-
11
- # 微信扩展接口, 模拟登陆微信公众平台
8
+ # User api of weixin.
9
+ #
12
10
  # @author FuShengYang
13
11
  module User
14
12
  class << self
15
- def change_remark(access_token, openid, remark) end
16
13
 
17
- def get_user_base_info(access_token, openid, lang) end
14
+ # Change the remark of user via post.
15
+ #
16
+ # @param [Enumerable<String>] access_token
17
+ # @param [Enumerable<String>] openid
18
+ # @param [Enumerable<String>] remark
19
+ # @return [Hash] Json based hash.
20
+ def change_remark(access_token, openid, remark)
21
+ url = 'https://api.weixin.qq.com/cgi-bin/user/info/updateremark'\
22
+ "?access_token=#{access_token}"
23
+ Helper.http_post(url, { openid: openid, remark: remark }.to_json)
24
+ end
25
+
26
+ # Get the user base info.
27
+ #
28
+ # @param [Enumerable<String>] access_token
29
+ # @param [Enumerable<String>] openid
30
+ # @param [Enumerable<String>] lang
31
+ # @return [Hash] Json based hash.
32
+ def get_user_base_info(access_token, openid, lang='zh_CN')
33
+ url = 'https://api.weixin.qq.com/cgi-bin/user/info'\
34
+ "?access_token=#{access_token}&openid=#{openid}&lang=#{lang}"
35
+ Helper.http_get(url, { accept: :json })
36
+ end
18
37
 
19
- def user_list(access_token, next_openid) end
38
+ # Get user list of weixin.
39
+ #
40
+ # @param [Enumerable<String>] access_token
41
+ # @param [Enumerable<String>] next_openid
42
+ # @return [Hash] Json based hash.
43
+ def user_list(access_token, next_openid)
44
+ url = 'https://api.weixin.qq.com/cgi-bin/user/get'\
45
+ "?access_token=#{access_token}"
46
+ url += "&next_openid=#{next_openid}" if next_openid
47
+ Helper.http_get(url, { accept: :json })
48
+ end
20
49
 
50
+ # Get oauth2 token with code.
51
+ #
52
+ # @param [Enumerable<String>] app_id
53
+ # @param [Enumerable<String>] app_secret
54
+ # @param [Enumerable<String>] code
55
+ # @param [Enumerable<String>] grant_type
56
+ # @return [Hash] Json based hash.
21
57
  def get_oauth2_token_with_code(app_id, app_secret, code, grant_type='authorization_code')
22
58
  url = 'https://api.weixin.qq.com/sns/oauth2/access_token'\
23
59
  "?appid=#{app_id}&secret=#{app_secret}&code=CODE&grant_type=#{grant_type}"
24
60
  Helper.http_get(url, { accept: :json })
25
61
  end
26
62
 
63
+ # Refresh oauth2 token.
64
+ #
65
+ # @param [Enumerable<String>] app_id
66
+ # @param [Enumerable<String>] refresh_token
67
+ # @param [Enumerable<String>] grant_type
68
+ # @return [Hash] Json based hash.
27
69
  def refresh_oauth2_token(app_id, refresh_token, grant_type='refresh_token')
28
70
  url = 'https://api.weixin.qq.com/sns/oauth2/refresh_token'\
29
71
  "?appid=#{app_id}&grant_type=#{grant_type}&refresh_token=#{refresh_token}"
30
72
  Helper.http_get(url, { accept: :json })
31
73
  end
32
74
 
75
+ # Get user info with snsapi_userinfo.
76
+ #
77
+ # @param [Enumerable<String>] oauth2_token
78
+ # @param [Enumerable<String>] openid
79
+ # @param [Enumerable<String>] lang
80
+ # @return [Hash] Json based hash.
33
81
  def get_user_info_with_snsapi_userinfo(oauth2_token, openid, lang)
34
82
  url = 'https://api.weixin.qq.com/sns/userinfo'\
35
83
  "?access_token=#{oauth2_token}&#{openid}=OPENID&lang=#{lang}"
36
84
  Helper.http_get(url, { accept: :json })
37
85
  end
38
86
 
87
+ # Check the oauth2_token.
88
+ #
89
+ # @param [Enumerable<String>] openid
90
+ # @param [Enumerable<String>] oauth2_token
91
+ # @return [Hash] Json based hash.
39
92
  def check_oauth2_token(openid, oauth2_token)
40
93
  url = 'https://api.weixin.qq.com/sns/auth'\
41
94
  "?access_token=#{oauth2_token}&openid=#{openid}"
data/lib/wx_ext/api.rb CHANGED
@@ -1,11 +1,12 @@
1
1
  # encoding: UTF-8
2
2
 
3
- #require 'wx_ext/api/qrcode'
4
- #require 'wx_ext/api/media'
5
- #require 'wx_ext/api/oauth'
6
-
7
3
  require 'wx_ext/api/base'
4
+ require 'wx_ext/api/customer_service'
8
5
  require 'wx_ext/api/js'
6
+ require 'wx_ext/api/mass'
7
+ require 'wx_ext/api/menu'
9
8
  require 'wx_ext/api/msg'
9
+ require 'wx_ext/api/qrcode'
10
+ require 'wx_ext/api/semantic'
11
+ require 'wx_ext/api/template_msg'
10
12
  require 'wx_ext/api/user'
11
- require 'wx_ext/api/menu'
data/lib/wx_ext/helper.rb CHANGED
@@ -4,15 +4,27 @@ require 'rest_client'
4
4
  require 'json'
5
5
 
6
6
  module WxExt
7
-
7
+ # WxExt Helper like get and post short method.
8
+ #
8
9
  # @author FuShengYang
9
10
  module Helper
10
11
  class << self
12
+ # Http get helper of this gem, always return a hash.
13
+ #
14
+ # @param [Enumerable<String>] url
15
+ # @param [Hash] headers
16
+ # @return [Hash] A json parse hash.
11
17
  def http_get(url, headers = {})
12
18
  res = RestClient.get url, headers
13
19
  JSON.parse res
14
20
  end
15
21
 
22
+ # Http post helper of this gem, always return a hash.
23
+ #
24
+ # @param [Enumerable<String>] url
25
+ # @param [Hash] params
26
+ # @param [Hash] headers
27
+ # @return [Hash] A json parse hash.
16
28
  def http_post(url, params, headers = {})
17
29
  res = RestClient.post url, params, headers
18
30
  JSON.parse res
@@ -6,9 +6,16 @@ require 'json'
6
6
  require 'open-uri'
7
7
 
8
8
  module WxExt
9
- # 微信扩展接口, 从搜狗微信抓取微信文章
9
+ # Spider post from http://weixin.sogou.com
10
+ #
10
11
  # @author FuShengYang
11
12
  class SougouWeixin
13
+ # Spider posts from sougou, only one page.
14
+ #
15
+ # @param [Enumerable<String>] openid
16
+ # @param [Integer] page_index
17
+ # @param [Enumerable<String>] date_last
18
+ # @return [Hash] A spider posts hash with total_pages etc.
12
19
  def self.spider_posts_from_sougou(openid, page_index = 1, date_last = (Time.now - 3600 * 24 * 10).strftime("%Y-%m-%d"))
13
20
  json_url = "http://weixin.sogou.com/gzhjs?&openid=#{openid}&page=#{page_index}"
14
21
  res = RestClient.get json_url
@@ -75,6 +82,11 @@ module WxExt
75
82
  }
76
83
  end
77
84
 
85
+ # Spider posts from sougou, last date.
86
+ #
87
+ # @param [Enumerable<String>] openid
88
+ # @param [Enumerable<String>] date_last
89
+ # @return [Hash] A spider posts hash with total_pages etc.
78
90
  def self.spider_posts_later_date(openid, date_last = (Time.now - 3600 * 24 * 10).strftime("%Y-%m-%d"))
79
91
  spider_posts_first_page_hash = spider_posts_from_sougou(openid, 1, date_last)
80
92
  total_pages = spider_posts_first_page_hash[:total_pages].to_i
@@ -88,9 +100,9 @@ module WxExt
88
100
  end
89
101
  end
90
102
  {
91
- total_items: spider_posts_first_page_hash[:total_items],
92
- total_pages: total_pages,
93
- spider_posts: spider_posts.uniq
103
+ total_items: spider_posts_first_page_hash[:total_items],
104
+ total_pages: total_pages,
105
+ spider_posts: spider_posts.uniq
94
106
  }
95
107
  end
96
108
  end
@@ -1,4 +1,4 @@
1
1
  # encoding: UTF-8
2
2
  module WxExt
3
- VERSION = '0.1.4'
3
+ VERSION = '0.1.5'
4
4
  end
@@ -6,11 +6,13 @@ require 'json'
6
6
  require 'nokogiri'
7
7
 
8
8
  module WxExt
9
- # 微信扩展接口, 模拟登陆微信公众平台
9
+ # weixin extention of mp.weixin.qq.com
10
+ #
10
11
  # @author FuShengYang
11
12
  class WeiXin
12
13
  attr_accessor :account, :password, :home_url, :token, :user_name, \
13
- :ticket_id, :ticket, :cookies, :operation_seq
14
+ :ticket_id, :ticket, :cookies, :operation_seq
15
+
14
16
  def initialize(account, password)
15
17
  @account = account
16
18
  @password = password
@@ -25,7 +27,7 @@ module WxExt
25
27
 
26
28
  # 模拟登陆微信公众平台, 初始化 access_token, cookies
27
29
  #
28
- # @return [Hash] 使用用户名和密码登陆微信公众平台获取access_token, 过期时间是7200s
30
+ # @return [Hash] Hash with login status and msg.
29
31
  def login
30
32
  password = Digest::MD5.hexdigest @password
31
33
  login_headers = {
@@ -45,11 +47,11 @@ module WxExt
45
47
  status: 0,
46
48
  msg: 'ok'
47
49
  }
48
- # {"base_resp"=>{"ret"=>0, "err_msg"=>"ok"}, "redirect_url"=>"/cgi-bin/home?t=home/index&lang=zh_CN&token=1869497342"}
49
- # {"base_resp":{"ret":-8,"err_msg":"need verify code"}}
50
- # {"base_resp":{"ret":-23,"err_msg":"acct\/password error"}}
51
- # {"base_resp":{"ret":-21,"err_msg":"user not exist"}}
52
- # https://mp.weixin.qq.com/cgi-bin/verifycode?username=tuodan@thecampus.cc&r=1415774604450
50
+
51
+ # 0: "ok", "redirect_url": ""
52
+ # -8: "need verify code"
53
+ # -23: "acct\/password error"
54
+ # -21: "user not exist"
53
55
  res_hash = JSON.parse res.to_s
54
56
  sta = res_hash['base_resp']['ret'].to_s
55
57
  if sta == '0'
@@ -79,10 +81,12 @@ module WxExt
79
81
  return_hash
80
82
  end
81
83
 
82
- # 初始化 ticket, cookies, operation_seq, user_name 等等信息
84
+ # Init ticket, cookies, operation_seq, user_name etc.
85
+ #
86
+ # @return [Boolean] Init ticket, cookies, operation_seq, user_name true or false.
83
87
  def init
84
88
  msg_send_url = 'https://mp.weixin.qq.com/cgi-bin/masssendpage'\
85
- "?t=mass/send&token=#{@token}&lang=zh_CN"
89
+ "?t=mass/send&token=#{@token}&lang=zh_CN"
86
90
  msg_send_page = RestClient.get msg_send_url, cookies: @cookies
87
91
  @cookies = @cookies.merge msg_send_page.cookies
88
92
 
@@ -98,36 +102,46 @@ module WxExt
98
102
  end
99
103
  end
100
104
 
101
- # 上传图片素材到素材中心
105
+ # Upload file to file.weixin.qq.com
106
+ #
107
+ # @param [File] file
108
+ # @param [String] file_name
109
+ # @param [String] folder
110
+ # @return [Hash] A json parse hash.
102
111
  def upload_file(file, file_name, folder = '/cgi-bin/uploads')
103
112
  upload_url = 'https://mp.weixin.qq.com/cgi-bin/filetransfer'\
104
- '?action=upload_material&f=json&writetype=doublewrite'\
105
- "&groupid=1&ticket_id=#{@ticket_id}"\
106
- "&ticket=#{@ticket}&token=#{@token}&lang=zh_CN"
107
- response = RestClient.post upload_url, file: file, \
108
- Filename: file_name, \
109
- folder: folder
113
+ '?action=upload_material&f=json&writetype=doublewrite'\
114
+ "&groupid=1&ticket_id=#{@ticket_id}"\
115
+ "&ticket=#{@ticket}&token=#{@token}&lang=zh_CN"
116
+ response = RestClient.post upload_url, file: file,
117
+ Filename: file_name,
118
+ folder: folder
110
119
  JSON.parse response.to_s
111
120
  end
112
121
 
113
- # 发送单条图文消息到素材中心
122
+ # Upload single news to mp.weixin.qq.com
123
+ #
124
+ # @param [Hash] single_msg_params
125
+ # @return [Hash] A json parse hash.
114
126
  def upload_single_msg(single_msg_params)
115
127
  post_single_msg_uri = 'cgi-bin/operate_appmsg'\
116
- '?t=ajax-response&sub=create&type=10&token'\
117
- "=#{@token}&lang=zh_CN"
128
+ '?t=ajax-response&sub=create&type=10&token'\
129
+ "=#{@token}&lang=zh_CN"
118
130
  headers = {
119
131
  referer: 'https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit'\
120
- '&action=edit&type=10&isMul=0&isNew=1&lang=zh_CN'\
121
- "&token=#{@token}"
132
+ '&action=edit&type=10&isMul=0&isNew=1&lang=zh_CN'\
133
+ "&token=#{@token}"
122
134
  }
123
135
  resource = RestClient::Resource.new(@home_url, headers: headers,
124
136
  cookies: @cookies)
125
137
  res = resource[post_single_msg_uri].post single_msg_params
126
- # {"ret":"0", "msg":"OK"}
127
138
  JSON.parse res.to_s
128
139
  end
129
140
 
130
- # 发送多图文到素材中心
141
+ # Upload multi news to mp.weixin.qq.com
142
+ #
143
+ # @param [Hash] msg_params
144
+ # @return [Hash] A json parse hash.
131
145
  def upload_multi_msg(msg_params)
132
146
  uri = 'cgi-bin/operate_appmsg?t=ajax-response&sub=create&type=10'\
133
147
  "&token=#{@token}&lang=zh_CN"
@@ -139,11 +153,13 @@ module WxExt
139
153
  resource = RestClient::Resource.new(@home_url, headers: headers,
140
154
  cookies: @cookies)
141
155
  post_msg_res = resource[uri].post msg_params
142
- # {"ret":"0", "msg":"OK"}
143
156
  JSON.parse post_msg_res.to_s
144
157
  end
145
158
 
146
- # 图文预览功能
159
+ # Preview broadcast news to user.
160
+ #
161
+ # @param [Hash] msg_params_with_name
162
+ # @return [Hash] A json parse hash.
147
163
  def preview_msg(msg_params_with_name)
148
164
  uri = 'cgi-bin/operate_appmsg?sub=preview&t=ajax-appmsg-preview'\
149
165
  "&type=10&token=#{@token}&lang=zh_CN"
@@ -155,39 +171,48 @@ module WxExt
155
171
  cookies: @cookies)
156
172
 
157
173
  res = resource[uri].post msg_params_with_name
158
- # {"ret":"0", "msg":"preview send success!", "appMsgId":"201796045", "fakeid":""}
174
+ # "ret":"0", "msg":"preview send success!", "appMsgId":"201796045", "fakeid":""
159
175
  JSON.parse res.to_s
160
176
  end
161
177
 
162
- # 群发图文消息
178
+ # Broadcast news to mp.weixin.qq.com.
179
+ #
180
+ # @param [Hash] msg_params
181
+ # @return [Hash] A json parse hash.
163
182
  def broadcast_msg(msg_params)
164
183
  uri = "cgi-bin/masssend?t=ajax-response&token=#{@token}&lang=zh_CN"
165
184
  headers = {
166
185
  referer: 'https://mp.weixin.qq.com/cgi-bin/masssendpage'\
167
- "?t=mass/send&token=#{token}&lang=zh_CN",
186
+ "?t=mass/send&token=#{token}&lang=zh_CN",
168
187
  host: 'mp.weixin.qq.com'
169
188
  }
170
189
  resource = RestClient::Resource.new(@home_url, headers: headers,
171
- cookies: @cookies)
190
+ cookies: @cookies)
172
191
  post_msg_res = resource[uri].post msg_params
173
- # {"ret":"0", "msg":"OK"}
174
192
  JSON.parse post_msg_res.to_s
175
193
  end
176
194
 
177
- # 获取所有的图文列表
195
+ # Get all news.
196
+ #
197
+ # @param [Integer] msg_begin
198
+ # @param [Integer] msg_count
199
+ # @return [Hash] A json parse hash.
178
200
  def get_app_msg_list(msg_begin = 0, msg_count = 10)
179
201
  url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?type=10&action=list'\
180
- "&begin=#{msg_begin}&count=#{msg_count}&f=json&token=#{@token}"\
181
- "&lang=zh_CN&token=#{@token}&lang=zh_CN&f=json&ajax=1"\
182
- "&random=#{rand}"
202
+ "&begin=#{msg_begin}&count=#{msg_count}&f=json&token=#{@token}"\
203
+ "&lang=zh_CN&token=#{@token}&lang=zh_CN&f=json&ajax=1"\
204
+ "&random=#{rand}"
183
205
  msg_json = RestClient.get url, cookies: @cookies
184
206
  JSON.parse msg_json.to_s
185
207
  end
186
208
 
187
- # 轮训新消息条数
209
+ # Get new coming msgs from user.
210
+ #
211
+ # @param [String] last_msg_id
212
+ # @return [Hash] A json parse hash.
188
213
  def get_new_msg_num(last_msg_id)
189
214
  uri = 'cgi-bin/getnewmsgnum?f=json&t=ajax-getmsgnum'\
190
- "&lastmsgid=#{last_msg_id}&token=#{@token}&lang=zh_CN"
215
+ "&lastmsgid=#{last_msg_id}&token=#{@token}&lang=zh_CN"
191
216
  post_params = {
192
217
  ajax: 1,
193
218
  f: 'json',
@@ -197,18 +222,21 @@ module WxExt
197
222
  }
198
223
  post_headers = {
199
224
  referer: 'https://mp.weixin.qq.com/cgi-bin/message?t=message/list'\
200
- "&count=20&day=7&token=#{@token}&lang=zh_CN"
225
+ "&count=20&day=7&token=#{@token}&lang=zh_CN"
201
226
  }
202
227
  resource = RestClient::Resource.new(@home_url, headers: post_headers,
203
- cookies: @cookies)
228
+ cookies: @cookies)
204
229
  res = resource[uri].post post_params
205
230
  JSON.parse res.to_s
206
231
  end
207
232
 
208
- # 获取联系人信息
233
+ # Get user info.
234
+ #
235
+ # @param [String] fakeid
236
+ # @return [Hash] A json parse hash.
209
237
  def get_contact_info(fakeid)
210
238
  uri = 'cgi-bin/getcontactinfo?t=ajax-getcontactinfo'\
211
- "&lang=zh_CN&fakeid=#{fakeid}"
239
+ "&lang=zh_CN&fakeid=#{fakeid}"
212
240
  post_params = {
213
241
  ajax: 1,
214
242
  f: 'json',
@@ -218,28 +246,32 @@ module WxExt
218
246
  }
219
247
  post_headers = {
220
248
  referer: 'https://mp.weixin.qq.com/cgi-bin/contactmanage?t=user/index'\
221
- "&pagesize=10&pageidx=0&type=0&token=#{@token}&lang=zh_CN"
249
+ "&pagesize=10&pageidx=0&type=0&token=#{@token}&lang=zh_CN"
222
250
  }
223
251
  resource = RestClient::Resource.new(@home_url, headers: post_headers,
224
- cookies: @cookies)
252
+ cookies: @cookies)
225
253
  res = resource[uri].post post_params
226
254
  JSON.parse res.to_s
227
255
  end
228
256
 
229
- # 获取国家列表
257
+ # Get country list.
258
+ #
259
+ # @return [Hash] A json parse hash.
230
260
  def get_country_list
231
261
  url = 'https://mp.weixin.qq.com/cgi-bin/getregions'\
232
- "?t=setting/ajax-getregions&id=0&token=#{@token}&lang=zh_CN"\
233
- "&token=#{@token}&lang=zh_CN&f=json&ajax=1&random=#{rand}"
262
+ "?t=setting/ajax-getregions&id=0&token=#{@token}&lang=zh_CN"\
263
+ "&token=#{@token}&lang=zh_CN&f=json&ajax=1&random=#{rand}"
234
264
  resource = RestClient::Resource.new(url, cookies: @cookies)
235
265
  res = resource.get
236
266
  JSON.parse res.to_s
237
267
  end
238
268
 
239
- # 获取每日可推送消息数
269
+ # Get this weixin can broadcast news count.
270
+ #
271
+ # @return [Integer] day msg count.
240
272
  def get_day_msg_count
241
273
  url = 'https://mp.weixin.qq.com/cgi-bin/masssendpage'\
242
- "?t=mass/send&token=#{@token}&lang=zh_CN"
274
+ "?t=mass/send&token=#{@token}&lang=zh_CN"
243
275
  res = RestClient.get(url, cookies: @cookies)
244
276
  day_msg_count = 0
245
277
  reg = /.*mass_send_left\s*:\s*can_verify_apply\s*\?\s*\'(\d*)\'\*/
@@ -247,11 +279,19 @@ module WxExt
247
279
  day_msg_count.to_i
248
280
  end
249
281
 
250
- # 获取 total_count, count, day, frommsgid, can_search_msg, offset, action=search, keyword, last_msg_id, filterivrmsg=0/1 和 msg_items
282
+ # Get msg items.
283
+ #
284
+ # @param [Integer] count
285
+ # @param [Integer] day
286
+ # @param [Integer] filterivrmsg
287
+ # @param [String] action
288
+ # @param [String] keyword
289
+ # @param [String] offset
290
+ # @return [Hash] A json parse hash.
251
291
  def get_msg_items(count = 20, day = 7, filterivrmsg = 1, action='', keyword='', frommsgid='', offset='')
252
292
  url = 'https://mp.weixin.qq.com/cgi-bin/message?t=message/list'\
253
- "&action=#{action}&keyword=#{keyword}&frommsgid=#{frommsgid}&offset=#{offset}&count=#{count}"\
254
- "&day=#{day}filterivrmsg=#{filterivrmsg}&token=#{@token}&lang=zh_CN"
293
+ "&action=#{action}&keyword=#{keyword}&frommsgid=#{frommsgid}&offset=#{offset}&count=#{count}"\
294
+ "&day=#{day}filterivrmsg=#{filterivrmsg}&token=#{@token}&lang=zh_CN"
255
295
  resource = RestClient::Resource.new(url, cookies: @cookies)
256
296
  res = resource.get
257
297
  reg = /.*total_count\s*:\s*(\d*).*latest_msg_id\s*:\s*\'(\d*)\'.*list\s*:\s*\((.*)\)\.msg_item,.*filterivrmsg\s*:\s*\"(\d*)\".*/m
@@ -279,7 +319,9 @@ module WxExt
279
319
  return_hash
280
320
  end
281
321
 
282
- # 获取粉丝数目
322
+ # Get fans count.
323
+ #
324
+ # @return [Hash] Fans count with friends_list, group_list etc.
283
325
  def get_fans_count
284
326
  url = 'https://mp.weixin.qq.com/cgi-bin/contactmanage?t=user/index'\
285
327
  "&pagesize=10&pageidx=0&type=0&token=#{ @token }&lang=zh_CN"
@@ -304,12 +346,15 @@ module WxExt
304
346
  return_hash
305
347
  end
306
348
 
307
- # {"base_resp":{"ret":10706,"err_msg":"customer block"}} 48小时内的才行
308
- # {"base_resp":{"ret":0,"err_msg":"ok"}}
309
- # 快速回复
349
+ # Quick reply to user.
350
+ #
351
+ # @param [String] content
352
+ # @param [String] quickreplyid
353
+ # @param [String] tofakeid
354
+ # @return [Hash] A json parse hash.
310
355
  def quick_reply(content, quickreplyid, tofakeid)
311
356
  post_uri = 'cgi-bin/singlesend'\
312
- "?t=ajax-response&f=json&token=#{ @token }&lang=zh_CN"
357
+ "?t=ajax-response&f=json&token=#{ @token }&lang=zh_CN"
313
358
  params = {
314
359
  ajax: 1,
315
360
  content: content,
@@ -325,17 +370,20 @@ module WxExt
325
370
  }
326
371
  headers = {
327
372
  referer: 'https://mp.weixin.qq.com/cgi-bin/message'\
328
- "?t=message/list&count=20&day=7&token=#{ @token }&lang=zh_CN"
373
+ "?t=message/list&count=20&day=7&token=#{ @token }&lang=zh_CN"
329
374
  }
330
375
  resource = RestClient::Resource.new(@home_url, headers: headers,
331
- cookies: @cookies)
376
+ cookies: @cookies)
332
377
  res = resource[post_uri].post params
378
+ #
379
+ # 10706: "customer block": "48小时内的才行"
333
380
  JSON.parse res.to_s
334
381
  end
335
382
 
336
- # https://mp.weixin.qq.com/cgi-bin/setstarmessage?t=ajax-setstarmessage&token=1664040225&lang=zh_CN
337
- # { "ret":0, "msg":"sys ok"}
338
- # 收藏消息
383
+ # Collect msg of user.
384
+ #
385
+ # @param [String] msgid
386
+ # @return [Hash] A json parse hash.
339
387
  def collect_msg(msgid)
340
388
  uri = "cgi-bin/setstarmessage?t=ajax-setstarmessage&token=#{ @token }&lang=zh_CN"
341
389
  params = {
@@ -349,15 +397,18 @@ module WxExt
349
397
  }
350
398
  headers = {
351
399
  referer: 'https://mp.weixin.qq.com/cgi-bin/message'\
352
- "?t=message/list&token=#{ @token }&count=20&day=7"
400
+ "?t=message/list&token=#{ @token }&count=20&day=7"
353
401
  }
354
402
  resource = RestClient::Resource.new(@home_url, headers: headers,
355
- cookies: @cookies)
403
+ cookies: @cookies)
356
404
  res = resource[uri].post params
357
405
  JSON.parse res.to_s
358
406
  end
359
407
 
360
- # 取消收藏消息
408
+ # Un collect msg of user.
409
+ #
410
+ # @param [String] msgid
411
+ # @return [Hash] A json parse hash.
361
412
  def un_collect_msg(msgid)
362
413
  uri = "cgi-bin/setstarmessage?t=ajax-setstarmessage&token=#{ @token }&lang=zh_CN"
363
414
  params = {
@@ -371,12 +422,11 @@ module WxExt
371
422
  }
372
423
  headers = {
373
424
  referer: 'https://mp.weixin.qq.com/cgi-bin/message'\
374
- "?t=message/list&token=#{ @token }&count=20&day=7"
425
+ "?t=message/list&token=#{ @token }&count=20&day=7"
375
426
  }
376
427
  resource = RestClient::Resource.new(@home_url, headers: headers,
377
- cookies: @cookies)
428
+ cookies: @cookies)
378
429
  res = resource[uri].post params
379
- # { "ret":0, "msg":"sys ok"}
380
430
  JSON.parse res.to_s
381
431
  end
382
432
  end
data/lib/wx_ext.rb CHANGED
@@ -5,17 +5,30 @@ require 'wx_ext/sougou_weixin'
5
5
  require 'wx_ext/wei_xin'
6
6
  require 'wx_ext/api'
7
7
 
8
- # 微信扩展接口和基本接口
8
+ # Weixin extention, sougou spider and weixin api.
9
+ #
9
10
  # @author FuShengYang
10
11
  module WxExt
12
+
13
+ # Return the root path of this gem.
14
+ #
15
+ # @return [String] Path of the gem's root.
11
16
  def self.root
12
17
  File.dirname __dir__
13
18
  end
14
19
 
20
+
21
+ # Return the lib path of this gem.
22
+ #
23
+ # @return [String] Path of the gem's lib.
15
24
  def self.lib
16
25
  File.join root, 'lib'
17
26
  end
18
27
 
28
+
29
+ # Return the spec path of this gem.
30
+ #
31
+ # @return [String] Path of the gem's spec.
19
32
  def self.spec
20
33
  File.join root, 'spec'
21
34
  end
@@ -0,0 +1,5 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe WxExt::Api::CustomerService do
5
+ end
@@ -0,0 +1,5 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe WxExt::Api::Mass do
5
+ end
File without changes
File without changes
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wx_ext
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - flowerwrong
@@ -109,9 +109,14 @@ files:
109
109
  - lib/wx_ext.rb
110
110
  - lib/wx_ext/api.rb
111
111
  - lib/wx_ext/api/base.rb
112
+ - lib/wx_ext/api/customer_service.rb
112
113
  - lib/wx_ext/api/js.rb
114
+ - lib/wx_ext/api/mass.rb
113
115
  - lib/wx_ext/api/menu.rb
114
116
  - lib/wx_ext/api/msg.rb
117
+ - lib/wx_ext/api/qrcode.rb
118
+ - lib/wx_ext/api/semantic.rb
119
+ - lib/wx_ext/api/template_msg.rb
115
120
  - lib/wx_ext/api/user.rb
116
121
  - lib/wx_ext/api/user/group.rb
117
122
  - lib/wx_ext/helper.rb
@@ -121,9 +126,13 @@ files:
121
126
  - spec/spec_helper.rb
122
127
  - spec/test.png
123
128
  - spec/wx_ext/api/base_spec.rb
129
+ - spec/wx_ext/api/customer_service_spec.rb
124
130
  - spec/wx_ext/api/js_spec.rb
131
+ - spec/wx_ext/api/mass_spec.rb
125
132
  - spec/wx_ext/api/menu_spec.rb
126
133
  - spec/wx_ext/api/msg_spec.rb
134
+ - spec/wx_ext/api/semantic_spec.rb
135
+ - spec/wx_ext/api/template_msg_spec.rb
127
136
  - spec/wx_ext/api/user/group_spec.rb
128
137
  - spec/wx_ext/api/user_spec.rb
129
138
  - spec/wx_ext/sougou_weixin_spec.rb
@@ -157,9 +166,13 @@ test_files:
157
166
  - spec/spec_helper.rb
158
167
  - spec/test.png
159
168
  - spec/wx_ext/api/base_spec.rb
169
+ - spec/wx_ext/api/customer_service_spec.rb
160
170
  - spec/wx_ext/api/js_spec.rb
171
+ - spec/wx_ext/api/mass_spec.rb
161
172
  - spec/wx_ext/api/menu_spec.rb
162
173
  - spec/wx_ext/api/msg_spec.rb
174
+ - spec/wx_ext/api/semantic_spec.rb
175
+ - spec/wx_ext/api/template_msg_spec.rb
163
176
  - spec/wx_ext/api/user/group_spec.rb
164
177
  - spec/wx_ext/api/user_spec.rb
165
178
  - spec/wx_ext/sougou_weixin_spec.rb