tblog_duopack 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/tblog_duopack.rb +951 -947
  3. metadata +2 -2
data/lib/tblog_duopack.rb CHANGED
@@ -1,3 +1,4 @@
1
+
1
2
  require 'glimmer-dsl-libui'
2
3
  require 'selenium-webdriver'
3
4
  # require 'webdrivers'
@@ -17,16 +18,15 @@ require 'cgi'
17
18
  require 'digest'
18
19
  require 'auto_click'
19
20
  require 'rainbow/refinement'
21
+ require 'net/http'
22
+ require 'httparty'
20
23
  include AutoClickMethods
21
24
  using Rainbow
25
+ include Glimmer
22
26
 
23
27
 
24
28
 
25
29
 
26
-
27
- #driver.find_element(:class, 'highlight-java')
28
- # or
29
- #driver.find_element(:class_name, 'highlight-java')
30
30
  class Chat
31
31
  def initialize(api_key)
32
32
  @api_key = api_key
@@ -39,10 +39,11 @@ class Chat
39
39
  'Authorization' => 'Bearer ' + @api_key
40
40
  }
41
41
  d = {
42
- 'model' => 'gpt-3.5-turbo',
42
+ #'model' => 'gpt-3.5-turbo',
43
+ 'model' => 'gpt-4',
43
44
  'messages' => [{
44
45
  "role" => "assistant",
45
- "content" => keyword.to_s+" 소개하는 글을 1000자에서 2000자 사이로 만들어줘"
46
+ "content" => keyword.to_s+" 소개하는 글을 1500자에서 2500자 사이로 만들어줘"
46
47
  }]
47
48
  }
48
49
  answer = ''
@@ -73,10 +74,11 @@ class Chat
73
74
  'Authorization' => 'Bearer ' + @api_key
74
75
  }
75
76
  d = {
76
- 'model' => 'gpt-3.5-turbo',
77
+ #'model' => 'gpt-3.5-turbo',
78
+ 'model' => 'gpt-4',
77
79
  'messages' => [{
78
80
  "role" => "assistant",
79
- "content" => keyword.to_s+" 관련된 글을 1000자에서 2000자 사이로 만들어줘"
81
+ "content" => keyword.to_s+" 관련된 글을 1500자에서 2500자 사이로 만들어줘"
80
82
  }]
81
83
  }
82
84
  answer = ''
@@ -107,215 +109,237 @@ class Chat
107
109
  end
108
110
  end
109
111
 
110
- class Naver
111
- def initialize
112
- @seed = 1
113
- @cookie = ''
112
+ class Chat_title
113
+ def initialize(api_key)
114
+ @api_key = api_key
114
115
  end
115
-
116
- def chrome_start(proxy)
117
- if proxy == ''
118
- begin
119
- Selenium::WebDriver::Chrome::Service.driver_path = './chromedriver.exe'
120
- options = Selenium::WebDriver::Chrome::Options.new #(options: {"excludeSwitches" => ["enable-automation"]}) #자동화된 테스트...제거(options: {"excludeSwitches" => ["enable-automation"]})
121
- options.add_extension('./crx/app.crx')
122
- options.add_argument('--disable-blink-features=AutomationControlled')
123
- options.add_argument('--disable-popup-blocking')
124
- options.add_argument('--dns-prefetch-disable')
125
- options.add_argument('--disable-dev-shm-usage')
126
- options.add_argument('--disable-software-rasterizer')
127
- options.add_argument('--ignore-certificate-errors')
128
- options.add_argument('--disable-gpu') # GPU가속 끄기
129
- options.excludeSwitches('enable-automation') #자동화된 테스트...제거
130
- options.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36') # user-agent 위조
131
-
132
- options.add_argument('--disable-web-security')
133
- options.add_argument('--allow-running-insecure-content')
134
- options.add_argument('--ignore-certificate-errors')
135
- options.add_argument('--allow-insecure-localhost')
136
- options.add_argument('--no-sandbox')
137
-
138
- options.add_argument('--disable-translate')
139
- options.add_argument('--disable-extensions-file-access-check')
140
- options.add_argument('--disable-impl-side-painting')
141
-
142
-
143
116
 
144
- @driver = Selenium::WebDriver.for(:chrome, capabilities: options)
145
- rescue
146
- @driver = Selenium::WebDriver.for(:chrome, capabilities: options)
117
+ def message(title)
118
+ url = 'https://api.openai.com/v1/chat/completions'
119
+ headers = {
120
+ 'Content-Type' => 'application/json',
121
+ 'Authorization' => 'Bearer ' + @api_key
122
+ }
123
+ data = {
124
+ 'model' => 'gpt-4',
125
+ 'messages' => [{
126
+ "role" => "system",
127
+ "content" => "너는 매우 친절하고 성의 있게 답변하는 AI 어시스턴트야."
128
+ },
129
+ {
130
+ "role" => "user",
131
+ "content" => "#{title}\n위 문장을 비슷한 길이로 ChatGPT의 멘트는 빼고 표현을 더 추가해서 하나만 만들어줘."
132
+ }]
133
+ }
134
+
135
+ begin
136
+ req = HTTP.headers(headers).post(url, json: data)
137
+ puts "HTTP Status: #{req.status}" # 상태 코드 확인
138
+ response = JSON.parse(req.body.to_s)
139
+ puts "API Response: #{response}" # 전체 응답 출력
140
+
141
+ if req.status == 429
142
+ return "API 요청 제한을 초과했습니다. 플랜 및 할당량을 확인하세요."
147
143
  end
148
- else
149
- begin
150
- Selenium::WebDriver::Chrome::Service.driver_path = './chromedriver.exe'
151
- # profile = Selenium::WebDriver::Chrome::Profile.new
152
- # profile['network.proxy.type'] = 1
153
- # profile['network.proxy.http'] = proxy.split(':')[0]
154
- # profile['network.proxy.http_port'] = proxy.split(':')[1].to_i
155
- # options = Selenium::WebDriver::Chrome::Options.new
156
- # options.profile = profile
157
- options = Selenium::WebDriver::Chrome::Options.new #(options: {"excludeSwitches" => ["enable-automation"]}) #자동화된 테스트...제거(options: {"excludeSwitches" => ["enable-automation"]})
158
- options.add_argument '--proxy-server='+proxy.to_s.force_encoding('utf-8').to_s
159
- options.add_extension('./crx/app.crx')
160
- options.add_argument('--disable-blink-features=AutomationControlled')
161
- options.add_argument('--disable-popup-blocking')
162
- options.add_argument('--dns-prefetch-disable')
163
- options.add_argument('--disable-dev-shm-usage')
164
- options.add_argument('--disable-software-rasterizer')
165
- options.add_argument('--ignore-certificate-errors')
166
- options.add_argument('--disable-gpu') # GPU가속 끄기
167
- options.excludeSwitches('enable-automation') #자동화된 테스트...제거
168
- options.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36') # user-agent 위조
169
-
170
- options.add_argument('--disable-web-security')
171
- options.add_argument('--allow-running-insecure-content')
172
- options.add_argument('--ignore-certificate-errors')
173
- options.add_argument('--allow-insecure-localhost')
174
- options.add_argument('--no-sandbox')
175
-
176
- options.add_argument('--disable-translate')
177
- options.add_argument('--disable-extensions-file-access-check')
178
- options.add_argument('--disable-impl-side-painting')
179
-
180
144
 
181
- @driver = Selenium::WebDriver.for(:chrome, capabilities: options)
182
- rescue => e
183
- puts e
184
- puts 'proxy error...'
185
- begin
186
- Selenium::WebDriver::Chrome::Service.driver_path = './chromedriver.exe'
187
- options.add_extension('./crx/app.crx')
188
- options.add_argument('--disable-blink-features=AutomationControlled')
189
- options.add_argument('--disable-popup-blocking')
190
- options.add_argument('--dns-prefetch-disable')
191
- options.add_argument('--disable-dev-shm-usage')
192
- options.add_argument('--disable-software-rasterizer')
193
- options.add_argument('--ignore-certificate-errors')
194
- options.add_argument('--disable-gpu') # GPU가속 끄기
195
- options.excludeSwitches('enable-automation') #자동화된 테스트...제거
196
- options.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36') # user-agent 위조
197
-
198
- options.add_argument('--disable-web-security')
199
- options.add_argument('--allow-running-insecure-content')
200
- options.add_argument('--ignore-certificate-errors')
201
- options.add_argument('--allow-insecure-localhost')
202
- options.add_argument('--no-sandbox')
145
+ # 응답 데이터에서 안전하게 값 추출
146
+ answer = response.dig('choices', 0, 'message', 'content')
147
+ answer ||= (title) # 응답이 없을 경우 기본 메시지 설정
148
+ rescue => e
149
+ puts "Error: #{e.message}"
150
+ answer = "오류가 발생했습니다."
151
+ end
152
+
153
+ puts 'API return ==> '
154
+ puts answer
155
+ answer
156
+ end
157
+ end
158
+
159
+ class Chat_content
160
+ def initialize(api_key)
161
+ @api_key = api_key
162
+ end
163
+
164
+ def message(content)
203
165
 
204
- options.add_argument('--disable-translate')
205
- options.add_argument('--disable-extensions-file-access-check')
206
- options.add_argument('--disable-impl-side-painting')
166
+ url = 'https://api.openai.com/v1/chat/completions'
167
+ headers = {
168
+ 'Content-Type' => 'application/json',
169
+ 'Authorization' => 'Bearer ' + @api_key
170
+ }
171
+ data = {
172
+ 'model' => 'gpt-4',
173
+ 'messages' => [{
174
+ "role" => "system",
175
+ "content" => "너는 매우 친절하고 성의 있게 답변하는 AI 어시스턴트야."
176
+ },
177
+ {
178
+ "role" => "user",
179
+ "content" => "#{content}\nChatGPT의 멘트는 빼고 위 전체적인 내용의 형식을 똑같이 표현을 더 추가하고 유사어로 변경하여 하나 만들어줘! 전화번호,연락처,가격,홈페이지안내 ,상담안내 관련 문구는 유지해야해"
180
+ }]
181
+ }
207
182
 
208
- @driver = Selenium::WebDriver.for(:chrome, capabilities: options)
209
- rescue
210
- @driver = Selenium::WebDriver.for(:chrome, capabilities: options)
211
- end
183
+ begin
184
+ req = HTTP.headers(headers).post(url, json: data)
185
+ puts "HTTP Status: #{req.status}" # 상태 코드 확인
186
+ response = JSON.parse(req.body.to_s)
187
+ puts "API Response: #{response}" # 전체 응답 출력
188
+
189
+ if req.status == 429
190
+ return "API 요청 제한을 초과했습니다. 플랜 및 할당량을 확인하세요."
212
191
  end
192
+
193
+ # 응답 데이터에서 안전하게 값 추출
194
+ answer = response.dig('choices', 0, 'message', 'content')
195
+ answer ||= (content) # 응답이 없을 경우 기본 메시지 설정
196
+ rescue => e
197
+ puts "Error: #{e.message}"
198
+ answer = "오류가 발생했습니다."
213
199
  end
200
+
201
+ puts 'API return ==> '
202
+ puts answer
203
+ answer
204
+ end
205
+ end
206
+
207
+
208
+ #############################################gpt############################################
209
+
210
+ class Naver
211
+ def initialize
212
+ @seed = 1
213
+ @cookie = ''
214
214
  end
215
+
216
+ def chrome_start(proxy)
217
+ # 공통 옵션 설정
218
+ Selenium::WebDriver::Chrome::Service.driver_path = './chromedriver.exe'
219
+ options = Selenium::WebDriver::Chrome::Options.new
220
+
221
+ options.add_argument('--disable-blink-features=AutomationControlled')
222
+ options.add_argument('--disable-popup-blocking')
223
+ options.add_argument('--dns-prefetch-disable')
224
+ options.add_argument('--disable-dev-shm-usage')
225
+ options.add_argument('--disable-software-rasterizer')
226
+ options.add_argument('--ignore-certificate-errors')
227
+ options.add_argument('--disable-gpu') # GPU 가속 끄기
228
+ options.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36') # user-agent 위조
229
+ options.add_argument('--disable-web-security')
230
+ options.add_argument('--allow-running-insecure-content')
231
+ options.add_argument('--allow-insecure-localhost')
232
+ options.add_argument('--no-sandbox')
233
+ options.add_argument('--disable-translate')
234
+ options.add_argument('--disable-extensions-file-access-check')
235
+ options.add_argument('--disable-impl-side-painting')
236
+
237
+ # 자동화된 테스트 제거
238
+ options.exclude_switches = ['enable-automation'] # 'excludeSwitches'를 'exclude_switches'로 수정
239
+
240
+ prefs = {
241
+ "profile.password_manager_enabled" => false, # 비밀번호 관리자 비활성화
242
+ "credentials_enable_service" => false, # 비밀번호 저장 관련 기능 비활성화
243
+ "password_manager.enabled" => false, # 비밀번호 관리자 비활성화 (추가적인 설정)
244
+ "profile.managed_default_content_settings.cookies" => 2, # 쿠키 관련 팝업 차단
245
+ "profile.default_content_setting_values.notifications" => 2 # 알림 관련 팝업 차단
246
+ }
247
+ options.add_preference('prefs', prefs)
215
248
 
