From 214c4e275124053a133e306a180b80093328bafc Mon Sep 17 00:00:00 2001 From: lanrion Date: Thu, 27 Nov 2014 11:51:00 +0800 Subject: [PATCH] 添加 多媒体资料管理API、发送消息API --- lib/qy_wechat_api.rb | 20 +++++--------------- lib/qy_wechat_api/api/media.rb | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- lib/qy_wechat_api/api/message.rb | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------- lib/qy_wechat_api/client.rb | 2 +- qy_wechat_api.gemspec | 3 +++ 5 files changed, 159 insertions(+), 32 deletions(-) diff --git a/lib/qy_wechat_api.rb b/lib/qy_wechat_api.rb index a4552c3..e2d0612 100644 --- a/lib/qy_wechat_api.rb +++ b/lib/qy_wechat_api.rb @@ -1,6 +1,10 @@ # encoding: utf-8 require "rest-client" + +require "carrierwave" +require "qy_wechat_api/carrierwave/qy_wechat_api_uploader" + require 'yajl/json_gem' require "qy_wechat_api/client" @@ -13,29 +17,15 @@ module QyWechatApi OK_CODE = 0.freeze class << self - # for test - def corpid - "wxb9ce1d023fe6eb69" - end - - # for test - def corpsecret - "UOofFIah4PVLmkG8xMH3lpDxj6NTnQSKMrFt-HubiPB4kjB09EmTVcUjgNeermps" - end def http_get_without_token(url, params={}) get_api_url = ENDPOINT_URL + url - puts get_api_url - puts params load_json(RestClient.get(get_api_url, params: params)) end def http_post_without_token(url, payload={}, params={}) post_api_url = ENDPOINT_URL + url - puts post_api_url - puts payload - puts params - payload = JSON.dump(payload) + payload = JSON.dump(payload) if !payload[:media].is_a?(File) load_json(RestClient.post(post_api_url, payload, params: params)) end diff --git a/lib/qy_wechat_api/api/media.rb b/lib/qy_wechat_api/api/media.rb index d30258a..5ae3f65 100644 --- a/lib/qy_wechat_api/api/media.rb +++ b/lib/qy_wechat_api/api/media.rb @@ -4,12 +4,16 @@ module QyWechatApi module Api class Media < Base - def upload - + # 媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file) + # media: 支持传路径或者文件实例 + def upload(media, media_type) + file = process_file(media) + http_post("upload", {media: file}, {type: media_type}) end + # 返回一个URL,请开发者自行使用此url下载 def get_media_by_id(media_id) - + http_get("get", {media_id: media_id}) end private @@ -18,6 +22,62 @@ module QyWechatApi "/media" end + def process_file(media) + return media if media.is_a?(File) && jpep?(media) + + media_url = media + uploader = QyWechatApiUploader.new + + if http?(media_url) # remote + uploader.download!(media_url.to_s) + else # local + media_file = media.is_a?(File) ? media : File.new(media_url) + uploader.cache!(media_file) + end + file = process_media(uploader) + CarrierWave.clean_cached_files! # clear last one day cache + file + end + + def process_media(uploader) + uploader = covert(uploader) + uploader.file.to_file + end + + # JUST ONLY FOR JPG IMAGE + def covert(uploader) + # image process + unless (uploader.file.content_type =~ /image/).nil? + if !jpep?(uploader.file) + require "mini_magick" + # covert to jpeg + image = MiniMagick::Image.open(uploader.path) + image.format("jpg") + uploader.cache!(File.open(image.path)) + image.destroy! # remove /tmp from MinMagick generate + end + end + uploader + end + + def http?(uri) + return false if !uri.is_a?(String) + uri = URI.parse(uri) + uri.scheme =~ /^https?$/ + end + + def jpep?(file) + content_type = if file.respond_to?(:content_type) + file.content_type + else + content_type(file.path) + end + !(content_type =~ /jpeg/).nil? + end + + def content_type(media_path) + MIME::Types.type_for(media_path).first.content_type + end end end end diff --git a/lib/qy_wechat_api/api/message.rb b/lib/qy_wechat_api/api/message.rb index 95d3d20..e3be759 100644 --- a/lib/qy_wechat_api/api/message.rb +++ b/lib/qy_wechat_api/api/message.rb @@ -5,37 +5,93 @@ module QyWechatApi class Message < Base # 发送文本 - def send_text + def send_text(users, parties, tags, agent_id, content, safe=0) + params = common_params("text", agent_id, users, parties, tags, safe) + params.merge!({text: {content: content}}) + http_post("send", params) end # 发送图片 - def send_image - + def send_image(users, parties, tags, agent_id, media_id, safe=0) + params = common_params("image", agent_id, users, parties, tags, safe) + params.merge!({image: {media_id: media_id}}) + http_post("send", params) end # 发送语音 - def send_voice - + def send_voice(users, parties, tags, agent_id, media_id, safe=0) + params = common_params("voice", agent_id, users, parties, tags, safe) + params.merge!({voice: {media_id: media_id}}) + http_post("send", params) end # 发送视频 - def send_video - + # media_options: {title: "title", description: "Description"} + def send_video(users, parties, tags, agent_id, media_id, media_options={}, safe=0) + params = common_params("video", agent_id, users, parties, tags, safe) + params.merge!({ + video: { + media_id: media_id, + title: media_options["title"], + description: media_options["description"], + } + }) + http_post("send", params) end # 文件信息 - def send_file - + def send_file(users, parties, tags, agent_id, media_id, safe=0) + params = common_params("file", agent_id, users, parties, tags, safe) + params.merge!({file: {media_id: media_id}}) + http_post("send", params) end # news消息 - def send_news - + # "articles":[ + # { + # "title": "Title", + # "description": "Description", + # "url": "URL", + # "picurl": "PIC_URL" + # }, + # { + # "title": "Title", + # "description": "Description", + # "url": "URL", + # "picurl": "PIC_URL" + # } + # ] + def send_news(users, parties, tags, agent_id, articles, safe=0) + params = common_params("news", agent_id, users, parties, tags, safe) + params.merge!({news: {articles: articles}}) + http_post("send", params) end # mpnews - def send_mpnews - + # articles":[ + # { + # "title": "Title", + # "thumb_media_id": "id", + # "author": "Author", + # "content_source_url": "URL", + # "content": "Content", + # "digest": "Digest description", + # "show_cover_pic": "0" + # }, + # { + # "title": "Title", + # "thumb_media_id": "id", + # "author": "Author", + # "content_source_url": "URL", + # "content": "Content", + # "digest": "Digest description", + # "show_cover_pic": "0" + # } + # ] + def send_mpnews(users, parties, tags, agent_id, articles, safe=0) + params = common_params("mpnews", agent_id, users, parties, tags, safe) + params.merge!({mpnews: {articles: articles}}) + http_post("send", params) end private @@ -44,6 +100,24 @@ module QyWechatApi "/message" end + # 通用函数 + def common_params(msg_type, agent_id, users=[], parties=[], tags=[], safe=0) + params = { + touser: join(users), + toparty: join(parties), + msgtype: msg_type, + agentid: agent_id, + totag: join(tags) + } + params.merge!({safe: safe}) if msg_type != "news" + params + end + + def join(array, split="|") + return array if array.is_a?(String) + array.join(split) + end + end end end diff --git a/lib/qy_wechat_api/client.rb b/lib/qy_wechat_api/client.rb index a0600fd..13541b2 100644 --- a/lib/qy_wechat_api/client.rb +++ b/lib/qy_wechat_api/client.rb @@ -44,7 +44,7 @@ module QyWechatApi private def get_access_token - self.access_token ||= get_token.result[:access_token] + self.access_token ||= get_token.result["access_token"] end # 获取token diff --git a/qy_wechat_api.gemspec b/qy_wechat_api.gemspec index bce9cf4..5005b0a 100644 --- a/qy_wechat_api.gemspec +++ b/qy_wechat_api.gemspec @@ -24,6 +24,9 @@ Gem::Specification.new do |spec| # https://github.com/brianmario/yajl-ruby spec.add_dependency "yajl-ruby", "~> 1.2.0" + spec.add_dependency "carrierwave", "~> 0.10.0" + spec.add_dependency 'mini_magick', '~> 3.7.0' + spec.add_development_dependency "bundler", "~> 1.6" spec.add_development_dependency "rake" end -- libgit2 0.21.0