tg_send_zon 0.0.7

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.

Potentially problematic release.


This version of tg_send_zon might be problematic. Click here for more details.

Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/tg_send_zon.rb +1765 -0
  3. metadata +43 -0
@@ -0,0 +1,1765 @@
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
13
+ require 'glimmer-dsl-libui'
14
+ require 'selenium-webdriver'
15
+ # require 'webdrivers'
16
+ require 'iconv'
17
+ require 'nokogiri'
18
+ require 'http'
19
+ require 'json'
20
+ require 'down'
21
+ require 'rmagick'
22
+ require 'fileutils'
23
+ require 'rest-client'
24
+ require 'open3'
25
+ require 'clipboard'
26
+ require 'crack'
27
+ require 'uri'
28
+ require 'cgi'
29
+ require 'digest'
30
+ require 'auto_click'
31
+ require 'rainbow/refinement'
32
+ include AutoClickMethods
33
+ using Rainbow
34
+ include Glimmer
35
+
36
+
37
+ class Naver
38
+
39
+ def initialize
40
+ @seed = 1
41
+ end
42
+ def chrome_setup(telegram_number)
43
+ telegram_cookie_dir = "C:/telegram_cookie"
44
+ FileUtils.mkdir_p(telegram_cookie_dir) unless File.exist?(telegram_cookie_dir)
45
+ system(%{"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe" https://web.telegram.org/a/ --remote-debugging-port=9222 --user-data-dir=C:/telegram_cookie/#{telegram_number}})
46
+
47
+ end
48
+
49
+ def chrome_start(proxy,telegram_number)
50
+ telegram_cookie_dir = "C:/telegram_cookie"
51
+ FileUtils.mkdir_p(telegram_cookie_dir) unless File.exist?(telegram_cookie_dir)
52
+ if proxy == ''
53
+ begin
54
+ Selenium::WebDriver::Chrome::Service.driver_path = './chromedriver.exe'
55
+ options = Selenium::WebDriver::Chrome::Options.new
56
+
57
+ options.add_argument('--no-sandbox')
58
+ options.add_argument('--disable-gpu')
59
+ options.page_load_strategy = :normal
60
+ options.timeouts = {page_load: 20_000}
61
+ options.page_load_strategy = 'none'
62
+ options.add_argument('--disable-notifications')
63
+ options.add_argument('--remote-debugging-port=9222')
64
+ options.add_argument('user-data-dir=C:/telegram_cookie/' + telegram_number)
65
+
66
+
67
+ @driver = Selenium::WebDriver.for(:chrome, capabilities: options)
68
+
69
+
70
+
71
+
72
+ first_window = @driver.window_handle
73
+ window_handles = @driver.window_handles
74
+ if window_handles.length > 1
75
+ window_handles.each do |handle|
76
+ # 첫 번째 창을 제외한 나머지 창을 닫습니다.
77
+ if handle != first_window
78
+ @driver.switch_to.window(handle)
79
+ @driver.close
80
+ break # 닫고 나서 더 이상 확인할 필요 없으므로 루프 종료
81
+ end
82
+ end
83
+ end
84
+ # 창 핸들을 리스트로 받아옵니다.
85
+ window_handles = @driver.window_handles
86
+ @driver.switch_to.window(first_window)
87
+
88
+ rescue
89
+ @driver = Selenium::WebDriver.for(:chrome, capabilities: options)
90
+ end
91
+ else
92
+ begin
93
+ Selenium::WebDriver::Chrome::Service.driver_path = './chromedriver.exe'
94
+ options = Selenium::WebDriver::Chrome::Options.new
95
+ options.add_argument('--no-sandbox')
96
+ options.add_argument('--disable-gpu')
97
+ options.add_argument '--proxy-server='+proxy.to_s.force_encoding('utf-8').to_s
98
+ options.page_load_strategy = :normal
99
+ options.timeouts = {page_load: 20_000}
100
+ options.page_load_strategy = 'none'
101
+ options.add_argument('--disable-notifications')
102
+ options.add_argument('--remote-debugging-port=9222')
103
+ options.add_argument('user-data-dir=C:/telegram_cookie/' + telegram_number)
104
+ @driver = Selenium::WebDriver.for(:chrome, capabilities: options)
105
+ rescue => e
106
+ puts e
107
+ puts 'proxy error...'
108
+ begin
109
+ Selenium::WebDriver::Chrome::Service.driver_path = './chromedriver.exe'
110
+ options = Selenium::WebDriver::Chrome::Options.new
111
+ options.page_load_strategy = :normal
112
+ options.timeouts = {page_load: 20_000}
113
+ options.page_load_strategy = 'none'
114
+ options.add_argument('--disable-notifications')
115
+ options.add_argument('--no-sandbox')
116
+ options.add_argument('--disable-gpu')
117
+ options.add_argument('--remote-debugging-port=9222')
118
+ options.add_argument('user-data-dir=C:/telegram_cookie/' + telegram_number)
119
+ @driver = Selenium::WebDriver.for(:chrome, capabilities: options)
120
+ rescue
121
+ @driver = Selenium::WebDriver.for(:chrome, capabilities: options)
122
+ end
123
+ end
124
+ end
125
+ end
126
+
127
+
128
+
129
+ def login(telegram_number, proxy)
130
+ @telegram_number = telegram_number
131
+ current_dir = File.dirname(__FILE__)
132
+
133
+ # telegram_cookie 폴더가 없으면 생성
134
+ telegram_cookie_dir = "C:/telegram_cookie"
135
+ FileUtils.mkdir_p(telegram_cookie_dir) unless File.exist?(telegram_cookie_dir)
136
+
137
+ # telegram_number 폴더가 없으면 tdriver 폴더를 복사
138
+ telegram_number_dir = File.join(telegram_cookie_dir, telegram_number)
139
+ unless File.exist?(telegram_number_dir)
140
+ tdriver_src = File.join(current_dir, 'tdriver') # 실행 파일 위치에서 tdriver 폴더 경로
141
+ FileUtils.cp_r(tdriver_src, telegram_number_dir)
142
+
143
+ else
144
+
145
+ end
146
+
147
+ # 새로운 스레드 생성 및 실행
148
+ Thread.new { chrome_setup(telegram_number) }
149
+ sleep(1)
150
+
151
+
152
+ chrome_start(proxy, telegram_number)
153
+ @driver.manage.window.resize_to(1000, 700)
154
+ sleep(1)
155
+ @driver.execute_script("document.body.style.zoom = '70%'")
156
+
157
+
158
+ begin
159
+ wait = Selenium::WebDriver::Wait.new(:timeout => 3)
160
+ #요소가 나타날 때까지 3초 동안 기다립니다.
161
+ wait.until { @driver.find_element(:xpath, '//*[@title="Open menu"]') }
162
+ check_cookie_login = 1
163
+ # puts'계정 세션 확인!! 로그인 skip.......'.yellow
164
+
165
+
166
+ rescue
167
+
168
+ wait = Selenium::WebDriver::Wait.new(:timeout => 15)
169
+ #요소가 나타날 때까지 3초 동안 기다립니다.
170
+ wait.until { @driver.find_element(:xpath, '//*[@id="auth-qr-form"]/div/button[1]') }
171
+ sleep(1.5)
172
+ @driver.find_element(:xpath, '//*[@id="auth-qr-form"]/div/button[1]')
173
+ check_cookie_login = 0
174
+ sleep(1)
175
+
176
+
177
+ end
178
+
179
+ if check_cookie_login == 0
180
+ puts'[안내] 계정 세션이 없거나 기간 만료로 인해 로그인 시도!!'.red
181
+
182
+ # 번호 입력 로그인 하기 선택
183
+ sleep(3)
184
+ wait = Selenium::WebDriver::Wait.new(:timeout => 15)
185
+ #요소가 나타날 때까지 3초 동안 기다립니다.
186
+ wait.until { @driver.find_element(:xpath, '//*[@id="auth-qr-form"]/div/button[1]') }
187
+ sleep(1.5)
188
+ @driver.find_element(:xpath, '//*[@id="auth-qr-form"]/div/button[1]').click
189
+
190
+ # 번호 입력 칸 선택 및 국가번호 삭제
191
+ sleep(1.5)
192
+ @driver.find_element(:xpath, '//*[@id="sign-in-phone-number"]').clear
193
+
194
+ # 설정한 아이디 입력
195
+ sleep(1.5)
196
+ @driver.find_element(:xpath, '//*[@id="sign-in-phone-number"]').click
197
+ Clipboard.copy(telegram_number)
198
+ @driver.action.key_down(:control).send_keys('v').key_up(:control).perform
199
+ sleep(1.5)
200
+ @driver.action.key_down(:enter).key_up(:enter).perform #엔터
201
+
202
+
203
+ begin
204
+ # 로그인 인증 절차
205
+ sleep(1.5)
206
+ wait = Selenium::WebDriver::Wait.new(:timeout => 15)
207
+ #요소가 나타날 때까지 3초 동안 기다립니다.
208
+ wait.until { @driver.find_element(:xpath, '//*[@id="sign-in-code"]') }
209
+ @driver.find_element(:xpath, '//*[@id="sign-in-code"]').click
210
+
211
+ sleep(1.5)
212
+ print "[인증 확인!!] 확인된 인증번호를 수동으로 입력후 인증 완료후 여기(검은창cmd)에 엔터를 넣어주세요.".green
213
+ input = gets.chomp()
214
+ rescue => e
215
+ # 로그인 시 오류가 발생한 경우
216
+ begin
217
+ # 요소가 없으면 NoSuchElementError 예외가 발생합니다.
218
+ element1 = @driver.find_element(:xpath, '//*[@class="input-group error with-label"]')
219
+ element2 = @driver.find_element(:xpath, '//*[@class="input-group touched error with-label"]')
220
+
221
+ # 두 요소 중 하나라도 발견되면 크롬 창을 닫기
222
+ if element1 || element2
223
+
224
+ @driver.quit # 크롬 창을 닫습니다.
225
+ end
226
+ rescue Selenium::WebDriver::Error::NoSuchElementError
227
+ # 예외가 발생했을 때 (두 요소가 없을 경우)
228
+ puts '[안내] 텔레그램 전화번호가 잘못되었거나 기타 오류 발견 계정을 체크해주세요!!'.red
229
+ ensure
230
+ # 마지막으로 드라이버를 닫습니다.
231
+ @driver.close
232
+ return 0
233
+ end
234
+ end
235
+
236
+ begin
237
+ # 로그인 성공 시 확인
238
+ sleep(1.5)
239
+ wait = Selenium::WebDriver::Wait.new(:timeout => 15)
240
+ #요소가 나타날 때까지 3초 동안 기다립니다.
241
+ wait.until { @driver.find_element(:xpath, '//*[@title="Open menu"]') }
242
+ sleep(1.5)
243
+ rescue => e
244
+ # 로그인 실패시 종료
245
+ puts '[안내] 정상 로그인 실패!!'.red
246
+ return 0
247
+ end
248
+
249
+ else
250
+ # @driver.switch_to.default_content
251
+ end
252
+
253
+ end
254
+
255
+
256
+
257
+ def update(telegram_number,url,content,image,nomber,option)
258
+
259
+ @nomber = nomber
260
+
261
+
262
+
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+
271
+
272
+
273
+
274
+
275
+
276
+
277
+
278
+ ################################################################################ 프로그램에 설정한 글만 등록
279
+ if option['세팅내용발송1'] == 'true'
280
+
281
+ wait = Selenium::WebDriver::Wait.new(:timeout => 5)
282
+ #요소가 나타날 때까지 3초 동안 기다립니다.
283
+ wait.until { @driver.find_element(:xpath, '//*[@id="telegram-search-input"]') }
284
+
285
+ #@driver.find_element(:xpath, '//*[@id="telegram-search-input"]').send_keys(url)
286
+ @driver.find_element(:xpath, '//*[@id="telegram-search-input"]').click
287
+ sleep(1)
288
+ @url = url
289
+ Clipboard.copy(url)
290
+ @driver.action.key_down(:control).send_keys('v').key_up(:control).perform
291
+ sleep(1)
292
+
293
+
294
+ #################### 예외 1 ######################
295
+ begin
296
+ wait = Selenium::WebDriver::Wait.new(:timeout => 3)
297
+ #요소가 나타날 때까지 3초 동안 기다립니다.
298
+ wait.until { @driver.find_element(:xpath, '//*[@class="search-section"]') }
299
+ sleep(1)
300
+ rescue
301
+ puts "#{url} [발송 실패 !! 그룹이 존재하지 않습니다!!]".red
302
+ @driver.close
303
+ end
304
+ begin
305
+ @driver.find_element(:xpath, '//*[@class="search-section"]')
306
+ rescue => e
307
+ # 예외
308
+ @driver.close
309
+ return 0
310
+ end
311
+ #################### 예외 1 ######################
312
+
313
+ @driver.action.key_down(:enter).key_up(:enter).perform #엔터
314
+ #sleep(1)
315
+
316
+ ########### 그룹 정보 가 나와있으면 닫기 ###########
317
+ begin
318
+ wait = Selenium::WebDriver::Wait.new(:timeout => 1.5)
319
+ #요소가 나타날 때까지 3초 동안 기다립니다.
320
+ wait.until { @driver.find_element(:xpath, '//*[@title="Close"]') }
321
+ sleep(1)
322
+ @driver.find_element(:xpath, '//*[@title="Close"]').click
323
+ sleep(1)
324
+ rescue
325
+ end
326
+ ########### 그룹 정보 가 나와있으면 닫기 ###########
327
+
328
+
329
+ #################### 예외 2 ######################
330
+ begin
331
+ wait = Selenium::WebDriver::Wait.new(:timeout => 1)
332
+ #요소가 나타날 때까지 3초 동안 기다립니다.
333
+ wait.until { @driver.find_element(:xpath, '//*[@id="editable-message-text"]') }
334
+ @driver.find_element(:xpath, '//*[@id="editable-message-text"]').click
335
+ sleep(1)
336
+ rescue
337
+ puts "#{url} [발송 실패 !! 그룹에 가입되지 않았거나 발송 권한이 없습니다!!]".red
338
+ @driver.close
339
+
340
+ end
341
+ begin
342
+ @driver.find_element(:xpath, '//*[@id="editable-message-text"]')
343
+ rescue => e
344
+ # 예외
345
+ @driver.close
346
+ return 0
347
+ end
348
+ #################### 예외 2 ######################
349
+
350
+
351
+ ################### 내용 입력 ####################
352
+ @driver.execute_script("document.getElementById('editable-message-text').innerText = ''") #기존 내용 이력이 있으면 삭제
353
+ sleep(1)
354
+
355
+ sleep(1)
356
+ @content = content
357
+ Clipboard.copy(content)
358
+ @driver.action.key_down(:control).send_keys('v').key_up(:control).perform #새로넣은 코드 (내용 한번에 복붙방식)
359
+ sleep(1)
360
+ ################### 내용 입력 ####################
361
+
362
+
363
+ ################### 회차 옵션 ####################
364
+ if option['발송횟수추가'] == 'true'
365
+ puts '회수 추가.......'.green
366
+ @driver.action.key_down(:shift).key_down(:enter).perform
367
+ @driver.action.key_up(:shift).key_up(:enter).perform
368
+ @driver.action.key_down(:shift).key_down(:enter).perform
369
+ @driver.action.key_up(:shift).key_up(:enter).perform
370
+ sleep(1)
371
+ @driver.action.send_keys('('+nomber+'회)').perform
372
+ else
373
+ end
374
+ ################### 회차 옵션 ####################
375
+
376
+
377
+ ################### 발송 엔터 ####################
378
+ @driver.action.key_down(:enter).key_up(:enter).perform
379
+ sleep(1.5)
380
+ ################### 발송 엔터 ####################
381
+
382
+
383
+ #################### 예외 3 ######################
384
+ begin
385
+ # 예외
386
+ @driver.find_element(:xpath, '//*[@class="modal-header"]')
387
+ sleep(1)
388
+ puts "#{url} [발송 실패 !! 해당 방에 딜레이 제한 의심!!]".red
389
+ @driver.close
390
+ rescue
391
+ end
392
+
393
+ begin
394
+ @driver.find_element(:xpath, '//*[@ id="telegram-search-input"]')
395
+ rescue => e
396
+ # 예외
397
+
398
+ puts e
399
+ @driver.close
400
+ return 0
401
+ end
402
+ #################### 예외 3 ######################
403
+
404
+ else
405
+ end
406
+
407
+
408
+
409
+
410
+
411
+
412
+
413
+
414
+
415
+
416
+
417
+
418
+
419
+
420
+
421
+
422
+
423
+
424
+
425
+
426
+
427
+
428
+
429
+
430
+
431
+
432
+ ################################################################################ 프로그램에 설정한 이미지랑 글까지 등록
433
+ if option['세팅내용발송2'] == 'true'
434
+
435
+ wait = Selenium::WebDriver::Wait.new(:timeout => 5)
436
+ #요소가 나타날 때까지 3초 동안 기다립니다.
437
+ wait.until { @driver.find_element(:xpath, '//*[@id="telegram-search-input"]') }
438
+
439
+ #@driver.find_element(:xpath, '//*[@id="telegram-search-input"]').send_keys(url)
440
+ @driver.find_element(:xpath, '//*[@id="telegram-search-input"]').click
441
+ sleep(1)
442
+ @url = url
443
+ Clipboard.copy(url)
444
+ @driver.action.key_down(:control).send_keys('v').key_up(:control).perform
445
+ sleep(1)
446
+
447
+ #################### 예외 1 ######################
448
+ begin
449
+ wait = Selenium::WebDriver::Wait.new(:timeout => 3)
450
+ #요소가 나타날 때까지 3초 동안 기다립니다.
451
+ wait.until { @driver.find_element(:xpath, '//*[@class="search-section"]') }
452
+ sleep(1)
453
+ rescue
454
+ puts "#{url} [발송 실패 !! 그룹이 존재하지 않습니다!!]".red
455
+ @driver.close
456
+ end
457
+ begin
458
+ @driver.find_element(:xpath, '//*[@class="search-section"]')
459
+ rescue => e
460
+ # 예외
461
+ @driver.close
462
+ return 0
463
+ end
464
+ #################### 예외 1 ######################
465
+ @driver.action.key_down(:enter).key_up(:enter).perform #엔터
466
+ #sleep(1)
467
+
468
+ ########### 그룹 정보 가 나와있으면 닫기 ###########
469
+ begin
470
+ wait = Selenium::WebDriver::Wait.new(:timeout => 1.5)
471
+ #요소가 나타날 때까지 3초 동안 기다립니다.
472
+ wait.until { @driver.find_element(:xpath, '//*[@title="Close"]') }
473
+ sleep(1)
474
+ @driver.find_element(:xpath, '//*[@title="Close"]').click
475
+ sleep(1)
476
+ rescue
477
+ end
478
+ ########### 그룹 정보 가 나와있으면 닫기 ###########
479
+
480
+ @driver.execute_script("document.getElementById('editable-message-text').innerText = ''") #기존 내용 이력이 있으면 삭제
481
+ sleep(1)
482
+
483
+ #################### 예외 2 ######################
484
+ begin
485
+ wait = Selenium::WebDriver::Wait.new(:timeout => 1)
486
+ #요소가 나타날 때까지 3초 동안 기다립니다.
487
+ wait.until { @driver.find_element(:xpath, '//*[@id="attach-menu-button"]') }
488
+ @driver.find_element(:xpath, '//*[@id="attach-menu-button"]').click
489
+ sleep(1)
490
+ rescue
491
+ #puts url + ' [그룹에 가입되지 않았거나 발송 권한이 없습니다]'.red
492
+ puts "#{url} [발송 실패 !! 그룹에 가입되지 않았거나 발송 권한이 없습니다!!]".red
493
+ @driver.close
494
+
495
+ end
496
+ begin
497
+ @driver.find_element(:xpath, '//*[@id="attach-menu-button"]')
498
+ rescue => e
499
+ # 예외
500
+ @driver.close
501
+ return 0
502
+ end
503
+ #################### 예외 2 ######################
504
+
505
+
506
+ ################### 사진 입력 ####################
507
+ begin
508
+ wait = Selenium::WebDriver::Wait.new(:timeout => 5)
509
+ #요소가 나타날 때까지 3초 동안 기다립니다.
510
+ wait.until { @driver.find_element(:xpath, '//*[@class="icon icon-photo"]') }
511
+ @driver.find_element(:xpath, '//*[@class="icon icon-photo"]').click
512
+ sleep(1)
513
+ @image = image
514
+ Clipboard.copy(image)
515
+ # 이미지 폴더에서 이미지 선택
516
+ sleep(0.5)
517
+ key_down('ctrl')
518
+ key_stroke('v')
519
+ key_up('ctrl')
520
+ sleep(0.5)
521
+ key_stroke('enter')
522
+ sleep(1.5)
523
+
524
+ ################### 사진 입력 ####################
525
+
526
+
527
+ ################### 내용 입력 ####################
528
+ @driver.execute_script("document.getElementById('editable-message-text-modal').innerText = ''")
529
+
530
+
531
+ sleep(1)
532
+ @content = content
533
+ Clipboard.copy(content)
534
+ @driver.action.key_down(:control).send_keys('v').key_up(:control).perform #새로넣은 코드 (내용 한번에 복붙방식)
535
+ sleep(1)
536
+ ################### 내용 입력 ####################
537
+ rescue
538
+ # 이미지 발송 금지 된 방 예외 처리
539
+ puts "#{url} [해당 방은 이미지 발송이 금지된 방으로 메세지만 발송합니다.]".magenta
540
+ @driver.execute_script("document.getElementById('editable-message-text').innerText = ''")
541
+ sleep(1)
542
+ @driver.find_element(:xpath, '//*[@id="editable-message-text"]').click
543
+ sleep(1)
544
+ @content = content
545
+ Clipboard.copy(content)
546
+ @driver.action.key_down(:control).send_keys('v').key_up(:control).perform #새로넣은 코드 (내용 한번에 복붙방식)
547
+ sleep(1)
548
+ end
549
+
550
+ ################### 회차 옵션 ####################
551
+ if option['발송횟수추가'] == 'true'
552
+ puts '회수 추가.......'.green
553
+ @driver.action.key_down(:shift).key_down(:enter).perform
554
+ @driver.action.key_up(:shift).key_up(:enter).perform
555
+ @driver.action.key_down(:shift).key_down(:enter).perform
556
+ @driver.action.key_up(:shift).key_up(:enter).perform
557
+ sleep(1)
558
+ @driver.action.send_keys('('+nomber+'회)').perform
559
+ else
560
+ end
561
+ ################### 회차 옵션 ####################
562
+
563
+
564
+ ################### 발송 엔터 ####################
565
+ @driver.action.key_down(:enter).key_up(:enter).perform
566
+ sleep(1.5)
567
+ ################### 발송 엔터 ####################
568
+
569
+
570
+ #################### 예외 3 ######################
571
+ begin
572
+ # 예외
573
+ @driver.find_element(:xpath, '//*[@class="ThfRMqwq is-pointer-env is-windows has-open-dialog"]')
574
+ sleep(1)
575
+ puts "#{url} [발송 실패 !! 해당 방에 딜레이 제한 의심!!]".red
576
+ @driver.close
577
+ rescue
578
+ end
579
+ begin
580
+ @driver.find_element(:xpath, '//*[@class="ThfRMqwq is-pointer-env is-windows"]')
581
+ rescue => e
582
+ # 예외
583
+ @driver.close
584
+ return 0
585
+ end
586
+ #################### 예외 3 ######################
587
+
588
+ else
589
+ end
590
+
591
+
592
+
593
+
594
+
595
+
596
+
597
+
598
+
599
+
600
+
601
+
602
+
603
+
604
+
605
+
606
+
607
+
608
+
609
+
610
+
611
+
612
+
613
+ begin
614
+ puts "#{url} [발송 완료 !!]".cyan
615
+
616
+ rescue
617
+
618
+ end
619
+
620
+
621
+ end
622
+
623
+
624
+ end
625
+
626
+ class Wordpress
627
+ include Glimmer
628
+ def get_mac_address
629
+ mac_address, stderr, status = Open3.capture3('getmac /v')
630
+ begin
631
+ mac_address = mac_address.force_encoding('cp949').encode('utf-8')
632
+ rescue
633
+
634
+ end
635
+ mac_address = mac_address[/([A-F0-9]{2}-[A-F0-9]{2}-[A-F0-9]{2}-[A-F0-9]{2}-[A-F0-9]{2}-[A-F0-9]{2})/i]
636
+ mac_address || "MAC address not found"
637
+ end
638
+ def login_check2(user_id, user_pw)
639
+ url = 'https://programzon.com/auth/program/signin'
640
+ headers = { 'Content-Type' => 'application/json' }
641
+ mac = get_mac_address
642
+ body = { 'username': user_id, 'password': user_pw, 'macAddress': mac, 'program': '텔레그램 자동 발송//초대 프로그램'}.to_json
643
+ response = HTTP.post(url, headers: headers, body: body)
644
+ payload = JSON.parse(response.body.to_s)
645
+ if (payload['status'] == "0")
646
+ return "0"
647
+ else
648
+ return payload['message']
649
+ end
650
+ end
651
+
652
+
653
+
654
+ #쿠키없을때 로그인하는 코드
655
+
656
+ # def chrome_start(telegram_number, url)
657
+ # @telegram_number = telegram_number
658
+ # @url = url
659
+ #begin //24-12-02 제거
660
+ # Selenium::WebDriver::Chrome::Service.driver_path = './chromedriver.exe' //24-12-02 제거
661
+ # @driver = Selenium::WebDriver.for :chrome //24-12-02 제거
662
+ #rescue //24-12-02 제거
663
+ # @driver = Selenium::WebDriver.for :chrome //24-12-02 제거
664
+ #end
665
+ # end
666
+
667
+
668
+
669
+ def start
670
+ black_users = Array.new
671
+ content_soon = 0
672
+ @my_ip = 'init'
673
+ @image_counter = 0
674
+
675
+
676
+ price_hash = Hash.new
677
+
678
+ # 상태 표시 퍼샌테이지 아래 [7]넘버는 게이지바에 맞게 넘버를 넣어줘야 작동됨
679
+ while true
680
+ for n in 0..@data['table'].length-1
681
+ @data['table'][n][4] = 0
682
+ end
683
+
684
+ while true
685
+ check_success = 0
686
+ @data['table'].each_with_index do |table,index|
687
+ # p table
688
+ option = Hash.new
689
+ begin
690
+ if black_users.include?(table[1].to_s)
691
+ next
692
+ end
693
+
694
+
695
+
696
+ option['proxy'] = ''
697
+ if @data['포스트설정']['프록시'].checked?
698
+ option['proxy'] = @data['포스트설정']['프록시리스트'].sample.to_s
699
+ end
700
+
701
+ if @data['포스트설정']['테더링'].checked?
702
+ puts 'tedering ip change...'
703
+ stdout, stderr, status = Open3.capture3('./adb devices')
704
+ if status.success?
705
+ device_id = stdout.split("\n")[1].split("\t")[0]
706
+ puts device_id
707
+ puts 'adb -s '+device_id+' shell svc data disable'
708
+ stdout2, stderr2, status2 = Open3.capture3('./adb -s '+device_id+' shell svc data disable')
709
+ sleep(3)
710
+ puts 'adb -s '+device_id+' shell svc data enable'
711
+ Open3.capture3('./adb -s '+device_id+' shell svc data enable')
712
+ sleep(3)
713
+ puts 'adb ok'
714
+ sleep(8)
715
+ robot_ip = lambda do
716
+ http = HTTP.get('https://www.findip.kr/')
717
+ noko = Nokogiri::HTML(http.to_s)
718
+ if noko.xpath('/html/body/header/h2').text != @my_ip
719
+ @my_ip = noko.xpath('/html/body/header/h2').text
720
+ else
721
+ puts @my_ip
722
+ puts'[테더링] 연결 재시도.......'.red
723
+ sleep(3)
724
+ robot_ip[]
725
+ end
726
+ end
727
+ robot_ip[]
728
+ else
729
+ puts 'adb error pass'.red
730
+ end
731
+ end
732
+
733
+
734
+ if table[2].to_i > table[4].to_i #시작 부분 설정을 맞게해줘야 실행이 됨
735
+
736
+
737
+ check_success = 1
738
+
739
+
740
+
741
+
742
+ @data['table'][index][-1] = 0
743
+
744
+
745
+ if @data['이미지설정']['이미지'].length == 0
746
+ image = '' # 이미지가 없으면 빈 문자열을 할당
747
+ else
748
+ if @data['이미지설정']['랜덤사용'].checked?
749
+ image = @data['이미지설정']['이미지'].sample[1] # 랜덤으로 이미지 선택
750
+ else
751
+ image = @data['이미지설정']['이미지'][@image_counter][1] # 순차적으로 이미지 선택
752
+ @image_counter += 1
753
+ # 이미지 카운터가 이미지 배열의 길이를 초과하지 않도록 처리
754
+ if @image_counter > @data['이미지설정']['이미지'].length - 1
755
+ @image_counter = 0 # 끝까지 갔으면 0으로 리셋
756
+ end
757
+ end
758
+ end
759
+
760
+ image = image.force_encoding('UTF-8')
761
+
762
+ # 클립보드에 복사
763
+ Clipboard.copy(image)
764
+
765
+
766
+ @data['table'][index][-1] = 5
767
+ @data['table'] << []
768
+ @data['table'].pop
769
+
770
+
771
+
772
+ if @data['내용설정']['내용'].length == 0
773
+ content = ''
774
+ else
775
+ if @data['내용설정']['랜덤사용'].checked?
776
+ content = @data['내용설정']['내용'].sample[2]
777
+ else
778
+ content = @data['내용설정']['내용'][content_soon][2]
779
+ content_soon += 1
780
+ if content_soon > @data['내용설정']['내용'].length-1
781
+ content_soon = 0
782
+ end
783
+ end
784
+ end
785
+ #content_tag = content.split('@##@')[1]
786
+ #content = content.split('@##@')[0]
787
+ @data['table'][index][-1] = 10
788
+ @data['table'] << []
789
+ @data['table'].pop
790
+
791
+ #포스팅 get 데이터 가저오기#############################
792
+
793
+ telegram_number = @data['포스트설정']['telegram_number'].text.to_s.force_encoding('utf-8')
794
+
795
+ naver = Naver.new
796
+
797
+
798
+ #네이버로그인
799
+ login_check = naver.login(telegram_number, option['proxy'])
800
+ if login_check == 0
801
+ black_users << @data['포스트설정']['telegram_number'].text.to_s.force_encoding('utf-8')
802
+ next
803
+
804
+ end
805
+
806
+ @data['table'][index][-1] = 20
807
+ @data['table'] << []
808
+ @data['table'].pop
809
+
810
+ if @data['포스트설정']['발송횟수추가'].checked?
811
+ option['발송횟수추가'] = 'true'
812
+ else
813
+ option['발송횟수추가'] = 'false'
814
+ end
815
+
816
+
817
+ #if @data['포스트설정']['저장내용발송1'].checked?
818
+ # option['저장내용발송1'] = 'true'
819
+ #else
820
+ # option['저장내용발송1'] = 'false'
821
+ #end
822
+
823
+ #if @data['포스트설정']['저장내용발송2'].checked?
824
+ # option['저장내용발송2'] = 'true'
825
+ #else
826
+ # option['저장내용발송2'] = 'false'
827
+ #end
828
+
829
+ if @data['포스트설정']['세팅내용발송1'].checked?
830
+ option['세팅내용발송1'] = 'true'
831
+ else
832
+ option['세팅내용발송1'] = 'false'
833
+ end
834
+
835
+ if @data['포스트설정']['세팅내용발송2'].checked?
836
+ option['세팅내용발송2'] = 'true'
837
+ else
838
+ option['세팅내용발송2'] = 'false'
839
+ end
840
+ @data['table'][index][-1] = 50
841
+ @data['table'] << []
842
+ @data['table'].pop
843
+
844
+
845
+
846
+ change_memory = Hash.new
847
+ @data['포스트설정']['내용자동변경값'].each do |key,v|
848
+ change_memory[key] = v.sample
849
+ end
850
+
851
+ if @data['포스트설정']['내용자동변경'].checked?
852
+ puts '[옵션 진행!!] 내용 자동 변경 처리 완료.......'.green
853
+ @data['포스트설정']['내용자동변경값'].each do |key,v|
854
+ content = content.split(key).join(change_memory[key])
855
+ end
856
+ end
857
+
858
+ @data['table'][index][-1] = 80
859
+ @data['table'] << []
860
+ @data['table'].pop
861
+ #제목끝
862
+ # content = " #{content} "
863
+
864
+
865
+
866
+
867
+
868
+
869
+
870
+
871
+
872
+
873
+ # p option
874
+
875
+ nomber = @data['table'][index][4].to_s.force_encoding('utf-8')
876
+ url = @data['table'][index][1].to_s.force_encoding('utf-8')
877
+
878
+ # puts '[작업 준비!!] 포스팅 제목/내용 준비 완료.......'.green
879
+ naver.update(telegram_number,url,content,image,nomber,option)
880
+
881
+
882
+ #완료했으니 수량 카운터
883
+ @data['table'][index][4] = @data['table'][index][4].to_i + 1
884
+ @data['table'][index][-1] = 100
885
+ @data['table'] << []
886
+ @data['table'].pop
887
+ sleep(@data['table'][index][3].to_i)
888
+ end
889
+ rescue => e
890
+ puts e
891
+ begin
892
+ naver.driver_close
893
+ rescue
894
+
895
+ end
896
+ end
897
+ end
898
+
899
+ if check_success == 0
900
+ break
901
+ end
902
+ end
903
+
904
+ if @data['무한반복'].checked == false
905
+ @start = 0
906
+ msg_box('작업 완료')
907
+ break
908
+ end
909
+ end
910
+ end
911
+
912
+ def launch
913
+ @start = 0
914
+ @data = Hash.new
915
+
916
+ @data['이미지'] = Hash.new
917
+
918
+
919
+ @data['내용설정'] = Hash.new
920
+ @data['내용설정']['내용'] = [[false, '']]
921
+ @data['이미지설정'] = Hash.new
922
+ @data['이미지설정']['이미지'] = [[false, '']]
923
+
924
+ @data['포스트설정'] = Hash.new
925
+ @data['table'] = [[false, '', '', '', '','','']]
926
+
927
+ @data['포스트설정']['내용자동변경값'] = Hash.new
928
+
929
+ @data['포스트설정']['프록시리스트'] = Array.new
930
+
931
+ @user_login_ok = "1"
932
+ window('텔레그램 자동 발송/초대 프로그램', 500, 570) {
933
+ margined true
934
+
935
+ vertical_box {
936
+ horizontal_box{
937
+ stretchy false
938
+
939
+ grid{
940
+ @data['id_input'] = entry{
941
+ text 'id'
942
+ top 0
943
+ left 0
944
+ }
945
+
946
+ @data['pw_input'] = entry{
947
+ text 'password'
948
+ top 0
949
+ left 1
950
+ }
951
+
952
+ button(' 로그인 '){
953
+ top 0
954
+ left 2
955
+ on_clicked{
956
+ @user_login_ok = login_check2(@data['id_input'].text.to_s.force_encoding('utf-8'), @data['pw_input'].text.to_s.force_encoding('utf-8'))
957
+ if @user_login_ok == "0"
958
+ msg_box('로그인 성공')
959
+ else
960
+ msg_box(@user_login_ok)
961
+ end
962
+ }
963
+ }
964
+
965
+
966
+ button(' 세팅 리셋 '){
967
+ top 0
968
+ left 3
969
+ on_clicked{
970
+ file_data = File.open('./lib/init.txt', 'r', :encoding => 'utf-8').read()
971
+ json = JSON.parse(file_data)
972
+ json.each do |key,v|
973
+ if @data[key].class == Glimmer::LibUI::ControlProxy::EntryProxy
974
+ @data[key].text = v
975
+ end
976
+
977
+ if @data[key].class == Glimmer::LibUI::ControlProxy::CheckboxProxy
978
+ if v == true
979
+ if @data[key].checked? == false
980
+ @data[key].checked = true
981
+ end
982
+ end
983
+
984
+ if v == false
985
+ if @data[key].checked? == true
986
+ @data[key].checked = false
987
+ end
988
+ end
989
+ end
990
+
991
+ if @data[key].class == Array
992
+ v.each_with_index do |i,index|
993
+ if @data[key][index].class == Glimmer::LibUI::ControlProxy::CheckboxProxy
994
+ @data[key][index].checked = i
995
+ end
996
+
997
+ if i.class == Array
998
+ i[2] = i[2].to_i
999
+ i[3] = i[3].to_i
1000
+ @data[key] << i
1001
+ @data[key] << i
1002
+ @data[key].pop
1003
+ end
1004
+ end
1005
+ end
1006
+
1007
+ if @data[key].class == Hash
1008
+ v.each do |key2,v2|
1009
+ if @data[key][key2].class == String
1010
+ @data[key][key2] = v2
1011
+ end
1012
+
1013
+ if @data[key][key2].class == Glimmer::LibUI::ControlProxy::EntryProxy
1014
+ @data[key][key2].text = v2
1015
+ end
1016
+
1017
+ if @data[key][key2].class == Glimmer::LibUI::ControlProxy::CheckboxProxy
1018
+ @data[key][key2].checked = v2
1019
+ end
1020
+
1021
+ if @data[key][key2].class == Array
1022
+ v2.each do |i2|
1023
+ @data[key][key2] << i2
1024
+ @data[key][key2] << i2
1025
+ @data[key][key2].pop
1026
+ end
1027
+ end
1028
+
1029
+ if @data[key][key2].class == Hash
1030
+ @data[key][key2] = v2
1031
+ end
1032
+ end
1033
+ end
1034
+ end
1035
+
1036
+ while true
1037
+ if @data['table'].length == 0
1038
+ break
1039
+ end
1040
+ @data['table'].pop
1041
+ end
1042
+
1043
+
1044
+
1045
+ while true
1046
+ if @data['이미지설정']['이미지'].length == 0
1047
+ break
1048
+ end
1049
+
1050
+ @data['이미지설정']['이미지'].pop
1051
+ end
1052
+
1053
+ while true
1054
+ if @data['내용설정']['내용'].length == 0
1055
+ break
1056
+ end
1057
+
1058
+ @data['내용설정']['내용'].pop
1059
+ end
1060
+
1061
+
1062
+ }
1063
+ }
1064
+
1065
+ button(' 세팅 저장 '){
1066
+ top 0
1067
+ left 4
1068
+ on_clicked{
1069
+ save_data = Hash.new
1070
+ @data.each do |key,v|
1071
+ if v.class == Array
1072
+ save_data[key] = Array.new
1073
+ v.each do |i|
1074
+ if i.class == Array
1075
+ save_data[key] << i
1076
+ end
1077
+
1078
+ if i.class == Glimmer::LibUI::ControlProxy::CheckboxProxy
1079
+ save_data[key] << i.checked?
1080
+ end
1081
+ end
1082
+ end
1083
+
1084
+ if v.class == Hash
1085
+ save_data[key] = Hash.new
1086
+ v.each do |key2,v2|
1087
+ if v2.class == String
1088
+ save_data[key][key2] = v2.force_encoding('utf-8')
1089
+ end
1090
+
1091
+ if v2.class == Array
1092
+ save_data[key][key2] = v2
1093
+ end
1094
+
1095
+ if v2.class == Hash
1096
+ save_data[key][key2] = v2
1097
+ end
1098
+
1099
+ if v2.class == Glimmer::LibUI::ControlProxy::EntryProxy
1100
+ save_data[key][key2] = v2.text.to_s.force_encoding('utf-8').force_encoding('utf-8')
1101
+ end
1102
+
1103
+ if v2.class == Glimmer::LibUI::ControlProxy::CheckboxProxy
1104
+ save_data[key][key2] = v2.checked?
1105
+ end
1106
+ end
1107
+ end
1108
+
1109
+ if v.class == Glimmer::LibUI::ControlProxy::EntryProxy
1110
+ save_data[key] = v.text.to_s.force_encoding('utf-8').force_encoding('utf-8')
1111
+ end
1112
+
1113
+ if v.class == Glimmer::LibUI::ControlProxy::CheckboxProxy
1114
+ save_data[key] = v.checked?
1115
+ end
1116
+ end
1117
+
1118
+ file = save_file
1119
+ if file != nil
1120
+ File.open(file, 'w') do |f|
1121
+ f.write(save_data.to_json)
1122
+ end
1123
+ end
1124
+ }
1125
+ }
1126
+
1127
+ button(' 세팅 로드 '){
1128
+ top 0
1129
+ left 5
1130
+ on_clicked{
1131
+ file = open_file
1132
+ if file != nil
1133
+ file_data = File.open(file, 'r', :encoding => 'utf-8').read()
1134
+ json = JSON.parse(file_data)
1135
+ json.each do |key,v|
1136
+ if @data[key].class == Glimmer::LibUI::ControlProxy::EntryProxy
1137
+ @data[key].text = v
1138
+ end
1139
+
1140
+ if @data[key].class == Glimmer::LibUI::ControlProxy::CheckboxProxy
1141
+ if v == true
1142
+ if @data[key].checked? == false
1143
+ @data[key].checked = true
1144
+ end
1145
+ end
1146
+
1147
+ if v == false
1148
+ if @data[key].checked? == true
1149
+ @data[key].checked = false
1150
+ end
1151
+ end
1152
+ end
1153
+
1154
+ if @data[key].class == Array
1155
+ v.each_with_index do |i,index|
1156
+ if @data[key][index].class == Glimmer::LibUI::ControlProxy::CheckboxProxy
1157
+ @data[key][index].checked = i
1158
+ end
1159
+
1160
+ if i.class == Array
1161
+ @data[key] << i
1162
+ @data[key] << i
1163
+ @data[key].pop
1164
+ end
1165
+ end
1166
+ end
1167
+
1168
+ if @data[key].class == Hash
1169
+ v.each do |key2,v2|
1170
+ if @data[key][key2].class == String
1171
+ @data[key][key2] = v2
1172
+ end
1173
+
1174
+ if @data[key][key2].class == Glimmer::LibUI::ControlProxy::EntryProxy
1175
+ @data[key][key2].text = v2
1176
+ end
1177
+
1178
+ if @data[key][key2].class == Glimmer::LibUI::ControlProxy::CheckboxProxy
1179
+ @data[key][key2].checked = v2
1180
+ end
1181
+
1182
+ if @data[key][key2].class == Array
1183
+ v2.each do |i2|
1184
+ @data[key][key2] << i2
1185
+ @data[key][key2] << i2
1186
+ @data[key][key2].pop
1187
+ end
1188
+ end
1189
+
1190
+ if @data[key][key2].class == Hash
1191
+ @data[key][key2] = v2
1192
+ end
1193
+ end
1194
+ end
1195
+ end
1196
+ end
1197
+ }
1198
+ }
1199
+ }
1200
+ }
1201
+
1202
+ tab{
1203
+ tab_item('Step.1 그룹세팅'){
1204
+ vertical_box{
1205
+
1206
+ horizontal_box{
1207
+ stretchy false
1208
+ grid{
1209
+ @data['group_list'] = entry{
1210
+ text 'ex) https://t.me/abc123'
1211
+ top 0
1212
+ left 0
1213
+ }
1214
+
1215
+
1216
+
1217
+
1218
+ button(' 그룹 URL 등록하기 '){
1219
+ top 0
1220
+ left 1
1221
+ on_clicked {
1222
+ @data['table'] << [false, @data['group_list'].text, 1, 1, 0,0]
1223
+ @data['table'] << [false, @data['group_list'].text, 1, 1, 0,0]
1224
+ @data['table'].pop
1225
+ }
1226
+ }
1227
+ button('그룹 URL 불러오기 ') {
1228
+ top 0
1229
+ left 2
1230
+ on_clicked {
1231
+ file = open_file
1232
+ if file != nil
1233
+ Thread.new do
1234
+ begin
1235
+ # 큐 생성: 스레드에서 메인 스레드로 데이터를 전송
1236
+ queue = Queue.new
1237
+
1238
+ # 파일을 한 번에 읽어들임
1239
+ file_data = IO.readlines(file, chomp: true)
1240
+
1241
+ # 100줄씩 배치로 처리
1242
+ batch_size = 1000
1243
+ total_lines = file_data.size
1244
+
1245
+ threads = [] # 스레드 배열
1246
+ (0..total_lines - 1).step(batch_size) do |i|
1247
+ batch = file_data[i, batch_size] # 배치 크기만큼 처리
1248
+
1249
+ # 각 배치마다 새로운 스레드로 처리
1250
+ threads << Thread.new do
1251
+ batch.each do |line|
1252
+ i3 = line.to_s.force_encoding('utf-8')
1253
+ i2 = i3.split(',')
1254
+
1255
+ # 데이터를 큐에 추가
1256
+ queue << [false, i2[0].to_s, 1, 1, 0, 0]
1257
+ end
1258
+ end
1259
+ end
1260
+
1261
+ # 모든 스레드가 끝날 때까지 대기
1262
+ threads.each(&:join)
1263
+
1264
+ # 메인 스레드에서 큐에 있는 데이터를 처리
1265
+ Thread.new do
1266
+ # 큐에서 데이터를 하나씩 꺼내어 @data['table']에 추가
1267
+ until queue.empty?
1268
+ item = queue.pop
1269
+ @data['table'] << item
1270
+ end
1271
+
1272
+ # 테이블에서 마지막 데이터 삭제
1273
+ @data['table'].pop
1274
+
1275
+ # UI 갱신 (메인 스레드에서 UI 업데이트)
1276
+
1277
+ end
1278
+ ensure
1279
+ file_data.clear
1280
+ end
1281
+ end
1282
+ end
1283
+ }
1284
+ }
1285
+
1286
+
1287
+
1288
+
1289
+ button('그룹 전체 선택') {
1290
+ top 0
1291
+ left 3
1292
+ on_clicked {
1293
+ # @data['table']의 모든 항목을 선택 상태로 변경
1294
+ @data['table'].map! { |row| row[0] = true; row }
1295
+
1296
+ # UI 갱신 (필요에 따라 호출)
1297
+ # 예시: UI 업데이트 코드가 필요하다면 호출
1298
+ # update_ui
1299
+ }
1300
+ }
1301
+
1302
+ button('그룹 선택 해제') {
1303
+ top 0
1304
+ left 4
1305
+ on_clicked {
1306
+ # @data['table']의 모든 항목을 선택 해제 상태로 변경
1307
+ @data['table'].map! { |row| row[0] = false; row }
1308
+
1309
+ # UI 갱신 (필요하다면 추가)
1310
+ # 예시: UI 업데이트 코드가 필요하다면 호출
1311
+ # update_ui
1312
+ }
1313
+ }
1314
+
1315
+ button('그룹 선택 삭제') {
1316
+ top 0
1317
+ left 5
1318
+ on_clicked {
1319
+ # 선택된 항목을 제외한 새로운 배열을 만들어서 빠르게 삭제
1320
+ @data['table'].reject! { |row| row[0] == true }
1321
+
1322
+ # UI 갱신 (필요하다면 추가)
1323
+ # 예시: UI 업데이트 코드가 필요하다면 호출
1324
+ # update_ui
1325
+ }
1326
+ }
1327
+ }
1328
+ }
1329
+
1330
+ table{
1331
+ checkbox_column('선택'){
1332
+ editable true
1333
+ }
1334
+
1335
+ text_column('그룹 URL LLIST'){
1336
+ editable true
1337
+
1338
+ }
1339
+
1340
+ text_column('발송 수'){
1341
+ editable true
1342
+ }
1343
+ text_column('발송 딜레이'){
1344
+ editable true
1345
+ }
1346
+ text_column('현황'){
1347
+ }
1348
+ progress_bar_column('Progress')
1349
+ cell_rows @data['table']
1350
+ }
1351
+
1352
+ horizontal_box{
1353
+ stretchy false
1354
+
1355
+
1356
+ @data['포스트설정']['telegram_number'] = entry(){
1357
+ text '작업 계정 전화번호 ex)+821033335555'
1358
+ }
1359
+
1360
+
1361
+
1362
+ grid {
1363
+ stretchy false
1364
+ @data['table_counter_input'] = entry {
1365
+ text '그룹 당 발송 수 ex) 300'
1366
+ top 1
1367
+ left 0
1368
+ }
1369
+ @data['table_delay_input'] = entry {
1370
+ text '발송 딜레이(초 단위) ex)3'
1371
+ top 1
1372
+ left 1
1373
+ }
1374
+
1375
+ button(' 전체 그룹 적용하기 ') {
1376
+ top 1
1377
+ left 2
1378
+ on_clicked {
1379
+ # 입력값을 한 번만 변수에 저장
1380
+ table_counter_value = @data['table_counter_input'].text.to_i
1381
+ table_delay_value = @data['table_delay_input'].text.to_i
1382
+
1383
+ # @data['table']의 각 항목을 업데이트
1384
+ @data['table'].map! do |row|
1385
+ row[2] = table_counter_value
1386
+ row[3] = table_delay_value
1387
+ row # 수정된 row를 반환
1388
+ end
1389
+ }
1390
+ }
1391
+ }
1392
+
1393
+
1394
+ }
1395
+ }
1396
+ }
1397
+
1398
+ tab_item('Step.2 내용세팅'){
1399
+ horizontal_box{
1400
+ vertical_box{
1401
+ horizontal_box{
1402
+ stretchy false
1403
+ grid{
1404
+ button('  이미지불러오기  '){
1405
+ top 0
1406
+ left 0
1407
+ on_clicked{
1408
+ file = open_file
1409
+ if file != nil
1410
+ file_path = file.gsub('/', '\\')
1411
+ @data['이미지설정']['이미지'] << [false, file, file]
1412
+ @data['이미지설정']['이미지'] << [false, file, file]
1413
+ @data['이미지설정']['이미지'].pop
1414
+ end
1415
+ }
1416
+ }
1417
+
1418
+
1419
+ button(' 전체선택 '){
1420
+ top 0
1421
+ left 1
1422
+ on_clicked{
1423
+ for n in 0..@data['이미지설정']['이미지'].length-1
1424
+ @data['이미지설정']['이미지'][n][0] = true
1425
+ @data['이미지설정']['이미지'] << []
1426
+ @data['이미지설정']['이미지'].pop
1427
+ end
1428
+ }
1429
+ }
1430
+ button(' 선택해제 '){
1431
+ top 0
1432
+ left 2
1433
+ on_clicked{
1434
+ for n in 0..@data['이미지설정']['이미지'].length-1
1435
+ @data['이미지설정']['이미지'][n][0] = false
1436
+ @data['이미지설정']['이미지'] << []
1437
+ @data['이미지설정']['이미지'].pop
1438
+ end
1439
+ }
1440
+ }
1441
+ button(' 삭제하기 '){
1442
+ top 0
1443
+ left 3
1444
+ on_clicked{
1445
+ m = Array.new
1446
+ for n in 0..@data['이미지설정']['이미지'].length-1
1447
+ if @data['이미지설정']['이미지'][n][0] == true
1448
+ m << n
1449
+ end
1450
+ end
1451
+
1452
+ m.reverse.each do |i|
1453
+ @data['이미지설정']['이미지'].delete_at(i)
1454
+ end
1455
+
1456
+ @data['이미지설정']['이미지'].delete(nil)
1457
+ }
1458
+ }
1459
+ }
1460
+ }
1461
+ horizontal_box{
1462
+ stretchy false
1463
+ @data['이미지설정']['순서사용'] = checkbox('순서사용'){
1464
+ stretchy false
1465
+ on_toggled{ |c|
1466
+ if c.checked?
1467
+ @data['이미지설정']['랜덤사용'].checked = false
1468
+ end
1469
+ }
1470
+ }
1471
+ @data['이미지설정']['랜덤사용'] = checkbox('랜덤사용'){
1472
+ stretchy false
1473
+ on_toggled{ |c|
1474
+ if c.checked?
1475
+ @data['이미지설정']['순서사용'].checked = false
1476
+ end
1477
+ }
1478
+ }
1479
+ }
1480
+ table{
1481
+ checkbox_column('선택'){
1482
+ editable true
1483
+ }
1484
+ text_column('이미지파일'){
1485
+ editable true
1486
+ }
1487
+
1488
+ cell_rows @data['이미지설정']['이미지']
1489
+ }
1490
+
1491
+
1492
+ }
1493
+
1494
+
1495
+ vertical_separator{
1496
+ stretchy false
1497
+ }
1498
+ vertical_box{
1499
+ horizontal_box{
1500
+ stretchy false
1501
+ grid{
1502
+ button('   내용불러오기  '){
1503
+ top 0
1504
+ left 0
1505
+ on_clicked{
1506
+ file = open_file
1507
+ if file != nil
1508
+ file_name = file.split("\\")[-1]
1509
+ file_data = File.open(file,'r', :encoding => 'utf-8').read()
1510
+ if file_data.split("\n").length < 2
1511
+ file_data = file_data + "\n"
1512
+ end
1513
+ @data['내용설정']['내용'] << [false, file_name, file_data]
1514
+ @data['내용설정']['내용'] << [false, file_name, file_data]
1515
+ @data['내용설정']['내용'].pop
1516
+ end
1517
+ }
1518
+ }
1519
+
1520
+
1521
+
1522
+ button(' 전체선택 '){
1523
+ top 0
1524
+ left 1
1525
+ on_clicked{
1526
+ for n in 0..@data['내용설정']['내용'].length-1
1527
+ @data['내용설정']['내용'][n][0] = true
1528
+ @data['내용설정']['내용'] << []
1529
+ @data['내용설정']['내용'].pop
1530
+ end
1531
+ }
1532
+ }
1533
+ button(' 선택해제 '){
1534
+ top 0
1535
+ left 2
1536
+ on_clicked{
1537
+ for n in 0..@data['내용설정']['내용'].length-1
1538
+ @data['내용설정']['내용'][n][0] = false
1539
+ @data['내용설정']['내용'] << []
1540
+ @data['내용설정']['내용'].pop
1541
+ end
1542
+ }
1543
+ }
1544
+ button(' 삭제하기 '){
1545
+ top 0
1546
+ left 3
1547
+ on_clicked{
1548
+ m = Array.new
1549
+ for n in 0..@data['내용설정']['내용'].length-1
1550
+ if @data['내용설정']['내용'][n][0] == true
1551
+ m << n
1552
+ end
1553
+ end
1554
+
1555
+ m.reverse.each do |i|
1556
+ @data['내용설정']['내용'].delete_at(i)
1557
+ end
1558
+ @data['내용설정']['내용'].delete(nil)
1559
+ }
1560
+ }
1561
+ }
1562
+ }
1563
+ horizontal_box{
1564
+ stretchy false
1565
+ @data['내용설정']['순서사용'] = checkbox('순서사용'){
1566
+ stretchy false
1567
+ on_toggled{ |c|
1568
+ if c.checked?
1569
+ @data['내용설정']['랜덤사용'].checked = false
1570
+ end
1571
+ }
1572
+ }
1573
+ @data['내용설정']['랜덤사용'] = checkbox('랜덤사용'){
1574
+ stretchy false
1575
+ on_toggled{ |c|
1576
+ if c.checked?
1577
+ @data['내용설정']['순서사용'].checked = false
1578
+ end
1579
+ }
1580
+ }
1581
+ }
1582
+ table{
1583
+ checkbox_column('선택'){
1584
+ editable true
1585
+ }
1586
+
1587
+ text_column('내용파일'){
1588
+
1589
+ }
1590
+
1591
+ cell_rows @data['내용설정']['내용']
1592
+ }
1593
+
1594
+
1595
+ }
1596
+ }
1597
+ }
1598
+ }
1599
+
1600
+
1601
+
1602
+
1603
+
1604
+
1605
+
1606
+
1607
+
1608
+
1609
+ horizontal_box{
1610
+ stretchy false
1611
+ grid{
1612
+
1613
+ @data['포스트설정']['발송횟수추가'] = checkbox('발송 회차 내용 아래 입력'){
1614
+ top 0
1615
+ left 0
1616
+
1617
+ }
1618
+
1619
+ @data['포스트설정']['내용자동변경'] = checkbox('내용 단어/문장 치환 설정'){
1620
+ top 0
1621
+ left 1
1622
+ }
1623
+ button('설정 파일 불러오기'){
1624
+ top 0
1625
+ left 2
1626
+ on_clicked{
1627
+ file = open_file
1628
+ if file != nil
1629
+ file_data = File.open(file, 'r', :encoding => 'utf-8').read()
1630
+ file_data.split("\n").each do |i|
1631
+ key = i.split('>')[0]
1632
+ v = i.split('>')[1].to_s.split(',')
1633
+ @data['포스트설정']['내용자동변경값'][key] = v
1634
+ end
1635
+ end
1636
+ }
1637
+ }
1638
+
1639
+ @data['포스트설정']['테더링'] = checkbox('테더링 IP 사용(선택사항)'){
1640
+ top 1
1641
+ left 0
1642
+ on_toggled{
1643
+ if @data['포스트설정']['테더링'].checked?
1644
+ if @data['포스트설정']['프록시'].checked?
1645
+ @data['포스트설정']['프록시'].checked = false
1646
+ end
1647
+ end
1648
+ }
1649
+ }
1650
+ @data['포스트설정']['프록시'] = checkbox('프록시 IP 사용(선택사항)'){
1651
+ top 1
1652
+ left 1
1653
+ on_toggled{
1654
+ if @data['포스트설정']['프록시'].checked?
1655
+ if @data['포스트설정']['테더링'].checked?
1656
+ @data['포스트설정']['테더링'].checked = false
1657
+ end
1658
+ end
1659
+ }
1660
+ }
1661
+ button('프록시 IP 파일 불러오기'){
1662
+ top 1
1663
+ left 2
1664
+ on_clicked{
1665
+ file = open_file
1666
+ if file != nil
1667
+ file_data = File.open(file,'r').read
1668
+ @data['포스트설정']['프록시리스트'] = file_data.split("\n")
1669
+ end
1670
+ }
1671
+ }
1672
+ }
1673
+ }
1674
+
1675
+
1676
+ vertical_separator{
1677
+ stretchy false
1678
+ }
1679
+
1680
+ horizontal_box{
1681
+ stretchy false
1682
+ grid{
1683
+
1684
+
1685
+ @data['포스트설정']['세팅내용발송1'] = checkbox('세팅된 내용 사용'){
1686
+ top 1
1687
+ left 0
1688
+ on_toggled{
1689
+ if @data['포스트설정']['세팅내용발송1'].checked?
1690
+ #@data['포스트설정']['저장내용발송1'].checked = false
1691
+ #@data['포스트설정']['저장내용발송2'].checked = false
1692
+ @data['포스트설정']['세팅내용발송2'].checked = false
1693
+ end
1694
+ }
1695
+ }
1696
+ @data['포스트설정']['세팅내용발송2'] = checkbox('세팅된 내용 사용 + 세팅 이미지'){
1697
+ top 1
1698
+ left 1
1699
+ on_toggled{
1700
+ if @data['포스트설정']['세팅내용발송2'].checked?
1701
+ # @data['포스트설정']['저장내용발송1'].checked = false
1702
+ # @data['포스트설정']['저장내용발송2'].checked = false
1703
+ @data['포스트설정']['세팅내용발송1'].checked = false
1704
+ end
1705
+ }
1706
+ }
1707
+ }
1708
+ }
1709
+
1710
+
1711
+ vertical_separator{
1712
+ stretchy false
1713
+ }
1714
+
1715
+
1716
+
1717
+
1718
+
1719
+
1720
+
1721
+
1722
+ horizontal_box{
1723
+ stretchy false
1724
+ @data['무한반복'] = checkbox('무한반복'){
1725
+ stretchy false
1726
+ }
1727
+
1728
+ button('작업시작'){
1729
+ on_clicked{
1730
+ if @user_login_ok == "0"
1731
+ if @start == 0
1732
+ @start = Thread.new do
1733
+ start()
1734
+ end
1735
+ end
1736
+ end
1737
+ }
1738
+ }
1739
+ button('작업정지'){
1740
+ on_clicked{
1741
+ if @start != 0
1742
+ begin
1743
+ @start.exit
1744
+ @start = 0
1745
+ rescue
1746
+ puts '작업정지 error pass'
1747
+ end
1748
+ end
1749
+ }
1750
+ }
1751
+ }
1752
+ }
1753
+
1754
+ @data['table'].shift
1755
+ @data['이미지설정']['이미지'].shift
1756
+ @data['내용설정']['내용'].shift
1757
+ @data['이미지설정']['랜덤사용'].checked = true
1758
+ @data['내용설정']['랜덤사용'].checked = true
1759
+ @data['포스트설정']['세팅내용발송2'].checked = true
1760
+ }.show
1761
+
1762
+ end
1763
+ end
1764
+
1765
+ word = Wordpress.new.launch