Commit 214c4e275124053a133e306a180b80093328bafc

Authored by lanrion
1 parent 9d365b99
Exists in master

添加 多媒体资料管理API、发送消息API

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
... ... @@ -44,7 +44,7 @@ module QyWechatApi
44 44  
45 45 private
46 46 def get_access_token
47   - self.access_token ||= get_token.result[:access_token]
  47 + self.access_token ||= get_token.result["access_token"]
48 48 end
49 49  
50 50 # 获取token
... ...
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
... ...