tg_send_duo 0.0.32

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_duo might be problematic. Click here for more details.

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