249
+ # Proxy가 설정되었으면 proxy 서버 설정
250
+ if proxy != ''
251
+ options.add_argument('--proxy-server=' + proxy.to_s.force_encoding('utf-8'))
252
+ end
253
+
254
+ # 브라우저 실행
255
+ begin
256
+ @driver = Selenium::WebDriver.for(:chrome, options: options)
257
+ @driver.get("https://www.tistory.com/auth/login")
258
+ rescue => e
259
+ puts "Error: #{e.message}"
260
+ puts 'Using default Chrome driver without proxy'
261
+ @driver = Selenium::WebDriver.for(:chrome, options: options)
262
+ @driver.get("https://www.tistory.com/auth/login")
263
+ end
264
+ end
216
265
 
266
+ def solve_captcha(captcha_api_key)
267
+ page_url = @driver.current_url
268
+ iframe_element = @driver.find_element(:css, "iframe[title='reCAPTCHA']")
269
+ iframe_src = iframe_element.attribute("src")
270
+
271
+ google_key = URI.parse(iframe_src).query.split("&").map { |param| param.split("=") }.to_h["k"]
272
+
273
+ raise "reCAPTCHA site key를 iframe에서 찾을 수 없습니다." if google_key.nil?
274
+
275
+ response = HTTParty.post("http://2captcha.com/in.php", body: {
276
+ method: 'userrecaptcha',
277
+ googlekey: google_key,
278
+ pageurl: page_url,
279
+ key: captcha_api_key,
280
+ json: 1
281
+ })
282
+
283
+ if response.code != 200 || JSON.parse(response.body)["status"] != 1
284
+ raise "2Captcha 요청에 실패했습니다. 응답: #{response.body}"
285
+ end
286
+
287
+ captcha_id = JSON.parse(response.body)["request"]
288
+
289
+ # CAPTCHA 해결을 기다립니다.
290
+ wait = Selenium::WebDriver::Wait.new(:timeout => 30)
291
+ result = nil
292
+
293
+ loop do
294
+ result = HTTParty.get("http://2captcha.com/res.php?key=#{captcha_api_key}&action=get&id=#{captcha_id}&json=1")
295
+ parsed_result = JSON.parse(result.body)
296
+
297
+ if parsed_result["status"] == 1
298
+ return parsed_result["request"]
299
+ elsif parsed_result["request"] != "CAPCHA_NOT_READY"
300
+ raise "2Captcha 에러 발생: #{parsed_result['request']}"
301
+ end
302
+ sleep(5) # 5초 간격으로 재시도
303
+ end
304
+ end
305
+
217
306
 
218
307
 
219
- def login(user_id, user_pw, proxy ,captcha_key)
308
+ def login(user_id, user_pw, proxy, captcha_api_key)
220
309
  chrome_start(proxy)
221
- sleep(2)
222
- @captcha_key = captcha_key
223
- @driver.get('chrome-extension://ifibfemgeogfhoebkmokieepdoobkbpo/options/options.html')
224
- sleep(3)
225
- begin
226
- @driver.switch_to.window(@driver.window_handles[1])
227
- @driver.close()
228
- rescue
229
- @driver.switch_to.window(@driver.window_handles[0])
230
- end
231
- sleep(2)
232
- # @driver.close()
233
- sleep(2)
234
- ####################탭나누기 수정중######################################
235
- begin
236
- puts '-[√] 투 캡챠 api 입력 시도 1.......'.green
237
- sleep(1)
238
- @driver.switch_to.window(@driver.window_handles[0])
239
- sleep(1)
240
- @driver.find_element(:xpath, '/html/body/div/div[1]/table/tbody/tr[1]/td[2]/input').click
241
- sleep(1)
242
- Clipboard.copy(captcha_key)
243
- @driver.action.key_down(:control).send_keys('v').key_up(:control).perform
244
- sleep(3)
245
- @driver.find_element(:xpath, '/html/body/div/div[1]/table/tbody/tr[1]/td[3]/button').click
246
- sleep(3)
247
- @driver.switch_to.alert.dismiss
248
- #팝업창 닫기
249
- #key_down('ctrl')
250
- #key_stroke('tab')
251
- #key_up('ctrl')
252
- #sleep(1)
253
- #@driver.close()
254
- rescue
255
- begin
256
- puts '-[√] 투 캡챠 api 입력 시도 2.......'.green
257
- sleep(1)
258
- @driver.switch_to.window(@driver.window_handles[0])
259
- sleep(1)
260
- @driver.find_element(:name, 'apiKey').click
261
- sleep(1)
262
- Clipboard.copy(captcha_key)
263
- @driver.action.key_down(:control).send_keys('v').key_up(:control).perform
264
- sleep(3)
265
- @driver.find_element(:class_name, 'default-btn').click
266
- sleep(3)
267
- @driver.switch_to.alert.dismiss
268
- #팝업창 닫기
269
- #key_down('ctrl')
270
- #key_stroke('tab')
271
- #key_up('ctrl')
272
- #sleep(1)
273
- #@driver.close()
274
- rescue
275
- begin
276
- @driver.quit()
277
- rescue
278
- end
279
- end
280
- end
281
- @driver.switch_to.window(@driver.window_handles[0])
282
- ####################탭나누기 수정중######################################
310
+ @captcha_api_key = captcha_api_key
283
311
  @user_id = user_id
284
- @user_id11 = user_id
285
- sleep(3)
286
- @driver.get('https://www.tistory.com/auth/login')
287
- sleep(3)
288
-
289
- user_cookie_file = Array.new
290
- begin
291
- Dir.entries('./cookie').each do |i|
292
- if i == '.' or i == '..'
293
312
 
294
- else
295
- user_cookie_file << i
313
+ user_cookie_file = []
314
+ begin
315
+ Dir.entries('./cookie').each do |i|
316
+ if i != '.' && i != '..'
317
+ user_cookie_file << i
296
318
  end
297
319
  end
298
320
  rescue
299
321
  end
300
322
 
301
- @cookie4 = Hash.new
323
+ @cookie4 = {}
302
324
  if user_cookie_file.include?(user_id+'.txt')
303
325
  f = File.open('./cookie/'+user_id+'.txt', 'r')
304
- @cookie4 = JSON.parse(f.read())
326
+ @cookie4 = JSON.parse(f.read)
305
327
  f.close
306
328
  end
307
329
 
330
+ # 기존 쿠키가 있으면 쿠키를 추가
308
331
  begin
309
332
  @cookie4.each do |i|
310
- p i
311
333
  @driver.manage.add_cookie(name: i['name'], value: i['value'], same_site: i['same_site'], domain: i['domain'], path: i['path'])
312
334
  end
313
335
  rescue
314
336
  end
315
-
316
- sleep(1)
337
+
317
338
  @driver.get('https://www.tistory.com/auth/login')
339
+ sleep(1)
318
340
  begin
341
+ wait = Selenium::WebDriver::Wait.new(:timeout => 3)
342
+ wait.until { @driver.find_element(:xpath, '//*[@id="cMain"]/div/div/div/div/a[2]/span[2]') }
319
343
  @driver.find_element(:xpath, '//*[@id="cMain"]/div/div/div/div/a[2]/span[2]').click
320
344
  check_cookie_login = 0
321
345
  rescue
@@ -323,122 +347,146 @@ class Naver
323
347
  end
324
348
 
325
349
  if check_cookie_login == 0
326
- sleep(3)
350
+ wait = Selenium::WebDriver::Wait.new(:timeout => 3)
351
+ wait.until { @driver.find_element(:xpath, '//*[@id="loginId--1"]') }
327
352
  @driver.find_element(:xpath, '//*[@id="loginId--1"]').click
328
353
  Clipboard.copy(user_id)
354
+ sleep(0.5)
329
355
  @driver.action.key_down(:control).send_keys('v').key_up(:control).perform
330
356
  puts '-[√] 1 아이디 입력.......'.yellow
331
- sleep(3)
357
+
358
+ wait = Selenium::WebDriver::Wait.new(:timeout => 3)
359
+ wait.until { @driver.find_element(:xpath, '//*[@id="password--2"]') }
332
360
  @driver.find_element(:xpath, '//*[@id="password--2"]').click
333
361
  Clipboard.copy(user_pw)
362
+ sleep(0.5)
334
363
  @driver.action.key_down(:control).send_keys('v').key_up(:control).perform
335
364
  puts '-[√] 2 비밀번호 입력.......'.yellow
336
- sleep(3)
365
+
366
+ wait = Selenium::WebDriver::Wait.new(:timeout => 3)
367
+ wait.until { @driver.find_element(:xpath, '//*[@type="submit"]') }
337
368
  @driver.find_element(:xpath, '//*[@type="submit"]').click
338
- #@driver.find_element(:xpath, '//*[@id="mainContent"]/div/div/form/div[4]/button[1]').click
339
369
  puts '-[√] 3 로그인 버튼 클릭.......'.yellow
340
-
341
- sleep(5)
342
370
 
343
-
344
- puts '-[√] 3 캡챠 발생 및 이메일 인증 유무 확인.......'.green
345
- sleep(1)
346
- puts '-[√] 3 캡챠 발생 및 이메일 인증 유무 확인.......'.green
347
- sleep(1)
348
- puts '-[√] 3 캡챠 발생 및 이메일 인증 유무 확인.......'.green
349
- sleep(1)
350
-
371
+ #예외 변수
372
+ begin
373
+ # CAPTCHA iframe 찾기
374
+ captcha_iframe = wait.until {
375
+ @driver.find_elements(:tag_name, "iframe").find do |iframe|
376
+ iframe.attribute("title") == "reCAPTCHA" || (iframe.attribute("src")&.include?("google.com/recaptcha"))
377
+ end
378
+ }
379
+ sleep(1)
380
+
381
+ # CAPTCHA iframe이 없다면 예외 처리
382
+ if captcha_iframe.nil?
383
+ puts 'CAPTCHA 없음, 로그인 진행 중...'.cyan
384
+ else
385
+ # CAPTCHA iframe으로 전환
386
+ @driver.switch_to.frame(captcha_iframe)
387
+ puts 'CAPTCHA iframe 전환 성공'.cyan
388
+ sleep(2)
389
+
390
+ # CAPTCHA 클릭
391
+ recaptcha_element = wait.until { @driver.find_element(:id, "recaptcha-anchor") }
392
+ recaptcha_element.click
393
+ puts 'CAPTCHA 클릭 완료'.cyan
394
+ sleep(3)
351
395
 
396
+ # CAPTCHA 해결
397
+ @captcha_api_key = captcha_api_key
398
+ captcha_answer = solve_captcha(@captcha_api_key)
399
+ puts "CAPTCHA 해결된 답: #{captcha_answer}".cyan
400
+ sleep(5)
401
+
402
+ # CAPTCHA 답 입력
403
+ begin
404
+ # 다시 `wait`을 사용하여 `g-recaptcha-response` 필드를 기다립니다
405
+ captcha_input = wait.until { @driver.find_element(:id, "g-recaptcha-response") }
406
+ @driver.execute_script("arguments[0].style.display = 'block';", captcha_input) # 숨겨진 CAPTCHA 입력 필드를 표시
407
+ captcha_input.send_keys(captcha_answer)
408
+ puts 'CAPTCHA 답 입력 완료'.cyan
409
+ rescue Selenium::WebDriver::Error::NoSuchElementError => e
410
+ puts "g-recaptcha-response 필드를 찾을 수 없습니다. 다시 시도해주세요.".red
411
+ raise e
412
+ end
413
+
414
+ # 로그인 버튼 다시 클릭
415
+ wait.until { @driver.find_element(:xpath, '//*[@class="btn_g highlight submit"]') }
416
+ @driver.find_element(:xpath, '//*[@class="btn_g highlight submit"]').click
417
+ puts '-[√] 3-3 로그인 버튼 다시 클릭.......'.cyan
418
+ end
419
+
420
+ rescue Selenium::WebDriver::Error::NoSuchElementError => e
421
+ puts 'CAPTCHA 없음, 로그인 진행 중...'.cyan
422
+ rescue => e
423
+ puts "로그인 처리 중 오류 발생: #{e.message}".red
424
+ end
352
425
 
353
426
 
