Commit 214c4e275124053a133e306a180b80093328bafc
1 parent
9d365b99
Exists in
master
添加 多媒体资料管理API、发送消息API
Showing
5 changed files
with
159 additions
and
32 deletions
Show diff stats
lib/qy_wechat_api.rb
1 | 1 | # encoding: utf-8 |
2 | 2 | |
3 | 3 | require "rest-client" |
4 | + | |
5 | +require "carrierwave" | |
6 | +require "qy_wechat_api/carrierwave/qy_wechat_api_uploader" | |
7 | + | |
4 | 8 | require 'yajl/json_gem' |
5 | 9 | |
6 | 10 | require "qy_wechat_api/client" |
... | ... | @@ -13,29 +17,15 @@ module QyWechatApi |
13 | 17 | OK_CODE = 0.freeze |
14 | 18 | |
15 | 19 | class << self |
16 | - # for test | |
17 | - def corpid | |
18 | - "wxb9ce1d023fe6eb69" | |
19 | - end | |
20 | - | |
21 | - # for test | |
22 | - def corpsecret | |
23 | - "UOofFIah4PVLmkG8xMH3lpDxj6NTnQSKMrFt-HubiPB4kjB09EmTVcUjgNeermps" | |
24 | - end | |
25 | 20 | |
26 | 21 | def http_get_without_token(url, params={}) |
27 | 22 | get_api_url = ENDPOINT_URL + url |
28 | - puts get_api_url | |
29 | - puts params | |
30 | 23 | load_json(RestClient.get(get_api_url, params: params)) |
31 | 24 | end |
32 | 25 | |
33 | 26 | def http_post_without_token(url, payload={}, params={}) |
34 | 27 | post_api_url = ENDPOINT_URL + url |
35 | - puts post_api_url | |
36 | - puts payload | |
37 | - puts params | |
38 | - payload = JSON.dump(payload) | |
28 | + payload = JSON.dump(payload) if !payload[:media].is_a?(File) | |
39 | 29 | load_json(RestClient.post(post_api_url, payload, params: params)) |
40 | 30 | end |
41 | 31 | ... | ... |
lib/qy_wechat_api/api/media.rb
... | ... | @@ -4,12 +4,16 @@ module QyWechatApi |
4 | 4 | module Api |
5 | 5 | class Media < Base |
6 | 6 | |
7 | - def upload | |
8 | - | |
7 | + # 媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file) | |
8 | + # media: 支持传路径或者文件实例 | |
9 | + def upload(media, media_type) | |
10 | + file = process_file(media) | |
11 | + http_post("upload", {media: file}, {type: media_type}) | |
9 | 12 | end |
10 | 13 | |
14 | + # 返回一个URL,请开发者自行使用此url下载 | |
11 | 15 | def get_media_by_id(media_id) |
12 | - | |
16 | + http_get("get", {media_id: media_id}) | |
13 | 17 | end |
14 | 18 | |
15 | 19 | private |
... | ... | @@ -18,6 +22,62 @@ module QyWechatApi |
18 | 22 | "/media" |
19 | 23 | end |
20 | 24 | |
25 | + def process_file(media) | |
26 | + return media if media.is_a?(File) && jpep?(media) | |
27 | + | |
28 | + media_url = media | |
29 | + uploader = QyWechatApiUploader.new | |
30 | + | |
31 | + if http?(media_url) # remote | |
32 | + uploader.download!(media_url.to_s) | |
33 | + else # local | |
34 | + media_file = media.is_a?(File) ? media : File.new(media_url) | |
35 | + uploader.cache!(media_file) | |
36 | + end | |
37 | + file = process_media(uploader) | |
38 | + CarrierWave.clean_cached_files! # clear last one day cache | |
39 | + file | |
40 | + end | |
41 | + | |
42 | + def process_media(uploader) | |
43 | + uploader = covert(uploader) | |
44 | + uploader.file.to_file | |
45 | + end | |
46 | + | |
47 | + # JUST ONLY FOR JPG IMAGE | |
48 | + def covert(uploader) | |
49 | + # image process | |
50 | + unless (uploader.file.content_type =~ /image/).nil? | |
51 | + if !jpep?(uploader.file) | |
52 | + require "mini_magick" | |
53 | + # covert to jpeg | |
54 | + image = MiniMagick::Image.open(uploader.path) | |
55 | + image.format("jpg") | |
56 | + uploader.cache!(File.open(image.path)) | |
57 | + image.destroy! # remove /tmp from MinMagick generate | |
58 | + end | |
59 | + end | |
60 | + uploader | |
61 | + end | |
62 | + | |
63 | + def http?(uri) | |
64 | + return false if !uri.is_a?(String) | |
65 | + uri = URI.parse(uri) | |
66 | + uri.scheme =~ /^https?$/ | |
67 | + end | |
68 | + | |
69 | + def jpep?(file) | |
70 | + content_type = if file.respond_to?(:content_type) | |
71 | + file.content_type | |
72 | + else | |
73 | + content_type(file.path) | |
74 | + end | |
75 | + !(content_type =~ /jpeg/).nil? | |
76 | + end | |
77 | + | |
78 | + def content_type(media_path) | |
79 | + MIME::Types.type_for(media_path).first.content_type | |
80 | + end | |
21 | 81 | end |
22 | 82 | end |
23 | 83 | end | ... | ... |
lib/qy_wechat_api/api/message.rb
... | ... | @@ -5,37 +5,93 @@ module QyWechatApi |
5 | 5 | class Message < Base |
6 | 6 | |
7 | 7 | # 发送文本 |
8 | - def send_text | |
8 | + def send_text(users, parties, tags, agent_id, content, safe=0) | |
9 | + params = common_params("text", agent_id, users, parties, tags, safe) | |
10 | + params.merge!({text: {content: content}}) | |
11 | + http_post("send", params) | |
9 | 12 | end |
10 | 13 | |
11 | 14 | # 发送图片 |
12 | - def send_image | |
13 | - | |
15 | + def send_image(users, parties, tags, agent_id, media_id, safe=0) | |
16 | + params = common_params("image", agent_id, users, parties, tags, safe) | |
17 | + params.merge!({image: {media_id: media_id}}) | |
18 | + http_post("send", params) | |
14 | 19 | end |
15 | 20 | |
16 | 21 | # 发送语音 |
17 | - def send_voice | |
18 | - | |
22 | + def send_voice(users, parties, tags, agent_id, media_id, safe=0) | |
23 | + params = common_params("voice", agent_id, users, parties, tags, safe) | |
24 | + params.merge!({voice: {media_id: media_id}}) | |
25 | + http_post("send", params) | |
19 | 26 | end |
20 | 27 | |
21 | 28 | # 发送视频 |
22 | - def send_video | |
23 | - | |
29 | + # media_options: {title: "title", description: "Description"} | |
30 | + def send_video(users, parties, tags, agent_id, media_id, media_options={}, safe=0) | |
31 | + params = common_params("video", agent_id, users, parties, tags, safe) | |
32 | + params.merge!({ | |
33 | + video: { | |
34 | + media_id: media_id, | |
35 | + title: media_options["title"], | |
36 | + description: media_options["description"], | |
37 | + } | |
38 | + }) | |
39 | + http_post("send", params) | |
24 | 40 | end |
25 | 41 | |
26 | 42 | # 文件信息 |
27 | - def send_file | |
28 | - | |
43 | + def send_file(users, parties, tags, agent_id, media_id, safe=0) | |
44 | + params = common_params("file", agent_id, users, parties, tags, safe) | |
45 | + params.merge!({file: {media_id: media_id}}) | |
46 | + http_post("send", params) | |
29 | 47 | end |
30 | 48 | |
31 | 49 | # news消息 |
32 | - def send_news | |
33 | - | |
50 | + # "articles":[ | |
51 | + # { | |
52 | + # "title": "Title", | |
53 | + # "description": "Description", | |
54 | + # "url": "URL", | |
55 | + # "picurl": "PIC_URL" | |
56 | + # }, | |
57 | + # { | |
58 | + # "title": "Title", | |
59 | + # "description": "Description", | |
60 | + # "url": "URL", | |
61 | + # "picurl": "PIC_URL" | |
62 | + # } | |
63 | + # ] | |
64 | + def send_news(users, parties, tags, agent_id, articles, safe=0) | |
65 | + params = common_params("news", agent_id, users, parties, tags, safe) | |
66 | + params.merge!({news: {articles: articles}}) | |
67 | + http_post("send", params) | |
34 | 68 | end |
35 | 69 | |
36 | 70 | # mpnews |
37 | - def send_mpnews | |
38 | - | |
71 | + # articles":[ | |
72 | + # { | |
73 | + # "title": "Title", | |
74 | + # "thumb_media_id": "id", | |
75 | + # "author": "Author", | |
76 | + # "content_source_url": "URL", | |
77 | + # "content": "Content", | |
78 | + # "digest": "Digest description", | |
79 | + # "show_cover_pic": "0" | |
80 | + # }, | |
81 | + # { | |
82 | + # "title": "Title", | |
83 | + # "thumb_media_id": "id", | |
84 | + # "author": "Author", | |
85 | + # "content_source_url": "URL", | |
86 | + # "content": "Content", | |
87 | + # "digest": "Digest description", | |
88 | + # "show_cover_pic": "0" | |
89 | + # } | |
90 | + # ] | |
91 | + def send_mpnews(users, parties, tags, agent_id, articles, safe=0) | |
92 | + params = common_params("mpnews", agent_id, users, parties, tags, safe) | |
93 | + params.merge!({mpnews: {articles: articles}}) | |
94 | + http_post("send", params) | |
39 | 95 | end |
40 | 96 | |
41 | 97 | private |
... | ... | @@ -44,6 +100,24 @@ module QyWechatApi |
44 | 100 | "/message" |
45 | 101 | end |
46 | 102 | |
103 | + # 通用函数 | |
104 | + def common_params(msg_type, agent_id, users=[], parties=[], tags=[], safe=0) | |
105 | + params = { | |
106 | + touser: join(users), | |
107 | + toparty: join(parties), | |
108 | + msgtype: msg_type, | |
109 | + agentid: agent_id, | |
110 | + totag: join(tags) | |
111 | + } | |
112 | + params.merge!({safe: safe}) if msg_type != "news" | |
113 | + params | |
114 | + end | |
115 | + | |
116 | + def join(array, split="|") | |
117 | + return array if array.is_a?(String) | |
118 | + array.join(split) | |
119 | + end | |
120 | + | |
47 | 121 | end |
48 | 122 | end |
49 | 123 | end | ... | ... |
lib/qy_wechat_api/client.rb
qy_wechat_api.gemspec
... | ... | @@ -24,6 +24,9 @@ Gem::Specification.new do |spec| |
24 | 24 | # https://github.com/brianmario/yajl-ruby |
25 | 25 | spec.add_dependency "yajl-ruby", "~> 1.2.0" |
26 | 26 | |
27 | + spec.add_dependency "carrierwave", "~> 0.10.0" | |
28 | + spec.add_dependency 'mini_magick', '~> 3.7.0' | |
29 | + | |
27 | 30 | spec.add_development_dependency "bundler", "~> 1.6" |
28 | 31 | spec.add_development_dependency "rake" |
29 | 32 | end | ... | ... |