pindo 4.6.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. checksums.yaml +7 -0
  2. data/bin/pindo +35 -0
  3. data/lib/pindo/base/aeshelper.rb +31 -0
  4. data/lib/pindo/base/deviceinfo.rb +90 -0
  5. data/lib/pindo/base/executable.rb +224 -0
  6. data/lib/pindo/base/githelper.rb +489 -0
  7. data/lib/pindo/base/hashhelper.rb +134 -0
  8. data/lib/pindo/base/plaininformative.rb +15 -0
  9. data/lib/pindo/base/plistbuddyexecutable.rb +121 -0
  10. data/lib/pindo/base/standarderror.rb +14 -0
  11. data/lib/pindo/client/applovinclient.rb +156 -0
  12. data/lib/pindo/client/aws3sclient.rb +183 -0
  13. data/lib/pindo/client/bossclient.rb +229 -0
  14. data/lib/pindo/client/bossconfigclient.rb +175 -0
  15. data/lib/pindo/client/giteeclient.rb +65 -0
  16. data/lib/pindo/client/httpclient.rb +40 -0
  17. data/lib/pindo/client/pgyerclient.rb +439 -0
  18. data/lib/pindo/client/tgateclient.rb +103 -0
  19. data/lib/pindo/command.rb +101 -0
  20. data/lib/pindo/config/pindoconfig.rb +439 -0
  21. data/lib/pindo/config/pindouserlocalconfig.rb +81 -0
  22. data/lib/pindo/deploy/Fastfile +233 -0
  23. data/lib/pindo/deploy/build.rb +167 -0
  24. data/lib/pindo/deploy/bundleid.rb +245 -0
  25. data/lib/pindo/deploy/cert.rb +508 -0
  26. data/lib/pindo/deploy/check.rb +79 -0
  27. data/lib/pindo/deploy/configproj.rb +89 -0
  28. data/lib/pindo/deploy/confusecode.rb +248 -0
  29. data/lib/pindo/deploy/confuseproj.rb +112 -0
  30. data/lib/pindo/deploy/fabric.rb +58 -0
  31. data/lib/pindo/deploy/getitcinfo.rb +248 -0
  32. data/lib/pindo/deploy/iap.rb +796 -0
  33. data/lib/pindo/deploy/initconfig.rb +128 -0
  34. data/lib/pindo/deploy/itcapp.rb +147 -0
  35. data/lib/pindo/deploy/itcinfo.rb +369 -0
  36. data/lib/pindo/deploy/pem.rb +55 -0
  37. data/lib/pindo/deploy/pullconfig.rb +46 -0
  38. data/lib/pindo/deploy/pushconfig.rb +83 -0
  39. data/lib/pindo/deploy/quswark.rb +146 -0
  40. data/lib/pindo/deploy/quswauth.rb +67 -0
  41. data/lib/pindo/deploy/reportbug.rb +135 -0
  42. data/lib/pindo/deploy/resign.rb +338 -0
  43. data/lib/pindo/deploy/tag.rb +108 -0
  44. data/lib/pindo/deploy/updateconfig.rb +129 -0
  45. data/lib/pindo/deploy/uploadipa.rb +63 -0
  46. data/lib/pindo/deploy.rb +44 -0
  47. data/lib/pindo/dev/autobuild.rb +204 -0
  48. data/lib/pindo/dev/autoresign.rb +186 -0
  49. data/lib/pindo/dev/confusecode.rb +127 -0
  50. data/lib/pindo/dev/confuseproj.rb +111 -0
  51. data/lib/pindo/dev/createbuild.rb +159 -0
  52. data/lib/pindo/dev/debug.rb +141 -0
  53. data/lib/pindo/dev/pub.rb +171 -0
  54. data/lib/pindo/dev/renewcert.rb +142 -0
  55. data/lib/pindo/dev.rb +23 -0
  56. data/lib/pindo/env/dreamstudio.rb +53 -0
  57. data/lib/pindo/env/flutter.rb +59 -0
  58. data/lib/pindo/env/flutter.sh +116 -0
  59. data/lib/pindo/env/quarkenv.rb +58 -0
  60. data/lib/pindo/env/swarkenv.rb +62 -0
  61. data/lib/pindo/env/workhard.rb +56 -0
  62. data/lib/pindo/env.rb +17 -0
  63. data/lib/pindo/ipa/autoresign.rb +188 -0
  64. data/lib/pindo/ipa/import.rb +261 -0
  65. data/lib/pindo/ipa/output.rb +396 -0
  66. data/lib/pindo/ipa.rb +22 -0
  67. data/lib/pindo/lib/forcepush.rb +159 -0
  68. data/lib/pindo/lib/lint.rb +115 -0
  69. data/lib/pindo/lib/push.rb +143 -0
  70. data/lib/pindo/lib/update.rb +75 -0
  71. data/lib/pindo/lib.rb +18 -0
  72. data/lib/pindo/module/appselect.rb +200 -0
  73. data/lib/pindo/module/appstore_in_app_purchase.rb +1803 -0
  74. data/lib/pindo/module/appstore_metadata_connect_api_helper.rb +12 -0
  75. data/lib/pindo/module/appstore_metadata_fastlane_helper.rb +922 -0
  76. data/lib/pindo/module/buildconfighelper.rb +13 -0
  77. data/lib/pindo/module/buildhelper.rb +76 -0
  78. data/lib/pindo/module/commonconfuseproj.rb +271 -0
  79. data/lib/pindo/module/config_project.sh +143 -0
  80. data/lib/pindo/module/configprojhelper.rb +631 -0
  81. data/lib/pindo/module/iap_tier.json +813 -0
  82. data/lib/pindo/module/icon_contents.json +116 -0
  83. data/lib/pindo/module/imessage_icon.json +91 -0
  84. data/lib/pindo/module/imgset_contents.json +21 -0
  85. data/lib/pindo/module/launchimg_contents.json +21 -0
  86. data/lib/pindo/module/pemcreate.rb +63 -0
  87. data/lib/pindo/module/pgyerhelper.rb +339 -0
  88. data/lib/pindo/module/xcodebuildpre.rb +258 -0
  89. data/lib/pindo/module/xcodehelper.rb +521 -0
  90. data/lib/pindo/options/appconfigoptions.rb +23 -0
  91. data/lib/pindo/options/deployoptions.rb +363 -0
  92. data/lib/pindo/pgyer/apptest.rb +104 -0
  93. data/lib/pindo/pgyer/comment.rb +95 -0
  94. data/lib/pindo/pgyer/download.rb +105 -0
  95. data/lib/pindo/pgyer/login.rb +61 -0
  96. data/lib/pindo/pgyer/upload.rb +234 -0
  97. data/lib/pindo/pgyer.rb +17 -0
  98. data/lib/pindo/repo/clone.rb +78 -0
  99. data/lib/pindo/repo/create.rb +55 -0
  100. data/lib/pindo/repo/login.rb +64 -0
  101. data/lib/pindo/repo/search.rb +60 -0
  102. data/lib/pindo/repo.rb +16 -0
  103. data/lib/pindo/setup.rb +60 -0
  104. data/lib/pindo/upgrade.rb +56 -0
  105. data/lib/pindo/utils/applovin.rb +213 -0
  106. data/lib/pindo/utils/boss.rb +209 -0
  107. data/lib/pindo/utils/clearcert.rb +60 -0
  108. data/lib/pindo/utils/device.rb +279 -0
  109. data/lib/pindo/utils/icon.rb +91 -0
  110. data/lib/pindo/utils/icon.sh +133 -0
  111. data/lib/pindo/utils/podindex.rb +56 -0
  112. data/lib/pindo/utils/podindex.sh +30 -0
  113. data/lib/pindo/utils/renewproj.rb +146 -0
  114. data/lib/pindo/utils/tgate.rb +159 -0
  115. data/lib/pindo/utils/xcassets.rb +46 -0
  116. data/lib/pindo/utils/xcassets.sh +88 -0
  117. data/lib/pindo/utils.rb +29 -0
  118. data/lib/pindo/version.rb +110 -0
  119. data/lib/pindo.rb +34 -0
  120. metadata +364 -0
