duo_blog_cafe_comment 0.0.53 → 0.0.57
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 +4 -4
- data/lib/duo_blog_cafe_comment.rb +214 -46
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1c1e81739e7324d3503fea9dfc7def1b11a66ac112ba85090d30bd2c8af5b593
|
4
|
+
data.tar.gz: 14e90041ca0f6c56ff97f23a749765a23e70e7a1dad23828a7f8463eccaca645
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0152e31341db41ee95139ab80efc8ae7a41b8b12c424216cf2c67dbd2d537f613eaca95df2354d685c7db418c6c9df4cc60f76b67bcf9175e97c8abdbdc7757c
|
7
|
+
data.tar.gz: 8c8a0b6ac2a36dfa4607d29635816e9a56e29f7fddb3147539266e2299bd6c06aaae9b40282fa4c86e43c542dcc0c22757fa2ad93708cde72b58061e40ba9b8c
|
@@ -16,48 +16,17 @@ require 'uri'
|
|
16
16
|
require 'cgi'
|
17
17
|
require 'auto_click'
|
18
18
|
require 'rainbow/refinement'
|
19
|
-
require 'win32ole'
|
20
19
|
include AutoClickMethods
|
21
20
|
using Rainbow
|
22
21
|
include Glimmer
|
23
22
|
|
24
23
|
|
25
24
|
class Naver
|
26
|
-
def initialize
|
27
|
-
|
28
|
-
sleep(1)
|
25
|
+
def initialize(data)
|
26
|
+
@data = data
|
29
27
|
@seed = 1
|
30
28
|
end
|
31
29
|
|
32
|
-
def kill_selenium_chrome #기존 창 모두 닫는 코드
|
33
|
-
wmi = WIN32OLE.connect("winmgmts://")
|
34
|
-
chrome_procs = wmi.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'chrome.exe'")
|
35
|
-
|
36
|
-
chrome_procs.each do |proc|
|
37
|
-
cmd = proc.CommandLine
|
38
|
-
if cmd && cmd.include?("user-data-dir=C:/naver_cookie")
|
39
|
-
puts "→ 크롬 창 초기화: PID #{proc.ProcessId}"
|
40
|
-
begin
|
41
|
-
proc.Terminate
|
42
|
-
rescue
|
43
|
-
#puts "→ 이미 종료된 프로세스: #{proc.ProcessId}"
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
# chromedriver도 같이 종료
|
49
|
-
chromedrivers = wmi.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'chromedriver.exe'")
|
50
|
-
chromedrivers.each do |proc|
|
51
|
-
puts "→ 크롬 창 초기화: PID #{proc.ProcessId}"
|
52
|
-
begin
|
53
|
-
proc.Terminate
|
54
|
-
rescue
|
55
|
-
#puts "→ 이미 종료된 chromedriver: #{proc.ProcessId}"
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
|
61
30
|
def chrome_setup(user_id, proxy)
|
62
31
|
naver_cookie_dir = "C:/naver_cookie"
|
63
32
|
FileUtils.mkdir_p(naver_cookie_dir) unless File.exist?(naver_cookie_dir)
|
@@ -306,12 +275,13 @@ class Naver
|
|
306
275
|
|
307
276
|
|
308
277
|
|
309
|
-
def update(content,board_url,blog_url,nickname,image,option,counts_number,keyword,api_key)
|
278
|
+
def update(content,board_url,blog_url,nickname,image,option,counts_number,keyword,api_key,sleep_delay)
|
310
279
|
@board_url = board_url
|
311
280
|
@keyword = keyword
|
312
281
|
@content = content
|
313
282
|
@api_key = api_key
|
314
283
|
@blog_url = blog_url
|
284
|
+
@sleep_delay = sleep_delay
|
315
285
|
if option['카페사용모드'] == 'true'
|
316
286
|
|
317
287
|
|
@@ -522,6 +492,42 @@ class Naver
|
|
522
492
|
sleep(1)
|
523
493
|
@driver.switch_to.frame(@driver.find_element(:xpath, '//*[@id="cafe_main"]')) # 아이프레임 선택
|
524
494
|
|
495
|
+
sleep(1)
|
496
|
+
puts "게시글 읽는 모션 진행".yellow
|
497
|
+
@driver.action.send_keys(:page_down).perform #스크롤 내리기
|
498
|
+
sleep(1)
|
499
|
+
@driver.action.send_keys(:page_down).perform #스크롤 내리기
|
500
|
+
sleep(1)
|
501
|
+
|
502
|
+
content_soon = 0
|
503
|
+
# 💬 content 설정 (여기 추가!)
|
504
|
+
if @data['내용설정']['내용'].nil? || @data['내용설정']['내용'].empty?
|
505
|
+
content = ''
|
506
|
+
else
|
507
|
+
if @data.dig('내용설정', '랜덤사용')&.respond_to?(:checked?) && @data['내용설정']['랜덤사용'].checked?
|
508
|
+
content = @data['내용설정']['내용'].sample[2] # 랜덤 사용 시
|
509
|
+
else
|
510
|
+
content = @data['내용설정']['내용'][content_soon][2] # 순차적으로 사용
|
511
|
+
content_soon += 1
|
512
|
+
if content_soon >= @data['내용설정']['내용'].length
|
513
|
+
content_soon = 0
|
514
|
+
end
|
515
|
+
end
|
516
|
+
end
|
517
|
+
|
518
|
+
# 디엠 자동 변경이 체크된 경우 content를 변환
|
519
|
+
if @data['포스트설정']['내용자동변경'].checked?
|
520
|
+
change_memory = {}
|
521
|
+
@data['포스트설정']['내용자동변경값'].each do |key, v|
|
522
|
+
change_memory[key] = v.sample
|
523
|
+
end
|
524
|
+
@data['포스트설정']['내용자동변경값'].each do |key, _|
|
525
|
+
if content.include?(key)
|
526
|
+
content = content.gsub(key, change_memory[key]) # gsub을 사용하여 내용 치환
|
527
|
+
else
|
528
|
+
end
|
529
|
+
end
|
530
|
+
end
|
525
531
|
|
526
532
|
if option['좋아요'] == 'true'
|
527
533
|
puts "좋아요 클릭 옵션 진행!!".cyan
|
@@ -602,6 +608,7 @@ class Naver
|
|
602
608
|
sleep(1)
|
603
609
|
else
|
604
610
|
begin
|
611
|
+
puts (content)
|
605
612
|
@driver.find_element(:xpath, '//*[@placeholder="댓글을 남겨보세요"]').send_keys(content)
|
606
613
|
sleep(1)
|
607
614
|
rescue
|
@@ -720,6 +727,18 @@ class Naver
|
|
720
727
|
end
|
721
728
|
end
|
722
729
|
@driver.switch_to.default_content() # 아이프레임 해제
|
730
|
+
def sleep_with_progress(sleep_delay)
|
731
|
+
print "[설정 딜레이 진행 중] "
|
732
|
+
steps = (sleep_delay.to_f / 0.5).to_i
|
733
|
+
steps.times do
|
734
|
+
print "."
|
735
|
+
STDOUT.flush
|
736
|
+
sleep(1)
|
737
|
+
end
|
738
|
+
puts "\n"
|
739
|
+
end
|
740
|
+
|
741
|
+
sleep_with_progress(sleep_delay)
|
723
742
|
rescue => e
|
724
743
|
puts "Error: #{e.message}"
|
725
744
|
end
|
@@ -739,6 +758,43 @@ class Naver
|
|
739
758
|
wait.until { @driver.find_element(:xpath, '//*[@id="cafe_main"]') } # 아이프레임 선택
|
740
759
|
sleep(1)
|
741
760
|
@driver.switch_to.frame(@driver.find_element(:xpath, '//*[@id="cafe_main"]')) # 아이프레임 선택
|
761
|
+
|
762
|
+
sleep(1)
|
763
|
+
puts "게시글 읽는 모션 진행".yellow
|
764
|
+
@driver.action.send_keys(:page_down).perform #스크롤 내리기
|
765
|
+
sleep(1)
|
766
|
+
@driver.action.send_keys(:page_down).perform #스크롤 내리기
|
767
|
+
sleep(1)
|
768
|
+
|
769
|
+
content_soon = 0
|
770
|
+
# 💬 content 설정 (여기 추가!)
|
771
|
+
if @data['내용설정']['내용'].nil? || @data['내용설정']['내용'].empty?
|
772
|
+
content = ''
|
773
|
+
else
|
774
|
+
if @data.dig('내용설정', '랜덤사용')&.respond_to?(:checked?) && @data['내용설정']['랜덤사용'].checked?
|
775
|
+
content = @data['내용설정']['내용'].sample[2] # 랜덤 사용 시
|
776
|
+
else
|
777
|
+
content = @data['내용설정']['내용'][content_soon][2] # 순차적으로 사용
|
778
|
+
content_soon += 1
|
779
|
+
if content_soon >= @data['내용설정']['내용'].length
|
780
|
+
content_soon = 0
|
781
|
+
end
|
782
|
+
end
|
783
|
+
end
|
784
|
+
|
785
|
+
# 디엠 자동 변경이 체크된 경우 content를 변환
|
786
|
+
if @data['포스트설정']['내용자동변경'].checked?
|
787
|
+
change_memory = {}
|
788
|
+
@data['포스트설정']['내용자동변경값'].each do |key, v|
|
789
|
+
change_memory[key] = v.sample
|
790
|
+
end
|
791
|
+
@data['포스트설정']['내용자동변경값'].each do |key, _|
|
792
|
+
if content.include?(key)
|
793
|
+
content = content.gsub(key, change_memory[key]) # gsub을 사용하여 내용 치환
|
794
|
+
else
|
795
|
+
end
|
796
|
+
end
|
797
|
+
end
|
742
798
|
|
743
799
|
if option['좋아요'] == 'true'
|
744
800
|
puts "좋아요 클릭 옵션 진행!!".cyan
|
@@ -819,6 +875,7 @@ class Naver
|
|
819
875
|
sleep(1)
|
820
876
|
else
|
821
877
|
begin
|
878
|
+
puts (content)
|
822
879
|
@driver.find_element(:xpath, '//*[@placeholder="댓글을 남겨보세요"]').send_keys(content)
|
823
880
|
sleep(1)
|
824
881
|
rescue
|
@@ -939,6 +996,17 @@ class Naver
|
|
939
996
|
|
940
997
|
end
|
941
998
|
@driver.switch_to.default_content() # 아이프레임 해제
|
999
|
+
def sleep_with_progress(sleep_delay)
|
1000
|
+
print "[설정 딜레이 진행 중] "
|
1001
|
+
steps = (sleep_delay.to_f / 0.5).to_i
|
1002
|
+
steps.times do
|
1003
|
+
print "."
|
1004
|
+
STDOUT.flush
|
1005
|
+
sleep(1)
|
1006
|
+
end
|
1007
|
+
puts "\n"
|
1008
|
+
end
|
1009
|
+
sleep_with_progress(sleep_delay)
|
942
1010
|
rescue => e
|
943
1011
|
puts "Error: #{e.message}"
|
944
1012
|
end
|
@@ -1040,6 +1108,42 @@ class Naver
|
|
1040
1108
|
sleep(1)
|
1041
1109
|
@driver.switch_to.frame(@driver.find_element(:xpath, '//*[@id="cafe_main"]')) # 아이프레임 선택
|
1042
1110
|
|
1111
|
+
sleep(1)
|
1112
|
+
puts "게시글 읽는 모션 진행".yellow
|
1113
|
+
@driver.action.send_keys(:page_down).perform #스크롤 내리기
|
1114
|
+
sleep(1)
|
1115
|
+
@driver.action.send_keys(:page_down).perform #스크롤 내리기
|
1116
|
+
sleep(1)
|
1117
|
+
|
1118
|
+
content_soon = 0
|
1119
|
+
# 💬 content 설정 (여기 추가!)
|
1120
|
+
if @data['내용설정']['내용'].nil? || @data['내용설정']['내용'].empty?
|
1121
|
+
content = ''
|
1122
|
+
else
|
1123
|
+
if @data.dig('내용설정', '랜덤사용')&.respond_to?(:checked?) && @data['내용설정']['랜덤사용'].checked?
|
1124
|
+
content = @data['내용설정']['내용'].sample[2] # 랜덤 사용 시
|
1125
|
+
else
|
1126
|
+
content = @data['내용설정']['내용'][content_soon][2] # 순차적으로 사용
|
1127
|
+
content_soon += 1
|
1128
|
+
if content_soon >= @data['내용설정']['내용'].length
|
1129
|
+
content_soon = 0
|
1130
|
+
end
|
1131
|
+
end
|
1132
|
+
end
|
1133
|
+
|
1134
|
+
# 디엠 자동 변경이 체크된 경우 content를 변환
|
1135
|
+
if @data['포스트설정']['내용자동변경'].checked?
|
1136
|
+
change_memory = {}
|
1137
|
+
@data['포스트설정']['내용자동변경값'].each do |key, v|
|
1138
|
+
change_memory[key] = v.sample
|
1139
|
+
end
|
1140
|
+
@data['포스트설정']['내용자동변경값'].each do |key, _|
|
1141
|
+
if content.include?(key)
|
1142
|
+
content = content.gsub(key, change_memory[key]) # gsub을 사용하여 내용 치환
|
1143
|
+
else
|
1144
|
+
end
|
1145
|
+
end
|
1146
|
+
end
|
1043
1147
|
|
1044
1148
|
if option['좋아요'] == 'true'
|
1045
1149
|
puts "좋아요 클릭 옵션 진행!!".cyan
|
@@ -1120,6 +1224,7 @@ class Naver
|
|
1120
1224
|
sleep(1)
|
1121
1225
|
else
|
1122
1226
|
begin
|
1227
|
+
puts (content)
|
1123
1228
|
@driver.find_element(:xpath, '//*[@placeholder="댓글을 남겨보세요"]').send_keys(content)
|
1124
1229
|
sleep(1)
|
1125
1230
|
rescue
|
@@ -1240,6 +1345,19 @@ class Naver
|
|
1240
1345
|
|
1241
1346
|
end
|
1242
1347
|
@driver.switch_to.default_content() # 아이프레임 해제
|
1348
|
+
def sleep_with_progress(sleep_delay)
|
1349
|
+
print "[설정 딜레이 진행 중] "
|
1350
|
+
steps = (sleep_delay.to_f / 0.5).to_i
|
1351
|
+
steps.times do
|
1352
|
+
print "."
|
1353
|
+
STDOUT.flush
|
1354
|
+
sleep(1)
|
1355
|
+
end
|
1356
|
+
puts "\n"
|
1357
|
+
end
|
1358
|
+
sleep_with_progress(sleep_delay)
|
1359
|
+
|
1360
|
+
|
1243
1361
|
rescue => e
|
1244
1362
|
puts "Error: #{e.message}"
|
1245
1363
|
end
|
@@ -1611,7 +1729,7 @@ class Naver
|
|
1611
1729
|
end
|
1612
1730
|
|
1613
1731
|
@driver.switch_to.default_content
|
1614
|
-
|
1732
|
+
end
|
1615
1733
|
|
1616
1734
|
collected_urls.each do |url|
|
1617
1735
|
# 각 post-url로 이동
|
@@ -1623,8 +1741,16 @@ class Naver
|
|
1623
1741
|
@driver.switch_to.frame(@driver.find_element(:xpath, '//*[@id="mainFrame"]')) # 아이프레임 선택
|
1624
1742
|
sleep(1)
|
1625
1743
|
|
1744
|
+
sleep(1)
|
1745
|
+
puts "게시글 읽는 모션 진행".yellow
|
1746
|
+
@driver.action.send_keys(:page_down).perform #스크롤 내리기
|
1747
|
+
sleep(1)
|
1748
|
+
@driver.action.send_keys(:page_down).perform #스크롤 내리기
|
1749
|
+
sleep(1)
|
1750
|
+
|
1626
1751
|
if option['이웃추가'] == 'true'
|
1627
1752
|
begin
|
1753
|
+
sleep(1)
|
1628
1754
|
begin
|
1629
1755
|
wait = Selenium::WebDriver::Wait.new(:timeout => 3)
|
1630
1756
|
#요소가 나타날 때까지 10초 동안 기다립니다.
|
@@ -1699,7 +1825,7 @@ class Naver
|
|
1699
1825
|
|
1700
1826
|
elsif option['서로이웃추가'] == 'true'
|
1701
1827
|
begin
|
1702
|
-
|
1828
|
+
sleep(1)
|
1703
1829
|
begin
|
1704
1830
|
wait = Selenium::WebDriver::Wait.new(:timeout => 3)
|
1705
1831
|
#요소가 나타날 때까지 10초 동안 기다립니다.
|
@@ -1780,7 +1906,7 @@ class Naver
|
|
1780
1906
|
|
1781
1907
|
if option['공유하기'] == 'true'
|
1782
1908
|
begin
|
1783
|
-
|
1909
|
+
sleep(1)
|
1784
1910
|
wait = Selenium::WebDriver::Wait.new(:timeout => 10)
|
1785
1911
|
#요소가 나타날 때까지 10초 동안 기다립니다.
|
1786
1912
|
wait.until { @driver.find_element(:xpath, '//*[@class="_spi_blog spi_btn_blog"]') }
|
@@ -1872,7 +1998,7 @@ class Naver
|
|
1872
1998
|
|
1873
1999
|
elsif option['공유하기비공개'] == 'true'
|
1874
2000
|
begin
|
1875
|
-
|
2001
|
+
sleep(1)
|
1876
2002
|
wait = Selenium::WebDriver::Wait.new(:timeout => 10)
|
1877
2003
|
#요소가 나타날 때까지 10초 동안 기다립니다.
|
1878
2004
|
wait.until { @driver.find_element(:xpath, '//*[@class="_spi_blog spi_btn_blog"]') }
|
@@ -1969,7 +2095,7 @@ class Naver
|
|
1969
2095
|
|
1970
2096
|
if option['좋아요'] == 'true'
|
1971
2097
|
begin
|
1972
|
-
|
2098
|
+
sleep(1)
|
1973
2099
|
wait = Selenium::WebDriver::Wait.new(:timeout => 3)
|
1974
2100
|
wait.until { @driver.find_element(:xpath, '//*[@class="u_ico _icon pcol3"]') }
|
1975
2101
|
|
@@ -2010,6 +2136,36 @@ class Naver
|
|
2010
2136
|
else
|
2011
2137
|
end
|
2012
2138
|
|
2139
|
+
content_soon = 0
|
2140
|
+
# 💬 content 설정 (여기 추가!)
|
2141
|
+
if @data['내용설정']['내용'].nil? || @data['내용설정']['내용'].empty?
|
2142
|
+
content = ''
|
2143
|
+
else
|
2144
|
+
if @data.dig('내용설정', '랜덤사용')&.respond_to?(:checked?) && @data['내용설정']['랜덤사용'].checked?
|
2145
|
+
content = @data['내용설정']['내용'].sample[2] # 랜덤 사용 시
|
2146
|
+
else
|
2147
|
+
content = @data['내용설정']['내용'][content_soon][2] # 순차적으로 사용
|
2148
|
+
content_soon += 1
|
2149
|
+
if content_soon >= @data['내용설정']['내용'].length
|
2150
|
+
content_soon = 0
|
2151
|
+
end
|
2152
|
+
end
|
2153
|
+
end
|
2154
|
+
|
2155
|
+
# 디엠 자동 변경이 체크된 경우 content를 변환
|
2156
|
+
if @data['포스트설정']['내용자동변경'].checked?
|
2157
|
+
change_memory = {}
|
2158
|
+
@data['포스트설정']['내용자동변경값'].each do |key, v|
|
2159
|
+
change_memory[key] = v.sample
|
2160
|
+
end
|
2161
|
+
@data['포스트설정']['내용자동변경값'].each do |key, _|
|
2162
|
+
if content.include?(key)
|
2163
|
+
content = content.gsub(key, change_memory[key]) # gsub을 사용하여 내용 치환
|
2164
|
+
else
|
2165
|
+
end
|
2166
|
+
end
|
2167
|
+
end
|
2168
|
+
|
2013
2169
|
begin #댓글 작업 >> 시작
|
2014
2170
|
# 댓글 쓰기 버튼 클릭
|
2015
2171
|
begin
|
@@ -2233,7 +2389,6 @@ class Naver
|
|
2233
2389
|
else
|
2234
2390
|
# 여기에 다른 코드 추가 가능
|
2235
2391
|
end
|
2236
|
-
|
2237
2392
|
begin
|
2238
2393
|
element = @driver.find_element(:xpath, '//*[@data-uiselector="writeButton"]')
|
2239
2394
|
@driver.execute_script("arguments[0].scrollIntoView({block: 'center', inline: 'center'})", element) # 크롤 이동
|
@@ -2305,8 +2460,20 @@ class Naver
|
|
2305
2460
|
ff.close()
|
2306
2461
|
puts '-[√] 로그 파일 생성 완료.......'.yellow
|
2307
2462
|
end
|
2308
|
-
end
|
2309
|
-
|
2463
|
+
end
|
2464
|
+
|
2465
|
+
def sleep_with_progress(sleep_delay)
|
2466
|
+
print "[설정 딜레이 진행 중] "
|
2467
|
+
steps = (sleep_delay.to_f / 0.5).to_i
|
2468
|
+
steps.times do
|
2469
|
+
print "."
|
2470
|
+
STDOUT.flush
|
2471
|
+
sleep(1)
|
2472
|
+
end
|
2473
|
+
puts "\n"
|
2474
|
+
end
|
2475
|
+
sleep_with_progress(sleep_delay)
|
2476
|
+
|
2310
2477
|
rescue
|
2311
2478
|
|
2312
2479
|
end #댓글 작업 >> 끝
|
@@ -2344,7 +2511,7 @@ class Naver
|
|
2344
2511
|
end
|
2345
2512
|
end
|
2346
2513
|
|
2347
|
-
class Wordpress
|
2514
|
+
class Wordpress
|
2348
2515
|
include Glimmer
|
2349
2516
|
|
2350
2517
|
def login_check2(user_id, user_pw)
|
@@ -2691,7 +2858,7 @@ class Wordpress
|
|
2691
2858
|
proxy = table[3].to_s
|
2692
2859
|
user_id = table[1].to_s
|
2693
2860
|
user_pw = table[2].to_s
|
2694
|
-
naver = Naver.new
|
2861
|
+
naver = Naver.new(@data)
|
2695
2862
|
@data['table'][index][-1] = 30
|
2696
2863
|
@data['table'] << []
|
2697
2864
|
@data['table'].pop
|
@@ -2914,7 +3081,8 @@ class Wordpress
|
|
2914
3081
|
# 댓글 설정 수 카운트
|
2915
3082
|
counts_number = @data['table'][index][6].to_i
|
2916
3083
|
api_key = @data['포스트설정']['api_key'].text.to_s.force_encoding('utf-8')
|
2917
|
-
|
3084
|
+
sleep_delay = @data['table'][index][5].to_i
|
3085
|
+
naver.update(content,board_url,blog_url,nickname,image,option,counts_number,keyword,api_key,sleep_delay)
|
2918
3086
|
|
2919
3087
|
|
2920
3088
|
|
@@ -2923,7 +3091,7 @@ class Wordpress
|
|
2923
3091
|
@data['table'][index][-1] = 100
|
2924
3092
|
@data['table'] << []
|
2925
3093
|
@data['table'].pop
|
2926
|
-
sleep(@data['table'][index][5].to_i)
|
3094
|
+
#sleep(@data['table'][index][5].to_i)
|
2927
3095
|
end
|
2928
3096
|
rescue => exception
|
2929
3097
|
puts exception
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: duo_blog_cafe_comment
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.57
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- zon
|
8
8
|
bindir: bin
|
9
9
|
cert_chain: []
|
10
|
-
date: 2025-
|
10
|
+
date: 2025-06-12 00:00:00.000000000 Z
|
11
11
|
dependencies: []
|
12
12
|
description: File to Clipboard gem
|
13
13
|
email: mymin26@naver.com
|