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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/tg_send_zon.rb +213 -112
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ae6550d47b01219b01eab762905c79dcb56b83764354f60b955eacee0680a641
4
- data.tar.gz: 448dc9d1cdb95423614a2a09fc54e53209107f4bbfd2029fa200e15bb825151a
3
+ metadata.gz: 17620f34faad15c2f44511fbf88ae0ca1d5f959bc36b345f37705e577c1ccd2e
4
+ data.tar.gz: e7125f2023eaf6c46ded0237a7a6be096c456b549b395350e39b56e080fa20f7
5
5
  SHA512:
6
- metadata.gz: 98b700ebdcdb31a5d58fbf2848b6ef6ab694904e732b92b895551cf50b1cb74511cf9c953cd8b9fecba02e1d694178486d49f17494c6ac0de44d7a5663ba67e0
7
- data.tar.gz: 145896e5d9c8131b7f7464a2400ef68fa2337fab918b864080c66973ccab6f6823e773625d8bfc60d675827e0ac88c75b86bbf34a8df14d20db677da9f2ba41e
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 'crack'
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,images,nomber,option)
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(3)
262
- @driver.action.key_down(:enter).key_up(:enter).perform #엔터
263
-
282
+ sleep(1)
283
+
264
284
 
265
285
  #################### 예외 1 ######################
266
286
  begin
267
- wait = Selenium::WebDriver::Wait.new(:timeout => 1.5)
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
- #@driver.find_element(:xpath, '//*[@id="editable-message-text"]').clear
319
- @driver.execute_script("document.getElementById('editable-message-text-modal').innerText = ''") #내용삭제
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(3)
410
- @driver.action.key_down(:enter).key_up(:enter).perform #엔터
411
-
412
-
436
+ sleep(1)
437
+
413
438
  #################### 예외 1 ######################
414
439
  begin
415
- wait = Selenium::WebDriver::Wait.new(:timeout => 1.5)
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
- @images = images
473
- Clipboard.copy(images) # 이미지 폴더에서 이미지 선택
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
- images = ''
687
- else
738
+ image = '' # 이미지가 없으면 빈 문자열을 할당
739
+ else
688
740
  if @data['이미지설정']['랜덤사용'].checked?
689
- images = @data['이미지설정']['이미지'].sample[1]
741
+ image = @data['이미지설정']['이미지'].sample[1] # 랜덤으로 이미지 선택
690
742
  else
691
- images = @data['이미지설정']['이미지'][@image_counter][1]
692
- @image_counter += 1
693
- if @image_counter > @data['이미지설정']['이미지'].length-1
694
- @image_counter = 0
695
- end
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
- end
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,images,nomber,option)
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(' 그룹 URL 불러오기 '){
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
- file_data = File.open(file, 'r', :encoding => 'utf-8').read()
1166
- file_data.split("\n").each do |i|
1167
- i3 = i.to_s.force_encoding('utf-8').to_s
1168
- i2 = i3.split(',')
1169
- @data['table'] << [false, i2[0].to_s, 1,1,0,0]
1170
- @data['table'] << [false, i2[0].to_s, 1,1,0,0]
1171
- @data['table'].pop
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
- button('그룹 전체 선택'){
1183
- top 0
1184
- left 3
1185
- on_clicked{
1186
- for n in 0..@data['table'].length-1
1187
- @data['table'][n][0] = true
1188
- @data['table'] << []
1189
- @data['table'].pop
1190
- end
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
- button('그룹 선택 해제'){
1194
- top 0
1195
- left 4
1196
- on_clicked{
1197
- for n in 0..@data['table'].length-1
1198
- @data['table'][n][0] = false
1199
- @data['table'] << []
1200
- @data['table'].pop
1201
- end
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
- button('그룹 선택 삭제'){
1205
- top 0
1206
- left 5
1207
- on_clicked{
1208
- del_list_number = Array.new
1209
- for n in 0..@data['table'].length-1
1210
- if @data['table'][n][0] == true
1211
- del_list_number << n
1212
- end
1213
- end
1214
-
1215
- del_list_number.reverse.each do |i|
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
- stretchy false
1258
- @data['table_counter_input'] = entry{
1259
- text '그룹 당 발송 수 ex) 300'
1260
- top 1
1261
- left 0
1262
- }
1263
- @data['table_delay_input'] = entry{
1264
- text '발송 딜레이(초 단위) ex)3'
1265
- top 1
1266
- left 1
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
- file_name = file.split("\\")[-1]
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.1
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-05 00:00:00.000000000 Z
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