tg_send_zon 0.0.1 → 0.0.3
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/tg_send_zon.rb +213 -112
- 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: 17620f34faad15c2f44511fbf88ae0ca1d5f959bc36b345f37705e577c1ccd2e
|
4
|
+
data.tar.gz: e7125f2023eaf6c46ded0237a7a6be096c456b549b395350e39b56e080fa20f7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eb60d2f732201d259f2bb05c0f99d671c8a45f721cde429d0c9647328810bc60a4ecad4f03a754890b6c1d57a249c43b4131bc6a200d1de0726db66a6dd81472
|
7
|
+
data.tar.gz: b3eb3cef822c18c5e30edfadfbd888a528186e507f41ed57b3063a752bede783e4cecc83570a5ffa8e84200fdf4746551e38457f3efb03e5287d8a463239d8ca
|
data/lib/tg_send_zon.rb
CHANGED
@@ -1,16 +1,37 @@
|
|
1
|
+
#require 'glimmer-dsl-libui'
|
2
|
+
#require 'selenium-webdriver'
|
3
|
+
#require 'nokogiri'
|
4
|
+
#require 'http'
|
5
|
+
#require 'json'
|
6
|
+
#require 'crack'
|
7
|
+
#require 'fileutils'
|
8
|
+
#require 'clipboard'
|
9
|
+
#require 'auto_click'
|
10
|
+
#require 'rainbow/refinement'
|
11
|
+
#include AutoClickMethods
|
12
|
+
#using Rainbow
|
1
13
|
require 'glimmer-dsl-libui'
|
2
14
|
require 'selenium-webdriver'
|
15
|
+
# require 'webdrivers'
|
16
|
+
require 'iconv'
|
3
17
|
require 'nokogiri'
|
4
18
|
require 'http'
|
5
19
|
require 'json'
|
6
|
-
require '
|
20
|
+
require 'down'
|
21
|
+
require 'rmagick'
|
7
22
|
require 'fileutils'
|
23
|
+
require 'rest-client'
|
24
|
+
require 'open3'
|
8
25
|
require 'clipboard'
|
26
|
+
require 'crack'
|
27
|
+
require 'uri'
|
28
|
+
require 'cgi'
|
29
|
+
require 'digest'
|
9
30
|
require 'auto_click'
|
10
31
|
require 'rainbow/refinement'
|
11
32
|
include AutoClickMethods
|
12
33
|
using Rainbow
|
13
|
-
|
34
|
+
include Glimmer
|
14
35
|
|
15
36
|
|
16
37
|
class Naver
|
@@ -224,7 +245,7 @@ class Naver
|
|
224
245
|
|
225
246
|
|
226
247
|
|
227
|
-
def update(telegram_number,url,content,
|
248
|
+
def update(telegram_number,url,content,image,nomber,option)
|
228
249
|
|
229
250
|
@nomber = nomber
|
230
251
|
|
@@ -245,7 +266,7 @@ class Naver
|
|
245
266
|
|
246
267
|
|
247
268
|
|
248
|
-
################################################################################ 프로그램에 설정한
|
269
|
+
################################################################################ 프로그램에 설정한 글만 등록
|
249
270
|
if option['세팅내용발송1'] == 'true'
|
250
271
|
|
251
272
|
wait = Selenium::WebDriver::Wait.new(:timeout => 5)
|
@@ -258,15 +279,15 @@ class Naver
|
|
258
279
|
@url = url
|
259
280
|
Clipboard.copy(url)
|
260
281
|
@driver.action.key_down(:control).send_keys('v').key_up(:control).perform
|
261
|
-
sleep(
|
262
|
-
|
263
|
-
|
282
|
+
sleep(1)
|
283
|
+
|
264
284
|
|
265
285
|
#################### 예외 1 ######################
|
266
286
|
begin
|
267
|
-
wait = Selenium::WebDriver::Wait.new(:timeout =>
|
287
|
+
wait = Selenium::WebDriver::Wait.new(:timeout => 3)
|
268
288
|
#요소가 나타날 때까지 3초 동안 기다립니다.
|
269
289
|
wait.until { @driver.find_element(:xpath, '//*[@class="search-section"]') }
|
290
|
+
sleep(1)
|
270
291
|
rescue
|
271
292
|
puts "#{url} [발송 실패 !! 그룹이 존재하지 않습니다!!]".red
|
272
293
|
@driver.close
|
@@ -280,6 +301,8 @@ class Naver
|
|
280
301
|
end
|
281
302
|
#################### 예외 1 ######################
|
282
303
|
|
304
|
+
@driver.action.key_down(:enter).key_up(:enter).perform #엔터
|
305
|
+
#sleep(1)
|
283
306
|
|
284
307
|
########### 그룹 정보 가 나와있으면 닫기 ###########
|
285
308
|
begin
|
@@ -288,6 +311,7 @@ class Naver
|
|
288
311
|
wait.until { @driver.find_element(:xpath, '//*[@title="Close"]') }
|
289
312
|
sleep(1)
|
290
313
|
@driver.find_element(:xpath, '//*[@title="Close"]').click
|
314
|
+
sleep(1)
|
291
315
|
rescue
|
292
316
|
end
|
293
317
|
########### 그룹 정보 가 나와있으면 닫기 ###########
|
@@ -299,6 +323,7 @@ class Naver
|
|
299
323
|
#요소가 나타날 때까지 3초 동안 기다립니다.
|
300
324
|
wait.until { @driver.find_element(:xpath, '//*[@id="editable-message-text"]') }
|
301
325
|
@driver.find_element(:xpath, '//*[@id="editable-message-text"]').click
|
326
|
+
sleep(1)
|
302
327
|
rescue
|
303
328
|
puts "#{url} [발송 실패 !! 그룹에 가입되지 않았거나 발송 권한이 없습니다!!]".red
|
304
329
|
@driver.close
|
@@ -315,12 +340,14 @@ class Naver
|
|
315
340
|
|
316
341
|
|
317
342
|
################### 내용 입력 ####################
|
318
|
-
|
319
|
-
|
343
|
+
@driver.execute_script("document.getElementById('editable-message-text').innerText = ''") #기존 내용 이력이 있으면 삭제
|
344
|
+
sleep(1)
|
345
|
+
|
320
346
|
sleep(1)
|
321
347
|
@content = content
|
322
348
|
Clipboard.copy(content)
|
323
349
|
@driver.action.key_down(:control).send_keys('v').key_up(:control).perform #새로넣은 코드 (내용 한번에 복붙방식)
|
350
|
+
sleep(1)
|
324
351
|
################### 내용 입력 ####################
|
325
352
|
|
326
353
|
|
@@ -406,15 +433,14 @@ class Naver
|
|
406
433
|
@url = url
|
407
434
|
Clipboard.copy(url)
|
408
435
|
@driver.action.key_down(:control).send_keys('v').key_up(:control).perform
|
409
|
-
sleep(
|
410
|
-
|
411
|
-
|
412
|
-
|
436
|
+
sleep(1)
|
437
|
+
|
413
438
|
#################### 예외 1 ######################
|
414
439
|
begin
|
415
|
-
wait = Selenium::WebDriver::Wait.new(:timeout =>
|
440
|
+
wait = Selenium::WebDriver::Wait.new(:timeout => 3)
|
416
441
|
#요소가 나타날 때까지 3초 동안 기다립니다.
|
417
442
|
wait.until { @driver.find_element(:xpath, '//*[@class="search-section"]') }
|
443
|
+
sleep(1)
|
418
444
|
rescue
|
419
445
|
puts "#{url} [발송 실패 !! 그룹이 존재하지 않습니다!!]".red
|
420
446
|
@driver.close
|
@@ -427,8 +453,9 @@ class Naver
|
|
427
453
|
return 0
|
428
454
|
end
|
429
455
|
#################### 예외 1 ######################
|
430
|
-
|
431
|
-
|
456
|
+
@driver.action.key_down(:enter).key_up(:enter).perform #엔터
|
457
|
+
#sleep(1)
|
458
|
+
|
432
459
|
########### 그룹 정보 가 나와있으면 닫기 ###########
|
433
460
|
begin
|
434
461
|
wait = Selenium::WebDriver::Wait.new(:timeout => 1.5)
|
@@ -436,17 +463,21 @@ class Naver
|
|
436
463
|
wait.until { @driver.find_element(:xpath, '//*[@title="Close"]') }
|
437
464
|
sleep(1)
|
438
465
|
@driver.find_element(:xpath, '//*[@title="Close"]').click
|
466
|
+
sleep(1)
|
439
467
|
rescue
|
440
468
|
end
|
441
469
|
########### 그룹 정보 가 나와있으면 닫기 ###########
|
442
470
|
|
443
|
-
|
471
|
+
@driver.execute_script("document.getElementById('editable-message-text').innerText = ''") #기존 내용 이력이 있으면 삭제
|
472
|
+
sleep(1)
|
473
|
+
|
444
474
|
#################### 예외 2 ######################
|
445
475
|
begin
|
446
476
|
wait = Selenium::WebDriver::Wait.new(:timeout => 1)
|
447
477
|
#요소가 나타날 때까지 3초 동안 기다립니다.
|
448
478
|
wait.until { @driver.find_element(:xpath, '//*[@id="attach-menu-button"]') }
|
449
479
|
@driver.find_element(:xpath, '//*[@id="attach-menu-button"]').click
|
480
|
+
sleep(1)
|
450
481
|
rescue
|
451
482
|
#puts url + ' [그룹에 가입되지 않았거나 발송 권한이 없습니다]'.red
|
452
483
|
puts "#{url} [발송 실패 !! 그룹에 가입되지 않았거나 발송 권한이 없습니다!!]".red
|
@@ -461,34 +492,53 @@ class Naver
|
|
461
492
|
return 0
|
462
493
|
end
|
463
494
|
#################### 예외 2 ######################
|
464
|
-
|
495
|
+
|
465
496
|
|
466
497
|
################### 사진 입력 ####################
|
498
|
+
begin
|
467
499
|
wait = Selenium::WebDriver::Wait.new(:timeout => 5)
|
468
500
|
#요소가 나타날 때까지 3초 동안 기다립니다.
|
469
501
|
wait.until { @driver.find_element(:xpath, '//*[@class="icon icon-photo"]') }
|
470
502
|
@driver.find_element(:xpath, '//*[@class="icon icon-photo"]').click
|
471
503
|
sleep(1)
|
472
|
-
@
|
473
|
-
Clipboard.copy(
|
504
|
+
@image = image
|
505
|
+
Clipboard.copy(image)
|
506
|
+
# 이미지 폴더에서 이미지 선택
|
507
|
+
puts image
|
508
|
+
sleep(0.5)
|
474
509
|
key_down('ctrl')
|
475
510
|
key_stroke('v')
|
476
511
|
key_up('ctrl')
|
512
|
+
sleep(0.5)
|
477
513
|
key_stroke('enter')
|
478
514
|
sleep(1.5)
|
515
|
+
|
479
516
|
################### 사진 입력 ####################
|
480
517
|
|
481
|
-
|
518
|
+
|
482
519
|
################### 내용 입력 ####################
|
483
520
|
@driver.execute_script("document.getElementById('editable-message-text-modal').innerText = ''")
|
521
|
+
|
522
|
+
|
484
523
|
sleep(1)
|
485
524
|
@content = content
|
486
525
|
Clipboard.copy(content)
|
487
526
|
@driver.action.key_down(:control).send_keys('v').key_up(:control).perform #새로넣은 코드 (내용 한번에 복붙방식)
|
488
527
|
sleep(1)
|
489
528
|
################### 내용 입력 ####################
|
490
|
-
|
491
|
-
|
529
|
+
rescue
|
530
|
+
# 이미지 발송 금지 된 방 예외 처리
|
531
|
+
puts "#{url} [해당 방은 이미지 발송이 금지된 방으로 메세지만 발송합니다.]".magenta
|
532
|
+
@driver.execute_script("document.getElementById('editable-message-text').innerText = ''")
|
533
|
+
sleep(1)
|
534
|
+
@driver.find_element(:xpath, '//*[@id="editable-message-text"]').click
|
535
|
+
sleep(1)
|
536
|
+
@content = content
|
537
|
+
Clipboard.copy(content)
|
538
|
+
@driver.action.key_down(:control).send_keys('v').key_up(:control).perform #새로넣은 코드 (내용 한번에 복붙방식)
|
539
|
+
sleep(1)
|
540
|
+
end
|
541
|
+
|
492
542
|
################### 회차 옵션 ####################
|
493
543
|
if option['발송횟수추가'] == 'true'
|
494
544
|
puts '회수 추가.......'.green
|
@@ -501,7 +551,7 @@ class Naver
|
|
501
551
|
else
|
502
552
|
end
|
503
553
|
################### 회차 옵션 ####################
|
504
|
-
|
554
|
+
|
505
555
|
|
506
556
|
################### 발송 엔터 ####################
|
507
557
|
@driver.action.key_down(:enter).key_up(:enter).perform
|
@@ -682,19 +732,29 @@ class Wordpress
|
|
682
732
|
|
683
733
|
|
684
734
|
@data['table'][index][-1] = 0
|
735
|
+
|
736
|
+
|
685
737
|
if @data['이미지설정']['이미지'].length == 0
|
686
|
-
|
687
|
-
|
738
|
+
image = '' # 이미지가 없으면 빈 문자열을 할당
|
739
|
+
else
|
688
740
|
if @data['이미지설정']['랜덤사용'].checked?
|
689
|
-
|
741
|
+
image = @data['이미지설정']['이미지'].sample[1] # 랜덤으로 이미지 선택
|
690
742
|
else
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
743
|
+
image = @data['이미지설정']['이미지'][@image_counter][1] # 순차적으로 이미지 선택
|
744
|
+
@image_counter += 1
|
745
|
+
# 이미지 카운터가 이미지 배열의 길이를 초과하지 않도록 처리
|
746
|
+
if @image_counter > @data['이미지설정']['이미지'].length - 1
|
747
|
+
@image_counter = 0 # 끝까지 갔으면 0으로 리셋
|
748
|
+
end
|
696
749
|
end
|
697
|
-
|
750
|
+
end
|
751
|
+
|
752
|
+
image = image.force_encoding('UTF-8')
|
753
|
+
|
754
|
+
# 클립보드에 복사
|
755
|
+
Clipboard.copy(image)
|
756
|
+
|
757
|
+
|
698
758
|
@data['table'][index][-1] = 5
|
699
759
|
@data['table'] << []
|
700
760
|
@data['table'].pop
|
@@ -808,7 +868,7 @@ class Wordpress
|
|
808
868
|
url = @data['table'][index][1].to_s.force_encoding('utf-8')
|
809
869
|
|
810
870
|
# puts '[작업 준비!!] 포스팅 제목/내용 준비 완료.......'.green
|
811
|
-
naver.update(telegram_number,url,content,
|
871
|
+
naver.update(telegram_number,url,content,image,nomber,option)
|
812
872
|
|
813
873
|
|
814
874
|
#완료했으니 수량 카운터
|
@@ -1156,68 +1216,106 @@ class Wordpress
|
|
1156
1216
|
@data['table'].pop
|
1157
1217
|
}
|
1158
1218
|
}
|
1159
|
-
button('
|
1219
|
+
button('그룹 URL 불러오기 ') {
|
1160
1220
|
top 0
|
1161
1221
|
left 2
|
1162
|
-
on_clicked{
|
1222
|
+
on_clicked {
|
1163
1223
|
file = open_file
|
1164
1224
|
if file != nil
|
1165
|
-
|
1166
|
-
|
1167
|
-
|
1168
|
-
|
1169
|
-
|
1170
|
-
|
1171
|
-
|
1225
|
+
Thread.new do
|
1226
|
+
begin
|
1227
|
+
# 큐 생성: 스레드에서 메인 스레드로 데이터를 전송
|
1228
|
+
queue = Queue.new
|
1229
|
+
|
1230
|
+
# 파일을 한 번에 읽어들임
|
1231
|
+
file_data = IO.readlines(file, chomp: true)
|
1232
|
+
|
1233
|
+
# 100줄씩 배치로 처리
|
1234
|
+
batch_size = 1000
|
1235
|
+
total_lines = file_data.size
|
1236
|
+
|
1237
|
+
threads = [] # 스레드 배열
|
1238
|
+
(0..total_lines - 1).step(batch_size) do |i|
|
1239
|
+
batch = file_data[i, batch_size] # 배치 크기만큼 처리
|
1240
|
+
|
1241
|
+
# 각 배치마다 새로운 스레드로 처리
|
1242
|
+
threads << Thread.new do
|
1243
|
+
batch.each do |line|
|
1244
|
+
i3 = line.to_s.force_encoding('utf-8')
|
1245
|
+
i2 = i3.split(',')
|
1246
|
+
|
1247
|
+
# 데이터를 큐에 추가
|
1248
|
+
queue << [false, i2[0].to_s, 1, 1, 0, 0]
|
1249
|
+
end
|
1250
|
+
end
|
1251
|
+
end
|
1252
|
+
|
1253
|
+
# 모든 스레드가 끝날 때까지 대기
|
1254
|
+
threads.each(&:join)
|
1255
|
+
|
1256
|
+
# 메인 스레드에서 큐에 있는 데이터를 처리
|
1257
|
+
Thread.new do
|
1258
|
+
# 큐에서 데이터를 하나씩 꺼내어 @data['table']에 추가
|
1259
|
+
until queue.empty?
|
1260
|
+
item = queue.pop
|
1261
|
+
@data['table'] << item
|
1262
|
+
end
|
1263
|
+
|
1264
|
+
# 테이블에서 마지막 데이터 삭제
|
1265
|
+
@data['table'].pop
|
1266
|
+
|
1267
|
+
# UI 갱신 (메인 스레드에서 UI 업데이트)
|
1268
|
+
|
1269
|
+
end
|
1270
|
+
ensure
|
1271
|
+
file_data.clear
|
1272
|
+
end
|
1172
1273
|
end
|
1173
1274
|
end
|
1174
1275
|
}
|
1175
1276
|
}
|
1176
1277
|
|
1177
|
-
|
1178
1278
|
|
1179
1279
|
|
1180
1280
|
|
1181
|
-
|
1182
|
-
|
1183
|
-
|
1184
|
-
|
1185
|
-
|
1186
|
-
|
1187
|
-
|
1188
|
-
|
1189
|
-
|
1190
|
-
|
1191
|
-
}
|
1281
|
+
button('그룹 전체 선택') {
|
1282
|
+
top 0
|
1283
|
+
left 3
|
1284
|
+
on_clicked {
|
1285
|
+
# @data['table']의 모든 항목을 선택 상태로 변경
|
1286
|
+
@data['table'].map! { |row| row[0] = true; row }
|
1287
|
+
|
1288
|
+
# UI 갱신 (필요에 따라 호출)
|
1289
|
+
# 예시: UI 업데이트 코드가 필요하다면 호출
|
1290
|
+
# update_ui
|
1192
1291
|
}
|
1193
|
-
|
1194
|
-
|
1195
|
-
|
1196
|
-
|
1197
|
-
|
1198
|
-
|
1199
|
-
|
1200
|
-
|
1201
|
-
|
1202
|
-
|
1292
|
+
}
|
1293
|
+
|
1294
|
+
button('그룹 선택 해제') {
|
1295
|
+
top 0
|
1296
|
+
left 4
|
1297
|
+
on_clicked {
|
1298
|
+
# @data['table']의 모든 항목을 선택 해제 상태로 변경
|
1299
|
+
@data['table'].map! { |row| row[0] = false; row }
|
1300
|
+
|
1301
|
+
# UI 갱신 (필요하다면 추가)
|
1302
|
+
# 예시: UI 업데이트 코드가 필요하다면 호출
|
1303
|
+
# update_ui
|
1203
1304
|
}
|
1204
|
-
|
1205
|
-
|
1206
|
-
|
1207
|
-
|
1208
|
-
|
1209
|
-
|
1210
|
-
|
1211
|
-
|
1212
|
-
|
1213
|
-
|
1214
|
-
|
1215
|
-
|
1216
|
-
@data['table'].delete_at(i)
|
1217
|
-
end
|
1218
|
-
@data.delete(nil)
|
1219
|
-
}
|
1305
|
+
}
|
1306
|
+
|
1307
|
+
button('그룹 선택 삭제') {
|
1308
|
+
top 0
|
1309
|
+
left 5
|
1310
|
+
on_clicked {
|
1311
|
+
# 선택된 항목을 제외한 새로운 배열을 만들어서 빠르게 삭제
|
1312
|
+
@data['table'].reject! { |row| row[0] == true }
|
1313
|
+
|
1314
|
+
# UI 갱신 (필요하다면 추가)
|
1315
|
+
# 예시: UI 업데이트 코드가 필요하다면 호출
|
1316
|
+
# update_ui
|
1220
1317
|
}
|
1318
|
+
}
|
1221
1319
|
}
|
1222
1320
|
}
|
1223
1321
|
|
@@ -1253,34 +1351,38 @@ class Wordpress
|
|
1253
1351
|
|
1254
1352
|
|
1255
1353
|
|
1256
|
-
grid{
|
1257
|
-
|
1258
|
-
|
1259
|
-
|
1260
|
-
|
1261
|
-
|
1262
|
-
|
1263
|
-
|
1264
|
-
|
1265
|
-
|
1266
|
-
|
1267
|
-
}
|
1268
|
-
|
1269
|
-
|
1270
|
-
button(' 전체 그룹 적용하기 '){
|
1271
|
-
top 1
|
1272
|
-
left 2
|
1273
|
-
on_clicked{
|
1274
|
-
for n in 0..@data['table'].length-1
|
1275
|
-
@data['table'][n][2] = @data['table_counter_input'].text.to_i
|
1276
|
-
@data['table'][n][3] = @data['table_delay_input'].text.to_i
|
1277
|
-
@data['table'] << []
|
1278
|
-
@data['table'].pop
|
1279
|
-
end
|
1354
|
+
grid {
|
1355
|
+
stretchy false
|
1356
|
+
@data['table_counter_input'] = entry {
|
1357
|
+
text '그룹 당 발송 수 ex) 300'
|
1358
|
+
top 1
|
1359
|
+
left 0
|
1360
|
+
}
|
1361
|
+
@data['table_delay_input'] = entry {
|
1362
|
+
text '발송 딜레이(초 단위) ex)3'
|
1363
|
+
top 1
|
1364
|
+
left 1
|
1280
1365
|
}
|
1281
|
-
}
|
1282
1366
|
|
1283
|
-
|
1367
|
+
button(' 전체 그룹 적용하기 ') {
|
1368
|
+
top 1
|
1369
|
+
left 2
|
1370
|
+
on_clicked {
|
1371
|
+
# 입력값을 한 번만 변수에 저장
|
1372
|
+
table_counter_value = @data['table_counter_input'].text.to_i
|
1373
|
+
table_delay_value = @data['table_delay_input'].text.to_i
|
1374
|
+
|
1375
|
+
# @data['table']의 각 항목을 업데이트
|
1376
|
+
@data['table'].map! do |row|
|
1377
|
+
row[2] = table_counter_value
|
1378
|
+
row[3] = table_delay_value
|
1379
|
+
row # 수정된 row를 반환
|
1380
|
+
end
|
1381
|
+
}
|
1382
|
+
}
|
1383
|
+
}
|
1384
|
+
|
1385
|
+
|
1284
1386
|
}
|
1285
1387
|
}
|
1286
1388
|
}
|
@@ -1297,15 +1399,14 @@ class Wordpress
|
|
1297
1399
|
on_clicked{
|
1298
1400
|
file = open_file
|
1299
1401
|
if file != nil
|
1300
|
-
|
1402
|
+
file_path = file.gsub('/', '\\')
|
1301
1403
|
@data['이미지설정']['이미지'] << [false, file, file]
|
1302
1404
|
@data['이미지설정']['이미지'] << [false, file, file]
|
1303
1405
|
@data['이미지설정']['이미지'].pop
|
1304
1406
|
end
|
1305
1407
|
}
|
1306
1408
|
}
|
1307
|
-
|
1308
|
-
|
1409
|
+
|
1309
1410
|
|
1310
1411
|
button(' 전체선택 '){
|
1311
1412
|
top 0
|
@@ -1373,7 +1474,7 @@ class Wordpress
|
|
1373
1474
|
editable true
|
1374
1475
|
}
|
1375
1476
|
text_column('이미지파일'){
|
1376
|
-
|
1477
|
+
editable true
|
1377
1478
|
}
|
1378
1479
|
|
1379
1480
|
cell_rows @data['이미지설정']['이미지']
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tg_send_zon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- zon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-12-
|
11
|
+
date: 2024-12-06 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: File to Clipboard gem
|
14
14
|
email: mymin26@naver.com
|