umeng_pusher 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0dddb4d71a215a264360f11339077d12d5db8de0bef51388f6265b4b452ffec9
4
- data.tar.gz: 04cfef1f0606fc4c7686c2538106c984085704d814d5ee248fd6f9cc5ac679f0
3
+ metadata.gz: d504e87d15e0e9a32f5678876512397073360be05b265b34d0c227ae7d032bf7
4
+ data.tar.gz: 16c4258738ae9a6a96011162cedfd6c4788da1bfffeeee02331a2f15827824ac
5
5
  SHA512:
6
- metadata.gz: ceb28586cfffe7077507cf93cb41f63370d1a6ac4d4ff277de3c643ee01af7c5fa840e9a8485333007214ace80a5d6e2111098f61d893558353a84e5c115cade
7
- data.tar.gz: 1d8f8a2485b541f665450f83aaf5e119e9cfe0ce598cdf6df2a4f618ec0759506089bcfce3197d4d7cff7a029776a49060a76c8cb0865568a2bb2ca826967bfb
6
+ metadata.gz: 534f123e33720a399d8cb528f7b99ebf30b89e11fc153195b25d8e0effd4679ee84ef54dfff013fefb4318740c1daba4f18f74f54dd4f8ad0d9d83ee77614aea
7
+ data.tar.gz: ef9ee8046b08b26909fae512b7329ebe5c1523669c6f09c7c6b441a1b8f8c8dcc67f00a213eeadab2c55fa1ce01487d641b4b342d79fc63ce3d8bfd21046151d
data/Gemfile.lock CHANGED
@@ -1,19 +1,30 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- umeng_pusher (0.1.0)
4
+ umeng_pusher (0.1.1)
5
+ activesupport
5
6
  httpx
6
7
 
7
8
  GEM
8
9
  remote: https://rubygems.org/
9
10
  specs:
11
+ activesupport (6.1.3.2)
12
+ concurrent-ruby (~> 1.0, >= 1.0.2)
13
+ i18n (>= 1.6, < 2)
14
+ minitest (>= 5.1)
15
+ tzinfo (~> 2.0)
16
+ zeitwerk (~> 2.3)
10
17
  coderay (1.1.3)
18
+ concurrent-ruby (1.1.9)
11
19
  diff-lcs (1.4.4)
12
- http-2-next (0.3.0)
13
- httpx (0.11.0)
14
- http-2-next (>= 0.1.2)
20
+ http-2-next (0.4.3)
21
+ httpx (0.15.0)
22
+ http-2-next (>= 0.4.1)
15
23
  timers
24
+ i18n (1.8.10)
25
+ concurrent-ruby (~> 1.0)
16
26
  method_source (1.0.0)
27
+ minitest (5.14.4)
17
28
  pry (0.14.1)
18
29
  coderay (~> 1.1)
19
30
  method_source (~> 1.0)
@@ -31,7 +42,10 @@ GEM
31
42
  diff-lcs (>= 1.2.0, < 2.0)
32
43
  rspec-support (~> 3.10.0)
33
44
  rspec-support (3.10.2)
34
- timers (4.3.2)
45
+ timers (4.3.3)
46
+ tzinfo (2.0.4)
47
+ concurrent-ruby (~> 1.0)
48
+ zeitwerk (2.4.2)
35
49
 
36
50
  PLATFORMS
37
51
  ruby
data/README.md CHANGED
@@ -38,3 +38,7 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERN
38
38
  ## License
39
39
 
40
40
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
41
+
42
+
43
+ ## 注意事项
44
+ 1. 测试时需要添加IP白名单
data/lib/umeng_pusher.rb CHANGED
@@ -1,5 +1,37 @@
1
1
  require "umeng_pusher/version"
2
+ require "umeng_pusher/configuration"
3
+ require "umeng_pusher/sign"
4
+ require "umeng_pusher/client"
5
+ require "umeng_pusher/params"
2
6
 
3
7
  module UmengPusher
4
8
  class Error < StandardError; end