354
- begin
355
- @driver.find_element(:xpath, '//*[@data-state="ready"]').click #캡챠우회버튼
356
- puts '-[√] 캡챠 해제 진행 중 (약 30~60 초 소요됩니다).......'.green
357
- sleep(10)
358
- begin
359
- @driver.find_element(:xpath, '//*[@data-state="error"]').click
360
- puts '-[√] 1 캡챠 해제 실패 !! API번호 및 포인트를 체크해주세요.......'.red
361
- puts '-[√] 2 캡챠 해제 실패 !! API번호 및 포인트를 체크해주세요.......'.red
362
- @driver.quit()
363
- rescue
364
-
365
- # 타임아웃을 77초로 설정
366
- wait = Selenium::WebDriver::Wait.new(:timeout => 100)
367
- # 요소가 나타날 때까지 100초 동안 기다립니다.
368
- wait.until { @driver.find_element(:xpath, '//*[@data-state="solved"]') }
369
- sleep(1)
370
- @driver.find_element(:xpath, '//*[@data-state="solved"]').click
371
- puts '-[√] 캡챠 해제 완료 → 이어서 진행 합니다.......'.green
372
- sleep(3)
373
- @driver.find_element(:xpath, '//*[@id="password--2"]').click #비번 클릭
374
- sleep(1)
375
- @driver.action.send_keys(:enter).perform #엔터키 주기
376
- sleep(5)
377
- end
378
- rescue
379
- puts '-[√] 캡챠 인증 없음 확인.......'.yellow
380
- sleep(1)
381
- end
382
-
383
-
384
-
385
- begin
386
- puts '-[√]'
387
- puts '-[√] 이메일 인증 체크 확인 중.......'.yellow
388
- sleep(2)
389
- # 타임아웃을 10초로 설정
390
- wait = Selenium::WebDriver::Wait.new(:timeout => 3)
391
- #요소가 나타날 때까지 3초 동안 기다립니다.
392
- wait.until { @driver.find_element(:xpath, '//*[@class="ico_comm ico_mail"]') }
393
- @driver.find_element(:xpath, '//*[@class="ico_comm ico_mail"]')
394
- print "이메일 인증 요구 발생!! 수동으로 인증 완료 후 여기에 엔터를 쳐주세요".cyan
395
- input = gets.chomp()
396
- rescue
397
- puts '-[√] 이메일 인증 없음 확인.......'.yellow
398
- sleep(1)
399
- end
400
-
427
+
428
+ # 아이디/비밀번호 오류 처리 부분
429
+ begin
430
+ @driver.find_element(:xpath, '//*[@class="desc_error"]')
431
+ sleep(1)
432
+ @driver.close
433
+ puts 'error = 아이디/비밀번호 오류'.yellow
434
+ rescue
435
+ end
401
436
 
402
437
 
403
- begin
404
- puts '-[√]'
405
- puts '-[√] 로그인 성공 여부 확인.......'.yellow
406
- @driver.get('https://www.tistory.com')
407
- sleep(2)
408
- # 타임아웃을 77초로 설정
409
- wait = Selenium::WebDriver::Wait.new(:timeout => 10)
410
- # 요소가 나타날 때까지 10초 동안 기다립니다.
411
- wait.until { @driver.find_element(:xpath, '//*[@class="thumb_profile"]') }
412
- sleep(1)
413
- @driver.find_element(:xpath, '//*[@class="thumb_profile"]').click
414
- puts '-[√] 로그인 성공 완료 포스팅 준비 중 .......'.yellow
415
- sleep(1)
416
- rescue
417
- puts '-[]'
418
- puts '-[√] 로그인 실패 확인 !! 종료 후 다음 작업 실행 준비.......'.red
419
- puts '-[√] 다음 작업이 준비중이니 1~60 초 정도 기다려주세요.......'.green
420
- sleep(1)
421
- @driver.quit()
422
- end
438
+ #예외 변수
439
+ begin
440
+ # 타임아웃을 10초로 설정
441
+ wait = Selenium::WebDriver::Wait.new(:timeout => 1)
442
+ #요소가 나타날 때까지 3초 동안 기다립니다.
443
+ wait.until { @driver.find_element(:xpath, '//*[@class="ico_comm ico_mail"]') }
444
+ @driver.find_element(:xpath, '//*[@class="ico_comm ico_mail"]')
445
+ print "이메일 인증 요구 발생!! 수동으로 인증 완료 후 여기에 엔터를 쳐주세요".cyan
446
+ input = gets.chomp()
447
+ rescue
448
+ end
449
+
450
+ #예외 변수
451
+ begin
452
+ @driver.find_element(:xpath, '//*[@class="link_comm link_g"]').click
453
+ puts '비밀번호 요청 다음에하기 클릭'.yellow
454
+ sleep(1)
455
+ rescue
456
+ end
457
+
458
+ #예외 변수
459
+ begin
460
+ @driver.find_element(:xpath, '//*[@class="inner_error inner_error_type2"]')
461
+ puts 'error = 평소와 다른 로그인이 감지되어 추가 인증이 필요합니다.'.yellow
462
+ sleep(1)
463
+ @driver.close
464
+ rescue
465
+ end
466
+
423
467
  end
424
468
 
425
469
  @cookie = ''
426
- cookie2 = Array.new
470
+ cookie2 = []
427
471
  @driver.manage.all_cookies.each do |i|
428
- puts i
429
- @cookie += i[:name]+'='+i[:value]+'; '
430
472
  cookie2 << i
431
473
  end
432
474
 
475
+ # 쿠키 만료 시간을 1년으로 설정
476
+ cookie2.each do |cookie|
477
+ cookie[:expiry] = Time.now.to_i + 365 * 24 * 60 * 60 # 만료 시간을 1년 후로 설정
478
+ end
479
+
433
480
  File.open('./cookie/'+user_id+'.txt', 'w') do |ff|
434
481
  ff.write(cookie2.to_json)
435
482
  end
436
483
  end
437
-
438
484
 
439
485
  sleep(2)
440
486
 
441
- def update(title, content, option, dd_time, url, keyword)
487
+
488
+
489
+ def update(title, content, option, dd_time, url, keyword, captcha_api_key)
442
490
  puts 'start...'.yellow
443
491
  puts(url)
444
492
  sleep(1)
@@ -448,11 +496,10 @@ class Naver
448
496
 
449
497
 
450
498
  begin
451
- #@driver.switch_to.window(@driver.window_handles[1])
499
+
452
500
  @driver.switch_to.alert.dismiss
453
501
  rescue
454
- #@driver.switch_to.window(@driver.window_handles[0])
455
- #@driver.switch_to.alert.dismiss
502
+
456
503
  end
457
504
 
458
505
  sleep(1)
@@ -489,7 +536,8 @@ class Naver
489
536
  rescue => e
490
537
  puts '-[√] 카테고리 ERROR 발생.......'.red
491
538
  puts '-[√] 다음 작업이 준비중이니 1~60 초 정도 기다려주세요.......'.green
492
- puts e
539
+ @driver.close
540
+ return 0
493
541
  end
494
542
 
495
543
 
@@ -503,8 +551,10 @@ class Naver
503
551
 
504
552
  begin
505
553
  @driver.find_element(:xpath, '//*[@id="post-title-inp"]').send_keys(title)
506
- rescue
507
- puts '-[√] 페이지 로드(로딩)시간 초과로 작업을 중지합니다.......'.red
554
+ rescue => e
555
+ @driver.close
556
+ return 0
557
+ puts '-[√] 페이지 로드(로딩)시간 초과 및 알수없는 오류로 종료.......'.red
508
558
  puts '-[√] 다음 작업이 준비중이니 1~60 초 정도 기다려주세요.......'.green
509
559
  puts e
510
560
  end
@@ -517,61 +567,26 @@ class Naver
517
567
 
518
568
  sleep(1)
519
569
 
570
+ begin
571
+ @driver.find_element(:xpath, '//*[@id="mceu_9-button"]').click()
572
+ @driver.find_element(:xpath, '//*[@id="mceu_9-button"]').click()
573
+ rescue => e
574
+ @driver.close
575
+ return 0
576
+ puts '-[√] 페이지 로드(로딩)시간 초과 및 알수없는 오류로 종료.......'.red
577
+ puts '-[√] 다음 작업이 준비중이니 1~60 초 정도 기다려주세요.......'.green
578
+
579
+ end
520
580
 
521
- @driver.find_element(:xpath, '//*[@id="mceu_9-button"]').click()
522
- @driver.find_element(:xpath, '//*[@id="mceu_9-button"]').click()
523
-
524
581
 
525
582
  puts content
526
583
  noko = Nokogiri::HTML(content, nil, Encoding::UTF_8.to_s)
527
584
  toomung = 0
528
585
  h = Hash.new
529
- # h[:authority] = 'blog.naver.com'
530
- # h[:method] = 'POST'
531
- # h[:path] = '/RabbitWrite.naver'
532
- # h[:scheme] = 'https'
533
- # h['accept'] = 'application/json, text/plain, */*'
534
- # h['accept-encoding'] = 'gzip, deflate, br'
535
- # h['accept-language'] = 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7'
536
- # h['content-type'] = 'application/x-www-form-urlencoded'
537
- # h['cookie'] = @cookie
538
- # h['origin'] = 'https://blog.naver.com'
539
- # h['referer'] = 'https://blog.naver.com/'+@user_id+'/postwrite?categoryNo=1'
540
- # h['sec-ch-ua'] = '"Chromium";v="106", "Google Chrome";v="106", "Not;A=Brand";v="99"'
541
- # h['sec-ch-ua-mobile'] = '?0'
542
- # h['sec-ch-ua-platform'] = '"Windows"'
543
- # h['sec-fetch-dest'] = 'empty'
544
- # h['sec-fetch-mode'] = 'cors'
545
- # h['sec-fetch-site'] = 'same-origin'
546
- # h['user-agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36'
586
+
547
587
 
548
588
  data = Hash.new
549
- # data['blogId'] = @user_id
550
- # data['documentModel'] = Hash.new
551
- # data['documentModel']['documentId'] = ''
552
- # data['documentModel']['document'] = Hash.new
553
- # data['documentModel']['document']['version'] = '2.6.0'
554
- # data['documentModel']['document']['theme'] = 'default'
555
- # data['documentModel']['document']['language'] = 'ko-KR'
556
- # data['documentModel']['document']['components'] = Array.new
557
- # data['documentModel']['document']['components'][0] = {
558
- # 'id' => create_id(),
559
- # 'layout' => 'default',
560
- # 'title' => [
561
- # {
562
- # 'id' => create_id(),
563
- # 'nodes' => [{
564
- # 'id' => create_id(),
565
- # 'value' => title,
566
- # '@ctype' => 'textNode'
567
- # }],
568
- # '@ctype' => 'paragraph'
569
- # }
570
- # ],
571
- # 'subTitle' => nil,
572
- # 'align' => 'left',
573
- # '@ctype' => 'documentTitle'
574
- # }
589
+
575
590
 
576
591
  check_position = 1
577
592
  noko.css('p').each do |i|
@@ -971,7 +986,7 @@ class Naver
971
986
  end
972
987
 
973
988
 
974
- #######################################여기까지 복원코드#########################################################
989
+
975
990
 
976
991
 
977
992
  #링크 넣는 코드 ↓
@@ -1042,22 +1057,7 @@ class Naver
1042
1057
  end
1043
1058
  end
1044
1059
  end
1045
- #@driver.switch_to.frame(@driver.find_element(:xpath, '//*[@id="editor-tistory_ifr"]'))
1046
- #아이프레임 선택
1047
- #sleep(0.5)
1048
- #@driver.find_element(:xpath, '//*[@id="tinymce"]/p').click
1049
- #아이프레임에서 코드 선택
1050
- #sleep(0.5)
1051
- #@driver.action.key_down(:control).key_down(:end).perform
1052
- #sleep(0.5)
1053
- #@driver.action.key_up(:control).key_up(:end).perform
1054
- #sleep(0.5)
1055
- #@driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
1056
- #sleep(0.5)
1057
- #@driver.switch_to.default_content()
1058
- #sleep(0.5)
1059
- #아이프레임 나오기
1060
-
1060
+
1061
1061
 
1062
1062
 
1063
1063
  @driver.action.key_down(:end).key_up(:end).perform
@@ -1069,24 +1069,6 @@ class Naver
1069
1069
 
1070
1070
  sleep(1)
1071
1071
 
1072
-
1073
- #sleep(1)
1074
- #@driver.action.key_down(:end).key_up(:end).perform
1075
- #sleep(0.5)
1076
- #@driver.action.key_down(:enter).key_up(:enter).perform
1077
-
1078
- #sleep(1)
1079
- ## 줄바꿈~~~~~~~~
1080
-
1081
-
1082
-
1083
- #@driver.find_element(:xpath, '/html/body/div[1]/div/main/div/div[1]').click
1084
- #빈공간 클릭
1085
- #sleep(1)
1086
- #@driver.action.key_down(:end).key_up(:end).perform
1087
- #스크롤 내리기
1088
- #sleep(1)
1089
-
1090
1072
  end
1091
1073
 
1092
1074
 
@@ -1181,30 +1163,32 @@ class Naver
1181
1163
  if option['전체공개'] == 'false'
1182
1164
  puts '-[√] 전체공개 선택.......'.yellow
1183
1165
  begin
1184
- sleep(2)
1166
+
1185
1167
  @driver.find_element(:xpath, '//*[@id="open20"]').click
1168
+ sleep(2)
1186
1169
  rescue
1187
1170
  end
1188
1171
  end
1189
- sleep(2)
1172
+
1190
1173
 
1191
1174
  if option['비공개'] == 'false'
1192
1175
  puts '-[√] 비공개 선택.......'.yellow
1193
1176
  begin
1194
- sleep(2)
1195
1177
  @driver.find_element(:xpath, '//*[@id="open0"]').click
1178
+ sleep(2)
1196
1179
  rescue
1197
1180
  end
1198
1181
  end
1199
- sleep(2)
1182
+
1200
1183
 
1201
1184
  if option['댓글허용'] == 'false'
1202
1185
  puts '-[√] 댓글허용 선택.......'.yellow
1203
1186
  begin
1204
- sleep(2)
1187
+
1205
1188
  @driver.find_element(:xpath, '//*[@class="mce-btn-type1"]').click
1206
1189
  sleep(2)
1207
1190
  @driver.find_element(:partial_link_text, '댓글 허용').click
1191
+ sleep(2)
1208
1192
  rescue
1209
1193
  end
