posting_duo 0.0.52 → 0.0.53
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.
- checksums.yaml +4 -4
- data/lib/posting_duo.rb +282 -193
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc359a857b425b1365169ae81e5acded00d804db9806b4bd66bc1ff9c7aabbcf
|
4
|
+
data.tar.gz: a8005949efb1edb0b4b704138617bde7df718558e7c242f8ccc8c4a12d0c2074
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 483f55350ae4c9331afa45df6139fd633a4788215cf80b694742fbb82170243c53777f59412d2098dfa3cabdbc67fba211be35d43054eb43cfea9f9787d3d739
|
7
|
+
data.tar.gz: a78fef544d381d13dec78026e26c5bebbcec30c26cadf60bd6a288c393da2e02605d5e15b71484d23726f51ca4058ef5336427990bed9f2a6a4d12beb0fd4f63
|
data/lib/posting_duo.rb
CHANGED
@@ -18,9 +18,10 @@ require 'cgi'
|
|
18
18
|
require 'digest'
|
19
19
|
require 'auto_click'
|
20
20
|
require 'rainbow/refinement'
|
21
|
+
require 'watir'
|
22
|
+
require 'timeout'
|
21
23
|
include AutoClickMethods
|
22
24
|
using Rainbow
|
23
|
-
require 'watir'
|
24
25
|
|
25
26
|
|
26
27
|
|
@@ -48,16 +49,24 @@ class Naver
|
|
48
49
|
options.add_preference("credentials_enable_service", false) # 비밀번호 저장 기능 비활성화
|
49
50
|
options.add_preference("profile.default_content_setting_values.notifications", 2) # 알림 차단
|
50
51
|
options.add_argument("--disable-save-password-bubble") # 비밀번호 저장 팝업 차단
|
51
|
-
|
52
|
-
#
|
53
|
-
options.add_argument(
|
52
|
+
options.add_argument('--disable-software-rasterizer') # 소프트웨어 렌더링 비활성화
|
53
|
+
options.add_argument('--remote-debugging-port=9222') # 디버깅 포트 설정
|
54
|
+
options.add_argument("--disable-logging")
|
55
|
+
options.add_argument("--silent") # 로그를 최소화 (최소한의 경고만)
|
56
|
+
options.add_argument("--log-level=3") # LogLevel: 3 = ERROR
|
57
|
+
options.add_argument('--disable-blink-features=AutomationControlled') # JavaScript로 navigator.webdriver 숨기기
|
54
58
|
|
55
|
-
#
|
56
|
-
|
59
|
+
# 'capabilities'과 'options' 배열로 설정
|
60
|
+
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome
|
61
|
+
capabilities["goog:chromeOptions"] = options.as_json
|
62
|
+
|
63
|
+
# Selenium 4에서는 'capabilities'만 사용하는 방식
|
64
|
+
@driver = Selenium::WebDriver.for(:chrome, capabilities: [capabilities, options])
|
65
|
+
|
57
66
|
@driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: function(){ return false; }});") # 셀레니움 감지 방지
|
58
|
-
|
59
|
-
rescue
|
60
|
-
|
67
|
+
|
68
|
+
rescue => e
|
69
|
+
@driver = Selenium::WebDriver.for(:chrome, capabilities: [capabilities, options])
|
61
70
|
end
|
62
71
|
else
|
63
72
|
begin
|
@@ -83,12 +92,21 @@ class Naver
|
|
83
92
|
options.add_preference("credentials_enable_service", false) # 비밀번호 저장 기능 비활성화
|
84
93
|
options.add_preference("profile.default_content_setting_values.notifications", 2) # 알림 차단
|
85
94
|
options.add_argument("--disable-save-password-bubble") # 비밀번호 저장 팝업 차단
|
86
|
-
|
95
|
+
options.add_argument('--disable-software-rasterizer') # 소프트웨어 렌더링 비활성화
|
96
|
+
options.add_argument('--remote-debugging-port=9222') # 디버깅 포트 설정
|
97
|
+
options.add_argument("--disable-logging")
|
98
|
+
options.add_argument("--silent") # 로그를 최소화 (최소한의 경고만)
|
99
|
+
options.add_argument("--log-level=3") # LogLevel: 3 = ERROR
|
87
100
|
# JavaScript로 navigator.webdriver 숨기기
|
88
101
|
options.add_argument('--disable-blink-features=AutomationControlled')
|
89
102
|
|
90
|
-
#
|
91
|
-
|
103
|
+
# 'capabilities'과 'options' 배열로 설정
|
104
|
+
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome
|
105
|
+
capabilities["goog:chromeOptions"] = options.as_json
|
106
|
+
|
107
|
+
# Selenium 4에서는 'capabilities'만 사용하는 방식
|
108
|
+
@driver = Selenium::WebDriver.for(:chrome, capabilities: [capabilities, options])
|
109
|
+
|
92
110
|
@driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: function(){ return false; }});") # 셀레니움 감지 방지
|
93
111
|
|
94
112
|
rescue => e
|
@@ -113,13 +131,22 @@ class Naver
|
|
113
131
|
options.add_preference("credentials_enable_service", false) # 비밀번호 저장 기능 비활성화
|
114
132
|
options.add_preference("profile.default_content_setting_values.notifications", 2) # 알림 차단
|
115
133
|
options.add_argument("--disable-save-password-bubble") # 비밀번호 저장 팝업 차단
|
116
|
-
|
117
|
-
#
|
118
|
-
|
134
|
+
options.add_argument('--disable-software-rasterizer') # 소프트웨어 렌더링 비활성화
|
135
|
+
options.add_argument('--remote-debugging-port=9222') # 디버깅 포트 설정
|
136
|
+
options.add_argument("--disable-logging")
|
137
|
+
options.add_argument("--silent") # 로그를 최소화 (최소한의 경고만)
|
138
|
+
options.add_argument("--log-level=3") # LogLevel: 3 = ERROR
|
139
|
+
|
140
|
+
# 'capabilities'과 'options' 배열로 설정
|
141
|
+
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome
|
142
|
+
capabilities["goog:chromeOptions"] = options.as_json
|
143
|
+
|
144
|
+
# Selenium 4에서는 'capabilities'만 사용하는 방식
|
145
|
+
@driver = Selenium::WebDriver.for(:chrome, capabilities: [capabilities, options])
|
146
|
+
|
119
147
|
@driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: function(){ return false; }});") # 셀레니움 감지 방지
|
120
|
-
|
121
148
|
rescue
|
122
|
-
@driver = Selenium::WebDriver.for(:chrome,
|
149
|
+
@driver = Selenium::WebDriver.for(:chrome, capabilities: [capabilities, options])
|
123
150
|
end
|
124
151
|
end
|
125
152
|
end
|
@@ -197,8 +224,41 @@ begin
|
|
197
224
|
@driver.action.key_down(:control).send_keys('v').key_up(:control).perform
|
198
225
|
sleep(1)
|
199
226
|
@driver.find_element(:xpath, '/html/body/div/div[1]/table/tbody/tr[1]/td[3]/button').click
|
200
|
-
sleep(
|
201
|
-
|
227
|
+
sleep(1)
|
228
|
+
|
229
|
+
begin
|
230
|
+
wait = Selenium::WebDriver::Wait.new(timeout: 10)
|
231
|
+
wait.until do
|
232
|
+
begin
|
233
|
+
alert = @driver.switch_to.alert
|
234
|
+
alert.accept
|
235
|
+
true
|
236
|
+
rescue Selenium::WebDriver::Error::NoSuchAlertError
|
237
|
+
false
|
238
|
+
end
|
239
|
+
end
|
240
|
+
rescue Selenium::WebDriver::Error::TimeoutError
|
241
|
+
puts "alert이 없으므로 버튼 클릭"
|
242
|
+
@driver.find_element(:xpath, '/html/body/div/div[1]/table/tbody/tr[1]/td[3]/button').click
|
243
|
+
begin
|
244
|
+
wait = Selenium::WebDriver::Wait.new(timeout: 10)
|
245
|
+
wait.until do
|
246
|
+
begin
|
247
|
+
alert = @driver.switch_to.alert
|
248
|
+
alert.accept
|
249
|
+
true
|
250
|
+
rescue Selenium::WebDriver::Error::NoSuchAlertError
|
251
|
+
false
|
252
|
+
end
|
253
|
+
end
|
254
|
+
puts "두 번째 alert 처리 완료"
|
255
|
+
rescue Selenium::WebDriver::Error::TimeoutError
|
256
|
+
puts "두 번째 alert이 10초 내에 나타나지 않음. Chrome 종료."
|
257
|
+
system('taskkill /F /IM chrome.exe')
|
258
|
+
@driver.quit if @driver
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
202
262
|
|
203
263
|
rescue
|
204
264
|
begin
|
@@ -227,8 +287,40 @@ rescue
|
|
227
287
|
sleep(1)
|
228
288
|
begin
|
229
289
|
@driver.find_element(:class_name, 'default-btn').click
|
230
|
-
sleep(
|
231
|
-
|
290
|
+
sleep(1)
|
291
|
+
|
292
|
+
begin
|
293
|
+
wait = Selenium::WebDriver::Wait.new(timeout: 10)
|
294
|
+
wait.until do
|
295
|
+
begin
|
296
|
+
alert = @driver.switch_to.alert
|
297
|
+
alert.accept
|
298
|
+
true
|
299
|
+
rescue Selenium::WebDriver::Error::NoSuchAlertError
|
300
|
+
false
|
301
|
+
end
|
302
|
+
end
|
303
|
+
rescue Selenium::WebDriver::Error::TimeoutError
|
304
|
+
puts "alert이 없으므로 버튼 클릭"
|
305
|
+
@driver.find_element(:xpath, '/html/body/div/div[1]/table/tbody/tr[1]/td[3]/button').click
|
306
|
+
begin
|
307
|
+
wait = Selenium::WebDriver::Wait.new(timeout: 10)
|
308
|
+
wait.until do
|
309
|
+
begin
|
310
|
+
alert = @driver.switch_to.alert
|
311
|
+
alert.accept
|
312
|
+
true
|
313
|
+
rescue Selenium::WebDriver::Error::NoSuchAlertError
|
314
|
+
false
|
315
|
+
end
|
316
|
+
end
|
317
|
+
puts "두 번째 alert 처리 완료"
|
318
|
+
rescue Selenium::WebDriver::Error::TimeoutError
|
319
|
+
puts "두 번째 alert이 10초 내에 나타나지 않음. Chrome 종료."
|
320
|
+
system('taskkill /F /IM chrome.exe')
|
321
|
+
@driver.quit if @driver
|
322
|
+
end
|
323
|
+
end
|
232
324
|
|
233
325
|
rescue => e
|
234
326
|
@driver.window_handles.each do |handle|
|
@@ -237,7 +329,7 @@ rescue
|
|
237
329
|
# 로딩 중이거나, 페이지가 완전히 로딩되지 않더라도 탭을 닫기
|
238
330
|
@driver.close
|
239
331
|
rescue Selenium::WebDriver::Error::WebDriverError => e
|
240
|
-
puts "
|
332
|
+
puts "크롬 브라우저 종료: #{e.message}"
|
241
333
|
end
|
242
334
|
end
|
243
335
|
return 0
|
@@ -253,7 +345,7 @@ rescue
|
|
253
345
|
# 로딩 중이거나, 페이지가 완전히 로딩되지 않더라도 탭을 닫기
|
254
346
|
@driver.close
|
255
347
|
rescue Selenium::WebDriver::Error::WebDriverError => e
|
256
|
-
puts "
|
348
|
+
puts "크롬 브라우저 종료: #{e.message}"
|
257
349
|
end
|
258
350
|
end
|
259
351
|
return 0
|
@@ -278,53 +370,50 @@ sleep(2)
|
|
278
370
|
|
279
371
|
else
|
280
372
|
|
281
|
-
|
282
|
-
|
283
|
-
|
284
373
|
begin
|
374
|
+
wait = Selenium::WebDriver::Wait.new(timeout: 20) # 최대 20초 대기
|
375
|
+
wait.until { @driver.execute_script("return document.readyState") == "complete" } # 페이지가 완전히 로드될 때까지 기다림
|
285
376
|
@driver.get(signup_url)
|
286
|
-
sleep(
|
377
|
+
sleep(1)
|
287
378
|
puts '-[√] 회원가입 페이지 URL 이동.......'.magenta
|
379
|
+
begin
|
380
|
+
wait = Selenium::WebDriver::Wait.new(timeout: 3) # 3초 동안 대기
|
381
|
+
wait.until do
|
382
|
+
begin
|
383
|
+
@driver.switch_to.alert.accept
|
384
|
+
true
|
385
|
+
rescue Selenium::WebDriver::Error::NoSuchAlertError
|
386
|
+
false
|
387
|
+
end
|
388
|
+
end
|
389
|
+
rescue Selenium::WebDriver::Error::TimeoutError
|
390
|
+
end
|
288
391
|
rescue Selenium::WebDriver::Error::UnknownError => e
|
289
392
|
puts "#{signup_url} 해당 사이트의 문제로 접속이 불가능합니다." # 오류 메시지 출력
|
290
393
|
# 열린 모든 창을 닫음
|
291
394
|
@driver.window_handles.each do |handle|
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
395
|
+
@driver.switch_to.window(handle)
|
396
|
+
begin
|
397
|
+
@driver.close
|
398
|
+
rescue Selenium::WebDriver::Error::WebDriverError => e
|
399
|
+
puts "사이트 내부에 예외 발생: #{e.message}"
|
400
|
+
end
|
298
401
|
end
|
299
|
-
|
402
|
+
|
300
403
|
# 드라이버 종료
|
301
404
|
@driver.quit if @driver
|
302
405
|
return 0
|
406
|
+
rescue Selenium::WebDriver::Error::TimeoutError => e
|
407
|
+
puts "웹 페이지 로드가 시간 초과되었습니다: #{e.message}"
|
408
|
+
@driver.quit if @driver
|
409
|
+
return 0
|
410
|
+
rescue => e
|
411
|
+
puts "사이트 내부에 사이트 내부에 알 수 없는 오류 발생: #{e.message}"
|
412
|
+
@driver.quit if @driver
|
413
|
+
return 0
|
303
414
|
end
|
304
415
|
|
305
416
|
|
306
|
-
begin
|
307
|
-
# 요소 찾기 타임아웃을 10초로 설정
|
308
|
-
wait = Selenium::WebDriver::Wait.new(:timeout => 20)
|
309
|
-
#요소가 나타날 때까지 20초 동안 기다립니다.
|
310
|
-
wait.until { @driver.find_element(:xpath, '/html') }
|
311
|
-
@driver.find_element(:xpath, '/html')
|
312
|
-
rescue
|
313
|
-
begin
|
314
|
-
@driver.get(signup_url)
|
315
|
-
# 요소 찾기 타임아웃을 10초로 설정
|
316
|
-
wait = Selenium::WebDriver::Wait.new(:timeout => 20)
|
317
|
-
#요소가 나타날 때까지 20초 동안 기다립니다.
|
318
|
-
wait.until { @driver.find_element(:xpath, '/html') }
|
319
|
-
@driver.find_element(:xpath, '/html')
|
320
|
-
rescue => e
|
321
|
-
puts '-[√] 회원가입 1차 페이지 접속 시도 실패 (페이지 로딩 지연 및 접속 불량).......'.red
|
322
|
-
puts '-[√] 다음 작업 준비로 약 1초~60초 내외 시간이 소요됩니다.......'.red
|
323
|
-
puts e
|
324
|
-
@driver.close
|
325
|
-
return 0
|
326
|
-
end
|
327
|
-
end
|
328
417
|
|
329
418
|
|
330
419
|
|
@@ -2464,9 +2553,16 @@ end
|
|
2464
2553
|
end
|
2465
2554
|
|
2466
2555
|
begin
|
2467
|
-
|
2468
|
-
|
2469
|
-
|
2556
|
+
wait = Selenium::WebDriver::Wait.new(timeout: 3) # 3초 동안 대기
|
2557
|
+
wait.until do
|
2558
|
+
begin
|
2559
|
+
@driver.switch_to.alert.accept
|
2560
|
+
true
|
2561
|
+
rescue Selenium::WebDriver::Error::NoSuchAlertError
|
2562
|
+
false
|
2563
|
+
end
|
2564
|
+
end
|
2565
|
+
rescue Selenium::WebDriver::Error::TimeoutError
|
2470
2566
|
end
|
2471
2567
|
|
2472
2568
|
|
@@ -2486,55 +2582,53 @@ login_url = option['login_url'].to_s
|
|
2486
2582
|
if login_url == '' or login_url == '로그인 페이지 url'
|
2487
2583
|
|
2488
2584
|
else
|
2585
|
+
|
2489
2586
|
begin
|
2587
|
+
wait = Selenium::WebDriver::Wait.new(timeout: 20) # 최대 20초 대기
|
2588
|
+
wait.until { @driver.execute_script("return document.readyState") == "complete" } # 페이지가 완전히 로드될 때까지 기다림
|
2490
2589
|
@driver.get(login_url)
|
2491
|
-
sleep(
|
2492
|
-
puts '-[√]
|
2590
|
+
sleep(1)
|
2591
|
+
puts '-[√] 로그인 페이지 URL 이동.......'.magenta
|
2592
|
+
begin
|
2593
|
+
wait = Selenium::WebDriver::Wait.new(timeout: 3) # 3초 동안 대기
|
2594
|
+
wait.until do
|
2595
|
+
begin
|
2596
|
+
@driver.switch_to.alert.accept
|
2597
|
+
true
|
2598
|
+
rescue Selenium::WebDriver::Error::NoSuchAlertError
|
2599
|
+
false
|
2600
|
+
end
|
2601
|
+
end
|
2602
|
+
rescue Selenium::WebDriver::Error::TimeoutError
|
2603
|
+
end
|
2604
|
+
|
2493
2605
|
rescue Selenium::WebDriver::Error::UnknownError => e
|
2494
|
-
puts "#{
|
2606
|
+
puts "#{signup_url} 해당 사이트의 문제로 접속이 불가능합니다." # 오류 메시지 출력
|
2495
2607
|
# 열린 모든 창을 닫음
|
2496
2608
|
@driver.window_handles.each do |handle|
|
2497
|
-
|
2498
|
-
|
2499
|
-
|
2500
|
-
|
2501
|
-
|
2502
|
-
|
2609
|
+
@driver.switch_to.window(handle)
|
2610
|
+
begin
|
2611
|
+
@driver.close
|
2612
|
+
rescue Selenium::WebDriver::Error::WebDriverError => e
|
2613
|
+
puts "사이트 내부에 예외 발생: #{e.message}"
|
2614
|
+
end
|
2503
2615
|
end
|
2504
|
-
|
2616
|
+
|
2505
2617
|
# 드라이버 종료
|
2506
2618
|
@driver.quit if @driver
|
2507
2619
|
return 0
|
2620
|
+
rescue Selenium::WebDriver::Error::TimeoutError => e
|
2621
|
+
puts "웹 페이지 로드가 시간 초과되었습니다: #{e.message}"
|
2622
|
+
@driver.quit if @driver
|
2623
|
+
return 0
|
2624
|
+
rescue => e
|
2625
|
+
puts "사이트 내부에 알 수 없는 오류 발생: #{e.message}"
|
2626
|
+
@driver.quit if @driver
|
2627
|
+
return 0
|
2508
2628
|
end
|
2509
2629
|
|
2510
2630
|
|
2511
|
-
|
2512
|
-
# 요소 찾기 타임아웃을 10초로 설정
|
2513
|
-
wait = Selenium::WebDriver::Wait.new(:timeout => 20)
|
2514
|
-
#요소가 나타날 때까지 20초 동안 기다립니다.
|
2515
|
-
wait.until { @driver.find_element(:xpath, '/html') }
|
2516
|
-
@driver.find_element(:xpath, '/html')
|
2517
|
-
rescue
|
2518
|
-
begin
|
2519
|
-
new_login__url = @driver.current_url #현제 페이지 URL 추출
|
2520
|
-
sleep(1)
|
2521
|
-
@driver.get(new_login__url)
|
2522
|
-
# 요소 찾기 타임아웃을 10초로 설정
|
2523
|
-
wait = Selenium::WebDriver::Wait.new(:timeout => 20)
|
2524
|
-
#요소가 나타날 때까지 20초 동안 기다립니다.
|
2525
|
-
wait.until { @driver.find_element(:xpath, '/html') }
|
2526
|
-
@driver.find_element(:xpath, '/html')
|
2527
|
-
rescue => e
|
2528
|
-
puts '-[√] 로그인 페이지 접속 시도 실패 (페이지 로딩 지연 및 접속 불량).......'.red
|
2529
|
-
puts '-[√] 다음 작업 준비로 약 1초~60초 내외 시간이 소요됩니다.......'.red
|
2530
|
-
puts e
|
2531
|
-
@driver.close
|
2532
|
-
return 0
|
2533
|
-
end
|
2534
|
-
end
|
2535
|
-
|
2536
|
-
|
2537
|
-
|
2631
|
+
|
2538
2632
|
sleep(1)
|
2539
2633
|
##캡챠 해제 입력 코드 부분─────────────────────────────────────────────────────────────────────>
|
2540
2634
|
|
@@ -3445,7 +3539,7 @@ login_url = option['login_url'].to_s
|
|
3445
3539
|
# 로딩 중이거나, 페이지가 완전히 로딩되지 않더라도 탭을 닫기
|
3446
3540
|
@driver.close
|
3447
3541
|
rescue Selenium::WebDriver::Error::WebDriverError => e
|
3448
|
-
puts "
|
3542
|
+
puts "크롬 브라우저 종료: #{e.message}"
|
3449
3543
|
end
|
3450
3544
|
end
|
3451
3545
|
return 0
|
@@ -3666,10 +3760,17 @@ login_url = option['login_url'].to_s
|
|
3666
3760
|
end
|
3667
3761
|
##로그인 버튼 코드 부분─────────────────────────────────────────────────────────────────────<
|
3668
3762
|
begin
|
3669
|
-
|
3670
|
-
|
3671
|
-
|
3672
|
-
|
3763
|
+
wait = Selenium::WebDriver::Wait.new(timeout: 3) # 3초 동안 대기
|
3764
|
+
wait.until do
|
3765
|
+
begin
|
3766
|
+
@driver.switch_to.alert.accept
|
3767
|
+
true
|
3768
|
+
rescue Selenium::WebDriver::Error::NoSuchAlertError
|
3769
|
+
false
|
3770
|
+
end
|
3771
|
+
end
|
3772
|
+
rescue Selenium::WebDriver::Error::TimeoutError
|
3773
|
+
end
|
3673
3774
|
|
3674
3775
|
end
|
3675
3776
|
|
@@ -3695,58 +3796,50 @@ begin
|
|
3695
3796
|
|
3696
3797
|
else
|
3697
3798
|
|
3698
|
-
|
3699
3799
|
begin
|
3800
|
+
wait = Selenium::WebDriver::Wait.new(timeout: 20) # 최대 20초 대기
|
3801
|
+
wait.until { @driver.execute_script("return document.readyState") == "complete" } # 페이지가 완전히 로드될 때까지 기다림
|
3700
3802
|
@driver.get(cc_check_url)
|
3701
|
-
sleep(
|
3702
|
-
puts '-[√]
|
3803
|
+
sleep(1)
|
3804
|
+
puts '-[√] 출석체크 페이지 URL 이동.......'.magenta
|
3805
|
+
begin
|
3806
|
+
wait = Selenium::WebDriver::Wait.new(timeout: 3) # 3초 동안 대기
|
3807
|
+
wait.until do
|
3808
|
+
begin
|
3809
|
+
@driver.switch_to.alert.accept
|
3810
|
+
true
|
3811
|
+
rescue Selenium::WebDriver::Error::NoSuchAlertError
|
3812
|
+
false
|
3813
|
+
end
|
3814
|
+
end
|
3815
|
+
rescue Selenium::WebDriver::Error::TimeoutError
|
3816
|
+
end
|
3703
3817
|
rescue Selenium::WebDriver::Error::UnknownError => e
|
3704
|
-
puts "#{
|
3818
|
+
puts "#{signup_url} 해당 사이트의 문제로 접속이 불가능합니다." # 오류 메시지 출력
|
3705
3819
|
# 열린 모든 창을 닫음
|
3706
3820
|
@driver.window_handles.each do |handle|
|
3707
|
-
|
3708
|
-
|
3709
|
-
|
3710
|
-
|
3711
|
-
|
3712
|
-
|
3821
|
+
@driver.switch_to.window(handle)
|
3822
|
+
begin
|
3823
|
+
@driver.close
|
3824
|
+
rescue Selenium::WebDriver::Error::WebDriverError => e
|
3825
|
+
puts "사이트 내부에 예외 발생: #{e.message}"
|
3826
|
+
end
|
3713
3827
|
end
|
3714
|
-
|
3828
|
+
|
3715
3829
|
# 드라이버 종료
|
3716
3830
|
@driver.quit if @driver
|
3717
3831
|
return 0
|
3832
|
+
rescue Selenium::WebDriver::Error::TimeoutError => e
|
3833
|
+
puts "웹 페이지 로드가 시간 초과되었습니다: #{e.message}"
|
3834
|
+
@driver.quit if @driver
|
3835
|
+
return 0
|
3836
|
+
rescue => e
|
3837
|
+
puts "사이트 내부에 알 수 없는 오류 발생: #{e.message}"
|
3838
|
+
@driver.quit if @driver
|
3839
|
+
return 0
|
3718
3840
|
end
|
3719
3841
|
|
3720
|
-
begin
|
3721
|
-
sleep(1)
|
3722
|
-
@driver.switch_to.alert.accept
|
3723
|
-
rescue
|
3724
|
-
end
|
3725
3842
|
|
3726
|
-
begin
|
3727
|
-
# 요소 찾기 타임아웃을 10초로 설정
|
3728
|
-
wait = Selenium::WebDriver::Wait.new(:timeout => 20)
|
3729
|
-
#요소가 나타날 때까지 20초 동안 기다립니다.
|
3730
|
-
wait.until { @driver.find_element(:xpath, '/html') }
|
3731
|
-
@driver.find_element(:xpath, '/html')
|
3732
|
-
rescue
|
3733
|
-
begin
|
3734
|
-
new_check_url = @driver.current_url #현제 페이지 URL 추출
|
3735
|
-
sleep(1)
|
3736
|
-
@driver.get(new_check_url)
|
3737
|
-
# 요소 찾기 타임아웃을 10초로 설정
|
3738
|
-
wait = Selenium::WebDriver::Wait.new(:timeout => 20)
|
3739
|
-
#요소가 나타날 때까지 20초 동안 기다립니다.
|
3740
|
-
wait.until { @driver.find_element(:xpath, '/html') }
|
3741
|
-
@driver.find_element(:xpath, '/html')
|
3742
|
-
rescue => e
|
3743
|
-
puts '-[√] 출석체크 페이지 접속 시도 실패 (페이지 로딩 지연 및 접속 불량).......'.red
|
3744
|
-
puts '-[√] 다음 작업 준비로 약 1초~60초 내외 시간이 소요됩니다.......'.red
|
3745
|
-
puts e
|
3746
|
-
@driver.close
|
3747
|
-
return 0
|
3748
|
-
end
|
3749
|
-
end
|
3750
3843
|
|
3751
3844
|
|
3752
3845
|
sleep(1)
|
@@ -3926,10 +4019,17 @@ begin
|
|
3926
4019
|
|
3927
4020
|
##<─────────────────────────────────────────────────────────────────────출석 체크 입력 코드 부분
|
3928
4021
|
begin
|
3929
|
-
|
3930
|
-
|
3931
|
-
|
3932
|
-
|
4022
|
+
wait = Selenium::WebDriver::Wait.new(timeout: 3) # 3초 동안 대기
|
4023
|
+
wait.until do
|
4024
|
+
begin
|
4025
|
+
@driver.switch_to.alert.accept
|
4026
|
+
true
|
4027
|
+
rescue Selenium::WebDriver::Error::NoSuchAlertError
|
4028
|
+
false
|
4029
|
+
end
|
4030
|
+
end
|
4031
|
+
rescue Selenium::WebDriver::Error::TimeoutError
|
4032
|
+
end
|
3933
4033
|
|
3934
4034
|
|
3935
4035
|
end
|
@@ -3956,63 +4056,52 @@ post_url = option['post_url'].to_s
|
|
3956
4056
|
else
|
3957
4057
|
puts '-[√] 글쓰기 페이지 URL 이동.......'.magenta
|
3958
4058
|
|
3959
|
-
|
4059
|
+
|
3960
4060
|
begin
|
4061
|
+
wait = Selenium::WebDriver::Wait.new(timeout: 20) # 최대 20초 대기
|
4062
|
+
wait.until { @driver.execute_script("return document.readyState") == "complete" } # 페이지가 완전히 로드될 때까지 기다림
|
3961
4063
|
@driver.get(post_url)
|
3962
|
-
sleep(
|
3963
|
-
puts '-[√]
|
4064
|
+
sleep(1)
|
4065
|
+
puts '-[√] 글쓰기 페이지 URL 이동.......'.magenta
|
4066
|
+
begin
|
4067
|
+
wait = Selenium::WebDriver::Wait.new(timeout: 3) # 3초 동안 대기
|
4068
|
+
wait.until do
|
4069
|
+
begin
|
4070
|
+
@driver.switch_to.alert.accept
|
4071
|
+
true
|
4072
|
+
rescue Selenium::WebDriver::Error::NoSuchAlertError
|
4073
|
+
false
|
4074
|
+
end
|
4075
|
+
end
|
4076
|
+
rescue Selenium::WebDriver::Error::TimeoutError
|
4077
|
+
end
|
3964
4078
|
rescue Selenium::WebDriver::Error::UnknownError => e
|
3965
|
-
puts "#{
|
4079
|
+
puts "#{signup_url} 해당 사이트의 문제로 접속이 불가능합니다." # 오류 메시지 출력
|
3966
4080
|
# 열린 모든 창을 닫음
|
3967
4081
|
@driver.window_handles.each do |handle|
|
3968
|
-
|
3969
|
-
|
3970
|
-
|
3971
|
-
|
3972
|
-
|
3973
|
-
|
4082
|
+
@driver.switch_to.window(handle)
|
4083
|
+
begin
|
4084
|
+
@driver.close
|
4085
|
+
rescue Selenium::WebDriver::Error::WebDriverError => e
|
4086
|
+
puts "사이트 내부에 예외 발생: #{e.message}"
|
4087
|
+
end
|
3974
4088
|
end
|
3975
|
-
|
4089
|
+
|
3976
4090
|
# 드라이버 종료
|
3977
4091
|
@driver.quit if @driver
|
3978
4092
|
return 0
|
4093
|
+
rescue Selenium::WebDriver::Error::TimeoutError => e
|
4094
|
+
puts "웹 페이지 로드가 시간 초과되었습니다: #{e.message}"
|
4095
|
+
@driver.quit if @driver
|
4096
|
+
return 0
|
4097
|
+
rescue => e
|
4098
|
+
puts "사이트 내부에 알 수 없는 오류 발생: #{e.message}"
|
4099
|
+
@driver.quit if @driver
|
4100
|
+
return 0
|
3979
4101
|
end
|
3980
4102
|
|
3981
|
-
begin
|
3982
|
-
sleep(2)
|
3983
|
-
@driver.switch_to.alert.accept
|
3984
|
-
rescue
|
3985
|
-
end
|
3986
|
-
|
3987
|
-
|
3988
|
-
|
3989
4103
|
|
3990
4104
|
|
3991
|
-
begin
|
3992
|
-
# 요소 찾기 타임아웃을 10초로 설정
|
3993
|
-
wait = Selenium::WebDriver::Wait.new(:timeout => 20)
|
3994
|
-
#요소가 나타날 때까지 20초 동안 기다립니다.
|
3995
|
-
wait.until { @driver.find_element(:xpath, '/html') }
|
3996
|
-
@driver.find_element(:xpath, '/html')
|
3997
|
-
rescue
|
3998
|
-
begin
|
3999
|
-
new_post_url = @driver.current_url #현제 페이지 URL 추출
|
4000
|
-
sleep(1)
|
4001
|
-
@driver.get(new_post_url)
|
4002
|
-
# 요소 찾기 타임아웃을 10초로 설정
|
4003
|
-
wait = Selenium::WebDriver::Wait.new(:timeout => 20)
|
4004
|
-
#요소가 나타날 때까지 20초 동안 기다립니다.
|
4005
|
-
wait.until { @driver.find_element(:xpath, '/html') }
|
4006
|
-
@driver.find_element(:xpath, '/html')
|
4007
|
-
sleep(1)
|
4008
|
-
rescue => e
|
4009
|
-
puts '-[√] 글쓰기 페이지 접속 시도 실패 (페이지 로딩 지연 및 접속 불량).......'.red
|
4010
|
-
puts '-[√] 다음 작업 준비로 약 1초~60초 내외 시간이 소요됩니다.......'.red
|
4011
|
-
puts e
|
4012
|
-
@driver.close
|
4013
|
-
return 0
|
4014
|
-
end
|
4015
|
-
end
|
4016
4105
|
|
4017
4106
|
sleep(1)
|
4018
4107
|
begin
|
@@ -5731,7 +5820,7 @@ begin
|
|
5731
5820
|
@driver.close
|
5732
5821
|
|
5733
5822
|
rescue Selenium::WebDriver::Error::WebDriverError => e
|
5734
|
-
puts "
|
5823
|
+
puts "크롬 브라우저 종료: #{e.message}"
|
5735
5824
|
end
|
5736
5825
|
end
|
5737
5826
|
return 0
|
@@ -8732,7 +8821,7 @@ rescue
|
|
8732
8821
|
# 로딩 중이거나, 페이지가 완전히 로딩되지 않더라도 탭을 닫기
|
8733
8822
|
@driver.close
|
8734
8823
|
rescue Selenium::WebDriver::Error::WebDriverError => e
|
8735
|
-
puts "
|
8824
|
+
puts "크롬 브라우저 종료: #{e.message}"
|
8736
8825
|
end
|
8737
8826
|
end
|
8738
8827
|
return 0
|
@@ -8854,7 +8943,7 @@ rescue => e
|
|
8854
8943
|
@driver.close
|
8855
8944
|
|
8856
8945
|
rescue Selenium::WebDriver::Error::WebDriverError => e
|
8857
|
-
puts "
|
8946
|
+
puts "크롬 브라우저 종료: #{e.message}"
|
8858
8947
|
end
|
8859
8948
|
end
|
8860
8949
|
return 0
|
@@ -8870,7 +8959,7 @@ begin
|
|
8870
8959
|
@driver.close
|
8871
8960
|
|
8872
8961
|
rescue Selenium::WebDriver::Error::WebDriverError => e
|
8873
|
-
puts "
|
8962
|
+
puts "크롬 브라우저 종료: #{e.message}"
|
8874
8963
|
end
|
8875
8964
|
end
|
8876
8965
|
@driver.quit
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: posting_duo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.53
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- zon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-02-
|
11
|
+
date: 2025-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: File to Clipboard gem
|
14
14
|
email: mymin26@naver.com
|