struggle 2.3.9 → 2.4.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: c81c7d2477eae2412e578bf73326826fc7dc2c3e
4
- data.tar.gz: 2a864ad7bc30bd6535330682c2ac54e89926601b
2
+ SHA256:
3
+ metadata.gz: a8fd0fe098d5b9742470ed55c764daced3c5101f14d7aa6248d330d2f6764a83
4
+ data.tar.gz: bd99a799faeabf1a42024f85847658d7461bfc715d0876b92b8eebaf12a03b51
5
5
  SHA512:
6
- metadata.gz: 2e74496d38feb6d22144704cfb8424b78039429442b0c635f210c0c6448959eee26aa3dfb24413ec982794ee221d48dc6aa74ee0a47e2894c3db345553355084
7
- data.tar.gz: 4b0638b97d1aff7c773ca4516d5ee895bceaf5d80165c5f6c1d8d511ced0ddd549debab089bc887957f8982e6ddf3c5816322fb05962f6f232f4cb94323d7966
6
+ metadata.gz: 7ae9954e08a7a3a9e3f1aeba53a3181bb35d7ff518b3d9d4293d2a5dcec15979052559ed937ab2652e1a5aa72a198ca488a79146e36baacafec8e5403a489219
7
+ data.tar.gz: ed35daa24d047b86fe4c6e1eab8b8bfc0f6c418eed8d0b3b0ed78e9c75c6398701accb939253b617ebf53c1fc5be541e327e6ca75104b27f8158bca136650c83
data/README.md CHANGED
File without changes
Binary file
@@ -0,0 +1,75 @@
1
+ # gem 'watir'
2
+ # gem 'selenium-webdriver'
3
+ module Collection
4
+ class Taobao
5
+
6
+ def self.run(url)
7
+ # 注释部分为浏览器驱动,可以隐藏运行浏览器。但是抓取淘宝失效,淘宝必须开启浏览器。
8
+ # filePath = File.expand_path(File.dirname(File.dirname(__FILE__)))
9
+ # chromedriverPath = File.expand_path("collection/chromedriver", filePath)
10
+ # Selenium::WebDriver::Chrome.driver_path = chromedriverPath
11
+ # options = Selenium::WebDriver::Chrome::Options.new
12
+ # options.add_argument("headless")
13
+ # browser = Watir::Browser.new :chrome, options: options
14
+ browser = Watir::Browser.new :chrome
15
+ browser.goto url
16
+ images = []
17
+ browser.div(id: "description").imgs.each do |img|
18
+ img.scroll_into_view
19
+ sleep 2
20
+ puts img.src
21
+ images << img.src
22
+ end
23
+ browser.close
24
+ {imgpath: down(images), text: get_text(images)}
25
+ end
26
+
27
+ def self.get_text(urls)
28
+ gettoken = Struggle::Http.new("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=ob5etUcqOmPr7HA5co98yreC&client_secret=puRIlGWeOtaLbbPr5zZfeyNgLEC88wyF")
29
+ tokenresult = eval gettoken.post.body
30
+ token = tokenresult[:access_token]
31
+ words = []
32
+ urls.each do |url|
33
+ getText = Struggle::Http.new("https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=" + token)
34
+ text = getText.post({url: url}, {"Content-Type" => "application/x-www-form-urlencoded"})
35
+ r = eval text.body
36
+ if r[:words_result] && r[:words_result].length > 0
37
+ words += r[:words_result].collect {|w| w[:words]}
38
+ end
39
+ end
40
+ words.join("\r\n")
41
+ end
42
+
43
+ def self.down(urls)
44
+ urls.each_with_index do |url, idx|
45
+ url = url[0..3] == "http" ? url : "https:#{url}"
46
+ data = open(url, 'User-Agent' => 'ruby') {|f| f.read}
47
+ fmidx = url.rindex(".")
48
+ fm = url[fmidx + 1, url.length - fmidx]
49
+
50
+ path = "#{Rails.root}/taobao"
51
+ FileUtils.mkdir(path) unless Dir.exists? path
52
+ file = File.new("#{path}/#{idx}.#{fm}", 'w+')
53
+ file.binmode
54
+ file << data
55
+ file.flush
56
+ file.close
57
+ end
58
+ merge_image
59
+ end
60
+
61
+ def self.merge_image
62
+ images = []
63
+ Dir.foreach("#{Rails.root}/taobao").each do |file|
64
+ if file != "." and file != ".."
65
+ images << "#{Rails.root}/taobao/" + file
66
+ end
67
+ end
68
+ saveImgPath = "#{Rails.root}/taobao_img/#{Time.now.strftime "%Y%m%d%H%M%S"}.jpg"
69
+ system <<-EOF
70
+ convert -append #{images.join(" ")} #{saveImgPath}
71
+ EOF
72
+ saveImgPath
73
+ end
74
+ end
75
+ end
data/lib/collection.rb ADDED
@@ -0,0 +1,10 @@
1
+ module Collection
2
+ end
3
+ begin
4
+ require 'rails'
5
+ rescue LoadError
6
+ #do nothing
7
+ end
8
+ require 'watir'
9
+ require 'selenium-webdriver'
10
+ require 'collection/'
File without changes
File without changes
File without changes
data/lib/struggle/aes.rb CHANGED
@@ -1,76 +1,78 @@
1
- class Aes
2
- # aes =
3
- def initialize(key)
4
- @@key = key
5
- end
1
+ module Struggle
2
+ class Aes
3
+ # aes =
4
+ def initialize(key)
5
+ @@key = key
6
+ end
6
7
 