1210
1194
  end
@@ -1213,182 +1197,63 @@ class Naver
1213
1197
  if option['댓글 비 허용'] == 'false'
1214
1198
  puts '-[√] 댓글 비 허용 선택.......'.yellow
1215
1199
  begin
1216
- sleep(2)
1217
1200
  @driver.find_element(:xpath, '//*[@class="mce-btn-type1"]').click
1218
1201
  sleep(2)
1219
1202
  @driver.find_element(:partial_link_text, '댓글 비허용').click
1203
+ sleep(2)
1220
1204
  rescue
1221
1205
  end
1222
1206
  end
1223
-
1224
-
1225
- puts '-[√] 캡챠 발생 유무 확인.......'.green
1226
- sleep(1)
1227
- puts '-[√] 캡챠 발생 유무 확인.......'.green
1228
- sleep(1)
1229
- puts '-[√] 캡챠 발생 유무 확인.......'.green
1207
+
1208
+
1209
+ sleep(dd_time.to_i) # 등록버튼 누르기 딜레이
1210
+ # 등록 버튼 클릭
1211
+ @driver.find_element(:xpath, '//*[@id="publish-btn"]').click
1212
+ puts '-[√] 포스트 등록 성공 여부 확인 중.......'.yellow
1213
+ sleep(2)
1214
+ # 리캡챡 발생 여부 확인
1215
+ begin
1216
+ # 리캡챡 요소 확인 (예: 구글 reCAPTCHA의 iframe을 찾는 방법)
1217
+ wait = Selenium::WebDriver::Wait.new(:timeout => 3)
1218
+ wait.until { @driver.find_element(:xpath, '//*[@id="recaptcha-anchor"]') }
1219
+
1220
+ puts '-[√] 리캡챡 감지됨! 자동 해결 시도...'.yellow
1221
+
1222
+ # 리캡챡 해결 함수 호출
1223
+ @captcha_api_key = captcha_api_key
1230
1224
  sleep(1)
1225
+ captcha_solution = solve_captcha(captcha_api_key)
1226
+
1227
+ # 리캡챡 응답 필드에 해결된 값을 입력
1228
+ @driver.execute_script("document.getElementById('g-recaptcha-response').innerHTML='#{captcha_solution}'")
1229
+ sleep(3) # 잠시 대기 후
1230
+ @driver.find_element(:xpath, '//*[@id="publish-btn"]').click # 등록 버튼 다시 클릭
1231
+ puts '-[√] 리캡챡 해결 후 등록 시도.......'.yellow
1232
+ sleep(2)
1233
+ rescue
1234
+ # 리캡챡이 없다면 바로 진행
1235
+ puts '-[√] 리캡챡 없음, 바로 등록 진행.......'.yellow
1236
+ end
1231
1237
 
1238
+ # 포스트 등록 완료 확인
1232
1239
  begin
1233
- sleep(1)
1234
- puts '-[] 캡챠 발생 유무 확인.......'.green
1235
- @driver.find_element(:xpath, '//*[@data-state="ready"]').click #캡챠우회버튼 (xpath값에서 data-state="ready를 지목하고자 한다면 //*[@data-state="ready"] 입력)
1236
- puts '-[√] 캡챠 해제 진행 중 (약 30~60 초 소요됩니다).......'.green
1237
- sleep(10)
1238
- begin
1239
- sleep(1)
1240
- @driver.find_element(:xpath, '//*[@data-state="error"]').click #캡챠 해제 오류 버튼
1241
- puts '-[√] 캡챠 해제 에러 발생 !! API번호 및 포인트를 체크해주세요.......'.red
1242
- sleep(1)
1243
- puts '-[√] 캡챠 해제 에러 발생 !! API번호 및 포인트를 체크해주세요.......'.red
1244
- sleep(1)
1245
- @driver.close
1246
- puts '-[√] 작업 종료 중........다음 포스팅 작업을 준비 합니다........'.red
1247
- sleep(1)
1248
- sleep(dd_time.to_i) #등록버튼 누르기전 딜레이
1249
- @driver.find_element(:xpath, '//*[@id="publish-btn"]').click #등록완료버튼
1250
- rescue
1251
- # 타임아웃을 100초로 설정
1252
- wait = Selenium::WebDriver::Wait.new(:timeout => 100)
1253
- # 요소가 나타날 때까지 100초 동안 기다립니다.
1254
- wait.until { @driver.find_element(:xpath, '//*[@data-state="solved"]') }
1255
- sleep(2)
1256
- @driver.find_element(:xpath, '//*[@data-state="solved"]').click #캡챠 해제 완료 버튼
1257
- puts '-[√] 캡챠 해제 완료 → 이어서 진행 합니다.......'.green
1258
- sleep(3.7)
1259
- puts '-[√] 등록 버튼 클릭.......'.yellow
1260
- sleep(dd_time.to_i) #등록버튼 누르기전 딜레이
1261
- @driver.find_element(:xpath, '//*[@id="publish-btn"]').click #등록완료버튼
1262
- puts '-[√] 포스트 등록 성공 여부 확인 중.......'.yellow
1263
- sleep(5)
1264
- @driver.find_element(:xpath, '//*[@class="post_cont"]')
1265
- sleep(1)
1266
- puts '-[√] 포스트 등록 완료.......'.yellow
1267
- @driver.close
1268
- end
1240
+ # 포스트 등록 완료를 확인할 수 있는 요소(예: 등록 후 확인 페이지로 이동)
1241
+ wait.until { @driver.find_element(:xpath, '//*[@class="post_cont"]') }
1242
+ puts '-[] 포스트 등록 완료.......'.yellow
1269
1243
  rescue
1270
- #puts '-[체크] 등록 버튼 클릭.......'
1271
- sleep(dd_time.to_i) #등록버튼 누르기전 딜레이
1272
- @driver.find_element(:xpath, '//*[@id="publish-btn"]').click #등록완료버튼
1273
- puts '-[√] 포스트 등록 성공 여부 확인 중.......'.yellow
1274
-
1275
- ###########포스트 캡챠해제 팝업 시 재시도 작업 시작▼▼▼▼▼▼▼▼▼▼▼▼
1276
- begin
1277
- sleep(1)
1278
- @driver.switch_to.alert.accept
1279
- puts '-[√] 캡챠 체크 시간 초과!! 재 등록 시도.......'.green
1280
- sleep(2)
1281
- @driver.get(url)
1282
- puts '-[√] 등록 내용 불러오기 시도.......'.yellow
1283
- sleep(2)
1284
- @driver.switch_to.alert.accept
1285
- sleep(2)
1286
- puts '-[√] 재 등록 시도 시작.......'.yellow
1287
- @driver.find_element(:xpath, '//*[@id="publish-layer-btn"]').click
1288
- sleep(2)
1289
-
1290
- # 타임아웃을 10초로 설정
1291
- wait = Selenium::WebDriver::Wait.new(:timeout => 60)
1292
- #요소가 나타날 때까지 60초 동안 기다립니다.
1293
- wait.until { @driver.find_element(:xpath, '//*[@id="open20"]') }
1244
+ puts '-[×] 포스트 등록 실패!'.red
1245
+ end
1246
+
1247
+
1248
+ # 브라우저 종료
1249
+ @driver.close
1250
+
1251
+
1294
1252
 
1295
-
1296
- if option['전체공개'] == 'false'
1297
- puts '-[√] 전체공개 선택.......'.yellow
1298
- begin
1299
- sleep(2)
1300
- @driver.find_element(:xpath, '//*[@id="open20"]').click
1301
- rescue
1302
- end
1303
- end
1304
- sleep(2)
1305
-
1306
- if option['비공개'] == 'false'
1307
- puts '-[√] 비공개 선택.......'.yellow
1308
- begin
1309
- sleep(2)
1310
- @driver.find_element(:xpath, '//*[@id="open0"]').click
1311
- rescue
1312
- end
1313
- end
1314
- sleep(2)
1315
-
1316
- if option['댓글허용'] == 'false'
1317
- puts '-[√] 댓글허용 선택.......'.yellow
1318
- begin
1319
- sleep(2)
1320
- @driver.find_element(:xpath, '//*[@class="mce-btn-type1"]').click
1321
- sleep(2)
1322
- @driver.find_element(:partial_link_text, '댓글 허용').click
1323
- rescue
1324
- end
1325
- end
1326
- sleep(2)
1327
-
1328
- if option['댓글 비 허용'] == 'false'
1329
- puts '-[√] 댓글 비 허용 선택.......'.yellow
1330
- begin
1331
- sleep(2)
1332
- @driver.find_element(:xpath, '//*[@class="mce-btn-type1"]').click
1333
- sleep(2)
1334
- @driver.find_element(:partial_link_text, '댓글 비허용').click
1335
- rescue
1336
- end
1337
- end
1338
-
1339
- puts '-[√] 캡챠 발생 유무 확인.......'.green
1340
- sleep(1)
1341
- puts '-[√] 캡챠 발생 유무 확인.......'.green
1342
- sleep(1)
1343
- puts '-[√] 캡챠 발생 유무 확인.......'.green
1344
- sleep(1)
1345
-
1346
- begin
1347
- sleep(1)
1348
- puts '-[√] 캡챠 발생 유무 확인.......'.green
1349
- @driver.find_element(:xpath, '//*[@data-state="ready"]').click #캡챠우회버튼 (xpath값에서 data-state="ready를 지목하고자 한다면 //*[@data-state="ready"] 입력)
1350
- puts '-[√] 캡챠 해제 진행 중 (약 30~60 초 소요됩니다).......'.green
1351
- sleep(10)
1352
- begin
1353
- sleep(1)
1354
- @driver.find_element(:xpath, '//*[@data-state="error"]').click #캡챠 해제 오류 버튼
1355
- puts '-[√] 캡챠 해제 에러 발생 !! API번호 및 포인트를 체크해주세요.......'.red
1356
- sleep(1)
1357
- puts '-[√] 캡챠 해제 에러 발생 !! API번호 및 포인트를 체크해주세요.......'.red
1358
- sleep(1)
1359
- @driver.close
1360
- puts '-[√] 작업 종료 중........다음 포스팅 작업을 준비 합니다........'.red
1361
- sleep(1)
1362
- sleep(dd_time.to_i) #등록버튼 누르기전 딜레이
1363
- @driver.find_element(:xpath, '//*[@id="publish-btn"]').click #등록완료버튼
1364
- rescue
1365
- # 타임아웃을 100초로 설정
1366
- wait = Selenium::WebDriver::Wait.new(:timeout => 100)
1367
- # 요소가 나타날 때까지 100초 동안 기다립니다.
1368
- wait.until { @driver.find_element(:xpath, '//*[@data-state="solved"]') }
1369
- sleep(2)
1370
- @driver.find_element(:xpath, '//*[@data-state="solved"]').click #캡챠 해제 완료 버튼
1371
- puts '-[√] 캡챠 해제 완료 → 이어서 진행 합니다.......'.green
1372
- sleep(3.7)
1373
- end
1374
- rescue
1375
- end
1376
- sleep(dd_time.to_i) #등록버튼 누르기전 딜레이
1377
- @driver.find_element(:xpath, '//*[@id="publish-btn"]').click #등록완료버튼
1378
- puts '-[√] 포스트 등록 성공 여부 확인 중.......'.yellow
1379
- rescue
1380
- end
1381
- ###########포스트 캡챠해제 팝업 시 재시도 작업 끝 ▲▲▲▲▲▲▲▲▲▲▲▲
1382
- sleep(5)
1383
- @driver.find_element(:xpath, '//*[@class="post_cont"]')
1384
- sleep(1)
1385
- puts '-[√] 포스트 등록 완료.......'.yellow
1386
- @driver.close
1387
- end
1388
-
1389
-
1390
- end
1391
- end
1253
+
1254
+
1255
+ end
1256
+ end
1392
1257
 
1393
1258
 
1394
1259
  class Wordpress
@@ -1595,11 +1460,11 @@ class Wordpress
1595
1460
 
1596
1461
 
1597
1462
 
1598
- def chrome_start(url, user_id, user_pw, captcha_key)
1463
+ def chrome_start(url, user_id, user_pw, captcha_api_key)
1599
1464
  @url = url
1600
1465
  @user_id = user_id
1601
1466
  @user_pw = user_pw
1602
- @captcha_key = captcha_key
1467
+ @captcha_api_key = captcha_api_key
1603
1468
  begin
1604
1469
  Selenium::WebDriver::Chrome::Service.driver_path = './chromedriver.exe'
1605
1470
  @driver = Selenium::WebDriver.for :chrome
@@ -1608,95 +1473,7 @@ class Wordpress
1608
1473
  end
1609
1474
  end
1610
1475
 