@@ -0,0 +1,121 @@
1
+ module Pindo
2
+
3
+ module Plistbuddyexecutable
4
+
5
+ def plistbuddyexecutable(name)
6
+ define_method(name) do |*command|
7
+ Plistbuddyexecutable.plistbuddy_execute_command(name, Array(command).flatten, false)
8
+ end
9
+
10
+ define_method(name.to_s + '!') do |*command|
11
+ Plistbuddyexecutable.plistbuddy_execute_command(name, Array(command).flatten, true)
12
+ end
13
+ end
14
+
15
+
16
+ def self.plistbuddy_execute_command(executable, command, raise_on_failure = true)
17
+ bin = '/usr/libexec/PlistBuddy'
18
+
19
+ command = command.map(&:to_s)
20
+ full_command = "#{bin} #{command.join(' ')}"
21
+
22
+
23
+ puts "$ #{full_command}"
24
+ stdout = Plistbuddyindenter.new(STDOUT)
25
+ stderr = Plistbuddyindenter.new(STDERR)
26
+
27
+
28
+ status = plistbuddy_popen3(bin, command, stdout, stderr)
29
+ stdout = stdout.join
30
+ stderr = stderr.join
31
+ output = stdout + stderr
32
+ unless status.success?
33
+ if raise_on_failure
34
+ raise Informative, "#{full_command}\n\n#{output}"
35
+ else
36
+ puts "[!] Failed: #{full_command}"
37
+ end
38
+ end
39
+
40
+ output
41
+ end
42
+
43
+ private
44
+
45
+ def self.plistbuddy_popen3(bin, command, stdout, stderr)
46
+ puts "plistbuddy_popen3 ++++1"
47
+ puts bin
48
+ require 'open3'
49
+ Open3.popen3(bin, *command) do |i, o, e, t|
50
+ plistbuddy_reader(o, stdout)
51
+ plistbuddy_reader(e, stderr)
52
+ i.close
53
+
54
+ status = t.value
55
+
56
+ o.flush
57
+ e.flush
58
+ sleep(0.01)
59
+
60
+ status
61
+ end
62
+ end
63
+
64
+ def self.plistbuddy_reader(input, output)
65
+ Thread.new do
66
+ buf = ''
67
+ begin
68
+ loop do
69
+ buf << input.readpartial(4096)
70
+ loop do
71
+ string, separator, buf = buf.partition(/[\r\n]/)
72
+ if separator.empty?
73
+ buf = string
74
+ break
75
+ end
76
+ output << (string << separator)
77
+ end
78
+ end
79
+ rescue EOFError
80
+ output << (buf << $/) unless buf.empty?
81
+ end
82
+ end
83
+ end
84
+
85
+ #-------------------------------------------------------------------------#
86
+
87
+ # Helper class that allows to write to an {IO} instance taking into account
88
+ # the UI indentation level.
89
+ #
90
+ class Plistbuddyindenter < ::Array
91
+ # @return [Fixnum] The indentation level of the UI.
92
+ #
93
+ attr_reader :indent
94
+
95
+ # @return [IO] the {IO} to which the output should be printed.
96
+ #
97
+ attr_reader :io
98
+
99
+ # Init a new Indenter
100
+ #
101
+ # @param [IO] io @see io
102
+ #
103
+ def initialize(io = nil)
104
+ @io = io
105
+ @indent = ' '
106
+ end
107
+
108
+ # Stores a portion of the output and prints it to the {IO} instance.
109
+ #
110
+ # @param [String] value
111
+ # the output to print.
112
+ #
113
+ # @return [void]
114
+ #
115
+ def <<(value)
116
+ super
117
+ io << "#{indent}#{value}" if io
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,14 @@
1
+ module Pindo
2
+
3
+ require 'pindo/version'
4
+
5
+ # Indicates a runtime error **not** caused by a bug.
6
+ #
7
+ class StandardError < ::StandardError;
8
+
9
+ end
10
+
11
+ # Indicates a user error.
12
+
13
+ end
14
+
@@ -0,0 +1,156 @@
1
+ require 'fileutils'
2
+ require 'faraday'
3
+
4
+ module Pindo
5
+
6
+ class ApplovinClient
7
+
8
+ attr_accessor :applovin_management_key
9
+ attr_accessor :applovin_base_url
10
+ attr_accessor :request_config
11
+
12
+
13
+
14
+
15
+
16
+ def self.ad_unit_type()
17
+ ad_format_array = [
18
+ "INTER",
19
+ "BANNER",
20
+ "REWARD",
21
+ "MREC",
22
+ "NATIVE",
23
+ "APPOPEN"
24
+ ]
25
+ return ad_format_array
26
+ end
27
+
28
+ def self.ad_unit_template_size()
29
+ ad_format_array = [
30
+ "small_template_1",
31
+ "medium_template_1",
32
+ "custom_template_1"
33
+ ]
34
+ return ad_format_array
35
+ end
36
+
37
+ def initialize()
38
+
39
+ # begin
40
+
41
+ config_file = File.join(File::expand_path(Pindoconfig.instance.pindo_common_configdir), "applovin_client_config.json")
42
+ config_json = JSON.parse(File.read(config_file))
43
+
44
+ @applovin_management_key = config_json["applovin_management_key"]
45
+ @applovin_base_url = config_json["applovin_base_url"]
46
+ @requests_config = config_json["applovin_req_config"]
47
+
48
+
49
+ # rescue => error
50
+ # puts error
51
+ # raise Informative, "加载applovi配置文件失败, 需要执行 pindo setup 或者pindo env dreamstudio"
52
+ # end
53
+ end
54
+
55
+ def get_ad_unit_info(ad_unit_id:nil)
56
+ req_path = @requests_config["get_ad_unit_info"]["path"]
57
+ req_url = @applovin_base_url + req_path
58
+
59
+
60
+ req_url = req_url + "/" + ad_unit_id.to_s
61
+
62
+
63
+ params = {
64
+ fields:"ad_network_settings,disabled_ad_network_settings,frequency_capping_settings,bid_floors,banner_refresh_settings,segments"
65
+ }
66
+
67
+ puts "req_url: #{req_url}"
68
+
69
+ con = Faraday.new
70
+ res = con.get do |req|
71
+ req.url req_url
72
+ req.headers['Content-Type'] = 'application/json'
73
+ req.headers['Api-Key'] = @applovin_management_key
74
+ req.params = params
75
+ end
76
+
77
+ result_data = nil
78
+ puts res.body
79
+ puts res.status
80
+ if !res.body.nil?
81
+ result_data = JSON.parse(res.body)
82
+ end
83
+ puts JSON.pretty_generate(result_data)
84
+
85
+ end
86
+
87
+
88
+ def get_all_ad_unit_info(limit:50, offset:0)
89
+ req_path = @requests_config["get_all_ad_unit_info"]["path"]
90
+ req_url = @applovin_base_url + req_path
91
+
92
+
93
+
94
+ puts "req_url: #{req_url}"
95
+
96
+ params = {
97
+ limit:limit,
98
+ offset:offset
99
+ }
100
+
101
+ con = Faraday.new
102
+ res = con.get do |req|
103
+ req.url req_url
104
+ req.headers['Content-Type'] = 'application/json'
105
+ req.headers['Api-Key'] = @applovin_management_key
106
+ req.params = params
107
+ end
108
+
109
+ result_data = nil
110
+ puts res.body
111
+ puts res.status
112
+ if !res.body.nil?
113
+ result_data = JSON.parse(res.body)
114
+
115
+ end
116
+ puts JSON.pretty_generate(result_data)
117
+
118
+ end
119
+
120
+
121
+ def create_ad_unit(ad_unit_name:nil, platform:nil, package_name:nil, ad_format:nil, template_size:nil)
122
+
123
+ req_path = @requests_config["create_ad_unit"]["path"]
124
+ req_url = @applovin_base_url + req_path
125
+
126
+ body_params = {
127
+ name:ad_unit_name,
128
+ platform:platform,
129
+ package_name:package_name,
130
+ ad_format:ad_format,
131
+ template_size:template_size
132
+ }
133
+
134
+ con = Faraday.new
135
+ res = con.post do |req|
136
+ req.url req_url
137
+ req.headers['Content-Type'] = 'application/json'
138
+ req.headers['Api-Key'] = @applovin_management_key
139
+ req.body = body_params.to_json
140
+ end
141
+ result_data = nil
142
+ puts res.body
143
+ puts res.status
144
+ if !res.body.nil?
145
+ result_data = JSON.parse(res.body)
146
+ end
147
+ puts JSON.pretty_generate(result_data)
148
+
149
+ return result_data
150
+
151
+ end
152
+
153
+
154
+ end
155
+ end
156
+
@@ -0,0 +1,183 @@
1
+
2
+ require 'uri'
3
+ require 'json'
4
+ require 'faraday'
5
+ require 'pindo/base/aeshelper'
6
+ require "aws-sdk-s3"
7
+ require 'securerandom'
8
+
9
+ module Pindo
10
+
11
+
12
+ class AWSS3Client
13
+
14
+
15
+ attr_accessor :region
16
+ attr_accessor :bucket_name
17
+
18
+ attr_accessor :access_key_id
19
+ attr_accessor :access_key_secret
20
+
21
+ attr_accessor :default_url
22
+ attr_accessor :attach_url
23
+
24
+ attr_accessor :asw_s3_object
25
+
26
+
27
+ def initialize()
28
+
29
+
30
+ begin
31
+
32
+ config_file = File.join(File::expand_path(Pindoconfig.instance.pindo_common_configdir), "pgyer_client_config.json")
33
+ config_json = JSON.parse(File.read(config_file))
34
+
35
+ @region = config_json["region"]
36
+ @bucket_name = config_json["bucket_name"]
37
+ @access_key_id = config_json["access_key_id"]
38
+ @access_key_secret = config_json["access_key_secret"]
39
+ @default_url = config_json["default_url"]
40
+ @attach_url = config_json["attach_url"]
41
+
42
+ rescue => error
43
+ raise Informative, "加载pgyer配置文件失败, 需要执行 pindo setup 或者pindo env dreamstudio"
44
+ end
45
+
46
+
47
+ http_proxy = ENV['http_proxy'] || ENV['https_proxy']
48
+
49
+ if http_proxy
50
+ puts "正在使用代理 : #{http_proxy}"
51
+ Aws.config.update(
52
+ http_proxy: http_proxy,
53
+ credentials: Aws::Credentials.new(@access_key_id, @access_key_secret),
54
+ region: @region
55
+ )
56
+ else
57
+ Aws.config.update(
58
+ credentials: Aws::Credentials.new(@access_key_id, @access_key_secret),
59
+ region: @region
60
+ )
61
+ end
62
+
63
+ @s3_client ||= Aws::S3::Client.new(
64
+ {
65
+ http_proxy: http_proxy,
66
+ region: @region,
67
+ credentials: Aws::Credentials.new(@access_key_id, @access_key_secret)
68
+ }.compact.compact
69
+ )
70
+
71
+
72
+ # S3Client = Aws::S3::Client.new(
73
+ # access_key_id: 'ACCESS_KEY_ID',
74
+ # secret_access_key: 'SECRET_ACCESS_KEY',
75
+ # region: 'REGION'
76
+ # )
77
+
78
+ end
79
+
80
+ def find_bucket!( )
81
+ bucket = Aws::S3::Bucket.new(@bucket_name, client: @s3_client)
82
+ raise "Bucket '#{bucket_name}' not found" unless bucket.exists?
83
+
84
+ return bucket
85
+ end
86
+
87
+ def delete_file(file_name)
88
+ bucket = find_bucket!()
89
+ file = bucket.object(file_name)
90
+ file.delete
91
+ end
92
+
93
+
94
+ def upload_file(binary_file:nil, isAttach:false)
95
+
96
+ extension = File.extname(binary_file)
97
+ filename = File.basename(binary_file)
98
+ filesize = File.size(binary_file)
99
+ size_level = 1024 * 1024
100
+ bytes = File.binread(binary_file)
101
+ checksum = Digest::MD5.hexdigest(bytes)
102
+ file_uuid = SecureRandom.uuid
103
+ total_m = sprintf("%.2f", 1.00 * filesize / 1024 /1024 )
104
+
105
+
106
+ puts "文件路径: #{binary_file}"
107
+ puts "文件大小: #{total_m}M"
108
+ upload_path = @default_url
109
+ content_disposition = nil
110
+ if isAttach
111
+ upload_path = @default_url + @attach_url
112
+ content_disposition = "attachment; filename=#{filename}"
113
+ end
114
+
115
+ object_key = upload_path + file_uuid + extension
116
+
117
+ puts "上传路径: #{object_key}"
118
+
119
+ upload_result = nil
120
+ begin
121
+
122
+
123
+ obj = Aws::S3::Object.new(@bucket_name, object_key)
124
+
125
+ progress = Proc.new do |bytes, totals|
126
+ set_progress(bytes.sum, totals.sum)
127
+ end
128
+
129
+
130
+ if isAttach
131
+ puts
132
+ puts "正在上传附件..."
133
+ obj.upload_file(binary_file, progress_callback: progress, content_disposition:content_disposition)
134
+ else
135
+ puts
136
+ puts "正在上传安装包..."
137
+ obj.upload_file(binary_file, progress_callback: progress)
138
+ end
139
+
140
+ upload_result = object_key
141
+
142
+ # bucket = find_bucket!()
143
+ # details = {
144
+ # # acl: 'private'
145
+ # key: object_key,
146
+ # body: bytes
147
+ # }
148
+ # obj = bucket.put_object(details)
149
+ # # When you enable versioning on a S3 bucket,
150
+ # # writing to an object will create an object version
151
+ # # instead of replacing the existing object.
152
+ # # http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/ObjectVersion.html
153
+ # if obj.kind_of?(Aws::S3::ObjectVersion)
154
+ # obj = obj.object
155
+ # end
156
+
157
+ # # Return public url
158
+ # puts obj.public_url.to_s
159
+ # upload_result = object_key
160
+ rescue => ex
161
+ puts ex.to_s
162
+ puts "Upload S3 failed !!!"
163
+ end
164
+
165
+ return upload_result
166
+ end
167
+
168
+
169
+ def set_progress(index_num, total_num, char = '=')
170
+ progress_str = sprintf("%.2f", 100.0 * index_num / total_num )
171
+ total_size = sprintf("%.2f", 1.00 * total_num / 1024 /1024 )
172
+ index = 100.0 * index_num / total_num
173
+
174
+ $stdout.print " 已上传: #{progress_str} \% ", (char * (index/1).floor).ljust(100, ' '), " Total: #{total_size} M \r"
175
+ $stdout.flush
176
+ # print " 已上传: #{progress_str} \% ", (char * (index/1).floor).ljust(100, ' '), " Total: #{total_size} M \r"
177
+ # $stdout.flush
178
+ end
179
+
180
+
181
+ end
182
+ end
183
+
@@ -0,0 +1,229 @@
1
+
2
+ require 'uri'
3
+ require 'json'
4
+ require 'faraday'
5
+ require 'pindo/base/aeshelper'
6
+ require 'pindo/base/deviceinfo'
7
+
8
+
9
+ module Pindo
10
+
11
+
12
+ class BossClient
13
+
14
+ attr_accessor :device_info_config
15
+ attr_accessor :base_url_config
16
+ attr_accessor :boss_default_platform
17
+ attr_accessor :salts_config
18
+ attr_accessor :requests_config
19
+
20
+
21
+
22
+ attr_accessor :app_type
23
+ attr_accessor :is_dev
24
+ attr_accessor :base_url
25
+
26
+
27
+ def initialize(app_type:"FancyApp", is_dev:true, base_url:nil)
28
+
29
+ #
30
+ @app_type = app_type
31
+ @is_dev = is_dev
32
+
33
+ begin
34
+
35
+ boss_config_file = File.join(File::expand_path(Pindoconfig.instance.pindo_common_configdir), "boss_client_config.json")
36
+ @boss_config_json = JSON.parse(File.read(boss_config_file))
37
+
38
+ @device_info_config = @boss_config_json["default_device_info"]
39
+ @base_url_config = @boss_config_json["base_url_config"]
40
+ @salts_config = @boss_config_json["salts"]
41
+ @requests_config = @boss_config_json["boss_req_config"]
42
+
43
+ rescue => error
44
+ raise Informative, "加载boss 配置文件失败, 需要执行 pindo setup 或者pindo env dreamstudio"
45
+ end
46
+
47
+ app_type_base_url_config = @base_url_config[@app_type]
48
+
49
+ @base_url = nil
50
+
51
+ if base_url.nil?
52
+ if @is_dev
53
+ @base_url = app_type_base_url_config["dev"]
54
+ else
55
+ @base_url = app_type_base_url_config["prod"]
56
+ end
57
+ else
58
+ @base_url = base_url
59
+ end
60
+
61
+
62
+
63
+ end
64
+
65
+ def self.is_in_review_status_with_confirm_key(confirm_key:nil)
66
+
67
+ if confirm_key.nil?
68
+ raise Informative, "confirm_key 是空,判断in review 状态失败!"
69
+ end
70
+ is_in_review_status = false
71
+
72
+ confirm_array = confirm_key.bytes || []
73
+ confirm_value = 0
74
+ confirm_array.each do |char_value|
75
+ confirm_value += char_value
76
+ end
77
+
78
+ if confirm_value % 2 == 0
79
+ is_in_review_status = false
80
+ else
81
+ is_in_review_status = true
82
+ end
83
+
84
+ return is_in_review_status
85
+
86
+ end
87
+
88
+
89
+ def get_default_device_info( )
90
+
91
+ device_info = DeviceInfo.new
92
+ device_info.reset_with_config(device_config:@device_info_config)
93
+
94
+ return device_info
95
+ end
96
+
97
+ def get_default_apps_flyer_info( )
98
+
99
+ apps_flyer_info = {
100
+ conversion_info:{
101
+ is_first_launch:true,
102
+ af_status:"Organic",
103
+ af_message:"organic install",
104
+ install_time:"nil"
105
+ },
106
+ apps_flyer_uid:nil
107
+ }
108
+
109
+
110
+ apps_flyer_info[:apps_flyer_uid] = @boss_config_json["apps_flyer_uid"] || "1686395365581-9548642"
111
+ time_install = Time.now - 5 * 60
112
+ time_install_str = time_install.strftime("%Y-%m-%d %H:%M:%S")
113
+ apps_flyer_info[:conversion_info][:install_time] = time_install_str
114
+ return apps_flyer_info
115
+ end
116
+
117
+ # app_info_dict = {
118
+ # login_device_id: "294D0303-6692-47F2-8EF2-DF6A1847D1CD",
119
+ # app_version:"3.2023.07",
120
+ # bundle_id:"com.heroneverdie101.fancyapptest",
121
+ # api_version:"1.0",
122
+ # platform:"iOS_Funny_Release",
123
+ # apps_flyer_info:{
124
+ # conversion_info:{
125
+ # is_first_launch:true,
126
+ # af_status:"Organic",
127
+ # af_message:"organic install",
128
+ # install_time:"2023-06-12 08:54:52"
129
+ # },
130
+ # apps_flyer_uid: "1686395365581-9548642"
131
+ # },
132
+ # device_info:@device_info
133
+ # }
134
+
135
+ def refresh_setting(app_info_dict:nil)
136
+ # puts app_info_dict
137
+
138
+ qerry_dict = {
139
+ app_info:[
140
+ app_info_dict.to_json
141
+ ]
142
+ }
143
+
144
+ data_dict = {
145
+ path: "",
146
+ query:"",
147
+ method:"GET",
148
+ response_key:"result",
149
+ response_data:{
150
+ status:"success"
151
+ }
152
+ }
153
+
154
+ req_config_item = @requests_config.find { |item| item["name"].eql?("get_settings_refresh")}
155
+ data_dict[:path] = req_config_item["path"]
156
+ data_dict[:query] = URI.encode_www_form(qerry_dict)
157
+
158
+ encrypt_string = req_data_aes_encrypt(data_dict:data_dict)
159
+
160
+ setting_params = {
161
+ app_version: app_info_dict[:app_version],
162
+ content: encrypt_string
163
+ }
164
+
165
+ data_json = do_request(boss_url:@base_url, params:setting_params)
166
+
167
+
168
+
169
+ # puts JSON.pretty_generate(data_json)
170
+ return data_json
171
+
172
+ end
173
+
174
+ def do_request(boss_url:nil, params:nil)
175
+
176
+ # puts JSON.pretty_generate(params)
177
+
178
+ con = Faraday.new
179
+ res = con.get do |req|
180
+ req.url boss_url
181
+ req.headers['Content-Type'] = 'application/json'
182
+ req.params = params
183
+ end
184
+
185
+
186
+ res_json = JSON.parse(res.body)
187
+ data_json = nil
188
+ if !res_json.nil? && !res_json["result"].nil?
189
+ data_json = req_data_aes_decrypt(encrypt_string:res_json["result"])
190
+ end
191
+
192
+ return data_json
193
+
194
+ end
195
+
196
+
197
+ def req_data_aes_encrypt(data_dict:nil)
198
+
199
+ aes_origin_data = data_dict.to_json
200
+ req_aes_key_nane = @salts_config.keys.sample
201
+ req_aes_key_value = @salts_config[req_aes_key_nane]
202
+ content = AESHelper::aes_128_ecb_encrypt(req_aes_key_value, aes_origin_data)
203
+
204
+ front_rand_str = (0...16).map{65.+(rand(26)).chr}.join
205
+ back_rand_str = (0...15).map{65.+(rand(26)).chr}.join
206
+
207
+ encrypt_string = front_rand_str + content + req_aes_key_nane + back_rand_str
208
+ return encrypt_string
209
+ end
210
+
211
+ def req_data_aes_decrypt(encrypt_string:nil)
212
+
213
+
214
+ response_data = encrypt_string
215
+ response_data = response_data[16..-1]
216
+ response_data = response_data[0..-16]
217
+ result_aes_key_name = response_data.slice(response_data.length-1)
218
+ result_aes_key_value = @salts_config[result_aes_key_name]
219
+ origin_result_data = response_data[0..-2]
220
+
221
+ data = AESHelper::aes_128_ecb_decrypt(result_aes_key_value, origin_result_data)
222
+ data_json = JSON.parse(data)
223
+
224
+ return data_json
225
+ end
226
+
227
+ end
228
+ end
229
+