7
- # 加密,key 秘钥, encrypted_string 需要加密的内容
8
- def encrypt(encrypted_string)
9
- aes = OpenSSL::Cipher::Cipher.new("AES-256-ECB").clone
10
- aes.encrypt
11
- aes.key = @@key
12
- txt = aes.update(encrypted_string) << aes.final
13
- txt.unpack('H*')[0].upcase
14
- end
8
+ # 加密,key 秘钥, encrypted_string 需要加密的内容
9
+ def encrypt(encrypted_string)
10
+ aes = OpenSSL::Cipher::Cipher.new("AES-256-ECB").clone
11
+ aes.encrypt
12
+ aes.key = @@key
13
+ txt = aes.update(encrypted_string) << aes.final
14
+ txt.unpack('H*')[0].upcase
15
+ end
15
16
 
16
- # 解密,key 秘钥, decrypted_string 需要解密的内容
17
- def decrypt(decrypted_string)
18
- aes = OpenSSL::Cipher::Cipher.new("AES-256-ECB").clone
19
- aes.decrypt
20
- aes.key = @@key
21
- aes.update([decrypted_string].pack('H*')) << aes.final
22
- end
17
+ # 解密,key 秘钥, decrypted_string 需要解密的内容
18
+ def decrypt(decrypted_string)
19
+ aes = OpenSSL::Cipher::Cipher.new("AES-256-ECB").clone
20
+ aes.decrypt
21
+ aes.key = @@key
22
+ aes.update([decrypted_string].pack('H*')) << aes.final
23
+ end
23
24
 
24
- # 文件内容加密并保存
25
- def file_encrypt(filename)
26
- if File.exist? filename
27
- puts filename
28
- content = File.read(filename)
29
- unless content.blank?
30
- File.write(filename, encrypt(Base64.encode64(content.force_encoding("UTF-8"))))
25
+ # 文件内容加密并保存
26
+ def file_encrypt(filename)
27
+ if File.exist? filename
28
+ puts filename
29
+ content = File.read(filename)
30
+ unless content.blank?
31
+ File.write(filename, encrypt(Base64.encode64(content.force_encoding("UTF-8"))))
32
+ end
31
33
  end
32
34
  end
33
- end
34
35
 
35
- # 文件内容解密并保存
36
- def file_decrypt(filename)
37
- if File.exist? filename
38
- puts filename
39
- content = File.read(filename)
40
- unless content.blank?
41
- File.write(filename, Base64.decode64(decrypt(content)).force_encoding("UTF-8"))
36
+ # 文件内容解密并保存
37
+ def file_decrypt(filename)
38
+ if File.exist? filename
39
+ puts filename
40
+ content = File.read(filename)
41
+ unless content.blank?
42
+ File.write(filename, Base64.decode64(decrypt(content)).force_encoding("UTF-8"))
43
+ end
42
44
  end
43
45
  end
44
- end
45
46
 
46
- # 目录递归所有文件加密
47
- def dir_encrypt(path)
48
- get_file_list(path).each do |fn|
49
- file_encrypt(fn)
47
+ # 目录递归所有文件加密
48
+ def dir_encrypt(path)
49
+ get_file_list(path).each do |fn|
50
+ file_encrypt(fn)
51
+ end
50
52
  end
51
- end
52
53
 
53
- # 目录递归所有文件解密
54
- def dir_decrypt(path)
55
- get_file_list(path).each do |fn|
56
- file_decrypt(fn)
54
+ # 目录递归所有文件解密
55
+ def dir_decrypt(path)
56
+ get_file_list(path).each do |fn|
57
+ file_decrypt(fn)
58
+ end
57
59
  end
58
- end
59
60
 