1611
- def login
1612
- @driver.get(@url+'/wp-admin')
1613
- @driver.find_element(:xpath , '//*[@id="user_login"]').send_keys(@user_id)
1614
- @driver.find_element(:xpath , '//*[@id="user_pass"]').send_keys(@user_pw)
1615
- @driver.find_element(:xpath , '//*[@id="wp-submit"]').click
1616
- @cookie = Hash.new
1617
- @driver.manage.all_cookies.each do |i|
1618
- @cookie[i[:name]] = i[:value]
1619
- end
1620
- sleep(2)
1621
- begin
1622
- puts @driver.find_element(:xpath , '/html/body/div/div/div[1]/div[1]/div/div[1]/a[1]/span').text
1623
- @driver.close
1624
- return 1
1625
- rescue => e
1626
- puts e
1627
- @driver.close
1628
- return 0
1629
- end
1630
- end
1631
-
1632
- def update
1633
- http = HTTP.cookies(@cookie).get(@url+'/wp-admin/post-new.php')
1634
- noko = Nokogiri::HTML(http.to_s)
1635
- @wpnonce = http.to_s.split('_wpnonce":"')[1].split('"')[0]
1636
- @data2 = Hash.new
1637
- @data2['_wpnonce'] = noko.xpath('//*[@id="_wpnonce"]')[0]['value']
1638
- @data2['_wp_http_referer'] = '/wp-admin/post-new.php'
1639
- @data2['user_ID'] = '1'
1640
- @data2['action'] = 'editpost'
1641
- @data2['originalaction'] = 'editpost'
1642
- @data2['post_author'] = '1'
1643
- @data2['post_type'] = 'post'
1644
- @data2['original_post_status'] = 'auto-draft'
1645
- @data2['referredby'] = @url+'/wp-admin/update-core.php'
1646
- @data2['_wp_original_http_referer'] = @url+'/wp-admin/update-core.php'
1647
- @data2['auto_draft'] = nil
1648
- @data2['post_ID'] = noko.xpath('//*[@id="post_ID"]')[0]['value']
1649
- @data2['meta-box-order-nonce'] = noko.xpath('//*[@id="meta-box-order-nonce"]')[0]['value']
1650
- @data2['closedpostboxesnonce'] = noko.xpath('//*[@id="closedpostboxesnonce"]')[0]['value']
1651
- @data2['post_title'] = 'title3'
1652
- @data2['samplepermalinknonce'] = noko.xpath('//*[@id="samplepermalinknonce"]')[0]['value']
1653
- @data2['content'] = 'content3'
1654
- @data2['wp-preview'] = nil
1655
- @data2['hidden_post_status'] = 'draft'
1656
- @data2['post_status'] = 'draft'
1657
- @data2['hidden_post_password'] = nil
1658
- @data2['hidden_post_visibility'] = 'public'
1659
- @data2['visibility'] = 'post'
1660
- @data2['post_password'] = nil
1661
- @data2['mm'] = '10'
1662
- @data2['jj'] = '24'
1663
- @data2['aa'] = '2022'
1664
- @data2['hh'] = '02'
1665
- @data2['mn'] = '41'
1666
- @data2['ss'] = '32'
1667
- @data2['hidden_mm'] = '10'
1668
- @data2['cur_mm'] = '10'
1669
- @data2['hidden_jj'] = '24'
1670
- @data2['cur_jj'] = '24'
1671
- @data2['hidden_aa'] = '2022'
1672
- @data2['cur_aa'] = '2022'
1673
- @data2['hidden_hh'] = '02'
1674
- @data2['cur_hh'] = '02'
1675
- @data2['hidden_mn'] = '41'
1676
- @data2['cur_mn'] = '41'
1677
- @data2['original_publish'] = '공개'
1678
- @data2['publish'] = '공개'
1679
- @data2['post_format'] = '0'
1680
- @data2['post_category[]'] = '0'
1681
- @data2['newcategory'] = '새 카테고리 이름'
1682
- @data2['newcategory_parent'] = -1
1683
- @data2['_ajax_nonce-add-category'] = noko.xpath('//*[@id="_ajax_nonce-add-category"]')[0]['value']
1684
- @data2['tax_input[post_tag]'] = nil
1685
- @data2['newtag[post_tag]'] = nil
1686
- @data2['_thumbnail_id'] = -1
1687
- @data2['excerpt'] = nil
1688
- @data2['trackback_url'] = nil
1689
- @data2['metakeyinput'] = nil
1690
- @data2['metavalue'] = nil
1691
- @data2['_ajax_nonce-add-meta'] = noko.xpath('//*[@id="_ajax_nonce-add-meta"]')[0]['value']
1692
- @data2['advanced_view'] = '1'
1693
- @data2['comment_status'] = 'open'
1694
- @data2['ping_status'] = 'open'
1695
- @data2['post_name'] = nil
1696
- @data2['post_author_override'] = '1'
1697
- #result_http = HTTP.cookies(@cookie).post(@url+'/wp-admin/post.php', :form => @data)
1698
- return @data2
1699
- end
1476
+
1700
1477
 
1701
1478
  def auto_image
1702
1479
  begin
@@ -1951,6 +1728,7 @@ class Wordpress
1951
1728
  option['category'] = ''
1952
1729
  end
1953
1730
 
1731
+
1954
1732
  #begin
1955
1733
  # option['category2'] = table[5].to_s.force_encoding('utf-8').to_s
1956
1734
  # if option['category2'].to_s == '편집모드'
@@ -1975,6 +1753,7 @@ class Wordpress
1975
1753
 
1976
1754
  puts table[7]
1977
1755
  puts table[10]
1756
+
1978
1757
  if table[7].to_i > table[10].to_i
1979
1758
  if @data['포스트설정']['테더링'].checked?
1980
1759
  puts 'tedering ip change...'
@@ -2023,6 +1802,14 @@ class Wordpress
2023
1802
  end
2024
1803
  end
2025
1804
  end
1805
+
1806
+ if @data['포스트설정']['gpt제목'].checked?
1807
+ chat = Chat_title.new(@data['포스트설정']['api_key'].text.to_s.force_encoding('utf-8'))
1808
+ gpt_text1 = chat.message(title)
1809
+ title = gpt_text1.to_s
1810
+ end
1811
+
1812
+
2026
1813
  @data['table'][index][-1] = 5
2027
1814
  @data['table'] << []
2028
1815
  @data['table'].pop
@@ -2060,6 +1847,25 @@ class Wordpress
2060
1847
  end
2061
1848
  end
2062
1849
  end
1850
+
1851
+ if @data['포스트설정']['gpt내용'].checked?
1852
+ api_key = @data['포스트설정']['api_key'].text.to_s.force_encoding('utf-8')
1853
+ #key_change = @data['포스트설정']['특정단어키워드로변경값'].text.to_s.force_encoding('utf-8')
1854
+ #imotcon_change = @data['포스트설정']['스티커로변경단어'].text.to_s.force_encoding('utf-8')
1855
+ #template_change = @data['포스트설정']['내템플릿변경단어'].text.to_s.force_encoding('utf-8')
1856
+ #ttdanar_change = @data['포스트설정']['단어링크적용단어'].text.to_s.force_encoding('utf-8')
1857
+ #sajine_change = @data['포스트설정']['단어사진으로변경단어'].text.to_s.force_encoding('utf-8')
1858
+ #mov_change = @data['포스트설정']['영상으로변경단어'].text.to_s.force_encoding('utf-8')
1859
+ #map_change = @data['포스트설정']['지도로변경단어'].text.to_s.force_encoding('utf-8')
1860
+ #inyong9_change = @data['포스트설정']['인용구변경단어'].text.to_s.force_encoding('utf-8')
1861
+
1862
+
1863
+ chat = Chat_content.new(api_key)
1864
+ gpt_text3 = chat.message(content)
1865
+ content = gpt_text3.to_s
1866
+ end
1867
+
1868
+
2063
1869
  content_tag = content.split('@##@')[1]
2064
1870
  content = content.split('@##@')[0]
2065
1871
  @data['table'][index][-1] = 15
@@ -2076,14 +1882,14 @@ class Wordpress
2076
1882
  proxy = table[3].to_s
2077
1883
  user_id = table[1].to_s
2078
1884
  user_pw = table[2].to_s
2079
- captcha_key = table[6].to_s
1885
+ captcha_api_key = @data['포스트설정']['captcha_api_key'].text.to_s.force_encoding('utf-8')
2080
1886
  naver = Naver.new
2081
1887
  @data['table'][index][-1] = 25
2082
1888
  @data['table'] << []
2083
1889
  @data['table'].pop
2084
1890
 
2085
- #네이버로그인
2086
- login_check = naver.login(user_id, user_pw, option['proxy'], captcha_key)
1891
+ #네이버로그인login(user_id, user_pw, proxy ,captcha_api_key)
1892
+ login_check = naver.login(user_id, user_pw, option['proxy'], captcha_api_key)
2087
1893
  if login_check == 0
2088
1894
  black_users << table[1].to_s
2089
1895
  next
@@ -2255,11 +2061,11 @@ class Wordpress
2255
2061
  content = content2
2256
2062
  end
2257
2063
  end
2258
-
2064
+
2259
2065
  @data['table'][index][-1] = 50
2260
2066
  @data['table'] << []
2261
2067
  @data['table'].pop
2262
- if @data['포스트설정']['gpt'].checked?
2068
+ if @data['포스트설정']['gpt키워드'].checked?
2263
2069
  chat = Chat.new(@data['포스트설정']['api_key'].text.to_s.force_encoding('utf-8'))
2264
2070
  gpt_text = chat.message(keyword)
2265
2071
  content = content.to_s + "\n(자동생성글)\n" + gpt_text.to_s
@@ -2280,7 +2086,7 @@ class Wordpress
2280
2086
  joongbok_check = 0
2281
2087
  counter10 = 0
2282
2088
  while joongbok_check == 0
2283
- if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt'].checked?
2089
+ if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt키워드'].checked?
2284
2090
  content22 = content.split("(자동생성글)")[1].split("\n")
2285
2091
  else
2286
2092
  content22 = content.split("\n")
@@ -2304,12 +2110,12 @@ class Wordpress
2304
2110
  content2 = content.split("\n")
2305
2111
  end
2306
2112
 
2307
- if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt'].checked?
2113
+ if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt키워드'].checked?
2308
2114
  content2 = content.split("(자동생성글)")[1].split("\n")
2309
2115
  position.pop
2310
2116
  end
2311
2117
 
2312
- if @data['포스트설정']['내용과자동생성'].checked? == false and @data['포스트설정']['내용을자동생성'].checked? == false and @data['포스트설정']['gpt'].checked? == false
2118
+ if @data['포스트설정']['내용과자동생성'].checked? == false and @data['포스트설정']['내용을자동생성'].checked? == false and @data['포스트설정']['gpt키워드'].checked? == false
2313
2119
  content2 = content.split("\n")
2314
2120
  end
2315
2121
 
@@ -2355,7 +2161,7 @@ class Wordpress
2355
2161
  content = content3.join("\n")
2356
2162
  end
2357
2163
 
2358
- if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt'].checked?
2164
+ if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt키워드'].checked?
2359
2165
  content2.each_with_index do |con, index|
2360
2166
  if position.include?(index)
2361
2167
  insert_keyword_text = keyword.to_s
@@ -2385,7 +2191,7 @@ class Wordpress
2385
2191
  end
2386
2192
  end
2387
2193
 
2388
- if @data['포스트설정']['내용과자동생성'].checked? == false and @data['포스트설정']['내용을자동생성'].checked? == false and @data['포스트설정']['gpt'].checked? == false
2194
+ if @data['포스트설정']['내용과자동생성'].checked? == false and @data['포스트설정']['내용을자동생성'].checked? == false and @data['포스트설정']['gpt키워드'].checked? == false
2389
2195
  begin
2390
2196
  content2.each_with_index do |con, index|
2391
2197
  if position.include?(index)
@@ -2473,7 +2279,7 @@ class Wordpress
2473
2279
  end
2474
2280
  end
2475
2281
 
2476
- if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt'].checked?
2282
+ if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt키워드'].checked?
2477
2283
  content5 = content.split("(자동생성글)")[0].to_s.split("\n")
2478
2284
  content55 = content.split("(자동생성글)")[1].to_s
2479
2285
 
@@ -2501,7 +2307,7 @@ class Wordpress
2501
2307
 
2502
2308
  position = position.sort
2503
2309
 
2504
- if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt'].checked?
2310
+ if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt키워드'].checked?
2505
2311
  image_url22 = get_image_file().force_encoding('utf-8')
2506
2312
  end
2507
2313
 
@@ -2519,7 +2325,7 @@ class Wordpress
2519
2325
  end
2520
2326
  end
2521
2327
 
2522
- if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt'].checked?
2328
+ if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt키워드'].checked?
2523
2329
  content = content5.join("\n")+'(자동생성글)'+content55
2524
2330
  # iconv = Iconv.new('UTF-8', 'ASCII-8BIT')
2525
2331
  # content = iconv.iconv(content)
@@ -2689,7 +2495,7 @@ class Wordpress
2689
2495
  # content = content
2690
2496
  # soosick_1 = content_end
2691
2497
  #else
2692
- if @data['포스트설정']['gpt'].checked?
2498
+ if @data['포스트설정']['gpt키워드'].checked?
2693
2499
  if @data['포스트설정']['gpt상단'].checked?
2694
2500
  content = content_end+"\n"+content+"\n"
2695
2501
  else
@@ -2812,9 +2618,11 @@ class Wordpress
2812
2618
 
2813
2619
  dd_time = @data['table'][index][9].to_s.force_encoding('utf-8').to_i
2814
2620
  url = @data['table'][index][3].to_s.force_encoding('utf-8')
2815
-
2621
+ captcha_api_key = @data['포스트설정']['captcha_api_key'].text.to_s.force_encoding('utf-8')
2622
+
2623
+
2816
2624
  puts 'start...'