5
- end
9
+
10
+ def self.configuration
11
+ @configuration ||= Configuration.new
12
+ end
13
+
14
+ class << self
15
+ attr_writer :configuration
16
+
17
+ def configuration
18
+ @configuration ||= Configuration.new
19
+ end
20
+
21
+ def configure
22
+ yield(configuration)
23
+ end
24
+
25
+ def appkey(platform)
26
+ platform.downcase == 'ios' ? configuration.ios_appkey : configuration.android_appkey
27
+ end
28
+
29
+ def app_master_secret(platform)
30
+ platform.downcase == 'ios' ? configuration.ios_app_master_secret : configuration.android_app_master_secret
31
+ end
32
+
33
+ def production_mode
34
+ configuration.production_mode
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,64 @@
1
+ require "httpx"
2
+ require "json"
3
+ require "active_support"
4
+
5
+ module UmengPusher
6
+ class Client
7
+ attr_reader :payload, :ret, :task_id, :error_code, :file_id, :platform, :content
8
+ CAST_TYPE = %w|unicast listcast filecast broadcast groupcast customizedcast|
9
+ SEND_URL = "http://msg.umeng.com/api/send"
10
+ STATUS_URL = "http://msg.umeng.com/api/status"
11
+ CANCEL_URL = "http://msg.umeng.com/api/cancel"
12
+ UPLOAD_URL = "http://msg.umeng.com/upload"
13
+
14
+ def initialize(platform, options, debug_mode = true)
15
+ @platform = platform
16
+ @options = options
17
+ @debug_mode = debug_mode
18
+ end
19
+
20
+ # unicast-单播
21
+ # listcast-列播,要求不超过500个device_token
22
+ # broadcast-广播
23
+ # filecast-文件播,多个device_token可通过文件形式批量发送
24
+ # groupcast-组播,按照filter筛选用户群,请参照filter参数
25
+ # customizedcast,通过alias进行推送,包括以下两种case:
26
+ # -alias:对单个或者多个alias进行推送
27
+ # -file_id:将alias存放到文件后,根据file_id来推送
28
+ def send
29
+ post(SEND_URL, Params.send_params(@platform, @options))
30
+ end
31
+
32
+ def status
33
+ post(STATUS_URL, Params.status_params(@platform, @options[:task_id]))
34
+ end
35
+
36
+ def cancel
37
+ post(CANCEL_URL, Params.cancel_params(@platform, @options[:task_id]))
38
+ end
39
+
40
+ def upload
41
+ post(UPLOAD_URL, Params.upload_params(@platform, @options))
42
+ end
43
+
44
+ private
45
+
46
+ def post(url, payload)
47
+ sign = Sign.generate @platform, url, payload
48
+
49
+ puts payload.to_json if @debug_mode
50
+
51
+ resp = HTTPX.post("#{url}?sign=#{sign}", json: payload)
52
+
53
+ if resp.status == 200
54
+ r = JSON.parse(resp.body)
55
+ { message: r["ret"], error_code: r["data"]["error_code"] || 0, data: r["data"] }
56
+ elsif resp.status == 400
57
+ r = JSON.parse(resp.body)
58
+ { message: r["data"]["error_msg"], error_code: r["data"]["error_code"], data: r["data"] }
59
+ else
60
+ { message: "系统错误", error_code: "999", data: {} }
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,15 @@
1
+ module UmengPusher
2
+ class Configuration
3
+ attr_accessor :ios_appkey, :ios_app_master_secret,
4
+ :android_appkey, :android_app_master_secret,
5
+ :production_mode
6
+
7
+ def initialize
8
+ @ios_appkey = ""
9
+ @ios_app_master_secret = ""
10
+ @android_appkey = ""
11
+ @android_app_master_secret = ""
12
+ @production_mode = "false"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,101 @@
1
+ require "securerandom"
2
+
3
+ module UmengPusher
4
+ module Params
5
+ extend self
6
+
7
+ def send_params(platform, options)
8
+
9
+ params = {
10
+ "appkey" => UmengPusher.appkey(platform),
11
+ "timestamp" => Time.now.to_i.to_s,
12
+ "type" => options[:type],
13
+ "device_tokens" => options[:device_tokens],
14
+ "alias_type" => options[:alias_type], # 当type=customizedcast时,必填
15
+ "alias" => options[:alias], #当type=customizedcast时,选填(此参数和file_id二选一)
16
+ "file_id" => options[:file_id], # 当type=filecast时,必填
17
+ "policy" => { # 可选,定时任务策略
18
+ "start_time" => options[:start_time],
19
+ "expire_time" => options[:expire_time],
20
+ "max_send_num" => options[:max_send_num],
21
+ "out_biz_no" => options[:out_biz_no], # 强烈建议开发者在发送任务类消息时填写这个字段,友盟服务端会根据这个字段对消息做去重避免重复发送、根据业务推送内容填写,out_biz_no只对任务类消息有效
22
+ },
23
+ "production_mode" => UmengPusher.production_mode,
24
+ "description" => options[:description], # 可选,发送消息描述,建议填写
25
+ }
26
+
27
+ ios_payload = {
28
+ "payload" => {
29
+ "aps" => {
30
+ "alert" => options[:alert],
31
+ "badge" => options[:badge] || 1,
32
+ "sound" => options[:sound] || "default",
33
+ "content-available" => options["content-available".to_sym],
34
+ "category" => options[:category],
35
+ },
36
+ },
37
+ }
38
+
39
+ # body为业务自定义字段
40
+ ios_payload["payload"]["body"] = options[:extra] if options.has_key?(:extra)
41
+
42
+ android_payload = {
43
+ "payload" => {
44
+ "display_type" => options[:display_type],
45
+ "body" => {
46
+ "ticker" => options[:ticker],
47
+ "title" => options[:title],
48
+ "text" => options[:text],
49
+ "icon" => options[:icon],
50
+ "largeIcon" => options[:largeIcon],
51
+ "img" => options[:img],
52
+ "sound" => options[:sound],
53
+ "builder_id" => (options[:builder_id] || 0),
54
+ "play_vibrate" => (options[:play_vibrate] || "true"),
55
+ "play_lights" => (options[:play_lights] || "true"),
56
+ "play_sound" => (options[:play_sound] || "true"),
57
+ "after_open" => (options[:after_open] || "go_app"),
58
+ "url" => options[:url],
59
+ "activity" => options[:activity],
60
+ "custom" => options[:custom],
61
+ },
62
+ "extra" => options[:extra] || {},
63
+ },
64
+ }
65
+
66
+ platform.downcase == "ios" ? params.merge!(ios_payload) : params.merge!(android_payload)
67
+ compact_params(params)
68
+ end
69
+
70
+ def status_params(platform, task_id)
71
+ {
72
+ "appkey" => UmengPusher.appkey(platform),
73
+ "timestamp" => Time.now.to_i.to_s,
74
+ "task_id" => task_id,
75
+ }
76
+ end
77
+
78
+ def cancel_params(platform, task_id)
79
+ {
80
+ "appkey" => UmengPusher.appkey(platform),
81
+ "timestamp" => Time.now.to_i.to_s,
82
+ "task_id" => task_id,
83
+ }
84
+ end
85
+
86
+ def upload_params(platform, content)
87
+ {
88
+ "appkey" => UmengPusher.appkey(platform),
89
+ "timestamp" => Time.now.to_i.to_s,
90
+ "content" => content,
91
+ }
92
+ end
93
+
94
+ private
95
+
96
+ def compact_params(params)
97
+ custom_compact = Proc.new { |k, v| v.delete_if(&custom_compact) if v.kind_of?(Hash); v.blank? }
98
+ params.delete_if &custom_compact
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,9 @@
1
+ require "digest/md5"
2
+
3
+ module UmengPusher
4
+ class Sign
5
+ def self.generate(platform, url, payload)
6
+ Digest::MD5.hexdigest("POST" + url + payload.to_json + UmengPusher.app_master_secret(platform))
7
+ end
8
+ end
9
+ end
@@ -1,3 +1,3 @@
1
1
  module UmengPusher
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
data/umeng_pusher.gemspec CHANGED
@@ -28,6 +28,7 @@ Gem::Specification.new do |spec|
28
28
  spec.require_paths = ["lib"]
29
29
 
30
30
  spec.add_dependency "httpx"
31
+ spec.add_dependency "activesupport"
31
32
 
32
33
  spec.add_development_dependency "bundler"
33
34
  spec.add_development_dependency "rake"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: umeng_pusher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - 42up
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -98,6 +112,10 @@ files:
98
112
  - bin/console
99
113
  - bin/setup
100
114
  - lib/umeng_pusher.rb
115
+ - lib/umeng_pusher/client.rb
116
+ - lib/umeng_pusher/configuration.rb
117
+ - lib/umeng_pusher/params.rb
118
+ - lib/umeng_pusher/sign.rb
101
119
  - lib/umeng_pusher/version.rb
102
120
  - umeng_pusher.gemspec
103
121
  homepage: https://github.com/42up/umeng_pusher