60
- private
61
- # 递归目录下所有文件
62
- def get_file_list(path)
63
- files = []
64
- Dir.entries(path).each do |sub|
65
- if sub != '.' && sub != '..'
66
- if File.directory?("#{path}/#{sub}")
67
- get_file_list("#{path}/#{sub}")
68
- else
69
- files << "#{path}/#{sub}"
61
+ private
62
+
63
+ # 递归目录下所有文件
64
+ def get_file_list(path)
65
+ files = []
66
+ Dir.entries(path).each do |sub|
67
+ if sub != '.' && sub != '..'
68
+ if File.directory?("#{path}/#{sub}")
69
+ get_file_list("#{path}/#{sub}")
70
+ else
71
+ files << "#{path}/#{sub}"
72
+ end
70
73
  end
71
74
  end
75
+ files
72
76
  end
73
- files
74
77
  end
75
-
76
78
  end
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,31 @@
1
+ require 'active_support/concern'
2
+ module Struggle
3
+ module TimestampsFormat
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ # created_at updated_at 删除 '+0800'
8
+ # 删除集合中的created_at和updated_at的'+0800'
9
+ scope :to_hash, -> do
10
+ objs = []
11
+ each do |obj|
12
+ objs << obj.to_hash
13
+ end
14
+ objs
15
+ end
16
+
17
+ def to_hash
18
+ obj = self.serializable_hash
19
+ obj.each do |k, v|
20
+ if v.class == ActiveSupport::TimeWithZone
21
+ obj[k] = v.localtime.to_s(:db)
22
+ end
23
+ end
24
+ obj
25
+ end
26
+ end
27
+
28
+ module ClassMethods
29
+ end
30
+ end
31
+ end
File without changes
File without changes
@@ -1,17 +1,18 @@
1
1
  require 'digest'
2
- class Getui
3
- class<<self
4
- AppID = "XxESwIkfcwAKhgIcQ0iyl8"
5
- AppKey = "9WY9yq0cxj5O7kPJT72om9"
6
- AppSecret = "RkZ9pNxnXl7hHYG4NX1s19"
7
- MasterSecret = "ie5ftISOpv97cgTBsiigaA"
2
+ module Struggle
3
+ class Getui
4
+ class << self
5
+ AppID = "XxESwIkfcwAKhgIcQ0iyl8"
6
+ AppKey = "9WY9yq0cxj5O7kPJT72om9"
7
+ AppSecret = "RkZ9pNxnXl7hHYG4NX1s19"
8
+ MasterSecret = "ie5ftISOpv97cgTBsiigaA"
8
9
 
9
- # 签权,获取权限。返回bool值,成功签权返回true,否则返回false。 @@auth_token 全局token
10
- def sign
11
- timestamp = "#{Time.now.to_i}000"
12
- sign = Digest::SHA256.hexdigest(AppKey+timestamp+MasterSecret)
13
- # sign = Digest::SHA256.base64digest sign
14
- command = <<EOF
10
+ # 签权,获取权限。返回bool值,成功签权返回true,否则返回false。 @@auth_token 全局token
11
+ def sign
12
+ timestamp = "#{Time.now.to_i}000"
13
+ sign = Digest::SHA256.hexdigest(AppKey + timestamp + MasterSecret)
14
+ # sign = Digest::SHA256.base64digest sign
15
+ command = <<EOF
15
16
  curl -H "Content-Type: application/json" \\
16
17
  https://restapi.getui.com/v1/#{AppID}/auth_sign \\
17
18
  -XPOST -d '{ "sign":"#{sign}",
@@ -19,28 +20,28 @@ curl -H "Content-Type: application/json" \\
19
20
  "appkey":"#{AppKey}"
20
21
  }'
21
22
  EOF
22
- r = JSON.parse `#{command}`
23
- r["result"] == "ok" ? @@auth_token = r["auth_token"] : nil
24
- end
23
+ r = JSON.parse `#{command}`
24
+ r["result"] == "ok" ? @@auth_token = r["auth_token"] : nil
25
+ end
25
26
 
26
- # 关闭签权,return bool,success true, error false
27
- def close
28
- command = <<EOF
27
+ # 关闭签权,return bool,success true, error false
28
+ def close
29
+ command = <<EOF
29
30
  curl -H "authtoken: #{@@auth_token}" \
30
31
  https://restapi.getui.com/v1/#{AppID}/auth_close \
31
32
  -XPOST
32
33
  EOF
33
- r = JSON.parse `#{command}`
34
- r["result"] == "ok"
35
- end
34
+ r = JSON.parse `#{command}`
35
+ r["result"] == "ok"
36
+ end
36
37
 