2817
- naver.update(title,content,option, dd_time, url, keyword)
2625
+ naver.update(title,content,option, dd_time, url, keyword, captcha_api_key)
2818
2626
 
2819
2627
  @data['table'][index][10] = @data['table'][index][10].to_i + 1
2820
2628
  @data['table'][index][-1] = 100
@@ -3170,13 +2978,11 @@ class Wordpress
3170
2978
  horizontal_box{
3171
2979
  stretchy false
3172
2980
  horizontal_box{
3173
- @data['captcha_key'] = entry{
3174
- text 'captcha_api_key 입력'
3175
- }
2981
+
3176
2982
  button('등록'){
3177
2983
  on_clicked {
3178
- @data['table'] << [false, @data['site_id_input'].text, @data['site_pw_input'].text,@data['게시판url'].text,@data['category'].text, @data['proxy'].text,@data['captcha_key'].text, 1, 1, 1, 0,0]
3179
- @data['table'] << [false, @data['site_id_input'].text, @data['site_pw_input'].text,@data['게시판url'].text,@data['category'].text, @data['proxy'].text,@data['captcha_key'].text, 1, 1, 1, 0,0]
2984
+ @data['table'] << [false, @data['site_id_input'].text, @data['site_pw_input'].text,@data['게시판url'].text,@data['category'].text, @data['proxy'].text, 1, 1, 1, 0,0]
2985
+ @data['table'] << [false, @data['site_id_input'].text, @data['site_pw_input'].text,@data['게시판url'].text,@data['category'].text, @data['proxy'].text, 1, 1, 1, 0,0]
3180
2986
  @data['table'].pop
3181
2987
  }
3182
2988
  }
@@ -3188,7 +2994,7 @@ class Wordpress
3188
2994
  file_data.split("\n").each do |i|
3189
2995
  i3 = i.to_s.force_encoding('utf-8').to_s
3190
2996
  i2 = i3.split(',')
3191
- @data['table'] << [false, i2[0].to_s, i2[1].to_s,i2[2].to_s,i2[3].to_s,i2[4].to_s,i2[5].to_s,1,1,1,0,0]
2997
+ @data['table'] << [false, i2[0].to_s, i2[1].to_s,i2[2].to_s,i2[3].to_s,i2[4].to_s,1,1,1,0,0]
3192
2998
  @data['table'] << [false, i2[0].to_s, i2[1].to_s,1,1,1,0,0]
3193
2999
  @data['table'].pop
3194
3000
  end
@@ -3244,10 +3050,7 @@ class Wordpress
3244
3050
  text_column('프록시'){
3245
3051
  editable true
3246
3052
  }
3247
- text_column('캡차api'){
3248
- editable true
3249
- }
3250
-
3053
+
3251
3054
  text_column('수량'){
3252
3055
  editable true
3253
3056
  }
@@ -3268,10 +3071,10 @@ class Wordpress
3268
3071
 
3269
3072
  horizontal_box{
3270
3073
  stretchy false
3271
-
3272
- @data['captcha_key1'] = entry{
3273
- text 'captcha_api_key 입력'
3074
+ @data['포스트설정']['captcha_api_key'] = entry(){
3075
+ text 'captcha_api_key 입력'
3274
3076
  }
3077
+
3275
3078
  @data['table_counter_input'] = entry{
3276
3079
  text '수량 ex) 3'
3277
3080
  }
@@ -3285,10 +3088,10 @@ class Wordpress
3285
3088
  button('전체설정'){
3286
3089
  on_clicked{
3287
3090
  for n in 0..@data['table'].length-1
3288
- @data['table'][n][6] = @data['captcha_key1'].text.to_s
3289
- @data['table'][n][7] = @data['table_counter_input'].text.to_i
3290
- @data['table'][n][8] = @data['table_delay_input'].text.to_i
3291
- @data['table'][n][9] = @data['table_delay_input2'].text.to_i
3091
+
3092
+ @data['table'][n][6] = @data['table_counter_input'].text.to_i
3093
+ @data['table'][n][7] = @data['table_delay_input'].text.to_i
3094
+ @data['table'][n][8] = @data['table_delay_input2'].text.to_i
3292
3095
  @data['table'] << []
3293
3096
  @data['table'].pop
3294
3097
  end
@@ -3324,7 +3127,10 @@ class Wordpress
3324
3127
  }
3325
3128
  horizontal_box{
3326
3129
  stretchy false
3130
+ grid{
3327
3131
  button('전체선택'){
3132
+ top 1
3133
+ left 1
3328
3134
  on_clicked{
3329
3135
  for n in 0..@data['키워드설정']['키워드'].length-1
3330
3136
  @data['키워드설정']['키워드'][n][0] = true
@@ -3333,7 +3139,20 @@ class Wordpress
3333
3139
  end
3334
3140
  }
3335
3141
  }
3336
- button('키워드삭제'){
3142
+ button('선택해제'){
3143
+ top 1
3144
+ left 2
3145
+ on_clicked{
3146
+ for n in 0..@data['키워드설정']['키워드'].length-1
3147
+ @data['키워드설정']['키워드'][n][0] = false
3148
+ @data['키워드설정']['키워드'] << []
3149
+ @data['키워드설정']['키워드'].pop
3150
+ end
3151
+ }
3152
+ }
3153
+ button('삭제하기'){
3154
+ top 1
3155
+ left 3
3337
3156
  on_clicked{
3338
3157
  m = Array.new
3339
3158
  for n in 0..@data['키워드설정']['키워드'].length-1
@@ -3341,13 +3160,15 @@ class Wordpress
3341
3160
  m << n
3342
3161
  end
3343
3162
  end
3344
-
3163
+
3345
3164
  m.reverse.each do |i|
3346
3165
  @data['키워드설정']['키워드'].delete_at(i)
3347
3166
  end
3348
3167
  @data['키워드설정']['키워드'].delete(nil)
3349
3168
  }
3350
3169
  }
3170
+ }
3171
+
3351
3172
  @data['키워드설정']['순서사용'] = checkbox('순서사용'){
3352
3173
  stretchy false
3353
3174
  on_toggled{ |c|
@@ -3365,6 +3186,58 @@ class Wordpress
3365
3186
  }
3366
3187
  }
3367
3188
  }
3189
+ vertical_separator{
3190
+ stretchy false
3191
+ }
3192
+ horizontal_box{
3193
+ stretchy false
3194
+ grid{
3195
+ @data['포스트설정']['gpt키워드'] = checkbox('GPT 키워드 기반 글 생성'){
3196
+ top 1
3197
+ left 0
3198
+ #enabled false # 기본적으로 비활성화
3199
+ on_toggled {
3200
+ if @data['포스트설정']['gpt키워드'].checked?
3201
+ @data['포스트설정']['gpt상단'].enabled = true # '내용투명' 활성화
3202
+ @data['포스트설정']['gpt하단'].enabled = true # '내용투명' 활성화
3203
+ else
3204
+ @data['포스트설정']['gpt상단'].checked = false # 체크 해제
3205
+ @data['포스트설정']['gpt상단'].enabled = false # 비활성화
3206
+ @data['포스트설정']['gpt하단'].checked = false # 체크 해제
3207
+ @data['포스트설정']['gpt하단'].enabled = false # 비활성화
3208
+ end
3209
+ }
3210
+
3211
+ }
3212
+
3213
+ @data['포스트설정']['gpt상단'] = checkbox('원고 위에 넣기'){
3214
+ top 1
3215
+ left 1
3216
+ enabled false # 기본적으로 비활성화
3217
+ on_toggled{
3218
+ if @data['포스트설정']['gpt상단'].checked?
3219
+ @data['포스트설정']['gpt하단'].checked = false
3220
+ end
3221
+ }
3222
+ }
3223
+
3224
+ @data['포스트설정']['gpt하단'] = checkbox('원고 아래 넣기'){
3225
+ top 1
3226
+ left 2
3227
+ enabled false # 기본적으로 비활성화
3228
+ on_toggled{
3229
+ if @data['포스트설정']['gpt하단'].checked?
3230
+ @data['포스트설정']['gpt상단'].checked = false
3231
+ end
3232
+ }
3233
+ }
3234
+ } }
3235
+ horizontal_box{
3236
+ stretchy false
3237
+ grid{
3238
+ label('※ GPT 기능 사용시 포스트설정1에서 GPT사용에 체크 필수'){
3239
+ } } }
3240
+
3368
3241
  table{
3369
3242
  checkbox_column('선택'){
3370
3243
  editable true
@@ -3383,68 +3256,100 @@ class Wordpress
3383
3256
  vertical_box{
3384
3257
  horizontal_box{
3385
3258
  stretchy false
3386
- button('제목불러오기'){
3387
- on_clicked{
3388
- file = open_file
3389
- if file != nil
3390
- file_data = File.open(file, 'r', :encoding => 'utf-8').read()
3391
- file_data.split("\n").each do |title|
3392
- if title.split(" ").join('').length < 2
3259
+ button('제목불러오기'){
3260
+ on_clicked{
3261
+ file = open_file
3262
+ if file != nil
3263
+ file_data = File.open(file, 'r', :encoding => 'utf-8').read()
3264
+ file_data.split("\n").each do |title|
3265
+ if title.split(" ").join('').length < 2
3393
3266
 
3394
- else
3395
- @data['제목설정']['제목'] << [false, title]
3396
- @data['제목설정']['제목'] << [false, title]
3397
- @data['제목설정']['제목'].pop
3398
- end
3399
- end
3267
+ else
3268
+ @data['제목설정']['제목'] << [false, title]
3269
+ @data['제목설정']['제목'] << [false, title]
3270
+ @data['제목설정']['제목'].pop
3400
3271
  end
3401
- }
3402
- }
3272
+ end
3273
+ end
3274
+ }
3275
+ }
3403
3276
 
3277
+ }
3278
+ horizontal_box{
3279
+ stretchy false
3280
+ grid{
3281
+ button('전체선택'){
3282
+ top 1
3283
+ left 1
3284
+ on_clicked{
3285
+ for n in 0..@data['제목설정']['제목'].length-1
3286
+ @data['제목설정']['제목'][n][0] = true
3287
+ @data['제목설정']['제목'] << []
3288
+ @data['제목설정']['제목'].pop
3289
+ end
3404
3290
  }
3405
- horizontal_box{
3406
- stretchy false
3407
- button('전체선택'){
3408
- on_clicked{
3409
- for n in 0..@data['제목설정']['제목'].length-1
3410
- @data['제목설정']['제목'][n][0] = true
3411
- @data['제목설정']['제목'] << []
3412
- @data['제목설정']['제목'].pop
3413
- end
3414
- }
3415
- }
3416
- button('제목삭제'){
3417
- on_clicked{
3418
- m = Array.new
3419
- for n in 0..@data['제목설정']['제목'].length-1
3420
- if @data['제목설정']['제목'][n][0] == true
3421
- m << n
3422
- end
3423
- end
3291
+ }
3292
+ button('선택해제'){
3293
+ top 1
3294
+ left 2
3295
+ on_clicked{
3296
+ for n in 0..@data['제목설정']['제목'].length-1
3297
+ @data['제목설정']['제목'][n][0] = false
3298
+ @data['제목설정']['제목'] << []
3299
+ @data['제목설정']['제목'].pop
3300
+ end
3301
+ }
3302
+ }
3303
+ button('삭제하기'){
3304
+ top 1
3305
+ left 3
3306
+ on_clicked{
3307
+ m = Array.new
3308
+ for n in 0..@data['제목설정']['제목'].length-1
3309
+ if @data['제목설정']['제목'][n][0] == true
3310
+ m << n
3311
+ end
3312
+ end
3424
3313
 
3425
- m.reverse.each do |i|
3426
- @data['제목설정']['제목'].delete_at(i)
3427
- end
3428
- @data['제목설정']['제목'].delete(nil)
3429
- }
3430
- }
3431
- @data['제목설정']['순서사용'] = checkbox('순서사용'){
3432
- stretchy false
3433
- on_toggled{ |c|
3434
- if c.checked?
3435
- @data['제목설정']['랜덤사용'].checked = false
3436
- end
3437
- }
3438
- }
3439
- @data['제목설정']['랜덤사용'] = checkbox('랜덤사용'){
3440
- stretchy false
3441
- on_toggled{ |c|
3442
- if c.checked?
3443
- @data['제목설정']['순서사용'].checked = false
3444
- end
3445
- }
3446
- }
3314
+ m.reverse.each do |i|
3315
+ @data['제목설정']['제목'].delete_at(i)
3316
+ end
3317
+ @data['제목설정']['제목'].delete(nil)
3447
3318
  }
3319
+ }
3320
+ }
3321
+ @data['제목설정']['순서사용'] = checkbox('순서사용'){
3322
+ stretchy false
3323
+ on_toggled{ |c|
3324
+ if c.checked?
3325
+ @data['제목설정']['랜덤사용'].checked = false
3326
+ end
3327
+ }
3328
+ }
3329
+ @data['제목설정']['랜덤사용'] = checkbox('랜덤사용'){
3330
+ stretchy false
3331
+ on_toggled{ |c|
3332
+ if c.checked?
3333
+ @data['제목설정']['순서사용'].checked = false
3334
+ end
3335
+ }
3336
+ }
3337
+ }
3338
+ vertical_separator{
3339
+ stretchy false
3340
+ }
3341
+ horizontal_box{
3342
+ stretchy false
3343
+ grid{
3344
+ @data['포스트설정']['gpt제목'] = checkbox('제목을 이용해 GPT로 비슷한 제목 생성'){
3345
+
3346
+
3347
+ }}}
3348
+ horizontal_box{
3349
+ stretchy false
3350
+ grid{
3351
+ label('※ GPT 기능 사용시 포스트설정1에서 GPT사용에 체크 필수'){
3352
+ } } }
3448
3353
  table{
3449
3354
  checkbox_column('선택'){
3450
3355
  editable true
@@ -3478,11 +3383,14 @@ class Wordpress
3478
3383
  end
3479
3384
  }
3480
3385
  }
3481
-
3386
+
3482
3387
  }
3483
3388
  horizontal_box{
3484
3389
  stretchy false
3390
+ grid{
3485
3391
  button('전체선택'){
3392
+ top 1
3393
+ left 1
3486
3394
  on_clicked{
3487
3395
  for n in 0..@data['내용설정']['내용'].length-1
3488
3396
  @data['내용설정']['내용'][n][0] = true
@@ -3491,7 +3399,20 @@ class Wordpress
3491
3399
  end
3492
3400
  }
3493
3401
  }
3494
- button('내용삭제'){
3402
+ button('선택해제'){
3403
+ top 1
3404
+ left 2
3405
+ on_clicked{
3406
+ for n in 0..@data['내용설정']['내용'].length-1
3407
+ @data['내용설정']['내용'][n][0] = false
3408
+ @data['내용설정']['내용'] << []
3409
+ @data['내용설정']['내용'].pop
3410
+ end
3411
+ }
3412
+ }
3413
+ button('삭제하기'){
3414
+ top 1
3415
+ left 3
3495
3416
  on_clicked{
3496
3417
  m = Array.new
3497
3418
  for n in 0..@data['내용설정']['내용'].length-1
@@ -3499,13 +3420,14 @@ class Wordpress
3499
3420
  m << n
3500
3421
  end
3501
3422
  end
3502
-
3423
+
3503
3424
  m.reverse.each do |i|
3504
3425
  @data['내용설정']['내용'].delete_at(i)
3505
3426
  end
3506
3427
  @data['내용설정']['내용'].delete(nil)
3507
3428
  }
3508
3429
  }
3430
+ }
3509
3431
  @data['내용설정']['순서사용'] = checkbox('순서사용'){
3510
3432
  stretchy false
3511
3433
  on_toggled{ |c|
@@ -3523,6 +3445,21 @@ class Wordpress
3523
3445
  }
3524
3446
  }
3525
3447
  }
3448
+ vertical_separator{
3449
+ stretchy false
3450
+ }
3451
+ horizontal_box{
3452
+ stretchy false
3453
+ grid{
3454
+ @data['포스트설정']['gpt내용'] = checkbox('내용파일을 이용해 GPT로 글 변형'){
3455
+
3456
+
3457
+ }}}
3458
+ horizontal_box{
3459
+ stretchy false
3460
+ grid{
3461
+ label('※ GPT 기능 사용시 포스트설정1에서 GPT사용에 체크 필수'){
3462
+ } } }
3526
3463
  table{
3527
3464
  checkbox_column('선택'){
3528
3465
  editable true
@@ -3853,248 +3790,298 @@ class Wordpress
3853
3790
  }
3854
3791
 
3855
3792
  tab_item('포스트설정1'){
3856
- horizontal_box{
3857
- vertical_box{
3858
- stretchy false
3859
- grid{
3860
- stretchy false
3861
- @data['포스트설정']['제목키워드변경'] = checkbox('제목에 특정 단어를 내용에 사용할 키워드로 변경'){
3862
- top 0
3863
- left 0
3864
-
3865
- }
3866
- @data['포스트설정']['제목키워드변경단어'] = entry{
3867
- top 0
3868
- left 1
3869
- text '특정단어'
3870
- }
3871
-
3872
- # @data['포스트설정']['제목단어변경'] = checkbox('제목에 특정 단어를 변경'){
3873
- # top 1
3874
- # left 0
3875
- # }
3876
- # @data['포스트설정']['제목단어변경파일불러오기'] = button('설정 파일 불러오기'){
3877
- # top 1
3878
- # left 1
3879
- # on_clicked{
3880
- # file = open_file
3881
- # if file != nil
3882
- # file_data = File.open(file, 'r', :encoding => 'utf-8').read()
3883
- # file_data.split("\n").each do |i|
3884
- # i2 = i.split('>')
3885
- # text_key = i2[0].to_s
3886
- # text_val = i2[1].to_s.split(',')
3887
- # @data['포스트설정']['제목특정단어변경데이터'][text_key] = text_val
3888
- # end
3889
- # end
3890
- # }
3891
- # }
3892
- @data['포스트설정']['제목에키워드삽입'] = checkbox('제목에 키워드 삽입'){
3893
- top 2
3894
- left 0
3895
- }
3896
- @data['포스트설정']['제목에키워드삽입숫자1'] = entry(){
3897
- top 2
3898
- left 1
3899
- text '최소수량'
3900
- }
3901
- label('~'){
3902
- top 2
3903
- left 2
3904
- }
3905
- @data['포스트설정']['제목에키워드삽입숫자2'] = entry(){
3906
- top 2
3907
- left 3
3908
- text '최대수량'
3909
- }
3910
- label('ㄴ'){
3911
- top 3
3912
- left 2
3913
- }
3914
- @data['포스트설정']['제목앞'] = checkbox('제목에 키워드 삽입 제목 앞'){
3915
- top 3
3916
- left 3
3917
- on_toggled{
3918
- if @data['포스트설정']['제목앞'].checked? == true
3919
- if @data['포스트설정']['제목뒤'].checked?
3920
- @data['포스트설정']['제목뒤'].checked = false
3921
- end
3922
- end
3923
- }
3924
- }
3925
- label('ㄴ'){
3926
- top 4
3927
- left 2
3928
- }
3929
- @data['포스트설정']['제목뒤'] = checkbox('제목에 키워드 삽입 제목 뒤'){
3930
- top 4
3931
- left 3
3932
- on_toggled{
3933
- if @data['포스트설정']['제목뒤'].checked? == true
3934
- if @data['포스트설정']['제목앞'].checked?
3935
- @data['포스트설정']['제목앞'].checked = false
3936
- end
3937
- end
3938
- }
3939
- }
3940
- @data['포스트설정']['제목내용설정'] = checkbox('내용의 첫 문장을 제목으로 설정'){
3941
- top 4
3942
- left 0
3943
- }
3944
-
3945
- @data['포스트설정']['특수문자'] = checkbox('제목에 키워드 삽입 시 특수문자 삽입'){
3946
- top 5
3947
- left 0
3948
- }
3949
- @data['포스트설정']['제목을랜덤'] = checkbox('제목을 랜덤 단어 조합으로 자동 입력'){
3950
- top 6
3951
- left 0
3952
- }
3953
- @data['포스트설정']['내용키워드삽입'] = checkbox('내용 키워드 삽입'){
3954
- top 7
3955
- left 0
3956
- }
3957
- @data['포스트설정']['키워드삽입시작숫자'] = entry(){
3958
- top 7
3959
- left 1
3960
- text '최소수량'
3961
- }
3962
- label('~'){
3963
- top 7
3964
- left 2
3965
- }
3966
- @data['포스트설정']['키워드삽입끝숫자'] = entry(){
3967
- top 7
3968
- left 3
3969
- text '최대수량'
3970
- }
3971
- @data['포스트설정']['키워드삽입'] = checkbox('내용 키워드 삽입시 링크 삽입'){
3972
- top 8
3973
- left 0
3974
- }
3975
- @data['포스트설정']['키워드삽입시링크'] = entry(){
3976
- top 8
3977
- left 1
3978
- text 'URL'
3979
- }
3980
- @data['포스트설정']['내용을자동생성'] = checkbox('내용을 키워드 기반으로 자동 생성해서 포스팅'){
3981
- top 9
3982
- left 0
3983
- on_toggled{
3984
- if @data['포스트설정']['내용을자동생성'].checked?
3985
- if @data['포스트설정']['내용과자동생성'].checked?
3986
- @data['포스트설정']['내용과자동생성'].checked = false
3987
- end
3988
- end
3989
- }
3990
- }
3991
-
3992
- @data['포스트설정']['gpt'] = checkbox('내용을 키워드 기반의 GPT로 생성해서 포스팅'){
3993
- top 10
3994
- left 0
3995
- }
3996
-
3997
- @data['포스트설정']['api_key'] = entry(){
3998
- top 10
3999
- left 1
4000
- text 'api key'
4001
- }
3793
+ horizontal_box{
3794
+ vertical_box{
3795
+ stretchy false
3796
+ grid{
3797
+ stretchy false
3798
+ @data['포스트설정']['제목키워드변경'] = checkbox('제목에 특정 단어를 내용에 사용할 키워드로 변경'){
3799
+ top 0
3800
+ left 0
4002
3801
 
4003
- @data['포스트설정']['gpt상단'] = checkbox('원고내용 위에 넣기'){
4004
- top 10
4005
- left 3
4006
- on_toggled{
4007
- if @data['포스트설정']['gpt상단'].checked? == true
4008
- if @data['포스트설정']['gpt하단'].checked?
4009
- @data['포스트설정']['gpt하단'].checked = false
4010
- end
4011
- end
4012
- }
4013
- }
3802
+ }
3803
+ @data['포스트설정']['제목키워드변경단어'] = entry{
3804
+ top 0
3805
+ left 1
3806
+ text '특정단어'
3807
+ }
4014
3808
 
4015
- @data['포스트설정']['gpt하단'] = checkbox('원고내용 아래에 넣기'){
4016
- top 11
4017
- left 3
4018
- on_toggled{
4019
- if @data['포스트설정']['gpt하단'].checked? == true
4020
- if @data['포스트설정']['gpt상단'].checked?
4021
- @data['포스트설정']['gpt상단'].checked = false
4022
- end
4023
- end
4024
- }
4025
- }
3809
+ # @data['포스트설정']['제목단어변경'] = checkbox('제목에 특정 단어를 변경'){
3810
+ # top 1
3811
+ # left 0
3812
+ # }
3813
+ # @data['포스트설정']['제목단어변경파일불러오기'] = button('설정 파일 불러오기'){
3814
+ # top 1
3815
+ # left 1
3816
+ # on_clicked{
3817
+ # file = open_file
3818
+ # if file != nil
3819
+ # file_data = File.open(file, 'r', :encoding => 'utf-8').read()
3820
+ # file_data.split("\n").each do |i|
3821
+ # i2 = i.split('>')
3822
+ # text_key = i2[0].to_s
3823
+ # text_val = i2[1].to_s.split(',')
3824
+ # @data['포스트설정']['제목특정단어변경데이터'][text_key] = text_val
3825
+ # end
3826
+ # end
3827
+ # }
3828
+ # }
3829
+ @data['포스트설정']['제목에키워드삽입'] = checkbox('제목에 키워드 삽입'){
3830
+ top 2
3831
+ left 0
3832
+ #enabled false # 기본적으로 비활성화
3833
+ on_toggled {
3834
+ if @data['포스트설정']['제목에키워드삽입'].checked?
3835
+ @data['포스트설정']['제목앞'].enabled = true # '내용투명' 활성화
3836
+ @data['포스트설정']['제목뒤'].enabled = true # '내용투명' 활성화
3837
+ else
3838
+ @data['포스트설정']['제목앞'].checked = false # 체크 해제
3839
+ @data['포스트설정']['제목앞'].enabled = false # 비활성화
3840
+ @data['포스트설정']['제목뒤'].checked = false # 체크 해제
3841
+ @data['포스트설정']['제목뒤'].enabled = false # 비활성화
3842
+ end
3843
+ }
3844
+
3845
+ }
3846
+ @data['포스트설정']['제목에키워드삽입숫자1'] = entry(){
3847
+ top 2
3848
+ left 1
3849
+ text '최소수량'
3850
+ }
3851
+ label('~'){
3852
+ top 2
3853
+ left 2
3854
+ }
3855
+ @data['포스트설정']['제목에키워드삽입숫자2'] = entry(){
3856
+ top 2
3857
+ left 3
3858
+ text '최대수량'
3859
+ }
3860
+ label('ㄴ'){
3861
+ top 3
3862
+ left 2
3863
+ }
3864
+ @data['포스트설정']['제목앞'] = checkbox('제목에 키워드 삽입 제목 앞'){
3865
+ top 3
3866
+ left 3
3867
+ enabled false # 기본적으로 비활성화
3868
+ on_toggled{
3869
+ if @data['포스트설정']['제목앞'].checked? == true
3870
+ if @data['포스트설정']['제목뒤'].checked?
3871
+ @data['포스트설정']['제목뒤'].checked = false
3872
+ end
3873
+ end
3874
+ }
3875
+ }
3876
+ label('ㄴ'){
3877
+ top 4
3878
+ left 2
3879
+ }
3880
+ @data['포스트설정']['제목뒤'] = checkbox('제목에 키워드 삽입 제목 뒤'){
3881
+ top 4
3882
+ left 3
3883
+ enabled false # 기본적으로 비활성화
3884
+ on_toggled{
3885
+ if @data['포스트설정']['제목뒤'].checked? == true
3886
+ if @data['포스트설정']['제목앞'].checked?
3887
+ @data['포스트설정']['제목앞'].checked = false
3888
+ end
3889
+ end
3890
+ }
3891
+ }
3892
+
3893
+ @data['포스트설정']['특수문자'] = checkbox('제목에 키워드 삽입 시 특수문자 삽입'){
3894
+ top 4
3895
+ left 0
3896
+ }
3897
+ @data['포스트설정']['제목을랜덤'] = checkbox('제목을 랜덤 단어 조합으로 자동 입력'){
3898
+ top 5
3899
+ left 0
3900
+ on_toggled{
3901
+ if @data['포스트설정']['제목을랜덤'].checked? == true
3902
+ if @data['포스트설정']['제목내용설정'].checked?
3903
+ @data['포스트설정']['제목내용설정'].checked = false
3904
+ end
3905
+ end
3906
+ }
3907
+ }
3908
+ @data['포스트설정']['제목내용설정'] = checkbox('내용의 첫 문장을 제목으로 설정'){
3909
+ top 6
3910
+ left 0
3911
+ on_toggled{
3912
+ if @data['포스트설정']['제목내용설정'].checked? == true
3913
+ if @data['포스트설정']['제목을랜덤'].checked?
3914
+ @data['포스트설정']['제목을랜덤'].checked = false
3915
+ end
3916
+ end
3917
+ }
3918
+ }
3919
+ @data['포스트설정']['내용키워드삽입'] = checkbox('내용 키워드 삽입'){
3920
+ top 7
3921
+ left 0
3922
+ on_toggled {
3923
+ if @data['포스트설정']['내용키워드삽입'].checked?
3924
+ @data['포스트설정']['키워드삽입'].enabled = true # '내용투명' 활성화
3925
+ @data['포스트설정']['키워드삽입시링크'].enabled = true # '내용투명' 활성화
3926
+ else
3927
+ @data['포스트설정']['키워드삽입'].checked = false # 체크 해제
3928
+ @data['포스트설정']['키워드삽입'].enabled = false # 비활성화
3929
+ @data['포스트설정']['키워드삽입시링크'].text = 'URL' # 기본 텍스트 설정
3930
+ @data['포스트설정']['키워드삽입시링크'].enabled = false # 비활성화
3931
+ end
3932
+ }
3933
+ }
3934
+ @data['포스트설정']['키워드삽입시작숫자'] = entry(){
3935
+ top 7
3936
+ left 1
3937
+
3938
+ text '최소수량'
3939
+ }
3940
+ label('~'){
3941
+ top 7
3942
+ left 2
3943
+ }
3944
+ @data['포스트설정']['키워드삽입끝숫자'] = entry(){
3945
+ top 7
3946
+ left 3
3947
+ text '최대수량'
3948
+ }
3949
+ @data['포스트설정']['키워드삽입'] = checkbox('내용 키워드 삽입시 링크 삽입'){
3950
+ enabled false # 기본적으로 비활성화
3951
+ top 8
3952
+ left 0
3953
+
3954
+ }
3955
+ @data['포스트설정']['키워드삽입시링크'] = entry(){
3956
+ enabled false # 기본적으로 비활성화
3957
+ top 8
3958
+ left 1
3959
+ text 'URL'
3960
+ }
3961
+ @data['포스트설정']['내용을자동생성'] = checkbox('키워드기반 생성으로만 등록(GPT 미 사용시 자체 생성)'){
3962
+ top 9
3963
+ left 0
3964
+ on_toggled{
3965
+ if @data['포스트설정']['내용을자동생성'].checked?
3966
+ @data['포스트설정']['내용과자동생성'].checked = false
3967
+ @data['포스트설정']['내용투명'].checked = false
3968
+ @data['포스트설정']['자동글 수식에 입력'].checked = false
3969
+
3970
+ end
3971
+ }
3972
+ }
4026
3973
 
4027
- aa1 = 2
4028
- @data['포스트설정']['내용과자동생성'] = checkbox('내용을 내용 파일 + 자동 생성 조합으로 포스팅'){
4029
- top 10 + aa1
4030
- left 0
4031
- on_toggled{
4032
- if @data['포스트설정']['내용과자동생성'].checked?
4033
- if @data['포스트설정']['내용을자동생성'].checked?
4034
- @data['포스트설정']['내용을자동생성'].checked = false
4035
- end
4036
- end
4037
- }
4038
- }
4039
- @data['포스트설정']['내용투명'] = checkbox('키워드 기반 자동 생성글 안보이게 처리'){
4040
- top 11+ aa1
4041
- left 0
4042
- }
4043
- @data['포스트설정']['내용자동변경'] = checkbox('내용에 단어들을 자동 변경'){
4044
- top 12+ aa1
4045
- left 0
4046
- }
4047
- button('설정 파일 불러오기'){
4048
- top 12+ aa1
4049
- left 1
4050
- on_clicked{
4051
- file = open_file
4052
- if file != nil
4053
- file_data = File.open(file, 'r', :encoding => 'utf-8').read()
4054
- file_data.split("\n").each do |i|
4055
- key = i.split('>')[0]
4056
- v = i.split('>')[1].to_s.split(',')
4057
- @data['포스트설정']['내용자동변경값'][key] = v
4058
- end
4059
- end
4060
- }
4061
- }
4062
- @data['포스트설정']['제목에도적용'] = checkbox('제목에도 적용'){
4063
- top 12+ aa1
4064
- left 3
4065
- }
3974
+
3975
+ aa1 = 2
3976
+ @data['포스트설정']['내용과자동생성'] = checkbox('내용파일+키워드기반 생성 등록(GPT 미 사용시 자체 생성)') {
3977
+ top 10 + aa1
3978
+ left 0
3979
+ on_toggled {
3980
+ if @data['포스트설정']['내용과자동생성'].checked?
3981
+ @data['포스트설정']['내용을자동생성'].checked = false
3982
+ @data['포스트설정']['내용투명'].enabled = true # '내용투명' 활성화
3983
+ @data['포스트설정']['자동글 수식에 입력'].enabled = true # '내용투명' 활성화
3984
+ else
3985
+ @data['포스트설정']['내용투명'].checked = false # 체크 해제
3986
+ @data['포스트설정']['내용투명'].enabled = false # 비활성화
3987
+ @data['포스트설정']['자동글 수식에 입력'].checked = false # 체크 해제
3988
+ @data['포스트설정']['자동글 수식에 입력'].enabled = false # 비활성화
3989
+ end
3990
+ }
3991
+ }
3992
+
3993
+ @data['포스트설정']['내용투명'] = checkbox('키워드 기반 자동 생성글 안보이게 처리') {
3994
+ top 11 + aa1
3995
+ left 0
3996
+ enabled false # 기본적으로 비활성화
3997
+ on_toggled {
3998
+ if @data['포스트설정']['내용투명'].checked?
3999
+ @data['포스트설정']['내용을자동생성'].checked = false
4000
+ @data['포스트설정']['자동글 수식에 입력'].checked = false
4001
+ end
4002
+ }
4003
+ }
4004
+ @data['포스트설정']['내용자동변경'] = checkbox('내용에 단어들을 자동 변경'){
4005
+ top 12+ aa1
4006
+ left 0
4007
+ }
4008
+ button('설정 파일 불러오기'){
4009
+ top 12+ aa1
4010
+ left 1
4011
+ on_clicked{
4012
+ file = open_file
4013
+ if file != nil
4014
+ file_data = File.open(file, 'r', :encoding => 'utf-8').read()
4015
+ file_data.split("\n").each do |i|
4016
+ key = i.split('>')[0]
4017
+ v = i.split('>')[1].to_s.split(',')
4018
+ @data['포스트설정']['내용자동변경값'][key] = v
4019
+ end
4020
+ end
4021
+ }
4022
+ }
4023
+ @data['포스트설정']['제목에도적용'] = checkbox('제목에도 적용'){
4024
+ top 12+ aa1
4025
+ left 3
4026
+ }
4066
4027
 
4067
- @data['포스트설정']['내용사진자동삽입'] = checkbox('내용 사진 자동 삽입'){
4068
- top 13+ aa1
4069
- left 0
4070
- }
4071
- @data['포스트설정']['내용사진자동삽입시작숫자'] = entry(){
4072
- top 13+ aa1
4073
- left 1
4074
- text '최소수량'
4075
- }
4076
- label('~'){
4077
- top 13+ aa1
4078
- left 2
4079
- }
4080
- @data['포스트설정']['내용사진자동삽입끝숫자'] = entry(){
4081
- top 13+ aa1
4082
- left 3
4083
- text '최대수량'
4084
- }
4028
+ @data['포스트설정']['내용사진자동삽입'] = checkbox('내용 사진 자동 삽입'){
4029
+ top 13+ aa1
4030
+ left 0
4031
+ #enabled false # 기본적으로 비활성화
4032
+ on_toggled {
4033
+ if @data['포스트설정']['내용사진자동삽입'].checked?
4034
+ @data['포스트설정']['내용사진링크'].enabled = true # '내용투명' 활성화
4035
+ @data['포스트설정']['내용사진링크값'].enabled = true # '내용투명' 활성화
4036
+ else
4037
+ @data['포스트설정']['내용사진링크'].checked = false # 체크 해제
4038
+ @data['포스트설정']['내용사진링크'].enabled = false # 비활성화
4039
+ @data['포스트설정']['내용사진링크값'].text = 'URL' # 기본 텍스트 설정
4040
+ @data['포스트설정']['내용사진링크값'].enabled = false # 비활성화
4041
+ end
4042
+ }
4043
+ }
4044
+ @data['포스트설정']['내용사진자동삽입시작숫자'] = entry(){
4045
+ top 13+ aa1
4046
+ left 1
4047
+ text '최소수량'
4048
+ }
4049
+ label('~'){
4050
+ top 13+ aa1
4051
+ left 2
4052
+ }
4053
+ @data['포스트설정']['내용사진자동삽입끝숫자'] = entry(){
4054
+ top 13+ aa1
4055
+ left 3
4056
+ text '최대수량'
4057
+ }
4085
4058
 
4086
- @data['포스트설정']['내용사진링크'] = checkbox('내용 사진 자동 삽입시 링크 삽입'){
4087
- top 14+ aa1
4088
- left 0
4089
- }
4059
+ @data['포스트설정']['내용사진링크'] = checkbox('내용 사진 자동 삽입시 링크 삽입'){
4060
+ enabled false # 기본적으로 비활성화
4061
+ top 14+ aa1
4062
+ left 0
4063
+ }
4090
4064
 
4091
- @data['포스트설정']['내용사진링크값'] = entry(){
4092
- top 14+ aa1
4093
- left 1
4094
- text 'URL'
4095
- }
4096
- }
4065
+ @data['포스트설정']['내용사진링크값'] = entry(){
4066
+ enabled false # 기본적으로 비활성화
4067
+ top 14+ aa1
4068
+ left 1
4069
+ text 'URL'
4070
+ }
4071
+
4072
+ @data['포스트설정']['ChatGPT사용'] = checkbox('Chat GPT 사용하기'){
4073
+ top 15+ aa1
4074
+ left 0
4097
4075
  }
4076
+
4077
+ @data['포스트설정']['api_key'] = entry(){
4078
+ top 15+ aa1
4079
+ left 1
4080
+ text 'api key 입력 필수!!'
4081
+ }
4082
+
4083
+ }
4084
+ }
4098
4085
 
4099
4086
  vertical_separator{
4100
4087
  stretchy false
@@ -4306,6 +4293,20 @@ class Wordpress
4306
4293
  @data['포스트설정']['막글삽입'] = checkbox('내용 하단에 막글 삽입'){
4307
4294
  top 6
4308
4295
  left 0
4296
+ on_toggled {
4297
+ if @data['포스트설정']['막글삽입'].checked?
4298
+ @data['포스트설정']['막글투명'].enabled = true # '내용투명' 활성화
4299
+ @data['포스트설정']['막글그대로'].enabled = true # '내용투명' 활성화
4300
+
4301
+
4302
+ else
4303
+ @data['포스트설정']['막글투명'].checked = false # 체크 해제
4304
+ @data['포스트설정']['막글투명'].enabled = false # 비활성화
4305
+ @data['포스트설정']['막글그대로'].checked = false # 체크 해제
4306
+ @data['포스트설정']['막글그대로'].enabled = false # 비활성화
4307
+
4308
+ end
4309
+ }
4309
4310
  }
4310
4311
  @data['포스트설정']['막글삽입시작숫자'] = entry{
4311
4312
  top 6
@@ -4335,10 +4336,12 @@ class Wordpress
4335
4336
  @data['포스트설정']['막글투명'] = checkbox('막글 안보이게 처리'){
4336
4337
  top 7
4337
4338
  left 0
4339
+ enabled false
4338
4340
  }
4339
4341
  @data['포스트설정']['막글그대로'] = checkbox('막글 그대로 입력'){
4340
4342
  top 7
4341
4343
  left 1
4344
+ enabled false
4342
4345
  }
4343
4346
 
4344
4347
  @data['포스트설정']['태그삽입1'] = checkbox('태그삽입'){
@@ -4459,6 +4462,7 @@ class Wordpress
4459
4462
  }
4460
4463
  }
4461
4464
 
4465
+
4462
4466
 
4463
4467
 
4464
4468
  horizontal_box{