wx_ext 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/wx_ext/api/base.rb +153 -0
- data/lib/wx_ext/api/js.rb +50 -0
- data/lib/wx_ext/api/menu.rb +31 -0
- data/lib/wx_ext/api/msg.rb +20 -0
- data/lib/wx_ext/api/user/group.rb +46 -0
- data/lib/wx_ext/api/user.rb +47 -0
- data/lib/wx_ext/api.rb +11 -0
- data/lib/wx_ext/helper.rb +22 -0
- data/lib/wx_ext/sougou_weixin.rb +4 -0
- data/lib/wx_ext/version.rb +1 -1
- data/lib/wx_ext/wei_xin.rb +383 -0
- data/lib/wx_ext.rb +5 -376
- data/spec/wx_ext/api/base_spec.rb +43 -0
- data/spec/wx_ext/api/js_spec.rb +20 -0
- data/spec/wx_ext/api/menu_spec.rb +5 -0
- data/spec/wx_ext/api/msg_spec.rb +5 -0
- data/spec/wx_ext/api/user/group_spec.rb +22 -0
- data/spec/wx_ext/api/user_spec.rb +15 -0
- data/spec/wx_ext/weixin_spec.rb +2 -2
- data/wx_ext.gemspec +6 -5
- metadata +53 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b09d3e31cfa73aba2eb5b058c17163dc97a25ffa
|
4
|
+
data.tar.gz: 11d8bb8534f855c0154099411f46d43181ed1cd2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b458d4545f22d2f7679e0640887c367483446765c688a5745faebf50cb4e089faf5b7765facef32251d087dae2683b5c1c21e5850be7144aedf00e124de81c5
|
7
|
+
data.tar.gz: 936ae911d89043aa9ab3765e238ead59b58b7004867b6a58f6c9f60c944f2780f9550167560b74416899a7ea496108ef39c639528f3b164e031ff4082800abb7
|
data/README.md
CHANGED
@@ -0,0 +1,153 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'digest'
|
4
|
+
require 'rest_client'
|
5
|
+
require 'json'
|
6
|
+
require 'wx_ext/helper'
|
7
|
+
|
8
|
+
module WxExt
|
9
|
+
module Api
|
10
|
+
|
11
|
+
# 微信扩展接口, 模拟登陆微信公众平台
|
12
|
+
# @author FuShengYang
|
13
|
+
module Base
|
14
|
+
class << self
|
15
|
+
# Get the access_token for other apis.
|
16
|
+
# http://mp.weixin.qq.com/wiki/11/0e4b294685f817b95cbed85ba5e82b8f.html
|
17
|
+
#
|
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}
|
22
|
+
def get_access_token(appid, secret, grant_type = 'client_credential')
|
23
|
+
url = 'https://api.weixin.qq.com/cgi-bin/token'\
|
24
|
+
"?grant_type=#{grant_type}&appid=#{appid}&secret=#{secret}"
|
25
|
+
Helper.http_get(url, { accept: :json })
|
26
|
+
end
|
27
|
+
|
28
|
+
# { "ip_list":["127.0.0.1","127.0.0.1"] }
|
29
|
+
def get_weixin_ips(access_token)
|
30
|
+
url = 'https://api.weixin.qq.com/cgi-bin/getcallbackip'\
|
31
|
+
"?access_token=#{access_token}"
|
32
|
+
Helper.http_get(url, { accept: :json })
|
33
|
+
end
|
34
|
+
|
35
|
+
def code_msg
|
36
|
+
{
|
37
|
+
-1 => '系统繁忙,此时请开发者稍候再试',
|
38
|
+
0 => '请求成功',
|
39
|
+
40001 => '获取access_token时AppSecret错误,或者access_token无效。请开发者认真比对AppSecret的正确性,或查看是否正在为恰当的公众号调用接口',
|
40
|
+
40002 => '不合法的凭证类型',
|
41
|
+
40003 => '不合法的OpenID,请开发者确认OpenID(该用户)是否已关注公众号,或是否是其他公众号的OpenID',
|
42
|
+
40004 => '不合法的媒体文件类型',
|
43
|
+
40005 => '不合法的文件类型',
|
44
|
+
40006 => '不合法的文件大小',
|
45
|
+
40007 => '不合法的媒体文件id',
|
46
|
+
40008 => '不合法的消息类型',
|
47
|
+
40009 => '不合法的图片文件大小',
|
48
|
+
40010 => '不合法的语音文件大小',
|
49
|
+
40011 => '不合法的视频文件大小',
|
50
|
+
40012 => '不合法的缩略图文件大小',
|
51
|
+
40013 => '不合法的AppID,请开发者检查AppID的正确性,避免异常字符,注意大小写',
|
52
|
+
40014 => '不合法的access_token,请开发者认真比对access_token的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口',
|
53
|
+
40015 => '不合法的菜单类型',
|
54
|
+
40016 => '不合法的按钮个数',
|
55
|
+
40017 => '不合法的按钮个数',
|
56
|
+
40018 => '不合法的按钮名字长度',
|
57
|
+
40019 => '不合法的按钮KEY长度',
|
58
|
+
40020 => '不合法的按钮URL长度',
|
59
|
+
40021 => '不合法的菜单版本号',
|
60
|
+
40022 => '不合法的子菜单级数',
|
61
|
+
40023 => '不合法的子菜单按钮个数',
|
62
|
+
40024 => '不合法的子菜单按钮类型',
|
63
|
+
40025 => '不合法的子菜单按钮名字长度',
|
64
|
+
40026 => '不合法的子菜单按钮KEY长度',
|
65
|
+
40027 => '不合法的子菜单按钮URL长度',
|
66
|
+
40028 => '不合法的自定义菜单使用用户',
|
67
|
+
40029 => '不合法的oauth_code',
|
68
|
+
40030 => '不合法的refresh_token',
|
69
|
+
40031 => '不合法的openid列表',
|
70
|
+
40032 => '不合法的openid列表长度',
|
71
|
+
40033 => '不合法的请求字符,不能包含\uxxxx格式的字符',
|
72
|
+
40035 => '不合法的参数',
|
73
|
+
40038 => '不合法的请求格式',
|
74
|
+
40039 => '不合法的URL长度',
|
75
|
+
40050 => '不合法的分组id',
|
76
|
+
40051 => '分组名字不合法',
|
77
|
+
41001 => '缺少access_token参数',
|
78
|
+
41002 => '缺少appid参数',
|
79
|
+
41003 => '缺少refresh_token参数',
|
80
|
+
41004 => '缺少secret参数',
|
81
|
+
41005 => '缺少多媒体文件数据',
|
82
|
+
41006 => '缺少media_id参数',
|
83
|
+
41007 => '缺少子菜单数据',
|
84
|
+
41008 => '缺少oauth code',
|
85
|
+
41009 => '缺少openid',
|
86
|
+
42001 => 'access_token超时,请检查access_token的有效期,请参考基础支持-获取access_token中,对access_token的详细机制说明',
|
87
|
+
42002 => 'refresh_token超时',
|
88
|
+
42003 => 'oauth_code超时',
|
89
|
+
43001 => '需要GET请求',
|
90
|
+
43002 => '需要POST请求',
|
91
|
+
43003 => '需要HTTPS请求',
|
92
|
+
43004 => '需要接收者关注',
|
93
|
+
43005 => '需要好友关系',
|
94
|
+
44001 => '多媒体文件',
|
95
|
+
44002 => 'POST的数据包',
|
96
|
+
44003 => '图文消息内容',
|
97
|
+
44004 => '文本消息内容',
|
98
|
+
45001 => '多媒体文件大小超过',
|
99
|
+
45002 => '消息内容超过',
|
100
|
+
45003 => '标题字段超过',
|
101
|
+
45004 => '描述字段超过',
|
102
|
+
45005 => '链接字段超过',
|
103
|
+
45006 => '图片链接字段超过',
|
104
|
+
45007 => '语音播放时间超过',
|
105
|
+
45008 => '图文消息超过',
|
106
|
+
45009 => '接口调用超过',
|
107
|
+
45010 => '创建菜单个数超过',
|
108
|
+
45015 => '回复时间超过',
|
109
|
+
45016 => '系统分组,不允许修改',
|
110
|
+
45017 => '分组名字过长',
|
111
|
+
45018 => '分组数量超过上限',
|
112
|
+
46001 => '不存在媒体数据',
|
113
|
+
46002 => '不存在的菜单版本',
|
114
|
+
46003 => '不存在的菜单数据',
|
115
|
+
46004 => '不存在的用户',
|
116
|
+
47001 => '解析JSON/XML内容错误',
|
117
|
+
48001 => 'api功能未授权,请确认公众号已获得该接口,可以在公众平台官网-开发者中心页中查看接口权限',
|
118
|
+
50001 => '用户未授权该api',
|
119
|
+
61451 => '参数错误(invalid parameter)',
|
120
|
+
61452 => '无效客服账号(invalid kf_account)',
|
121
|
+
61453 => '客服帐号已存在(kf_account exsited)',
|
122
|
+
61454 => '客服帐号名长度超过(仅允许10个英文字符,不包括@及@后的公众号的微信号)(invalid kf_acount length)',
|
123
|
+
61455 => '客服帐号名包含非法字符(仅允许英文+数字)(illegal character in kf_account)',
|
124
|
+
61456 => '客服帐号个数超过(10个客服账号)(kf_account count exceeded)',
|
125
|
+
61457 => '无效头像文件类型(invalid file type)',
|
126
|
+
61450 => '系统错误(system error)',
|
127
|
+
61500 => '日期格式错误',
|
128
|
+
61501 => '日期范围错误'
|
129
|
+
}
|
130
|
+
end
|
131
|
+
|
132
|
+
# Upload media to weixin.
|
133
|
+
# http://mp.weixin.qq.com/wiki/10/78b15308b053286e2a66b33f0f0f5fb6.html
|
134
|
+
#
|
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
|
+
def upload_media(access_token, type, media)
|
140
|
+
url = 'http://file.api.weixin.qq.com/cgi-bin/media/upload'\
|
141
|
+
"?access_token=#{access_token}&type=#{type}"
|
142
|
+
Helper.http_post(url, {file: media})
|
143
|
+
end
|
144
|
+
|
145
|
+
def download_media(access_token, media_id)
|
146
|
+
url = 'http://file.api.weixin.qq.com/cgi-bin/media/get'\
|
147
|
+
"?access_token=#{access_token}&media_id=#{media_id}"
|
148
|
+
RestClient.get url
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'digest'
|
4
|
+
require 'rest_client'
|
5
|
+
require 'json'
|
6
|
+
|
7
|
+
module WxExt
|
8
|
+
module Api
|
9
|
+
|
10
|
+
# 微信扩展接口, 模拟登陆微信公众平台
|
11
|
+
# @author FuShengYang
|
12
|
+
module Js
|
13
|
+
class << self
|
14
|
+
def get_jsapi_ticket(access_token)
|
15
|
+
url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=#{access_token}&type=jsapi"
|
16
|
+
Helper.http_get(url, { accept: :json })
|
17
|
+
end
|
18
|
+
|
19
|
+
def get_jsapi_config(access_token, url, app_id)
|
20
|
+
config_hash = {}
|
21
|
+
jsapi_ticket_hash = get_jsapi_ticket(access_token)
|
22
|
+
timestamp = set_timestamp
|
23
|
+
noncestr = set_noncestr
|
24
|
+
if jsapi_ticket_hash['errcode'] == 0
|
25
|
+
jsapi_ticket = jsapi_ticket_hash['ticket']
|
26
|
+
str = "jsapi_ticket=#{jsapi_ticket}&noncestr=#{noncestr}×tamp=#{timestamp}&url=#{url}"
|
27
|
+
signature = Digest::SHA1.hexdigest(str)
|
28
|
+
config_hash = {
|
29
|
+
app_id: app_id,
|
30
|
+
timestamp: timestamp,
|
31
|
+
noncestr: noncestr,
|
32
|
+
signature: signature
|
33
|
+
}
|
34
|
+
end
|
35
|
+
config_hash
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def set_noncestr
|
41
|
+
[*'a'..'z',*'0'..'9',*'A'..'Z'].sample(16).join
|
42
|
+
end
|
43
|
+
|
44
|
+
def set_timestamp
|
45
|
+
Time.now.to_i.to_s
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module WxExt
|
4
|
+
module Api
|
5
|
+
|
6
|
+
# 微信扩展接口, 模拟登陆微信公众平台
|
7
|
+
# @author FuShengYang
|
8
|
+
module Menu
|
9
|
+
class << self
|
10
|
+
|
11
|
+
def create_menu(access_token, menu_hash)
|
12
|
+
url = 'https://api.weixin.qq.com/cgi-bin/menu/create'\
|
13
|
+
"?access_token=#{access_token}"
|
14
|
+
Helper.http_post(url, menu_hash)
|
15
|
+
end
|
16
|
+
|
17
|
+
def menus(access_token)
|
18
|
+
url = 'https://api.weixin.qq.com/cgi-bin/menu/get'\
|
19
|
+
"?access_token=#{access_token}"
|
20
|
+
Helper.http_get(url, { accept: :json })
|
21
|
+
end
|
22
|
+
|
23
|
+
def del_menu(access_token)
|
24
|
+
url = 'https://api.weixin.qq.com/cgi-bin/menu/delete'\
|
25
|
+
"?access_token=#{access_token}"
|
26
|
+
Helper.http_get(url, { accept: :json })
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'digest'
|
4
|
+
|
5
|
+
module WxExt
|
6
|
+
module Api
|
7
|
+
|
8
|
+
# 微信扩展接口, 模拟登陆微信公众平台
|
9
|
+
# @author FuShengYang
|
10
|
+
module Msg
|
11
|
+
class << self
|
12
|
+
|
13
|
+
def check_signature(signature, timestamp, nonce, token)
|
14
|
+
array = [token, timestamp, nonce].sort
|
15
|
+
signature == Digest::SHA1.hexdigest(array.join) ? true : false
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'rest_client'
|
4
|
+
|
5
|
+
module WxExt
|
6
|
+
module Api
|
7
|
+
|
8
|
+
# 微信扩展接口, 模拟登陆微信公众平台
|
9
|
+
# @author FuShengYang
|
10
|
+
module User
|
11
|
+
module Group
|
12
|
+
class << self
|
13
|
+
def create_group(access_token, group_name)
|
14
|
+
url = 'https://api.weixin.qq.com/cgi-bin/groups/create'\
|
15
|
+
"?access_token=#{access_token}"
|
16
|
+
Helper.http_post(url, { group: { name: group_name } }.to_json)
|
17
|
+
end
|
18
|
+
|
19
|
+
def groups(access_token)
|
20
|
+
url = 'https://api.weixin.qq.com/cgi-bin/groups/get'\
|
21
|
+
"?access_token=#{access_token}"
|
22
|
+
Helper.http_get(url, { accept: :json })
|
23
|
+
end
|
24
|
+
|
25
|
+
def user_of_group(access_token, openid)
|
26
|
+
url = 'https://api.weixin.qq.com/cgi-bin/groups/getid'\
|
27
|
+
"?access_token=#{access_token}"
|
28
|
+
Helper.http_post(url, { openid: openid })
|
29
|
+
end
|
30
|
+
|
31
|
+
def update_group_name(access_token, id, name)
|
32
|
+
url = 'https://api.weixin.qq.com/cgi-bin/groups/update'\
|
33
|
+
"?access_token=#{access_token}"
|
34
|
+
Helper.http_post(url, { group: { id: id, name: name } })
|
35
|
+
end
|
36
|
+
|
37
|
+
def mv_user_group(access_token, openid, to_groupid)
|
38
|
+
url = 'https://api.weixin.qq.com/cgi-bin/groups/members/update'\
|
39
|
+
"?access_token=#{access_token}"
|
40
|
+
Helper.http_post(url, { openid: openid, to_groupid: to_groupid })
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'digest'
|
4
|
+
require 'rest_client'
|
5
|
+
require 'json'
|
6
|
+
require 'wx_ext/api/user/group'
|
7
|
+
|
8
|
+
module WxExt
|
9
|
+
module Api
|
10
|
+
|
11
|
+
# 微信扩展接口, 模拟登陆微信公众平台
|
12
|
+
# @author FuShengYang
|
13
|
+
module User
|
14
|
+
class << self
|
15
|
+
def change_remark(access_token, openid, remark) end
|
16
|
+
|
17
|
+
def get_user_base_info(access_token, openid, lang) end
|
18
|
+
|
19
|
+
def user_list(access_token, next_openid) end
|
20
|
+
|
21
|
+
def get_oauth2_token_with_code(app_id, app_secret, code, grant_type='authorization_code')
|
22
|
+
url = 'https://api.weixin.qq.com/sns/oauth2/access_token'\
|
23
|
+
"?appid=#{app_id}&secret=#{app_secret}&code=CODE&grant_type=#{grant_type}"
|
24
|
+
Helper.http_get(url, { accept: :json })
|
25
|
+
end
|
26
|
+
|
27
|
+
def refresh_oauth2_token(app_id, refresh_token, grant_type='refresh_token')
|
28
|
+
url = 'https://api.weixin.qq.com/sns/oauth2/refresh_token'\
|
29
|
+
"?appid=#{app_id}&grant_type=#{grant_type}&refresh_token=#{refresh_token}"
|
30
|
+
Helper.http_get(url, { accept: :json })
|
31
|
+
end
|
32
|
+
|
33
|
+
def get_user_info_with_snsapi_userinfo(oauth2_token, openid, lang)
|
34
|
+
url = 'https://api.weixin.qq.com/sns/userinfo'\
|
35
|
+
"?access_token=#{oauth2_token}&#{openid}=OPENID&lang=#{lang}"
|
36
|
+
Helper.http_get(url, { accept: :json })
|
37
|
+
end
|
38
|
+
|
39
|
+
def check_oauth2_token(openid, oauth2_token)
|
40
|
+
url = 'https://api.weixin.qq.com/sns/auth'\
|
41
|
+
"?access_token=#{oauth2_token}&openid=#{openid}"
|
42
|
+
Helper.http_get(url, { accept: :json })
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/wx_ext/api.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'rest_client'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
module WxExt
|
7
|
+
|
8
|
+
# @author FuShengYang
|
9
|
+
module Helper
|
10
|
+
class << self
|
11
|
+
def http_get(url, headers = {})
|
12
|
+
res = RestClient.get url, headers
|
13
|
+
JSON.parse res
|
14
|
+
end
|
15
|
+
|
16
|
+
def http_post(url, params, headers = {})
|
17
|
+
res = RestClient.post url, params, headers
|
18
|
+
JSON.parse res
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/wx_ext/sougou_weixin.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
1
|
# encoding: UTF-8
|
2
|
+
|
2
3
|
require 'nokogiri'
|
3
4
|
require 'rest_client'
|
4
5
|
require 'json'
|
5
6
|
require 'open-uri'
|
7
|
+
|
6
8
|
module WxExt
|
9
|
+
# 微信扩展接口, 从搜狗微信抓取微信文章
|
10
|
+
# @author FuShengYang
|
7
11
|
class SougouWeixin
|
8
12
|
def self.spider_posts_from_sougou(openid, page_index = 1, date_last = (Time.now - 3600 * 24 * 10).strftime("%Y-%m-%d"))
|
9
13
|
json_url = "http://weixin.sogou.com/gzhjs?&openid=#{openid}&page=#{page_index}"
|
data/lib/wx_ext/version.rb
CHANGED