37
- # 单推
38
- # 参数 cid:client_id, title: 标题, text: 消息内容, is_offline是否离线默认否。
39
- # 返回值 bool,success true, error false
40
- def onePush(cid, title, text, is_offline=false)
41
- if sign
42
- requestid = Random.new.rand(1000000000000000000000..99999999999999999999999)
43
- command = <<EOF
38
+ # 单推
39
+ # 参数 cid:client_id, title: 标题, text: 消息内容, is_offline是否离线默认否。
40
+ # 返回值 bool,success true, error false
41
+ def onePush(cid, title, text, is_offline = false)
42
+ if sign
43
+ requestid = Random.new.rand(1000000000000000000000..99999999999999999999999)
44
+ command = <<EOF
44
45
  curl -H "Content-Type: application/json" \
45
46
  -H "authtoken:#{@@auth_token}" \
46
47
  https://restapi.getui.com/v1/#{AppID}/push_single \
@@ -64,45 +65,45 @@ curl -H "Content-Type: application/json" \
64
65
  "requestid": "#{requestid}"
65
66
  }'
66
67
  EOF
67
- r = JSON.parse `#{command}`
68
- close
69
- return r["result"] == "ok"
70
- else
71
- return false
68
+ r = JSON.parse `#{command}`
69
+ close
70
+ return r["result"] == "ok"
71
+ else
72
+ return false
73
+ end
72
74
  end
73
- end
74
75
 
75
- # 多推
76
- # 参数 clients: 客户信息数组格式[{cid: "xxx", title: "xxx", text: "xxx", is_offline: false}],
77
- # 具体组成 cid:client_id, title: 标题, text: 消息内容, is_offline是否离线默认否。
78
- # 返回值 bool,success true, error false
79
- def manyPush(clients)
80
- if sign
81
- msg_list = []
82
- clients.each do |c|
83
- requestid = Random.new.rand(1000000000000000000000..99999999999999999999999)
84
- msg_list << {
85
- "message": {
86
- "appkey": "#{AppKey}",
87
- "is_offline": c[:is_offline] || false,
88
- "offline_expire_time": 100000000,
89
- "msgtype": "notification"
90
- },
91
- "notification": {
92
- "style": {
93
- "type": 0,
94
- "text": "#{c[:text]}",
95
- "title": "#{c[:title]}"
96
- },
97
- "transmission_type": true,
98
- "transmission_content": "透传内容"
99
- },
100
- "cid": "#{c[:cid]}",
101
- "requestid": "#{requestid}"
102
- }
103
- end
76
+ # 多推
77
+ # 参数 clients: 客户信息数组格式[{cid: "xxx", title: "xxx", text: "xxx", is_offline: false}],
78
+ # 具体组成 cid:client_id, title: 标题, text: 消息内容, is_offline是否离线默认否。
79
+ # 返回值 bool,success true, error false
80
+ def manyPush(clients)
81
+ if sign
82
+ msg_list = []
83
+ clients.each do |c|
84
+ requestid = Random.new.rand(1000000000000000000000..99999999999999999999999)
85
+ msg_list << {
86
+ "message": {
87
+ "appkey": "#{AppKey}",
88
+ "is_offline": c[:is_offline] || false,
89
+ "offline_expire_time": 100000000,
90
+ "msgtype": "notification"
91
+ },
92
+ "notification": {
93
+ "style": {
94
+ "type": 0,
95
+ "text": "#{c[:text]}",
96
+ "title": "#{c[:title]}"
97
+ },
98
+ "transmission_type": true,
99
+ "transmission_content": "透传内容"
100
+ },
101
+ "cid": "#{c[:cid]}",
102
+ "requestid": "#{requestid}"
103
+ }
104
+ end
104
105
 
105
- command = <<EOF
106
+ command = <<EOF
106
107
  curl -H "Content-Type: application/json" \
107
108
  -H "authtoken:#{@@auth_token}" \
108
109
  https://restapi.getui.com/v1/#{AppID}/push_single_batch \
@@ -111,13 +112,14 @@ curl -H "Content-Type: application/json" \
111
112
  "need_detail":true
112
113
  }'
113
114
  EOF
114
- r = JSON.parse `#{command}`
115
- close
116
- return r["result"] == "ok"
117
- else
118
- return false
115
+ r = JSON.parse `#{command}`
116
+ close
117
+ return r["result"] == "ok"
118
+ else
119
+ return false
120
+ end
119
121
  end
120
- end
121
122
 
123
+ end
122
124
  end
123
125
  end
data/lib/struggle/http.rb CHANGED
@@ -9,14 +9,16 @@ module Struggle
9
9
  def initialize(url)
10
10
  @uri = URI.parse(url)
11
11
  @http = Net::HTTP.new(@uri.host, @uri.port)
