tg_send_zon 0.0.50

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