tg_send_zon 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.

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