12
- @http.use_ssl = true if @uri.scheme == 'https'
13
- @http.verify_mode = OpenSSL::SSL::VERIFY_NONE
12
+ if @uri.scheme == 'https'
13
+ @http.use_ssl = true
14
+ @http.verify_mode = OpenSSL::SSL::VERIFY_NONE
15
+ end
14
16
  end
15
17
 
16
18
  # get请求,params为携带的参数,header为报文头数据,两个参数都是hash类型,示例
17
19
  # http = Struggle::Http.new("http://xxx.com/xxx")
18
20
  # result = http.post({name: 'lily', age: 18}).body
19
- def get(params=nil, header=nil)
21
+ def get(params = nil, header = nil)
20
22
  @request = Net::HTTP::Get.new(@uri.request_uri, header)
21
23
  if !params.blank?
22
24
  @request.form_data = params
@@ -26,16 +28,23 @@ module Struggle
26
28
 
27
29
  # post请求,params为携带的参数为json类型,header为报文头数据为hash类型,示例:
28
30
  # http = Struggle::Http.new("http://xxx.com/xxx")
29
- # data = {name: 'lily', age: 18}
30
- # result = http.post(data.to_json, {'Content-Type' => 'application/json'}).body
31
+ # data = {name: 'lily', age: 18} || '{"aa":"bb"}'json类型(字符串)
32
+ # result = http.post(data, {'Content-Type' => 'application/json'}).body
31
33
  # eval(result) => {status: 200, msg: 'success'}
32
- def post(params=nil, header=nil)
34
+ def post(params = nil, header = nil)
33
35
  @request = Net::HTTP::Post.new(@uri.request_uri, header)
34
36
  if !params.blank?
35
- @request.body = params #post json must body
37
+ if params.class == Hash
38
+ @request.set_form_data(params)
39
+ else
40
+ @request.body = params
41
+ end
36
42
  end
37
43
  @http.request(@request)
38
44
  end
39
45
 
46
+ def encode(html)
47
+ html.force_encoding("gb2312").encode("utf-8")
48
+ end
40
49
  end
41
50
  end
@@ -7,17 +7,17 @@ module Struggle
7
7
  URL_loophold = "http://www.kuaidi100.com/query"
8
8
 
9
9
  def self.send(id, com, nu, show="json", muti=1, order="desc")
10
- respond = Http.get(URL, {'id' => id, 'com' => com, 'nu' => nu, 'show' => show, 'muti' => muti, 'order' => order})
10
+ respond = Http.new(URL).get({'id' => id, 'com' => com, 'nu' => nu, 'show' => show, 'muti' => muti, 'order' => order})
11
11
  puts respond.body
12
12
  return respond.body.blank? ? nil : JSON.parse(respond.body)
13
13
  end
14
14
 
15
15
  def self.sendByLoophold(type, postid)
16
- respond = Http.post(URL_loophold, {'type' => type, 'postid' => postid})
16
+ respond = Http.new(URL_loophold).post({'type' => type, 'postid' => postid})
17
17
  return respond.body.blank? ? nil : JSON.parse(respond.body)
18
18
  end
19
19
 
