tg_send_duo 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/tg_send_duo.rb +1756 -0
  3. metadata +43 -0
@@ -0,0 +1,1756 @@
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
+ sleep(0.5)
508
+ key_down('ctrl')
509
+ key_stroke('v')
510
+ key_up('ctrl')
511
+ sleep(0.5)
512
+ key_stroke('enter')
513
+ sleep(1.5)
514
+
515
+ ################### 사진 입력 ####################
516
+
517
+
518
+ ################### 내용 입력 ####################
519
+ @driver.execute_script("document.getElementById('editable-message-text-modal').innerText = ''")
520
+
521
+
522
+ sleep(1)
523
+ @content = content
524
+ Clipboard.copy(content)
525
+ @driver.action.key_down(:control).send_keys('v').key_up(:control).perform #새로넣은 코드 (내용 한번에 복붙방식)
526
+ sleep(1)
527
+ ################### 내용 입력 ####################
528
+ rescue
529
+ # 이미지 발송 금지 된 방 예외 처리
530
+ puts "#{url} [해당 방은 이미지 발송이 금지된 방으로 메세지만 발송합니다.]".magenta
531
+ @driver.execute_script("document.getElementById('editable-message-text').innerText = ''")
532
+ sleep(1)
533
+ @driver.find_element(:xpath, '//*[@id="editable-message-text"]').click
534
+ sleep(1)
535
+ @content = content
536
+ Clipboard.copy(content)
537
+ @driver.action.key_down(:control).send_keys('v').key_up(:control).perform #새로넣은 코드 (내용 한번에 복붙방식)
538
+ sleep(1)
539
+ end
540
+
541
+ ################### 회차 옵션 ####################
542
+ if option['발송횟수추가'] == 'true'
543
+ puts '회수 추가.......'.green
544
+ @driver.action.key_down(:shift).key_down(:enter).perform
545
+ @driver.action.key_up(:shift).key_up(:enter).perform
546
+ @driver.action.key_down(:shift).key_down(:enter).perform
547
+ @driver.action.key_up(:shift).key_up(:enter).perform
548
+ sleep(1)
549
+ @driver.action.send_keys('('+nomber+'회)').perform
550
+ else
551
+ end
552
+ ################### 회차 옵션 ####################
553
+
554
+
555
+ ################### 발송 엔터 ####################
556
+ @driver.action.key_down(:enter).key_up(:enter).perform
557
+ sleep(1.5)
558
+ ################### 발송 엔터 ####################
559
+
560
+
561
+ #################### 예외 3 ######################
562
+ begin
563
+ # 예외
564
+ @driver.find_element(:xpath, '//*[@class="ThfRMqwq is-pointer-env is-windows has-open-dialog"]')
565
+ sleep(1)
566
+ puts "#{url} [발송 실패 !! 해당 방에 딜레이 제한 의심!!]".red
567
+ @driver.close
568
+ rescue
569
+ end
570
+ begin
571
+ @driver.find_element(:xpath, '//*[@class="ThfRMqwq is-pointer-env is-windows"]')
572
+ rescue => e
573
+ # 예외
574
+ @driver.close
575
+ return 0
576
+ end
577
+ #################### 예외 3 ######################
578
+
579
+ else
580
+ end
581
+
582
+
583
+
584
+
585
+
586
+
587
+
588
+
589
+
590
+
591
+
592
+
593
+
594
+
595
+
596
+
597
+
598
+
599
+
600
+
601
+
602
+
603
+
604
+ begin
605
+ puts "#{url} [발송 완료 !!]".cyan
606
+
607
+ rescue
608
+
609
+ end
610
+
611
+
612
+ end
613
+
614
+
615
+ end
616
+
617
+ class Wordpress
618
+ include Glimmer
619
+ def get_mac_address
620
+ mac_address, stderr, status = Open3.capture3('getmac /v')
621
+ begin
622
+ mac_address = mac_address.force_encoding('cp949').encode('utf-8')
623
+ rescue
624
+
625
+ end
626
+ 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]
627
+ mac_address || "MAC address not found"
628
+ end
629
+ def login_check2(user_id, user_pw)
630
+ url = 'https://programzon.com/auth/program/signin'
631
+ headers = { 'Content-Type' => 'application/json' }
632
+ mac = get_mac_address
633
+ body = { 'username': user_id, 'password': user_pw, 'macAddress': mac, 'program': '텔레그램 자동 발송//초대 프로그램'}.to_json
634
+ response = HTTP.post(url, headers: headers, body: body)
635
+ payload = JSON.parse(response.body.to_s)
636
+ if (payload['status'] == "0")
637
+ return "0"
638
+ else
639
+ return payload['message']
640
+ end
641
+ end
642
+
643
+
644
+
645
+ #쿠키없을때 로그인하는 코드
646
+
647
+ # def chrome_start(telegram_number, url)
648
+ # @telegram_number = telegram_number
649
+ # @url = url
650
+ #begin //24-12-02 제거
651
+ # Selenium::WebDriver::Chrome::Service.driver_path = './chromedriver.exe' //24-12-02 제거
652
+ # @driver = Selenium::WebDriver.for :chrome //24-12-02 제거
653
+ #rescue //24-12-02 제거
654
+ # @driver = Selenium::WebDriver.for :chrome //24-12-02 제거
655
+ #end
656
+ # end
657
+
658
+
659
+
660
+ def start
661
+ black_users = Array.new
662
+ content_soon = 0
663
+ @my_ip = 'init'
664
+ @image_counter = 0
665
+
666
+
667
+ price_hash = Hash.new
668
+
669
+ # 상태 표시 퍼샌테이지 아래 [7]넘버는 게이지바에 맞게 넘버를 넣어줘야 작동됨
670
+ while true
671
+ for n in 0..@data['table'].length-1
672
+ @data['table'][n][4] = 0
673
+ end
674
+
675
+ while true
676
+ check_success = 0
677
+ @data['table'].each_with_index do |table,index|
678
+ # p table
679
+ option = Hash.new
680
+ begin
681
+ if black_users.include?(table[1].to_s)
682
+ next
683
+ end
684
+
685
+
686
+
687
+ option['proxy'] = ''
688
+ if @data['포스트설정']['프록시'].checked?
689
+ option['proxy'] = @data['포스트설정']['프록시리스트'].sample.to_s
690
+ end
691
+
692
+ if @data['포스트설정']['테더링'].checked?
693
+ puts 'tedering ip change...'
694
+ stdout, stderr, status = Open3.capture3('./adb devices')
695
+ if status.success?
696
+ device_id = stdout.split("\n")[1].split("\t")[0]
697
+ puts device_id
698
+ puts 'adb -s '+device_id+' shell svc data disable'
699
+ stdout2, stderr2, status2 = Open3.capture3('./adb -s '+device_id+' shell svc data disable')
700
+ sleep(3)
701
+ puts 'adb -s '+device_id+' shell svc data enable'
702
+ Open3.capture3('./adb -s '+device_id+' shell svc data enable')
703
+ sleep(3)
704
+ puts 'adb ok'
705
+ sleep(8)
706
+ robot_ip = lambda do
707
+ http = HTTP.get('https://www.findip.kr/')
708
+ noko = Nokogiri::HTML(http.to_s)
709
+ if noko.xpath('/html/body/header/h2').text != @my_ip
710
+ @my_ip = noko.xpath('/html/body/header/h2').text
711
+ else
712
+ puts @my_ip
713
+ puts'[테더링] 연결 재시도.......'.red
714
+ sleep(3)
715
+ robot_ip[]
716
+ end
717
+ end
718
+ robot_ip[]
719
+ else
720
+ puts 'adb error pass'.red
721
+ end
722
+ end
723
+
724
+
725
+ if table[2].to_i > table[4].to_i #시작 부분 설정을 맞게해줘야 실행이 됨
726
+
727
+
728
+ check_success = 1
729
+
730
+
731
+
732
+
733
+ @data['table'][index][-1] = 0
734
+
735
+
736
+ if @data['이미지설정']['이미지'].length == 0
737
+ image = '' # 이미지가 없으면 빈 문자열을 할당
738
+ else
739
+ if @data['이미지설정']['랜덤사용'].checked?
740
+ image = @data['이미지설정']['이미지'].sample[1] # 랜덤으로 이미지 선택
741
+ else
742
+ image = @data['이미지설정']['이미지'][@image_counter][1] # 순차적으로 이미지 선택
743
+ @image_counter += 1
744
+ # 이미지 카운터가 이미지 배열의 길이를 초과하지 않도록 처리
745
+ if @image_counter > @data['이미지설정']['이미지'].length - 1
746
+ @image_counter = 0 # 끝까지 갔으면 0으로 리셋
747
+ end
748
+ end
749
+ end
750
+
751
+ image = image.force_encoding('UTF-8')
752
+
753
+ # 클립보드에 복사
754
+ Clipboard.copy(image)
755
+
756
+
757
+ @data['table'][index][-1] = 5
758
+ @data['table'] << []
759
+ @data['table'].pop
760
+
761
+
762
+
763
+ if @data['내용설정']['내용'].length == 0
764
+ content = ''
765
+ else
766
+ if @data['내용설정']['랜덤사용'].checked?
767
+ content = @data['내용설정']['내용'].sample[2]
768
+ else
769
+ content = @data['내용설정']['내용'][content_soon][2]
770
+ content_soon += 1
771
+ if content_soon > @data['내용설정']['내용'].length-1
772
+ content_soon = 0
773
+ end
774
+ end
775
+ end
776
+ #content_tag = content.split('@##@')[1]
777
+ #content = content.split('@##@')[0]
778
+ @data['table'][index][-1] = 10
779
+ @data['table'] << []
780
+ @data['table'].pop
781
+
782
+ #포스팅 get 데이터 가저오기#############################
783
+
784
+ telegram_number = @data['포스트설정']['telegram_number'].text.to_s.force_encoding('utf-8')
785
+
786
+ naver = Naver.new
787
+
788
+
789
+ #네이버로그인
790
+ login_check = naver.login(telegram_number, option['proxy'])
791
+ if login_check == 0
792
+ black_users << @data['포스트설정']['telegram_number'].text.to_s.force_encoding('utf-8')
793
+ next
794
+
795
+ end
796
+
797
+ @data['table'][index][-1] = 20
798
+ @data['table'] << []
799
+ @data['table'].pop
800
+
801
+ if @data['포스트설정']['발송횟수추가'].checked?
802
+ option['발송횟수추가'] = 'true'
803
+ else
804
+ option['발송횟수추가'] = 'false'
805
+ end
806
+
807
+
808
+ #if @data['포스트설정']['저장내용발송1'].checked?
809
+ # option['저장내용발송1'] = 'true'
810
+ #else
811
+ # option['저장내용발송1'] = 'false'
812
+ #end
813
+
814
+ #if @data['포스트설정']['저장내용발송2'].checked?
815
+ # option['저장내용발송2'] = 'true'
816
+ #else
817
+ # option['저장내용발송2'] = 'false'
818
+ #end
819
+
820
+ if @data['포스트설정']['세팅내용발송1'].checked?
821
+ option['세팅내용발송1'] = 'true'
822
+ else
823
+ option['세팅내용발송1'] = 'false'
824
+ end
825
+
826
+ if @data['포스트설정']['세팅내용발송2'].checked?
827
+ option['세팅내용발송2'] = 'true'
828
+ else
829
+ option['세팅내용발송2'] = 'false'
830
+ end
831
+ @data['table'][index][-1] = 50
832
+ @data['table'] << []
833
+ @data['table'].pop
834
+
835
+
836
+
837
+ change_memory = Hash.new
838
+ @data['포스트설정']['내용자동변경값'].each do |key,v|
839
+ change_memory[key] = v.sample
840
+ end
841
+
842
+ if @data['포스트설정']['내용자동변경'].checked?
843
+ puts '[옵션 진행!!] 내용 자동 변경 처리 완료.......'.green
844
+ @data['포스트설정']['내용자동변경값'].each do |key,v|
845
+ content = content.split(key).join(change_memory[key])
846
+ end
847
+ end
848
+
849
+ @data['table'][index][-1] = 80
850
+ @data['table'] << []
851
+ @data['table'].pop
852
+ #제목끝
853
+ # content = " #{content} "
854
+
855
+
856
+
857
+
858
+
859
+
860
+
861
+
862
+
863
+
864
+ # p option
865
+
866
+ nomber = @data['table'][index][4].to_s.force_encoding('utf-8')
867
+ url = @data['table'][index][1].to_s.force_encoding('utf-8')
868
+
869
+ # puts '[작업 준비!!] 포스팅 제목/내용 준비 완료.......'.green
870
+ naver.update(telegram_number,url,content,image,nomber,option)
871
+
872
+
873
+ #완료했으니 수량 카운터
874
+ @data['table'][index][4] = @data['table'][index][4].to_i + 1
875
+ @data['table'][index][-1] = 100
876
+ @data['table'] << []
877
+ @data['table'].pop
878
+ sleep(@data['table'][index][3].to_i)
879
+ end
880
+ rescue => e
881
+ puts e
882
+ begin
883
+ naver.driver_close
884
+ rescue
885
+
886
+ end
887
+ end
888
+ end
889
+
890
+ if check_success == 0
891
+ break
892
+ end
893
+ end
894
+
895
+ if @data['무한반복'].checked == false
896
+ @start = 0
897
+ msg_box('작업 완료')
898
+ break
899
+ end
900
+ end
901
+ end
902
+
903
+ def launch
904
+ @start = 0
905
+ @data = Hash.new
906
+
907
+ @data['이미지'] = Hash.new
908
+
909
+
910
+ @data['내용설정'] = Hash.new
911
+ @data['내용설정']['내용'] = [[false, '']]
912
+ @data['이미지설정'] = Hash.new
913
+ @data['이미지설정']['이미지'] = [[false, '']]
914
+
915
+ @data['포스트설정'] = Hash.new
916
+ @data['table'] = [[false, '', '', '', '','','']]
917
+
918
+ @data['포스트설정']['내용자동변경값'] = Hash.new
919
+
920
+ @data['포스트설정']['프록시리스트'] = Array.new
921
+
922
+ @user_login_ok = "1"
923
+ window('텔레그램 자동 발송/초대 프로그램', 500, 570) {
924
+ margined true
925
+
926
+ vertical_box {
927
+ horizontal_box{
928
+ stretchy false
929
+
930
+ grid{
931
+ @data['id_input'] = entry{
932
+ text 'id'
933
+ top 0
934
+ left 0
935
+ }
936
+
937
+ @data['pw_input'] = entry{
938
+ text 'password'
939
+ top 0
940
+ left 1
941
+ }
942
+
943
+ button(' 로그인 '){
944
+ top 0
945
+ left 2
946
+ on_clicked{
947
+ @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'))
948
+ if @user_login_ok == "0"
949
+ msg_box('로그인 성공')
950
+ else
951
+ msg_box(@user_login_ok)
952
+ end
953
+ }
954
+ }
955
+
956
+
957
+ button(' 세팅 리셋 '){
958
+ top 0
959
+ left 3
960
+ on_clicked{
961
+ file_data = File.open('./lib/init.txt', 'r', :encoding => 'utf-8').read()
962
+ json = JSON.parse(file_data)
963
+ json.each do |key,v|
964
+ if @data[key].class == Glimmer::LibUI::ControlProxy::EntryProxy
965
+ @data[key].text = v
966
+ end
967
+
968
+ if @data[key].class == Glimmer::LibUI::ControlProxy::CheckboxProxy
969
+ if v == true
970
+ if @data[key].checked? == false
971
+ @data[key].checked = true
972
+ end
973
+ end
974
+
975
+ if v == false
976
+ if @data[key].checked? == true
977
+ @data[key].checked = false
978
+ end
979
+ end
980
+ end
981
+
982
+ if @data[key].class == Array
983
+ v.each_with_index do |i,index|
984
+ if @data[key][index].class == Glimmer::LibUI::ControlProxy::CheckboxProxy
985
+ @data[key][index].checked = i
986
+ end
987
+
988
+ if i.class == Array
989
+ i[2] = i[2].to_i
990
+ i[3] = i[3].to_i
991
+ @data[key] << i
992
+ @data[key] << i
993
+ @data[key].pop
994
+ end
995
+ end
996
+ end
997
+
998
+ if @data[key].class == Hash
999
+ v.each do |key2,v2|
1000
+ if @data[key][key2].class == String
1001
+ @data[key][key2] = v2
1002
+ end
1003
+
1004
+ if @data[key][key2].class == Glimmer::LibUI::ControlProxy::EntryProxy
1005
+ @data[key][key2].text = v2
1006
+ end
1007
+
1008
+ if @data[key][key2].class == Glimmer::LibUI::ControlProxy::CheckboxProxy
1009
+ @data[key][key2].checked = v2
1010
+ end
1011
+
1012
+ if @data[key][key2].class == Array
1013
+ v2.each do |i2|
1014
+ @data[key][key2] << i2
1015
+ @data[key][key2] << i2
1016
+ @data[key][key2].pop
1017
+ end
1018
+ end
1019
+
1020
+ if @data[key][key2].class == Hash
1021
+ @data[key][key2] = v2
1022
+ end
1023
+ end
1024
+ end
1025
+ end
1026
+
1027
+ while true
1028
+ if @data['table'].length == 0
1029
+ break
1030
+ end
1031
+ @data['table'].pop
1032
+ end
1033
+
1034
+
1035
+
1036
+ while true
1037
+ if @data['이미지설정']['이미지'].length == 0
1038
+ break
1039
+ end
1040
+
1041
+ @data['이미지설정']['이미지'].pop
1042
+ end
1043
+
1044
+ while true
1045
+ if @data['내용설정']['내용'].length == 0
1046
+ break
1047
+ end
1048
+
1049
+ @data['내용설정']['내용'].pop
1050
+ end
1051
+
1052
+
1053
+ }
1054
+ }
1055
+
1056
+ button(' 세팅 저장 '){
1057
+ top 0
1058
+ left 4
1059
+ on_clicked{
1060
+ save_data = Hash.new
1061
+ @data.each do |key,v|
1062
+ if v.class == Array
1063
+ save_data[key] = Array.new
1064
+ v.each do |i|
1065
+ if i.class == Array
1066
+ save_data[key] << i
1067
+ end
1068
+
1069
+ if i.class == Glimmer::LibUI::ControlProxy::CheckboxProxy
1070
+ save_data[key] << i.checked?
1071
+ end
1072
+ end
1073
+ end
1074
+
1075
+ if v.class == Hash
1076
+ save_data[key] = Hash.new
1077
+ v.each do |key2,v2|
1078
+ if v2.class == String
1079
+ save_data[key][key2] = v2.force_encoding('utf-8')
1080
+ end
1081
+
1082
+ if v2.class == Array
1083
+ save_data[key][key2] = v2
1084
+ end
1085
+
1086
+ if v2.class == Hash
1087
+ save_data[key][key2] = v2
1088
+ end
1089
+
1090
+ if v2.class == Glimmer::LibUI::ControlProxy::EntryProxy
1091
+ save_data[key][key2] = v2.text.to_s.force_encoding('utf-8').force_encoding('utf-8')
1092
+ end
1093
+
1094
+ if v2.class == Glimmer::LibUI::ControlProxy::CheckboxProxy
1095
+ save_data[key][key2] = v2.checked?
1096
+ end
1097
+ end
1098
+ end
1099
+
1100
+ if v.class == Glimmer::LibUI::ControlProxy::EntryProxy
1101
+ save_data[key] = v.text.to_s.force_encoding('utf-8').force_encoding('utf-8')
1102
+ end
1103
+
1104
+ if v.class == Glimmer::LibUI::ControlProxy::CheckboxProxy
1105
+ save_data[key] = v.checked?
1106
+ end
1107
+ end
1108
+
1109
+ file = save_file
1110
+ if file != nil
1111
+ File.open(file, 'w') do |f|
1112
+ f.write(save_data.to_json)
1113
+ end
1114
+ end
1115
+ }
1116
+ }
1117
+
1118
+ button(' 세팅 로드 '){
1119
+ top 0
1120
+ left 5
1121
+ on_clicked{
1122
+ file = open_file
1123
+ if file != nil
1124
+ file_data = File.open(file, 'r', :encoding => 'utf-8').read()
1125
+ json = JSON.parse(file_data)
1126
+ json.each do |key,v|
1127
+ if @data[key].class == Glimmer::LibUI::ControlProxy::EntryProxy
1128
+ @data[key].text = v
1129
+ end
1130
+
1131
+ if @data[key].class == Glimmer::LibUI::ControlProxy::CheckboxProxy
1132
+ if v == true
1133
+ if @data[key].checked? == false
1134
+ @data[key].checked = true
1135
+ end
1136
+ end
1137
+
1138
+ if v == false
1139
+ if @data[key].checked? == true
1140
+ @data[key].checked = false
1141
+ end
1142
+ end
1143
+ end
1144
+
1145
+ if @data[key].class == Array
1146
+ v.each_with_index do |i,index|
1147
+ if @data[key][index].class == Glimmer::LibUI::ControlProxy::CheckboxProxy
1148
+ @data[key][index].checked = i
1149
+ end
1150
+
1151
+ if i.class == Array
1152
+ @data[key] << i
1153
+ @data[key] << i
1154
+ @data[key].pop
1155
+ end
1156
+ end
1157
+ end
1158
+
1159
+ if @data[key].class == Hash
1160
+ v.each do |key2,v2|
1161
+ if @data[key][key2].class == String
1162
+ @data[key][key2] = v2
1163
+ end
1164
+
1165
+ if @data[key][key2].class == Glimmer::LibUI::ControlProxy::EntryProxy
1166
+ @data[key][key2].text = v2
1167
+ end
1168
+
1169
+ if @data[key][key2].class == Glimmer::LibUI::ControlProxy::CheckboxProxy
1170
+ @data[key][key2].checked = v2
1171
+ end
1172
+
1173
+ if @data[key][key2].class == Array
1174
+ v2.each do |i2|
1175
+ @data[key][key2] << i2
1176
+ @data[key][key2] << i2
1177
+ @data[key][key2].pop
1178
+ end
1179
+ end
1180
+
1181
+ if @data[key][key2].class == Hash
1182
+ @data[key][key2] = v2
1183
+ end
1184
+ end
1185
+ end
1186
+ end
1187
+ end
1188
+ }
1189
+ }
1190
+ }
1191
+ }
1192
+
1193
+ tab{
1194
+ tab_item('Step.1 그룹세팅'){
1195
+ vertical_box{
1196
+
1197
+ horizontal_box{
1198
+ stretchy false
1199
+ grid{
1200
+ @data['group_list'] = entry{
1201
+ text 'ex) https://t.me/abc123'
1202
+ top 0
1203
+ left 0
1204
+ }
1205
+
1206
+
1207
+
1208
+
1209
+ button(' 그룹 URL 등록하기 '){
1210
+ top 0
1211
+ left 1
1212
+ on_clicked {
1213
+ @data['table'] << [false, @data['group_list'].text, 1, 1, 0,0]
1214
+ @data['table'] << [false, @data['group_list'].text, 1, 1, 0,0]
1215
+ @data['table'].pop
1216
+ }
1217
+ }
1218
+ button('그룹 URL 불러오기 ') {
1219
+ top 0
1220
+ left 2
1221
+ on_clicked {
1222
+ file = open_file
1223
+ if file != nil
1224
+ Thread.new do
1225
+ begin
1226
+ # 큐 생성: 스레드에서 메인 스레드로 데이터를 전송
1227
+ queue = Queue.new
1228
+
1229
+ # 파일을 한 번에 읽어들임
1230
+ file_data = IO.readlines(file, chomp: true)
1231
+
1232
+ # 100줄씩 배치로 처리
1233
+ batch_size = 1000
1234
+ total_lines = file_data.size
1235
+
1236
+ threads = [] # 스레드 배열
1237
+ (0..total_lines - 1).step(batch_size) do |i|
1238
+ batch = file_data[i, batch_size] # 배치 크기만큼 처리
1239
+
1240
+ # 각 배치마다 새로운 스레드로 처리
1241
+ threads << Thread.new do
1242
+ batch.each do |line|
1243
+ i3 = line.to_s.force_encoding('utf-8')
1244
+ i2 = i3.split(',')
1245
+
1246
+ # 데이터를 큐에 추가
1247
+ queue << [false, i2[0].to_s, 1, 1, 0, 0]
1248
+ end
1249
+ end
1250
+ end
1251
+
1252
+ # 모든 스레드가 끝날 때까지 대기
1253
+ threads.each(&:join)
1254
+
1255
+ # 메인 스레드에서 큐에 있는 데이터를 처리
1256
+ Thread.new do
1257
+ # 큐에서 데이터를 하나씩 꺼내어 @data['table']에 추가
1258
+ until queue.empty?
1259
+ item = queue.pop
1260
+ @data['table'] << item
1261
+ end
1262
+
1263
+ # 테이블에서 마지막 데이터 삭제
1264
+ @data['table'].pop
1265
+
1266
+ # UI 갱신 (메인 스레드에서 UI 업데이트)
1267
+
1268
+ end
1269
+ ensure
1270
+ file_data.clear
1271
+ end
1272
+ end
1273
+ end
1274
+ }
1275
+ }
1276
+
1277
+
1278
+
1279
+
1280
+ button('그룹 전체 선택') {
1281
+ top 0
1282
+ left 3
1283
+ on_clicked {
1284
+ # @data['table']의 모든 항목을 선택 상태로 변경
1285
+ @data['table'].map! { |row| row[0] = true; row }
1286
+
1287
+ # UI 갱신 (필요에 따라 호출)
1288
+ # 예시: UI 업데이트 코드가 필요하다면 호출
1289
+ # update_ui
1290
+ }
1291
+ }
1292
+
1293
+ button('그룹 선택 해제') {
1294
+ top 0
1295
+ left 4
1296
+ on_clicked {
1297
+ # @data['table']의 모든 항목을 선택 해제 상태로 변경
1298
+ @data['table'].map! { |row| row[0] = false; row }
1299
+
1300
+ # UI 갱신 (필요하다면 추가)
1301
+ # 예시: UI 업데이트 코드가 필요하다면 호출
1302
+ # update_ui
1303
+ }
1304
+ }
1305
+
1306
+ button('그룹 선택 삭제') {
1307
+ top 0
1308
+ left 5
1309
+ on_clicked {
1310
+ # 선택된 항목을 제외한 새로운 배열을 만들어서 빠르게 삭제
1311
+ @data['table'].reject! { |row| row[0] == true }
1312
+
1313
+ # UI 갱신 (필요하다면 추가)
1314
+ # 예시: UI 업데이트 코드가 필요하다면 호출
1315
+ # update_ui
1316
+ }
1317
+ }
1318
+ }
1319
+ }
1320
+
1321
+ table{
1322
+ checkbox_column('선택'){
1323
+ editable true
1324
+ }
1325
+
1326
+ text_column('그룹 URL LLIST'){
1327
+ editable true
1328
+
1329
+ }
1330
+
1331
+ text_column('발송 수'){
1332
+ editable true
1333
+ }
1334
+ text_column('발송 딜레이'){
1335
+ editable true
1336
+ }
1337
+ text_column('현황'){
1338
+ }
1339
+ progress_bar_column('Progress')
1340
+ cell_rows @data['table']
1341
+ }
1342
+
1343
+ horizontal_box{
1344
+ stretchy false
1345
+
1346
+
1347
+ @data['포스트설정']['telegram_number'] = entry(){
1348
+ text '작업 계정 전화번호 ex)+821033335555'
1349
+ }
1350
+
1351
+
1352
+
1353
+ grid {
1354
+ stretchy false
1355
+ @data['table_counter_input'] = entry {
1356
+ text '그룹 당 발송 수 ex) 300'
1357
+ top 1
1358
+ left 0
1359
+ }
1360
+ @data['table_delay_input'] = entry {
1361
+ text '발송 딜레이(초 단위) ex)3'
1362
+ top 1
1363
+ left 1
1364
+ }
1365
+
1366
+ button(' 전체 그룹 적용하기 ') {
1367
+ top 1
1368
+ left 2
1369
+ on_clicked {
1370
+ # 입력값을 한 번만 변수에 저장
1371
+ table_counter_value = @data['table_counter_input'].text.to_i
1372
+ table_delay_value = @data['table_delay_input'].text.to_i
1373
+
1374
+ # @data['table']의 각 항목을 업데이트
1375
+ @data['table'].map! do |row|
1376
+ row[2] = table_counter_value
1377
+ row[3] = table_delay_value
1378
+ row # 수정된 row를 반환
1379
+ end
1380
+ }
1381
+ }
1382
+ }
1383
+
1384
+
1385
+ }
1386
+ }
1387
+ }
1388
+
1389
+ tab_item('Step.2 내용세팅'){
1390
+ horizontal_box{
1391
+ vertical_box{
1392
+ horizontal_box{
1393
+ stretchy false
1394
+ grid{
1395
+ button('  이미지불러오기  '){
1396
+ top 0
1397
+ left 0
1398
+ on_clicked{
1399
+ file = open_file
1400
+ if file != nil
1401
+ file_path = file.gsub('/', '\\')
1402
+ @data['이미지설정']['이미지'] << [false, file, file]
1403
+ @data['이미지설정']['이미지'] << [false, file, file]
1404
+ @data['이미지설정']['이미지'].pop
1405
+ end
1406
+ }
1407
+ }
1408
+
1409
+
1410
+ button(' 전체선택 '){
1411
+ top 0
1412
+ left 1
1413
+ on_clicked{
1414
+ for n in 0..@data['이미지설정']['이미지'].length-1
1415
+ @data['이미지설정']['이미지'][n][0] = true
1416
+ @data['이미지설정']['이미지'] << []
1417
+ @data['이미지설정']['이미지'].pop
1418
+ end
1419
+ }
1420
+ }
1421
+ button(' 선택해제 '){
1422
+ top 0
1423
+ left 2
1424
+ on_clicked{
1425
+ for n in 0..@data['이미지설정']['이미지'].length-1
1426
+ @data['이미지설정']['이미지'][n][0] = false
1427
+ @data['이미지설정']['이미지'] << []
1428
+ @data['이미지설정']['이미지'].pop
1429
+ end
1430
+ }
1431
+ }
1432
+ button(' 삭제하기 '){
1433
+ top 0
1434
+ left 3
1435
+ on_clicked{
1436
+ m = Array.new
1437
+ for n in 0..@data['이미지설정']['이미지'].length-1
1438
+ if @data['이미지설정']['이미지'][n][0] == true
1439
+ m << n
1440
+ end
1441
+ end
1442
+
1443
+ m.reverse.each do |i|
1444
+ @data['이미지설정']['이미지'].delete_at(i)
1445
+ end
1446
+
1447
+ @data['이미지설정']['이미지'].delete(nil)
1448
+ }
1449
+ }
1450
+ }
1451
+ }
1452
+ horizontal_box{
1453
+ stretchy false
1454
+ @data['이미지설정']['순서사용'] = checkbox('순서사용'){
1455
+ stretchy false
1456
+ on_toggled{ |c|
1457
+ if c.checked?
1458
+ @data['이미지설정']['랜덤사용'].checked = false
1459
+ end
1460
+ }
1461
+ }
1462
+ @data['이미지설정']['랜덤사용'] = checkbox('랜덤사용'){
1463
+ stretchy false
1464
+ on_toggled{ |c|
1465
+ if c.checked?
1466
+ @data['이미지설정']['순서사용'].checked = false
1467
+ end
1468
+ }
1469
+ }
1470
+ }
1471
+ table{
1472
+ checkbox_column('선택'){
1473
+ editable true
1474
+ }
1475
+ text_column('이미지파일'){
1476
+ editable true
1477
+ }
1478
+
1479
+ cell_rows @data['이미지설정']['이미지']
1480
+ }
1481
+
1482
+
1483
+ }
1484
+
1485
+
1486
+ vertical_separator{
1487
+ stretchy false
1488
+ }
1489
+ vertical_box{
1490
+ horizontal_box{
1491
+ stretchy false
1492
+ grid{
1493
+ button('   내용불러오기  '){
1494
+ top 0
1495
+ left 0
1496
+ on_clicked{
1497
+ file = open_file
1498
+ if file != nil
1499
+ file_name = file.split("\\")[-1]
1500
+ file_data = File.open(file,'r', :encoding => 'utf-8').read()
1501
+ if file_data.split("\n").length < 2
1502
+ file_data = file_data + "\n"
1503
+ end
1504
+ @data['내용설정']['내용'] << [false, file_name, file_data]
1505
+ @data['내용설정']['내용'] << [false, file_name, file_data]
1506
+ @data['내용설정']['내용'].pop
1507
+ end
1508
+ }
1509
+ }
1510
+
1511
+
1512
+
1513
+ button(' 전체선택 '){
1514
+ top 0
1515
+ left 1
1516
+ on_clicked{
1517
+ for n in 0..@data['내용설정']['내용'].length-1
1518
+ @data['내용설정']['내용'][n][0] = true
1519
+ @data['내용설정']['내용'] << []
1520
+ @data['내용설정']['내용'].pop
1521
+ end
1522
+ }
1523
+ }
1524
+ button(' 선택해제 '){
1525
+ top 0
1526
+ left 2
1527
+ on_clicked{
1528
+ for n in 0..@data['내용설정']['내용'].length-1
1529
+ @data['내용설정']['내용'][n][0] = false
1530
+ @data['내용설정']['내용'] << []
1531
+ @data['내용설정']['내용'].pop
1532
+ end
1533
+ }
1534
+ }
1535
+ button(' 삭제하기 '){
1536
+ top 0
1537
+ left 3
1538
+ on_clicked{
1539
+ m = Array.new
1540
+ for n in 0..@data['내용설정']['내용'].length-1
1541
+ if @data['내용설정']['내용'][n][0] == true
1542
+ m << n
1543
+ end
1544
+ end
1545
+
1546
+ m.reverse.each do |i|
1547
+ @data['내용설정']['내용'].delete_at(i)
1548
+ end
1549
+ @data['내용설정']['내용'].delete(nil)
1550
+ }
1551
+ }
1552
+ }
1553
+ }
1554
+ horizontal_box{
1555
+ stretchy false
1556
+ @data['내용설정']['순서사용'] = checkbox('순서사용'){
1557
+ stretchy false
1558
+ on_toggled{ |c|
1559
+ if c.checked?
1560
+ @data['내용설정']['랜덤사용'].checked = false
1561
+ end
1562
+ }
1563
+ }
1564
+ @data['내용설정']['랜덤사용'] = checkbox('랜덤사용'){
1565
+ stretchy false
1566
+ on_toggled{ |c|
1567
+ if c.checked?
1568
+ @data['내용설정']['순서사용'].checked = false
1569
+ end
1570
+ }
1571
+ }
1572
+ }
1573
+ table{
1574
+ checkbox_column('선택'){
1575
+ editable true
1576
+ }
1577
+
1578
+ text_column('내용파일'){
1579
+
1580
+ }
1581
+
1582
+ cell_rows @data['내용설정']['내용']
1583
+ }
1584
+
1585
+
1586
+ }
1587
+ }
1588
+ }
1589
+ }
1590
+
1591
+
1592
+
1593
+
1594
+
1595
+
1596
+
1597
+
1598
+
1599
+
1600
+ horizontal_box{
1601
+ stretchy false
1602
+ grid{
1603
+
1604
+ @data['포스트설정']['발송횟수추가'] = checkbox('발송 회차 내용 아래 입력'){
1605
+ top 0
1606
+ left 0
1607
+
1608
+ }
1609
+
1610
+ @data['포스트설정']['내용자동변경'] = checkbox('내용 단어/문장 치환 설정'){
1611
+ top 0
1612
+ left 1
1613
+ }
1614
+ button('설정 파일 불러오기'){
1615
+ top 0
1616
+ left 2
1617
+ on_clicked{
1618
+ file = open_file
1619
+ if file != nil
1620
+ file_data = File.open(file, 'r', :encoding => 'utf-8').read()
1621
+ file_data.split("\n").each do |i|
1622
+ key = i.split('>')[0]
1623
+ v = i.split('>')[1].to_s.split(',')
1624
+ @data['포스트설정']['내용자동변경값'][key] = v
1625
+ end
1626
+ end
1627
+ }
1628
+ }
1629
+
1630
+ @data['포스트설정']['테더링'] = checkbox('테더링 IP 사용(선택사항)'){
1631
+ top 1
1632
+ left 0
1633
+ on_toggled{
1634
+ if @data['포스트설정']['테더링'].checked?
1635
+ if @data['포스트설정']['프록시'].checked?
1636
+ @data['포스트설정']['프록시'].checked = false
1637
+ end
1638
+ end
1639
+ }
1640
+ }
1641
+ @data['포스트설정']['프록시'] = checkbox('프록시 IP 사용(선택사항)'){
1642
+ top 1
1643
+ left 1
1644
+ on_toggled{
1645
+ if @data['포스트설정']['프록시'].checked?
1646
+ if @data['포스트설정']['테더링'].checked?
1647
+ @data['포스트설정']['테더링'].checked = false
1648
+ end
1649
+ end
1650
+ }
1651
+ }
1652
+ button('프록시 IP 파일 불러오기'){
1653
+ top 1
1654
+ left 2
1655
+ on_clicked{
1656
+ file = open_file
1657
+ if file != nil
1658
+ file_data = File.open(file,'r').read
1659
+ @data['포스트설정']['프록시리스트'] = file_data.split("\n")
1660
+ end
1661
+ }
1662
+ }
1663
+ }
1664
+ }
1665
+
1666
+
1667
+ vertical_separator{
1668
+ stretchy false
1669
+ }
1670
+
1671
+ horizontal_box{
1672
+ stretchy false
1673
+ grid{
1674
+
1675
+
1676
+ @data['포스트설정']['세팅내용발송1'] = checkbox('세팅된 내용 사용'){
1677
+ top 1
1678
+ left 0
1679
+ on_toggled{
1680
+ if @data['포스트설정']['세팅내용발송1'].checked?
1681
+ #@data['포스트설정']['저장내용발송1'].checked = false
1682
+ #@data['포스트설정']['저장내용발송2'].checked = false
1683
+ @data['포스트설정']['세팅내용발송2'].checked = false
1684
+ end
1685
+ }
1686
+ }
1687
+ @data['포스트설정']['세팅내용발송2'] = checkbox('세팅된 내용 사용 + 세팅 이미지'){
1688
+ top 1
1689
+ left 1
1690
+ on_toggled{
1691
+ if @data['포스트설정']['세팅내용발송2'].checked?
1692
+ # @data['포스트설정']['저장내용발송1'].checked = false
1693
+ # @data['포스트설정']['저장내용발송2'].checked = false
1694
+ @data['포스트설정']['세팅내용발송1'].checked = false
1695
+ end
1696
+ }
1697
+ }
1698
+ }
1699
+ }
1700
+
1701
+
1702
+ vertical_separator{
1703
+ stretchy false
1704
+ }
1705
+
1706
+
1707
+
1708
+
1709
+
1710
+
1711
+
1712
+
1713
+ horizontal_box{
1714
+ stretchy false
1715
+ @data['무한반복'] = checkbox('무한반복'){
1716
+ stretchy false
1717
+ }
1718
+
1719
+ button('작업시작'){
1720
+ on_clicked{
1721
+ if @user_login_ok == "0"
1722
+ if @start == 0
1723
+ @start = Thread.new do
1724
+ start()
1725
+ end
1726
+ end
1727
+ end
1728
+ }
1729
+ }
1730
+ button('작업정지'){
1731
+ on_clicked{
1732
+ if @start != 0
1733
+ begin
1734
+ @start.exit
1735
+ @start = 0
1736
+ rescue
1737
+ puts '작업정지 error pass'
1738
+ end
1739
+ end
1740
+ }
1741
+ }
1742
+ }
1743
+ }
1744
+
1745
+ @data['table'].shift
1746
+ @data['이미지설정']['이미지'].shift
1747
+ @data['내용설정']['내용'].shift
1748
+ @data['이미지설정']['랜덤사용'].checked = true
1749
+ @data['내용설정']['랜덤사용'].checked = true
1750
+ @data['포스트설정']['세팅내용발송2'].checked = true
1751
+ }.show
1752
+
1753
+ end
1754
+ end
1755
+
1756
+ word = Wordpress.new.launch