20
- Company = {"anxindakuaixi" => "安信达", "huitongkuaidi" => "汇通快运", "baifudongfang" => "百福东方", "bht" => "BHT", "bangsongwuliu" => "邦送物流",
20
+ Company = {"anxindakuaixi" => "安信达","huitongkuaidi" => "百世快递", "baifudongfang" => "百福东方", "bht" => "BHT", "bangsongwuliu" => "邦送物流",
21
21
  "coe" => "中国东方(COE)", "chuanxiwuliu" => "传喜物流", "datianwuliu" => "大田物流",
22
22
  "debangwuliu" => "德邦物流","dpex" => "DPEX", "dhl" => "DHL-中国件", "dsukuaidi" => "D速快递", "disifang" => "递四方",
23
23
  "ems" => "EMS-(中国-中国)件", "feikangda" => "飞康达物流", "feikuaida" => "飞快达", "rufengda" => "凡客如风达",
File without changes
data/lib/struggle/rsa.rb CHANGED
@@ -1,43 +1,45 @@
1
1
  # = RSA工具,基于openssl,功能包括,秘钥生成,加密解密
2
- class Rsa
3
- # 实例化Rsa类,keyfile是秘钥文件地址(公钥或私钥)文件格式pem
4
- def initialize(keyfile)
5
- keystr = File.read(keyfile)
6
- if keystr
7
- @@rsa = OpenSSL::PKey::RSA.new(keystr)
2
+ module Struggle
3
+ class Rsa
4
+ # 实例化Rsa类,keyfile是秘钥文件地址(公钥或私钥)文件格式pem
5
+ def initialize(keyfile)
6
+ keystr = File.read(keyfile)
7
+ if keystr
8
+ @@rsa = OpenSSL::PKey::RSA.new(keystr)
9
+ end
8
10
  end
9
- end
10
11
 
11
- # Rsa.generate("/Users/apple/object") => /Users/apple/object/private_key.pem ,public_key.pem
12
- # 创建2048位秘钥文件
13
- def self.generate(dir)
14
- pk = OpenSSL::PKey::RSA.generate(2048)
15
- File.write(dir+"/private_key.pem", pk.to_pem)
16
- File.write(dir+"/public_key.pem", pk.public_key.to_pem)
17
- end
12
+ # Rsa.generate("/Users/apple/object") => /Users/apple/object/private_key.pem ,public_key.pem
13
+ # 创建2048位秘钥文件
14
+ def self.generate(dir)
15
+ pk = OpenSSL::PKey::RSA.generate(2048)
16
+ File.write(dir + "/private_key.pem", pk.to_pem)
17
+ File.write(dir + "/public_key.pem", pk.public_key.to_pem)
18
+ end
18
19
 
19
- # 私钥加密
20
- def private_encrypt(value)
21
- Base64.encode64(@@rsa.private_encrypt(value.force_encoding("UTF-8"))) unless value.blank?
22
- end
20
+ # 私钥加密
21
+ def private_encrypt(value)
22
+ Base64.encode64(@@rsa.private_encrypt(value.force_encoding("UTF-8"))) unless value.blank?
23
+ end
23
24
 
24
- # 私钥解密
25
- def private_decrypt(value)
26
- @@rsa.private_decrypt(Base64.decode64(value.force_encoding("UTF-8"))) unless value.blank?
27
- end
25
+ # 私钥解密
26
+ def private_decrypt(value)
27
+ @@rsa.private_decrypt(Base64.decode64(value.force_encoding("UTF-8"))) unless value.blank?
28
+ end
28
29
 
29
- # 公钥加密
30
- def public_encrypt(value)
31
- Base64.encode64(@@rsa.public_encrypt(value.force_encoding("UTF-8"))) unless value.blank?
32
- end
30
+ # 公钥加密
31
+ def public_encrypt(value)
32
+ Base64.encode64(@@rsa.public_encrypt(value.force_encoding("UTF-8"))) unless value.blank?
33
+ end
33
34
 
34
- # 公钥解密
35
- def public_decrypt(value)
36
- @@rsa.public_decrypt(Base64.decode64(value.force_encoding("UTF-8"))) unless value.blank?
37
- end
35
+ # 公钥解密
36
+ def public_decrypt(value)
37
+ @@rsa.public_decrypt(Base64.decode64(value.force_encoding("UTF-8"))) unless value.blank?
38
+ end
38
39
 
39
- # 签名
40
- def sign(value)
41
- @@rsa.sign("sha1", value)
40
+ # 签名
41
+ def sign(value)
42
+ @@rsa.sign("sha1", value)
43
+ end
42
44
  end
43
45
  end
data/lib/struggle/sms.rb CHANGED
@@ -8,5 +8,32 @@ module Struggle
8
8
  response = Http.post(URL, {'ac' => "send", 'uid' => uid, 'pwd' => pwd, 'mobile' => mobile, 'content' => content})
9
9
  return response.body=="100"
10
10
  end
11
+
12
+ # 腾讯短信单发接口
13
+ # 参数
14
+ # 1.sdkappid,请填写您在腾讯云上申请到的appid 示例:1400147773
15
+ # 2.appkey,sdkappid对应的的appkey 示例:f1c0cae4ee52489abe711d48a7e7789c
16
+ # 3.tpl_id,短信模板id 示例:205045
17
+ # 4.sign,开通得短信的应用名称,一般是公司名称缩写。 示例:微象科技
18
+ # 5.mobile,接收短信的手机号码
19
+ # 6.content,发送的变量内容,对应模板中的变量{0},类型为string数组
20
+ def Sms.tx_send(sdkappid, appkey, tpl_id, sign, mobile, content)
21
+ random = Random.new.rand(100000..999999)
22
+ time = Time.now.to_i
23
+ data = {:ext=>"", :extend=>"", :params=>content,
24
+ :sig=>Digest::SHA256.hexdigest("appkey=#{appkey}&random=#{random}&time=#{time}&mobile=#{mobile}"),
25
+ :sign=>sign, :tel=>{:mobile=>mobile, :nationcode=>"86"}, :time => time, :tpl_id=>tpl_id}
26
+ url = "https://yun.tim.qq.com/v5/tlssmssvr/sendsms?sdkappid=#{sdkappid}&random=#{random}"
27
+ body = Http.new(url).post(data.to_json).body
28
+ if !body.blank?
29
+ result = eval body
30
+ if result[:result] == 0
31
+ return {state: true}
32
+ else
33
+ return {state: false, msg: result[:errmsg]}
34
+ end
35
+ end
36
+ return {state: false, msg:"腾讯短信平台无响应,发送失败。"}
37
+ end
11
38
  end
12
39
  end
data/lib/struggle/sql.rb CHANGED
File without changes
File without changes
File without changes
@@ -0,0 +1,117 @@
1
+ module Struggle
2
+ class Translate
3
+ require 'uri'
4
+ require 'open-uri'
5
+ require 'rexml/document'
6
+
7
+ ICIBA_URL = "http://dict-co.iciba.com/api/dictionary.php"
8
+ ICIBA_KEY = "36CC7638D81785E7006BB5B29DBA1FEF"
9
+
10
+ BAIDU_URL = "http://api.fanyi.baidu.com/api/trans/vip/translate"
11
+ BAIDU_APPID = "20180719000186861"
12
+ BAIDU_KEY = "QvOMjlxoc3xY1ComqF7P"
13
+
14
+ YOUDAO_URL = "http://fanyi.youdao.com/openapi.do"
15
+ YOUDAO_KEY = "29324956"
16
+ YOUDAO_KEYFROM = "wordtest"
17
+
18
+ GOOGLE_URL = "https://translate.google.com.hk/translate_a/t"
19
+
20
+ def self.httpget(url)
21
+ content = ""
22
+ open(url) do |http|
23
+ content << http.read
24
+ end
25
+ return content
26
+ end
27
+
28
+ #获取爱词霸翻译结果
29
+ #参数: word => 单词
30
+ #返回: 成功返回hash, key:单词, ps:音标, pron:英语发音, pron2:美式发音, zn:翻译
31
+ def self.iciba(word)
32
+ begin
33
+ url = "#{self::ICIBA_URL}?w=#{URI.escape(word)}&key=#{self::ICIBA_KEY}"
34
+ content = self.httpget(url)
35
+ xml = REXML::Document.new(content)
36
+ key = xml.get_elements("/dict/key")[0]
37
+ if key && word == key.text #判断返回成功
38
+ psxml = xml.get_elements("/dict/ps")[0] #音标
39
+ ps = psxml.text if psxml
40
+ pronxml = xml.get_elements("/dict/pron")[0]
41
+ pron = pronxml.text if pronxml
42
+ pron2xml = xml.get_elements("/dict/pron")[1]
43
+ pron2 = pron2xml.text if pron2xml
44
+ acceptations = xml.get_elements("/dict/acceptation") #中文翻译
45
+ poses = xml.get_elements("/dict/pos") #动词,形容词。。
46
+ zn = ""
47
+ if poses && acceptations
48
+ 1.upto(acceptations.count) do |i|
49
+ zn = zn + poses[i - 1].text + acceptations[i - 1].text + "|"
50
+ end
51
+ if ps && zn
52
+ return {key: key.text, ps: ps, pron: pron, pron2: pron2, zn: zn}
53
+ else
54
+ return nil
55
+ end
56
+ else
57
+ return nil
58
+ end
59
+ else
60
+ return nil
61
+ end
62
+ rescue
63
+ return nil
64
+ end
65
+ end
66
+
67
+ #google翻译,eval出错,不能转换成数组,因为有存在俩个逗号中没有值的情况,可以替换双逗号解决,但是没有音标
68
+ #参数: word => 单词
69
+ #返回: string,翻译的中文结果
70
+ def self.google(word)
71
+ begin
72
+ url = "#{self::GOOGLE_URL}?client=t&sl=en&tl=zh-CN&hl=zh-CN&sc=2&ie=UTF-8&oe=UTF-8&oc=1&otf=2&ssel=0&tsel=0&q=#{URI.escape(word)}"
73
+ content = self.httpget(url)
74
+ if content
75
+ return eval(content.gsub(',,', ',').gsub(',,', ',').gsub(',,', ','))[0][0][0] #有没有值的,arr[0][0][0]是翻译,但是谷歌不支持音标,只支持翻译后的中文拼音
76
+ else
77
+ return nil
78
+ end
79
+ rescue
80
+ return nil
81
+ end
82
+ end
83
+
84
+ #百度翻译,同样没有音标,只返回翻译结果
85
+ #参数: word => 单词
86
+ #返回: string,翻译的中文结果
87
+ def self.baidu(word)
88
+ salt = Random.new.rand(10000..99999)
89
+ #appid+q+salt+密钥
90
+ sign = Digest::MD5.new.hexdigest "#{self::BAIDU_APPID}#{word}#{salt}#{self::BAIDU_KEY}"
91
+ begin
92
+ url = "#{self::BAIDU_URL}?appid=#{self::BAIDU_APPID}&q=#{URI.escape(word)}&from=auto&to=auto&salt=#{salt}&sign=#{sign}"
93
+ content = self.httpget(url)
94
+ contenthash = eval content.gsub(":", "=>")
95
+ return contenthash["trans_result"][0]["dst"]
96
+ rescue
97
+ return nil
98
+ end
99
+ end
100
+
101
+ #有道翻译,只支持英文翻译
102
+ #参数: word => 单词
103
+ #返回: 成功返回hash, key:单词, ps:音标, zn:翻译;失败返回nil
104
+ def self.youdao(word)
105
+ begin
106
+ url = "#{self::YOUDAO_URL}?keyfrom=#{self::YOUDAO_KEYFROM}&key=#{self::YOUDAO_KEY}&type=data&doctype=json&version=1.1&q=#{URI.escape(word)}"
107
+ content = self.httpget(url)
108
+ contenthash = eval(content.gsub(":", "=>"))
109
+ return {'key' => contenthash["query"],
110
+ 'ps' => contenthash["basic"]["phonetic"],
111
+ 'zn' => contenthash["basic"]["explains"].join("|")}
112
+ rescue
113
+ return nil
114
+ end
115
+ end
116
+ end
117
+ end
File without changes
data/lib/struggle.rb CHANGED
@@ -20,11 +20,15 @@ require 'struggle/concerns/string_extend'
20
20
  require 'struggle/concerns/int_extend'
21
21
  require 'struggle/concerns/decimal_extend'
22
22
  require 'struggle/concerns/time_extend'
23
+ require 'struggle/concerns/timestamps_format'
23
24
  require "struggle/ftp_tool"
25
+ require "struggle/translate"
24
26
  require "struggle/zip_tool"
25
27
  require 'struggle/sql'
26
28
  require 'struggle/backup'
27
29
  require 'pay/jd_gateway'
30
+
31
+ ActiveRecord::Base.send :include, Struggle::TimestampsFormat
28
32
  String.send :include, Struggle::StringExtend
29
33
  Integer.send :include, Struggle::IntExtend
30
34
  Numeric.send :include, Struggle::DecimalExtend
File without changes
File without changes
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: struggle
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.9
4
+ version: 2.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - lean
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-26 00:00:00.000000000 Z
11
+ date: 2018-09-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: iconv
@@ -52,7 +52,35 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
- description: code,tfile,pager,http,logistic,pay,tmagick,class_extend,aes,rsa,ftp_tool,zip_tool,sql,backup;
55
+ - !ruby/object:Gem::Dependency
56
+ name: watir
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: selenium-webdriver
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: code,tfile,pager,http,logistic,pay,tmagick,class_extend,aes,rsa,ftp_tool,translate,zip_tool,sql,backup,collection;
56
84
  email: 54850915@qq.com
57
85
  executables: []
58
86
  extensions: []
@@ -60,6 +88,9 @@ extra_rdoc_files:
60
88
  - README.md
61
89
  files:
62
90
  - README.md
91
+ - lib/collection.rb
92
+ - lib/collection/chromedriver
93
+ - lib/collection/taobao.rb
63
94
  - lib/generators/struggle/backup_config_generator.rb
64
95
  - lib/generators/struggle/sql_config_generator.rb
65
96
  - lib/pay/jd_gateway.rb
@@ -71,6 +102,7 @@ files:
71
102
  - lib/struggle/concerns/int_extend.rb
72
103
  - lib/struggle/concerns/string_extend.rb
73
104
  - lib/struggle/concerns/time_extend.rb
105
+ - lib/struggle/concerns/timestamps_format.rb
74
106
  - lib/struggle/font/ARIALNBI.TTF
75
107
  - lib/struggle/font/font.ttf
76
108
  - lib/struggle/ftp_tool.rb
@@ -83,6 +115,7 @@ files:
83
115
  - lib/struggle/sql.rb
84
116
  - lib/struggle/tfile.rb
85
117
  - lib/struggle/tmagick.rb
118
+ - lib/struggle/translate.rb
86
119
  - lib/struggle/zip_tool.rb
87
120
  - lib/templates/backup.yml
88
121
  - lib/templates/tsql_config.yml
@@ -106,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
139
  version: '0'
107
140
  requirements: []
108
141
  rubyforge_project:
109
- rubygems_version: 2.6.7
142
+ rubygems_version: 2.7.7
110
143
  signing_key:
111
144
  specification_version: 4
112
145
  summary: struggle!