tblog_zon 0.0.1 → 0.0.7

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_zon.rb +1227 -1070
  3. metadata +2 -2
data/lib/tblog_zon.rb CHANGED
@@ -19,14 +19,11 @@ require 'auto_click'
19
19
  require 'rainbow/refinement'
20
20
  include AutoClickMethods
21
21
  using Rainbow
22
+ include Glimmer
22
23
 
23
24
 
24
25
 
25
26
 
26
-
27
- #driver.find_element(:class, 'highlight-java')
28
- # or
29
- #driver.find_element(:class_name, 'highlight-java')
30
27
  class Chat
31
28
  def initialize(api_key)
32
29
  @api_key = api_key
@@ -39,10 +36,11 @@ class Chat
39
36
  'Authorization' => 'Bearer ' + @api_key
40
37
  }
41
38
  d = {
42
- 'model' => 'gpt-3.5-turbo',
39
+ #'model' => 'gpt-3.5-turbo',
40
+ 'model' => 'gpt-4',
43
41
  'messages' => [{
44
42
  "role" => "assistant",
45
- "content" => keyword.to_s+" 소개하는 글을 1000자에서 2000자 사이로 만들어줘"
43
+ "content" => keyword.to_s+" 소개하는 글을 1500자에서 2500자 사이로 만들어줘"
46
44
  }]
47
45
  }
48
46
  answer = ''
@@ -73,10 +71,11 @@ class Chat
73
71
  'Authorization' => 'Bearer ' + @api_key
74
72
  }
75
73
  d = {
76
- 'model' => 'gpt-3.5-turbo',
74
+ #'model' => 'gpt-3.5-turbo',
75
+ 'model' => 'gpt-4',
77
76
  'messages' => [{
78
77
  "role" => "assistant",
79
- "content" => keyword.to_s+" 관련된 글을 1000자에서 2000자 사이로 만들어줘"
78
+ "content" => keyword.to_s+" 관련된 글을 1500자에서 2500자 사이로 만들어줘"
80
79
  }]
81
80
  }
82
81
  answer = ''
@@ -107,215 +106,213 @@ class Chat
107
106
  end
108
107
  end
109
108
 
110
- class Naver
111
- def initialize
112
- @seed = 1
113
- @cookie = ''
109
+ class Chat_title
110
+ def initialize(api_key)
111
+ @api_key = api_key
114
112
  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
113
 
144
- @driver = Selenium::WebDriver.for(:chrome, capabilities: options)
145
- rescue
146
- @driver = Selenium::WebDriver.for(:chrome, capabilities: options)
147
- 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
-
114
+ def message(title)
115
+ url = 'https://api.openai.com/v1/chat/completions'
116
+ headers = {
117
+ 'Content-Type' => 'application/json',
118
+ 'Authorization' => 'Bearer ' + @api_key
119
+ }
120
+ data = {
121
+ 'model' => 'gpt-4',
122
+ 'messages' => [{
123
+ "role" => "system",
124
+ "content" => "너는 매우 친절하고 성의 있게 답변하는 AI 어시스턴트야."
125
+ },
126
+ {
127
+ "role" => "user",
128
+ "content" => "#{title}\n위 문장을 비슷한 길이로 ChatGPT의 멘트는 빼고 표현을 더 추가해서 하나만 만들어줘."
129
+ }]
130
+ }
180
131
 
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')
203
-
204
- options.add_argument('--disable-translate')
205
- options.add_argument('--disable-extensions-file-access-check')
206
- options.add_argument('--disable-impl-side-painting')
132
+ begin
133
+ req = HTTP.headers(headers).post(url, json: data)
134
+ puts "HTTP Status: #{req.status}" # 상태 코드 확인
135
+ response = JSON.parse(req.body.to_s)
136
+ puts "API Response: #{response}" # 전체 응답 출력
207
137
 
208
- @driver = Selenium::WebDriver.for(:chrome, capabilities: options)
209
- rescue
210
- @driver = Selenium::WebDriver.for(:chrome, capabilities: options)
211
- end
138
+ if req.status == 429
139
+ return "API 요청 제한을 초과했습니다. 플랜 및 할당량을 확인하세요."
212
140
  end
141
+
142
+ # 응답 데이터에서 안전하게 값 추출
143
+ answer = response.dig('choices', 0, 'message', 'content')
144
+ answer ||= (title) # 응답이 없을 경우 기본 메시지 설정
145
+ rescue => e
146
+ puts "Error: #{e.message}"
147
+ answer = "오류가 발생했습니다."
213
148
  end
149
+
150
+ puts 'API return ==> '
151
+ puts answer
152
+ answer
214
153
  end
154
+ end
215
155
 
156
+ class Chat_content
157
+ def initialize(api_key)
158
+ @api_key = api_key
159
+ end
216
160
 
217
-
218
-
219
- def login(user_id, user_pw, proxy ,captcha_key)
220
- 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
- ####################탭나누기 수정중######################################
283
- @user_id = user_id
284
- @user_id11 = user_id
285
- sleep(3)
286
- @driver.get('https://www.tistory.com/auth/login')
287
- sleep(3)
161
+ def message(content)
288
162
 
289
- user_cookie_file = Array.new
290
- begin
291
- Dir.entries('./cookie').each do |i|
292
- if i == '.' or i == '..'
163
+ url = 'https://api.openai.com/v1/chat/completions'
164
+ headers = {
165
+ 'Content-Type' => 'application/json',
166
+ 'Authorization' => 'Bearer ' + @api_key
167
+ }
168
+ data = {
169
+ 'model' => 'gpt-4',
170
+ 'messages' => [{
171
+ "role" => "system",
172
+ "content" => "너는 매우 친절하고 성의 있게 답변하는 AI 어시스턴트야."
173
+ },
174
+ {
175
+ "role" => "user",
176
+ "content" => "#{content}\nChatGPT의 멘트는 빼고 위 전체적인 내용의 형식을 똑같이 표현을 더 추가하고 유사어로 변경하여 하나 만들어줘! 전화번호,연락처,가격,홈페이지안내 ,상담안내 관련 문구는 유지해야해"
177
+ }]
178
+ }
293
179
 
294
- else
295
- user_cookie_file << i
296
- end
180
+ begin
181
+ req = HTTP.headers(headers).post(url, json: data)
182
+ puts "HTTP Status: #{req.status}" # 상태 코드 확인
183
+ response = JSON.parse(req.body.to_s)
184
+ puts "API Response: #{response}" # 전체 응답 출력
185
+
186
+ if req.status == 429
187
+ return "API 요청 제한을 초과했습니다. 플랜 및 할당량을 확인하세요."
297
188
  end
298
- rescue
299
- end
300
189
 
301
- @cookie4 = Hash.new
302
- if user_cookie_file.include?(user_id+'.txt')
303
- f = File.open('./cookie/'+user_id+'.txt', 'r')
304
- @cookie4 = JSON.parse(f.read())
305
- f.close
190
+ # 응답 데이터에서 안전하게 값 추출
191
+ answer = response.dig('choices', 0, 'message', 'content')
192
+ answer ||= (content) # 응답이 없을 경우 기본 메시지 설정
193
+ rescue => e
194
+ puts "Error: #{e.message}"
195
+ answer = "오류가 발생했습니다."
306
196
  end
307
197
 
308
- begin
309
- @cookie4.each do |i|
310
- p i
311
- @driver.manage.add_cookie(name: i['name'], value: i['value'], same_site: i['same_site'], domain: i['domain'], path: i['path'])
312
- end
313
- rescue
314
- end
198
+ puts 'API return ==> '
199
+ puts answer
200
+ answer
201
+ end
202
+ end
203
+
204
+
205
+ #############################################gpt############################################
206
+
207
+ class Naver
208
+ def initialize
209
+ @seed = 1
210
+ @cookie = ''
211
+ end
212
+
213
+ def chrome_start(proxy)
214
+ # 공통 옵션 설정
215
+ Selenium::WebDriver::Chrome::Service.driver_path = './chromedriver.exe'
216
+ options = Selenium::WebDriver::Chrome::Options.new
217
+
218
+ options.add_extension('./crx/app.crx') # 확장 프로그램을 첫 번째 탭에 추가
219
+ options.add_argument('--disable-blink-features=AutomationControlled')
220
+ options.add_argument('--disable-popup-blocking')
221
+ options.add_argument('--dns-prefetch-disable')
222
+ options.add_argument('--disable-dev-shm-usage')
223
+ options.add_argument('--disable-software-rasterizer')
224
+ options.add_argument('--ignore-certificate-errors')
225
+ options.add_argument('--disable-gpu') # GPU 가속 끄기
226
+ 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 위조
227
+ options.add_argument('--disable-web-security')
228
+ options.add_argument('--allow-running-insecure-content')
229
+ options.add_argument('--allow-insecure-localhost')
230
+ options.add_argument('--no-sandbox')
231
+ options.add_argument('--disable-translate')
232
+ options.add_argument('--disable-extensions-file-access-check')
233
+ options.add_argument('--disable-impl-side-painting')
234
+
235
+ # 자동화된 테스트 제거
236
+ options.exclude_switches = ['enable-automation']
237
+
238
+ options.add_preference("profile.password_manager_enabled", false) # 비밀번호 관리자 비활성화
239
+ options.add_preference("credentials_enable_service", false) # 비밀번호 저장 기능 비활성화
240
+ #options.add_preference("profile.managed_default_content_settings.cookies", 2) # 쿠키 관련 팝업 차단
241
+ options.add_preference("profile.default_content_setting_values.notifications", 2) # 알림 차단
242
+ options.add_argument("--disable-save-password-bubble") # 비밀번호 저장 팝업 차단
243
+
244
+
245
+ # Proxy 설정
246
+ if proxy != ''
247
+ options.add_argument('--proxy-server=' + proxy.to_s.force_encoding('utf-8'))
248
+ end
249
+
250
+ # 브라우저 실행
251
+ begin
252
+ # 새 드라이버 실행
253
+ @driver = Selenium::WebDriver.for(:chrome, options: options)
254
+
255
+ # 첫 번째 탭에서 확장 프로그램을 로드
256
+ #@driver.get("chrome-extension://ifibfemgeogfhoebkmokieepdoobkbpo/options/options.html")
315
257
 
316
258
  sleep(1)
259
+ # 두 번째 탭에서 로그인 페이지 열기
260
+ @driver.get('https://www.tistory.com/auth/login')
261
+ sleep(1)
262
+
263
+ rescue => e
264
+
265
+ puts "Error: #{e.message}"
266
+ puts 'Using default Chrome driver without proxy'
267
+ @driver = Selenium::WebDriver.for(:chrome, options: options)
268
+
269
+ # 첫 번째 탭에서 확장 프로그램을 로드
270
+ #@driver.get("chrome-extension://ifibfemgeogfhoebkmokieepdoobkbpo/options/options.html")
271
+ sleep(1)
272
+ # 두 번째 탭에서 로그인 페이지 열기
317
273
  @driver.get('https://www.tistory.com/auth/login')
274
+ sleep(1)
275
+ end
276
+ end
277
+
278
+ def login(user_id, user_pw, proxy, captcha_api_key)
279
+ chrome_start(proxy)
280
+ @captcha_api_key = captcha_api_key
281
+ @user_id = user_id
282
+
283
+ user_cookie_file = []
284
+ begin
285
+ Dir.entries('./cookie').each do |i|
286
+ if i != '.' && i != '..'
287
+ user_cookie_file << i
288
+ end
289
+ end
290
+ rescue
291
+ end
292
+
293
+ @cookie4 = {}
294
+ if user_cookie_file.include?(user_id+'.txt')
295
+ f = File.open('./cookie/'+user_id+'.txt', 'r')
296
+ @cookie4 = JSON.parse(f.read)
297
+ f.close
298
+ end
299
+
300
+ # 기존 쿠키가 있으면 쿠키를 추가
301
+ begin
302
+ @cookie4.each do |i|
303
+ @driver.manage.add_cookie(name: i['name'], value: i['value'], same_site: i['same_site'], domain: i['domain'], path: i['path'])
304
+ end
305
+ rescue
306
+ end
307
+
308
+ @driver.switch_to.window(@driver.window_handles.last)
309
+ sleep(1.5)
310
+ @driver.get('https://www.tistory.com/auth/login')
311
+
312
+ sleep(1)
318
313
  begin
314
+ wait = Selenium::WebDriver::Wait.new(:timeout => 3)
315
+ wait.until { @driver.find_element(:xpath, '//*[@id="cMain"]/div/div/div/div/a[2]/span[2]') }
319
316
  @driver.find_element(:xpath, '//*[@id="cMain"]/div/div/div/div/a[2]/span[2]').click
320
317
  check_cookie_login = 0
321
318
  rescue
@@ -323,45 +320,67 @@ class Naver
323
320
  end
324
321
 
325
322
  if check_cookie_login == 0
326
- sleep(3)
323
+ wait = Selenium::WebDriver::Wait.new(:timeout => 3)
324
+ wait.until { @driver.find_element(:xpath, '//*[@id="loginId--1"]') }
327
325
  @driver.find_element(:xpath, '//*[@id="loginId--1"]').click
328
326
  Clipboard.copy(user_id)
327
+ sleep(0.5)
329
328
  @driver.action.key_down(:control).send_keys('v').key_up(:control).perform
330
329
  puts '-[√] 1 아이디 입력.......'.yellow
331
- sleep(3)
330
+
331
+ wait = Selenium::WebDriver::Wait.new(:timeout => 3)
332
+ wait.until { @driver.find_element(:xpath, '//*[@id="password--2"]') }
332
333
  @driver.find_element(:xpath, '//*[@id="password--2"]').click
333
334
  Clipboard.copy(user_pw)
335
+ sleep(0.5)
334
336
  @driver.action.key_down(:control).send_keys('v').key_up(:control).perform
335
337
  puts '-[√] 2 비밀번호 입력.......'.yellow
336
- sleep(3)
338
+
339
+ wait = Selenium::WebDriver::Wait.new(:timeout => 3)
340
+ wait.until { @driver.find_element(:xpath, '//*[@class="btn_g highlight submit"]') }
337
341
  @driver.find_element(:xpath, '//*[@type="submit"]').click
338
- #@driver.find_element(:xpath, '//*[@id="mainContent"]/div/div/form/div[4]/button[1]').click
339
342
  puts '-[√] 3 로그인 버튼 클릭.......'.yellow
340
-
341
- sleep(5)
342
-
343
-
344
- puts '-[√] 3 캡챠 발생 및 이메일 인증 유무 확인.......'.green
345
- sleep(1)
346
- puts '-[√] 3 캡챠 발생 및 이메일 인증 유무 확인.......'.green
347
- sleep(1)
348
- puts '-[√] 3 캡챠 발생 및 이메일 인증 유무 확인.......'.green
349
- sleep(1)
350
-
351
343
 
344
+ #캡챠 해제시
345
+ begin
346
+ wait = Selenium::WebDriver::Wait.new(:timeout => 3)
347
+ wait.until { @driver.find_element(:xpath, '//*[@id="captchaContainer"]') }
348
+ puts '-[√] 로그인 중 캡챠 요구 발생 처리 진행.......'.yellow
349
+ sleep(1)
350
+ @driver.switch_to.window(@driver.window_handles[0])
351
+ sleep(1)
352
+ @driver.find_element(:xpath, '//*[@name="apiKey"]').click
353
+ Clipboard.copy(captcha_api_key)
354
+ sleep(0.5)
355
+ @driver.action.key_down(:control).send_keys('v').key_up(:control).perform
356
+ sleep(0.5)
357
+ @driver.find_element(:xpath, '//*[@data-lang="login"]').click
358
+
359
+ begin
360
+ sleep(2)
361
+ @driver.switch_to.alert.dismiss
362
+ sleep(1)
363
+ rescue
364
+
365
+ end
352
366
 
367
+ # 두 번째 탭으로 전환
368
+ @driver.switch_to.window(@driver.window_handles[1])
353
369
 
354
370
  begin
371
+ wait = Selenium::WebDriver::Wait.new(:timeout => 7)
372
+ wait.until { @driver.find_element(:xpath, '//*[@data-state="ready"]') }
355
373
  @driver.find_element(:xpath, '//*[@data-state="ready"]').click #캡챠우회버튼
356
374
  puts '-[√] 캡챠 해제 진행 중 (약 30~60 초 소요됩니다).......'.green
357
375
  sleep(10)
376
+
358
377
  begin
359
378
  @driver.find_element(:xpath, '//*[@data-state="error"]').click
360
379
  puts '-[√] 1 캡챠 해제 실패 !! API번호 및 포인트를 체크해주세요.......'.red
361
380
  puts '-[√] 2 캡챠 해제 실패 !! API번호 및 포인트를 체크해주세요.......'.red
362
- @driver.quit()
381
+ sleep(1)
382
+ @driver.quit
363
383
  rescue
364
-
365
384
  # 타임아웃을 77초로 설정
366
385
  wait = Selenium::WebDriver::Wait.new(:timeout => 100)
367
386
  # 요소가 나타날 때까지 100초 동안 기다립니다.
@@ -373,89 +392,107 @@ class Naver
373
392
  @driver.find_element(:xpath, '//*[@id="password--2"]').click #비번 클릭
374
393
  sleep(1)
375
394
  @driver.action.send_keys(:enter).perform #엔터키 주기
376
- sleep(5)
377
- end
378
- rescue
379
- puts '-[√] 캡챠 인증 없음 확인.......'.yellow
380
- sleep(1)
381
- end
382
-
395
+ end
383
396
 
397
+ rescue
398
+ end
384
399
 
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
-
400
+ rescue
401
+ end
401
402
 
402
403
 
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
404
+ # 아이디/비밀번호 오류 처리 부분
405
+ begin
406
+ @driver.find_element(:xpath, '//*[@class="desc_error"]')
407
+ sleep(1)
408
+ @driver.quit
409
+ puts 'error = 아이디/비밀번호 오류'.yellow
410
+ rescue
411
+ end
412
+
413
+
414
+ #예외 변수
415
+ begin
416
+ # 타임아웃을 10초로 설정
417
+ wait = Selenium::WebDriver::Wait.new(:timeout => 1)
418
+ #요소가 나타날 때까지 3초 동안 기다립니다.
419
+ wait.until { @driver.find_element(:xpath, '//*[@class="ico_comm ico_mail"]') }
420
+ @driver.find_element(:xpath, '//*[@class="ico_comm ico_mail"]')
421
+ print "이메일 인증 요구 발생!! 수동으로 인증 완료 후 여기에 엔터를 쳐주세요".cyan
422
+ input = gets.chomp()
423
+ rescue
424
+ end
425
+
426
+ #예외 변수
427
+ begin
428
+ @driver.find_element(:xpath, '//*[@class="link_comm link_g"]').click
429
+ puts '비밀번호 재 요청 다음에하기 클릭'.yellow
430
+ sleep(1)
431
+ rescue
432
+ end
433
+
434
+ #예외 변수
435
+ begin
436
+ @driver.find_element(:xpath, '//*[@class="inner_error inner_error_type2"]')
437
+ puts 'error = 평소와 다른 로그인이 감지되어 추가 인증이 필요합니다.'.yellow
438
+ @driver.quit
439
+ rescue
440
+ end
441
+
442
+ #최종 로그인 실패시
443
+ begin
444
+ wait = Selenium::WebDriver::Wait.new(:timeout => 5)
445
+ wait.until { @driver.find_element(:xpath, '//*[@class="my_tistory border_box"]') }
446
+ rescue => e
447
+ puts '-[√] 로그인 실패.......'.red
448
+ @driver.quit
449
+ return 0
450
+ end
451
+
423
452
  end
424
453
 
425
454
  @cookie = ''
426
- cookie2 = Array.new
455
+ cookie2 = []
427
456
  @driver.manage.all_cookies.each do |i|
428
- puts i
429
- @cookie += i[:name]+'='+i[:value]+'; '
430
457
  cookie2 << i
431
458
  end
432
459
 
460
+ # 쿠키 만료 시간을 1년으로 설정
461
+ cookie2.each do |cookie|
462
+ cookie[:expiry] = Time.now.to_i + 365 * 24 * 60 * 60 # 만료 시간을 1년 후로 설정
463
+ end
464
+
433
465
  File.open('./cookie/'+user_id+'.txt', 'w') do |ff|
434
466
  ff.write(cookie2.to_json)
435
467
  end
436
468
  end
437
-
438
469
 
439
470
  sleep(2)
440
471
 
441
- def update(title, content, option, dd_time, url, keyword)
472
+
473
+
474
+ def update(title, content, option, url, keyword, captcha_api_key)#dd_time
442
475
  puts 'start...'.yellow
443
476
  puts(url)
444
477
  sleep(1)
445
478
  @driver.get(url)
446
- sleep(5)
447
-
479
+ sleep(2)
480
+
448
481
 
449
482
 
450
483
  begin
451
- #@driver.switch_to.window(@driver.window_handles[1])
452
- @driver.switch_to.alert.dismiss
453
- rescue
454
- #@driver.switch_to.window(@driver.window_handles[0])
455
- #@driver.switch_to.alert.dismiss
484
+ # alert이 뜨기를 기다리기
485
+ wait = Selenium::WebDriver::Wait.new(:timeout => 5) # 10초 대기
486
+ alert = wait.until { @driver.switch_to.alert }
487
+
488
+ # alert 처리 (예: dismiss나 accept)
489
+ alert.dismiss # 또는 alert.accept
490
+ sleep(2)
491
+ rescue
492
+ sleep(1)
456
493
  end
457
494
 
458
- sleep(1)
495
+
459
496
 
460
497
 
461
498
 
@@ -489,7 +526,8 @@ class Naver
489
526
  rescue => e
490
527
  puts '-[√] 카테고리 ERROR 발생.......'.red
491
528
  puts '-[√] 다음 작업이 준비중이니 1~60 초 정도 기다려주세요.......'.green
492
- puts e
529
+ @driver.quit
530
+ return 0
493
531
  end
494
532
 
495
533
 
@@ -503,8 +541,10 @@ class Naver
503
541
 
504
542
  begin
505
543
  @driver.find_element(:xpath, '//*[@id="post-title-inp"]').send_keys(title)
506
- rescue
507
- puts '-[√] 페이지 로드(로딩)시간 초과로 작업을 중지합니다.......'.red
544
+ rescue => e
545
+ @driver.quit
546
+ return 0
547
+ puts '-[√] 페이지 로드(로딩)시간 초과 및 알수없는 오류로 종료.......'.red
508
548
  puts '-[√] 다음 작업이 준비중이니 1~60 초 정도 기다려주세요.......'.green
509
549
  puts e
510
550
  end
@@ -517,61 +557,26 @@ class Naver
517
557
 
518
558
  sleep(1)
519
559
 
560
+ begin
561
+ @driver.find_element(:xpath, '//*[@id="mceu_9-button"]').click()
562
+ @driver.find_element(:xpath, '//*[@id="mceu_9-button"]').click()
563
+ rescue => e
564
+ @driver.quit
565
+ return 0
566
+ puts '-[√] 페이지 로드(로딩)시간 초과 및 알수없는 오류로 종료.......'.red
567
+ puts '-[√] 다음 작업이 준비중이니 1~60 초 정도 기다려주세요.......'.green
568
+
569
+ end
520
570
 
521
- @driver.find_element(:xpath, '//*[@id="mceu_9-button"]').click()
522
- @driver.find_element(:xpath, '//*[@id="mceu_9-button"]').click()
523
-
524
571
 
525
572
  puts content
526
573
  noko = Nokogiri::HTML(content, nil, Encoding::UTF_8.to_s)
527
574
  toomung = 0
528
575
  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'
576
+
547
577
 
548
578
  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
- # }
579
+
575
580
 
576
581
  check_position = 1
577
582
  noko.css('p').each do |i|
@@ -971,7 +976,7 @@ class Naver
971
976
  end
972
977
 
973
978
 
974
- #######################################여기까지 복원코드#########################################################
979
+
975
980
 
976
981
 
977
982
  #링크 넣는 코드 ↓
@@ -1042,22 +1047,7 @@ class Naver
1042
1047
  end
1043
1048
  end
1044
1049
  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
-
1050
+
1061
1051
 
1062
1052
 
1063
1053
  @driver.action.key_down(:end).key_up(:end).perform
@@ -1069,52 +1059,10 @@ class Naver
1069
1059
 
1070
1060
  sleep(1)
1071
1061
 
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
1062
  end
1091
1063
 
1092
1064
 
1093
-
1094
-
1095
-
1096
-
1097
-
1098
-
1099
-
1100
-
1101
-
1102
-
1103
-
1104
-
1105
-
1106
-
1107
-
1108
-
1109
-
1110
-
1111
-
1112
-
1113
-
1114
-
1115
-
1116
-
1117
- if option['중앙정렬'] == 'false'
1065
+ if option['중앙정렬'] == 'true'
1118
1066
  puts '-[√] 중앙정렬 선택.......'.yellow
1119
1067
  begin
1120
1068
 
@@ -1128,7 +1076,7 @@ class Naver
1128
1076
  sleep(1.5)
1129
1077
 
1130
1078
 
1131
- if option['좌측정렬'] == 'false'
1079
+ if option['좌측정렬'] == 'true'
1132
1080
  puts '-[√] 좌측정렬 선택.......'.yellow
1133
1081
  begin
1134
1082
  @driver.action.key_down(:control).key_down('a').key_up('a').key_up(:control).perform
@@ -1140,7 +1088,7 @@ class Naver
1140
1088
  sleep(1.5)
1141
1089
 
1142
1090
 
1143
- if option['우측정렬'] == 'false'
1091
+ if option['우측정렬'] == 'true'
1144
1092
  puts '-[√] 우측정렬 선택.......'.yellow
1145
1093
  begin
1146
1094
  @driver.action.key_down(:control).key_down('a').key_up('a').key_up(:control).perform
@@ -1167,224 +1115,287 @@ class Naver
1167
1115
  #태그 입력 항목
1168
1116
 
1169
1117
  sleep(1.5)
1170
-
1171
- @driver.find_element(:xpath, '/html/body/div[1]/div/div[2]/div[3]/button').click
1172
- #1차 완료버튼
1173
- sleep(1.5)
1174
-
1175
- # 타임아웃을 10초로 설정
1176
- wait = Selenium::WebDriver::Wait.new(:timeout => 60)
1177
- #요소가 나타날 때까지 60초 동안 기다립니다.
1178
- wait.until { @driver.find_element(:xpath, '//*[@id="open20"]') }
1179
-
1180
-
1181
- if option['전체공개'] == 'false'
1182
- puts '-[√] 전체공개 선택.......'.yellow
1183
- begin
1184
- sleep(2)
1185
- @driver.find_element(:xpath, '//*[@id="open20"]').click
1186
- rescue
1187
- end
1188
- end
1189
- sleep(2)
1190
-
1191
- if option['비공개'] == 'false'
1192
- puts '-[√] 비공개 선택.......'.yellow
1193
- begin
1194
- sleep(2)
1195
- @driver.find_element(:xpath, '//*[@id="open0"]').click
1196
- rescue
1197
- end
1198
- end
1199
- sleep(2)
1200
-
1201
- if option['댓글허용'] == 'false'
1202
- puts '-[√] 댓글허용 선택.......'.yellow
1203
- begin
1204
- sleep(2)
1205
- @driver.find_element(:xpath, '//*[@class="mce-btn-type1"]').click
1206
- sleep(2)
1207
- @driver.find_element(:partial_link_text, '댓글 허용').click
1208
- rescue
1209
- end
1210
- end
1211
- sleep(2)
1212
-
1213
- if option['댓글 비 허용'] == 'false'
1214
- puts '-[√] 댓글 비 허용 선택.......'.yellow
1215
- begin
1216
- sleep(2)
1217
- @driver.find_element(:xpath, '//*[@class="mce-btn-type1"]').click
1218
- sleep(2)
1219
- @driver.find_element(:partial_link_text, '댓글 비허용').click
1220
- rescue
1221
- end
1222
- end
1223
-
1224
-
1225
- puts '-[√] 캡챠 발생 유무 확인.......'.green
1226
- sleep(1)
1227
- puts '-[√] 캡챠 발생 유무 확인.......'.green
1228
- sleep(1)
1229
- puts '-[√] 캡챠 발생 유무 확인.......'.green
1230
- sleep(1)
1231
1118
 
1232
- 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)
1119
+ ##################글 발행##################
1120
+
1121
+ if option['글발생하기'] == 'true'
1122
+ puts '-[] 발행 선택.......'.yellow
1238
1123
  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
1269
- 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)
1124
+
1125
+
1126
+ @driver.find_element(:xpath, '/html/body/div[1]/div/div[2]/div[3]/button').click
1127
+ #1차 완료버튼
1128
+ sleep(1.5)
1289
1129
 
1290
1130
  # 타임아웃을 10초로 설정
1291
1131
  wait = Selenium::WebDriver::Wait.new(:timeout => 60)
1292
1132
  #요소가 나타날 때까지 60초 동안 기다립니다.
1293
1133
  wait.until { @driver.find_element(:xpath, '//*[@id="open20"]') }
1294
-
1295
1134
 
1296
- if option['전체공개'] == 'false'
1135
+
1136
+ if option['전체공개'] == 'true'
1297
1137
  puts '-[√] 전체공개 선택.......'.yellow
1298
1138
  begin
1299
- sleep(2)
1139
+
1300
1140
  @driver.find_element(:xpath, '//*[@id="open20"]').click
1141
+ sleep(1)
1301
1142
  rescue
1302
1143
  end
1303
1144
  end
1304
- sleep(2)
1305
-
1306
- if option['비공개'] == 'false'
1145
+
1146
+
1147
+ if option['비공개'] == 'true'
1307
1148
  puts '-[√] 비공개 선택.......'.yellow
1308
1149
  begin
1309
- sleep(2)
1310
1150
  @driver.find_element(:xpath, '//*[@id="open0"]').click
1151
+ sleep(1)
1311
1152
  rescue
1312
1153
  end
1313
1154
  end
1314
- sleep(2)
1315
-
1316
- if option['댓글허용'] == 'false'
1155
+
1156
+
1157
+ if option['댓글허용'] == 'true'
1317
1158
  puts '-[√] 댓글허용 선택.......'.yellow
1318
1159
  begin
1319
- sleep(2)
1160
+
1320
1161
  @driver.find_element(:xpath, '//*[@class="mce-btn-type1"]').click
1321
1162
  sleep(2)
1322
1163
  @driver.find_element(:partial_link_text, '댓글 허용').click
1164
+ sleep(1)
1323
1165
  rescue
1324
1166
  end
1325
1167
  end
1326
1168
  sleep(2)
1327
-
1328
- if option['댓글 비 허용'] == 'false'
1169
+
1170
+ if option['댓글 비 허용'] == 'true'
1329
1171
  puts '-[√] 댓글 비 허용 선택.......'.yellow
1330
1172
  begin
1331
- sleep(2)
1332
1173
  @driver.find_element(:xpath, '//*[@class="mce-btn-type1"]').click
1333
1174
  sleep(2)
1334
1175
  @driver.find_element(:partial_link_text, '댓글 비허용').click
1176
+ sleep(1)
1335
1177
  rescue
1336
1178
  end
1337
1179
  end
1338
-
1339
- puts '-[√] 캡챠 발생 유무 확인.......'.green
1340
- sleep(1)
1341
- puts '-[√] 캡챠 발생 유무 확인.......'.green
1342
- sleep(1)
1343
- puts '-[√] 캡챠 발생 유무 확인.......'.green
1344
- sleep(1)
1345
-
1346
- begin
1180
+
1181
+
1182
+
1183
+
1184
+
1185
+
1186
+
1187
+
1188
+
1189
+ #캡챠 해제시######################################################################
1190
+ begin
1191
+ wait = Selenium::WebDriver::Wait.new(:timeout => 3.7)
1192
+ wait.until { @driver.find_element(:xpath, '//*[@id="captchaContainer"]') }
1193
+ puts '-[√] 로그인 중 캡챠 요구 발생 처리 진행.......'.yellow
1194
+ sleep(1)
1195
+ @driver.switch_to.window(@driver.window_handles[0])
1347
1196
  sleep(1)
1348
- puts '-[] 캡챠 발생 유무 확인.......'.green
1349
- @driver.find_element(:xpath, '//*[@data-state="ready"]').click #캡챠우회버튼 (xpath값에서 data-state="ready를 지목하고자 한다면 //*[@data-state="ready"] 입력)
1197
+ @driver.find_element(:xpath, '//*[@name="apiKey"]').click
1198
+ sleep(0.5)
1199
+ @driver.find_element(:xpath, '//*[@name="apiKey"]').clear
1200
+ sleep(0.5)
1201
+ Clipboard.copy(captcha_api_key)
1202
+ sleep(0.5)
1203
+ @driver.action.key_down(:control).send_keys('v').key_up(:control).perform
1204
+ sleep(0.5)
1205
+ @driver.find_element(:xpath, '//*[@data-lang="login"]').click
1206
+
1207
+ begin
1208
+ sleep(2)
1209
+ @driver.switch_to.alert.dismiss
1210
+ sleep(1)
1211
+ rescue
1212
+
1213
+ end
1214
+
1215
+ # 두 번째 탭으로 전환
1216
+ @driver.switch_to.window(@driver.window_handles[1])
1217
+
1218
+ begin
1219
+ wait = Selenium::WebDriver::Wait.new(:timeout => 7)
1220
+ wait.until { @driver.find_element(:xpath, '//*[@data-state="ready"]') }
1221
+ @driver.find_element(:xpath, '//*[@data-state="ready"]').click #캡챠우회버튼
1350
1222
  puts '-[√] 캡챠 해제 진행 중 (약 30~60 초 소요됩니다).......'.green
1351
1223
  sleep(10)
1224
+
1225
+ begin
1226
+ @driver.find_element(:xpath, '//*[@data-state="error"]').click
1227
+ puts '-[√] 1 캡챠 해제 실패 !! API번호 및 포인트를 체크해주세요.......'.red
1228
+ puts '-[√] 2 캡챠 해제 실패 !! API번호 및 포인트를 체크해주세요.......'.red
1229
+
1230
+ @driver.quit
1231
+ puts '-[√] 다음 작업을 진행합니다. 약 10~60초 소요 될 수 있습니다.......'.red
1232
+ rescue
1233
+ # 타임아웃을 77초로 설정
1234
+ wait = Selenium::WebDriver::Wait.new(:timeout => 100)
1235
+ # 요소가 나타날 때까지 100초 동안 기다립니다.
1236
+ wait.until { @driver.find_element(:xpath, '//*[@data-state="solved"]') }
1237
+ sleep(1)
1238
+ @driver.find_element(:xpath, '//*[@data-state="solved"]').click
1239
+ puts '-[√] 캡챠 해제 완료 → 이어서 진행 합니다.......'.green
1240
+ sleep(1)
1241
+
1242
+ end
1243
+
1244
+ rescue
1245
+ end
1246
+
1247
+ rescue
1248
+ end
1249
+ #캡챠 해제시######################################################################
1250
+
1251
+
1252
+
1253
+
1254
+
1255
+
1256
+ #sleep(dd_time.to_i) # 등록버튼 누르기 전 딜레이
1257
+ # 등록 버튼 클릭
1258
+ @driver.find_element(:xpath, '//*[@id="publish-btn"]').click
1259
+ puts '-[√] 포스트 등록 성공 여부 확인 중.......'.yellow
1260
+ sleep(2)
1261
+ ###########포스트 캡챠해제 팝업 시 재시도 작업 시작▼▼▼▼▼▼▼▼▼▼▼▼
1262
+ begin
1263
+ sleep(1)
1264
+ @driver.switch_to.alert.accept
1265
+ puts '-[√] 캡챠 체크 시간 초과!! 재 등록 시도.......'.green
1266
+ sleep(2)
1267
+ @driver.get(url)
1268
+ puts '-[√] 등록 내용 불러오기 시도.......'.yellow
1269
+ sleep(2)
1270
+ @driver.switch_to.alert.accept
1271
+ sleep(2)
1272
+ puts '-[√] 재 등록 시도 시작.......'.yellow
1273
+ @driver.find_element(:xpath, '//*[@id="publish-layer-btn"]').click
1274
+ sleep(2)
1275
+
1276
+ # 타임아웃을 10초로 설정
1277
+ wait = Selenium::WebDriver::Wait.new(:timeout => 60)
1278
+ #요소가 나타날 때까지 60초 동안 기다립니다.
1279
+ wait.until { @driver.find_element(:xpath, '//*[@id="open20"]') }
1280
+
1281
+ if option['전체공개'] == 'true'
1282
+ puts '-[√] 전체공개 선택.......'.yellow
1283
+ begin
1284
+
1285
+ @driver.find_element(:xpath, '//*[@id="open20"]').click
1286
+ sleep(2)
1287
+ rescue
1288
+ end
1289
+ end
1290
+
1291
+
1292
+ if option['비공개'] == 'true'
1293
+ puts '-[√] 비공개 선택.......'.yellow
1294
+ begin
1295
+ @driver.find_element(:xpath, '//*[@id="open0"]').click
1296
+ sleep(2)
1297
+ rescue
1298
+ end
1299
+ end
1300
+
1301
+
1302
+ if option['댓글허용'] == 'true'
1303
+ puts '-[√] 댓글허용 선택.......'.yellow
1304
+ begin
1305
+
1306
+ @driver.find_element(:xpath, '//*[@class="mce-btn-type1"]').click
1307
+ sleep(2)
1308
+ @driver.find_element(:partial_link_text, '댓글 허용').click
1309
+ sleep(2)
1310
+ rescue
1311
+ end
1312
+ end
1313
+ sleep(2)
1314
+
1315
+ if option['댓글 비 허용'] == 'true'
1316
+ puts '-[√] 댓글 비 허용 선택.......'.yellow
1317
+ begin
1318
+ @driver.find_element(:xpath, '//*[@class="mce-btn-type1"]').click
1319
+ sleep(2)
1320
+ @driver.find_element(:partial_link_text, '댓글 비허용').click
1321
+ sleep(2)
1322
+ rescue
1323
+ end
1324
+ end
1325
+
1352
1326
  begin
1353
1327
  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 #등록완료버튼
1328
+ puts '-[] 캡챠 발생 유무 확인.......'.green
1329
+ @driver.find_element(:xpath, '//*[@data-state="ready"]').click #캡챠우회버튼 (xpath값에서 data-state="ready를 지목하고자 한다면 //*[@data-state="ready"] 입력)
1330
+ puts '-[√] 캡챠 해제 진행 중 (약 30~60 초 소요됩니다).......'.green
1331
+ sleep(10)
1332
+ begin
1333
+ sleep(1)
1334
+ @driver.find_element(:xpath, '//*[@data-state="error"]').click #캡챠 해제 오류 버튼
1335
+ puts '-[√] 캡챠 해제 에러 발생 !! API번호 및 포인트를 체크해주세요.......'.red
1336
+ sleep(1)
1337
+ puts '-[] 캡챠 해제 에러 발생 !! API번호 및 포인트를 체크해주세요.......'.red
1338
+ sleep(1)
1339
+ @driver.close
1340
+ puts '-[√] 작업 종료 중........다음 포스팅 작업을 준비 합니다........'.red
1341
+ sleep(1)
1342
+ sleep(dd_time.to_i) #등록버튼 누르기전 딜레이
1343
+ @driver.find_element(:xpath, '//*[@id="publish-btn"]').click #등록완료버튼
1344
+ rescue
1345
+ # 타임아웃을 100초로 설정
1346
+ wait = Selenium::WebDriver::Wait.new(:timeout => 100)
1347
+ # 요소가 나타날 때까지 100초 동안 기다립니다.
1348
+ wait.until { @driver.find_element(:xpath, '//*[@data-state="solved"]') }
1349
+ sleep(2)
1350
+ @driver.find_element(:xpath, '//*[@data-state="solved"]').click #캡챠 해제 완료 버튼
1351
+ puts '-[√] 캡챠 해제 완료 → 이어서 진행 합니다.......'.green
1352
+ sleep(3.7)
1353
+ end
1364
1354
  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
1355
  end
1356
+
1357
+ @driver.find_element(:xpath, '//*[@id="publish-btn"]').click #등록완료버튼
1358
+ puts '-[√] 포스트 등록 성공 여부 확인 중.......'.yellow
1374
1359
  rescue
1375
1360
  end
1376
- sleep(dd_time.to_i) #등록버튼 누르기전 딜레이
1377
- @driver.find_element(:xpath, '//*[@id="publish-btn"]').click #등록완료버튼
1378
- puts '-[√] 포스트 등록 성공 여부 확인 중.......'.yellow
1361
+
1362
+
1363
+
1364
+ # 포스트 등록 완료 확인
1365
+ begin
1366
+ # 포스트 등록 완료를 확인할 수 있는 요소(예: 등록 후 확인 페이지로 이동)
1367
+ wait.until { @driver.find_element(:xpath, '//*[@class="post_cont"]') }
1368
+ puts '-[√] 포스트 등록 완료.......'.yellow
1369
+ sleep(1.5)
1370
+ @driver.quit
1371
+ rescue => e
1372
+ puts '-[×] 포스트 등록 실패!'.red
1373
+ @driver.quit
1374
+ return 0
1375
+ end
1376
+
1379
1377
  rescue
1380
1378
  end
1381
- ###########포스트 캡챠해제 팝업 시 재시도 작업 끝 ▲▲▲▲▲▲▲▲▲▲▲▲
1382
- sleep(5)
1383
- @driver.find_element(:xpath, '//*[@class="post_cont"]')
1384
- sleep(1)
1385
- puts '-[√] 포스트 등록 완료.......'.yellow
1386
- @driver.close
1387
1379
  end
1380
+
1381
+
1382
+ if option['글임시저장'] == 'true'
1383
+ puts '-[√] 임시 저장 선택.......'.yellow
1384
+ begin
1385
+
1386
+ @driver.find_element(:xpath, '//*[@class="btn btn-draft"]').click
1387
+ sleep(1.5)
1388
+ @driver.quit
1389
+ rescue
1390
+ end
1391
+ end
1392
+
1393
+
1394
+
1395
+
1396
+
1397
+
1398
+
1388
1399
 
1389
1400
 
1390
1401
  end
@@ -1525,11 +1536,11 @@ class Wordpress
1525
1536
 
1526
1537
 
1527
1538
 
1528
- def chrome_start(url, user_id, user_pw, captcha_key)
1539
+ def chrome_start(url, user_id, user_pw, captcha_api_key)
1529
1540
  @url = url
1530
1541
  @user_id = user_id
1531
1542
  @user_pw = user_pw
1532
- @captcha_key = captcha_key
1543
+ @captcha_api_key = captcha_api_key
1533
1544
  begin
1534
1545
  Selenium::WebDriver::Chrome::Service.driver_path = './chromedriver.exe'
1535
1546
  @driver = Selenium::WebDriver.for :chrome
@@ -1538,95 +1549,7 @@ class Wordpress
1538
1549
  end
1539
1550
  end
1540
1551
 
1541
- def login
1542
- @driver.get(@url+'/wp-admin')
1543
- @driver.find_element(:xpath , '//*[@id="user_login"]').send_keys(@user_id)
1544
- @driver.find_element(:xpath , '//*[@id="user_pass"]').send_keys(@user_pw)
1545
- @driver.find_element(:xpath , '//*[@id="wp-submit"]').click
1546
- @cookie = Hash.new
1547
- @driver.manage.all_cookies.each do |i|
1548
- @cookie[i[:name]] = i[:value]
1549
- end
1550
- sleep(2)
1551
- begin
1552
- puts @driver.find_element(:xpath , '/html/body/div/div/div[1]/div[1]/div/div[1]/a[1]/span').text
1553
- @driver.close
1554
- return 1
1555
- rescue => e
1556
- puts e
1557
- @driver.close
1558
- return 0
1559
- end
1560
- end
1561
-
1562
- def update
1563
- http = HTTP.cookies(@cookie).get(@url+'/wp-admin/post-new.php')
1564
- noko = Nokogiri::HTML(http.to_s)
1565
- @wpnonce = http.to_s.split('_wpnonce":"')[1].split('"')[0]
1566
- @data2 = Hash.new
1567
- @data2['_wpnonce'] = noko.xpath('//*[@id="_wpnonce"]')[0]['value']
1568
- @data2['_wp_http_referer'] = '/wp-admin/post-new.php'
1569
- @data2['user_ID'] = '1'
1570
- @data2['action'] = 'editpost'
1571
- @data2['originalaction'] = 'editpost'
1572
- @data2['post_author'] = '1'
1573
- @data2['post_type'] = 'post'
1574
- @data2['original_post_status'] = 'auto-draft'
1575
- @data2['referredby'] = @url+'/wp-admin/update-core.php'
1576
- @data2['_wp_original_http_referer'] = @url+'/wp-admin/update-core.php'
1577
- @data2['auto_draft'] = nil
1578
- @data2['post_ID'] = noko.xpath('//*[@id="post_ID"]')[0]['value']
1579
- @data2['meta-box-order-nonce'] = noko.xpath('//*[@id="meta-box-order-nonce"]')[0]['value']
1580
- @data2['closedpostboxesnonce'] = noko.xpath('//*[@id="closedpostboxesnonce"]')[0]['value']
1581
- @data2['post_title'] = 'title3'
1582
- @data2['samplepermalinknonce'] = noko.xpath('//*[@id="samplepermalinknonce"]')[0]['value']
1583
- @data2['content'] = 'content3'
1584
- @data2['wp-preview'] = nil
1585
- @data2['hidden_post_status'] = 'draft'
1586
- @data2['post_status'] = 'draft'
1587
- @data2['hidden_post_password'] = nil
1588
- @data2['hidden_post_visibility'] = 'public'
1589
- @data2['visibility'] = 'post'
1590
- @data2['post_password'] = nil
1591
- @data2['mm'] = '10'
1592
- @data2['jj'] = '24'
1593
- @data2['aa'] = '2022'
1594
- @data2['hh'] = '02'
1595
- @data2['mn'] = '41'
1596
- @data2['ss'] = '32'
1597
- @data2['hidden_mm'] = '10'
1598
- @data2['cur_mm'] = '10'
1599
- @data2['hidden_jj'] = '24'
1600
- @data2['cur_jj'] = '24'
1601
- @data2['hidden_aa'] = '2022'
1602
- @data2['cur_aa'] = '2022'
1603
- @data2['hidden_hh'] = '02'
1604
- @data2['cur_hh'] = '02'
1605
- @data2['hidden_mn'] = '41'
1606
- @data2['cur_mn'] = '41'
1607
- @data2['original_publish'] = '공개'
1608
- @data2['publish'] = '공개'
1609
- @data2['post_format'] = '0'
1610
- @data2['post_category[]'] = '0'
1611
- @data2['newcategory'] = '새 카테고리 이름'
1612
- @data2['newcategory_parent'] = -1
1613
- @data2['_ajax_nonce-add-category'] = noko.xpath('//*[@id="_ajax_nonce-add-category"]')[0]['value']
1614
- @data2['tax_input[post_tag]'] = nil
1615
- @data2['newtag[post_tag]'] = nil
1616
- @data2['_thumbnail_id'] = -1
1617
- @data2['excerpt'] = nil
1618
- @data2['trackback_url'] = nil
1619
- @data2['metakeyinput'] = nil
1620
- @data2['metavalue'] = nil
1621
- @data2['_ajax_nonce-add-meta'] = noko.xpath('//*[@id="_ajax_nonce-add-meta"]')[0]['value']
1622
- @data2['advanced_view'] = '1'
1623
- @data2['comment_status'] = 'open'
1624
- @data2['ping_status'] = 'open'
1625
- @data2['post_name'] = nil
1626
- @data2['post_author_override'] = '1'
1627
- #result_http = HTTP.cookies(@cookie).post(@url+'/wp-admin/post.php', :form => @data)
1628
- return @data2
1629
- end
1552
+
1630
1553
 
1631
1554
  def auto_image
1632
1555
  begin
@@ -1859,7 +1782,7 @@ class Wordpress
1859
1782
 
1860
1783
  while true
1861
1784
  for n in 0..@data['table'].length-1
1862
- @data['table'][n][10] = 0
1785
+ @data['table'][n][8] = 0
1863
1786
  end
1864
1787
 
1865
1788
  while true
@@ -1881,6 +1804,7 @@ class Wordpress
1881
1804
  option['category'] = ''
1882
1805
  end
1883
1806
 
1807
+
1884
1808
  #begin
1885
1809
  # option['category2'] = table[5].to_s.force_encoding('utf-8').to_s
1886
1810
  # if option['category2'].to_s == '편집모드'
@@ -1892,10 +1816,10 @@ class Wordpress
1892
1816
 
1893
1817
  option['proxy'] = ''
1894
1818
  if @data['포스트설정']['프록시'].checked?
1895
- if table[6].to_s.include?('ex)') or table[6].to_i == 0
1819
+ if table[5].to_s.include?('ex)') or table[5].to_i == 0
1896
1820
  option['proxy'] = @data['포스트설정']['프록시리스트'].sample.to_s
1897
1821
  else
1898
- option['proxy'] = table[6].to_s.force_encoding('utf-8').to_s
1822
+ option['proxy'] = table[5].to_s.force_encoding('utf-8').to_s
1899
1823
  end
1900
1824
  end
1901
1825
 
@@ -1903,9 +1827,10 @@ class Wordpress
1903
1827
 
1904
1828
 
1905
1829
 
1906
- puts table[7]
1907
- puts table[10]
1908
- if table[7].to_i > table[10].to_i
1830
+ puts table[6]
1831
+ puts table[8]
1832
+
1833
+ if table[6].to_i > table[8].to_i
1909
1834
  if @data['포스트설정']['테더링'].checked?
1910
1835
  puts 'tedering ip change...'
1911
1836
  stdout, stderr, status = Open3.capture3('./adb devices')
@@ -1953,6 +1878,14 @@ class Wordpress
1953
1878
  end
1954
1879
  end
1955
1880
  end
1881
+
1882
+ if @data['포스트설정']['gpt제목'].checked?
1883
+ chat = Chat_title.new(@data['포스트설정']['api_key'].text.to_s.force_encoding('utf-8'))
1884
+ gpt_text1 = chat.message(title)
1885
+ title = gpt_text1.to_s
1886
+ end
1887
+
1888
+
1956
1889
  @data['table'][index][-1] = 5
1957
1890
  @data['table'] << []
1958
1891
  @data['table'].pop
@@ -1990,6 +1923,25 @@ class Wordpress
1990
1923
  end
1991
1924
  end
1992
1925
  end
1926
+
1927
+ if @data['포스트설정']['gpt내용'].checked?
1928
+ api_key = @data['포스트설정']['api_key'].text.to_s.force_encoding('utf-8')
1929
+ #key_change = @data['포스트설정']['특정단어키워드로변경값'].text.to_s.force_encoding('utf-8')
1930
+ #imotcon_change = @data['포스트설정']['스티커로변경단어'].text.to_s.force_encoding('utf-8')
1931
+ #template_change = @data['포스트설정']['내템플릿변경단어'].text.to_s.force_encoding('utf-8')
1932
+ #ttdanar_change = @data['포스트설정']['단어링크적용단어'].text.to_s.force_encoding('utf-8')
1933
+ #sajine_change = @data['포스트설정']['단어사진으로변경단어'].text.to_s.force_encoding('utf-8')
1934
+ #mov_change = @data['포스트설정']['영상으로변경단어'].text.to_s.force_encoding('utf-8')
1935
+ #map_change = @data['포스트설정']['지도로변경단어'].text.to_s.force_encoding('utf-8')
1936
+ #inyong9_change = @data['포스트설정']['인용구변경단어'].text.to_s.force_encoding('utf-8')
1937
+
1938
+
1939
+ chat = Chat_content.new(api_key)
1940
+ gpt_text3 = chat.message(content)
1941
+ content = gpt_text3.to_s
1942
+ end
1943
+
1944
+
1993
1945
  content_tag = content.split('@##@')[1]
1994
1946
  content = content.split('@##@')[0]
1995
1947
  @data['table'][index][-1] = 15
@@ -2006,14 +1958,14 @@ class Wordpress
2006
1958
  proxy = table[3].to_s
2007
1959
  user_id = table[1].to_s
2008
1960
  user_pw = table[2].to_s
2009
- captcha_key = table[6].to_s
1961
+ captcha_api_key = @data['포스트설정']['captcha_api_key'].text.to_s.force_encoding('utf-8')
2010
1962
  naver = Naver.new
2011
1963
  @data['table'][index][-1] = 25
2012
1964
  @data['table'] << []
2013
1965
  @data['table'].pop
2014
1966
 
2015
- #네이버로그인
2016
- login_check = naver.login(user_id, user_pw, option['proxy'], captcha_key)
1967
+ #네이버로그인login(user_id, user_pw, proxy ,captcha_api_key)
1968
+ login_check = naver.login(user_id, user_pw, option['proxy'], captcha_api_key)
2017
1969
  if login_check == 0
2018
1970
  black_users << table[1].to_s
2019
1971
  next
@@ -2185,11 +2137,11 @@ class Wordpress
2185
2137
  content = content2
2186
2138
  end
2187
2139
  end
2188
-
2140
+
2189
2141
  @data['table'][index][-1] = 50
2190
2142
  @data['table'] << []
2191
2143
  @data['table'].pop
2192
- if @data['포스트설정']['gpt'].checked?
2144
+ if @data['포스트설정']['gpt키워드'].checked?
2193
2145
  chat = Chat.new(@data['포스트설정']['api_key'].text.to_s.force_encoding('utf-8'))
2194
2146
  gpt_text = chat.message(keyword)
2195
2147
  content = content.to_s + "\n(자동생성글)\n" + gpt_text.to_s
@@ -2210,7 +2162,7 @@ class Wordpress
2210
2162
  joongbok_check = 0
2211
2163
  counter10 = 0
2212
2164
  while joongbok_check == 0
2213
- if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt'].checked?
2165
+ if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt키워드'].checked?
2214
2166
  content22 = content.split("(자동생성글)")[1].split("\n")
2215
2167
  else
2216
2168
  content22 = content.split("\n")
@@ -2234,12 +2186,12 @@ class Wordpress
2234
2186
  content2 = content.split("\n")
2235
2187
  end
2236
2188
 
2237
- if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt'].checked?
2189
+ if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt키워드'].checked?
2238
2190
  content2 = content.split("(자동생성글)")[1].split("\n")
2239
2191
  position.pop
2240
2192
  end
2241
2193
 
2242
- 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
2243
2195
  content2 = content.split("\n")
2244
2196
  end
2245
2197
 
@@ -2285,7 +2237,7 @@ class Wordpress
2285
2237
  content = content3.join("\n")
2286
2238
  end
2287
2239
 
2288
- if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt'].checked?
2240
+ if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt키워드'].checked?
2289
2241
  content2.each_with_index do |con, index|
2290
2242
  if position.include?(index)
2291
2243
  insert_keyword_text = keyword.to_s
@@ -2315,7 +2267,7 @@ class Wordpress
2315
2267
  end
2316
2268
  end
2317
2269
 
2318
- if @data['포스트설정']['내용과자동생성'].checked? == false and @data['포스트설정']['내용을자동생성'].checked? == false and @data['포스트설정']['gpt'].checked? == false
2270
+ if @data['포스트설정']['내용과자동생성'].checked? == false and @data['포스트설정']['내용을자동생성'].checked? == false and @data['포스트설정']['gpt키워드'].checked? == false
2319
2271
  begin
2320
2272
  content2.each_with_index do |con, index|
2321
2273
  if position.include?(index)
@@ -2374,101 +2326,70 @@ class Wordpress
2374
2326
  end
2375
2327
 
2376
2328
  image_thum_ids = Array.new
2377
-
2378
2329
  image_memory = Array.new
2379
-
2330
+
2380
2331
  if @data['포스트설정']['내용사진자동삽입'].checked?
2381
2332
  puts '내용사진자동삽입...'
2333
+
2382
2334
  sn = @data['포스트설정']['내용사진자동삽입시작숫자'].text.to_s.force_encoding('utf-8').to_i
2383
2335
  en = @data['포스트설정']['내용사진자동삽입끝숫자'].text.to_s.force_encoding('utf-8').to_i
2336
+
2384
2337
  begin
2385
2338
  cn = rand(sn..en)
2386
2339
  rescue
2387
2340
  cn = 0
2388
2341
  puts 'cn = rand(sn..en) error cn = 1'
2389
2342
  end
2390
-
2343
+
2391
2344
  if cn != 0
2392
- position = Array.new
2393
- if @data['포스트설정']['내용과자동생성'].checked?
2394
- for n in 1..cn
2395
- position << rand(0..(content.split("(자동생성글)")[1].split("\n").length-1))
2396
- sleep(2)
2397
- end
2398
- position.pop
2399
- else
2400
- for n in 1..cn
2401
- position << rand(0..(content.split("\n").length-2))
2402
- sleep(2)
2403
- end
2404
- end
2405
-
2406
- if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt'].checked?
2407
- content5 = content.split("(자동생성글)")[0].to_s.split("\n")
2408
- content55 = content.split("(자동생성글)")[1].to_s
2409
-
2410
- else
2411
- content55 = ''
2412
- content5 = content.split("(자동생성글)")[0].to_s.split("\n")
2413
- end
2414
-
2415
- p content5
2416
- puts content55
2417
- p position
2418
-
2419
- while true
2420
- check11 = 0
2421
- for nn in 0..position.length-1
2422
- if content5[position[nn]].to_s.include?('style') or content5[position[nn]].to_s.include?('<') or content5[position[nn]].to_s.include?('>')
2423
- check11 = 1
2424
- position[nn] += 4
2425
- end
2426
- end
2427
- if check11 == 0
2428
- break
2345
+ # 내용 분할 (자동 생성 글과 텍스트)
2346
+ content5 = content.split("(자동생성글)")[0].to_s.split("\n")
2347
+ content55 = content.split("(자동생성글)")[1].to_s if @data['포스트설정']['내용과자동생성'].checked? || @data['포스트설정']['gpt키워드'].checked?
2348
+
2349
+ # 빈 줄 찾기
2350
+ empty_positions = content5.each_with_index.select { |line, index| line.strip.empty? }.map { |line, index| index }
2351
+
2352
+ # 빈 줄이 부족하면 텍스트 끝에 빈 줄 추가
2353
+ if empty_positions.length < cn
2354
+ # 부족한 빈 줄의 수
2355
+ missing_empty_lines = cn - empty_positions.length
2356
+ missing_empty_lines.times do
2357
+ content5 << "" # 텍스트 마지막에 빈 줄 추가
2429
2358
  end
2359
+ empty_positions = content5.each_with_index.select { |line, index| line.strip.empty? }.map { |line, index| index } # 다시 빈 줄 위치 계산
2430
2360
  end
2431
-
2432
- position = position.sort
2433
-
2434
- if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt'].checked?
2361
+
2362
+ # 이미지 삽입할 위치를 지정 (빈 줄 위치에 삽입)
2363
+ position = empty_positions[0..cn-1]
2364
+
2365
+ # 이미지 URL 가져오기
2366
+ if @data['포스트설정']['내용과자동생성'].checked? || @data['포스트설정']['gpt키워드'].checked?
2435
2367
  image_url22 = get_image_file().force_encoding('utf-8')
2436
2368
  end
2437
-
2369
+
2370
+ # 각 위치에 이미지를 하나씩만 삽입
2438
2371
  position.each do |i|
2439
2372
  image_url = get_image_file().force_encoding('utf-8')
2440
- puts image_url
2441
-
2442
- puts '사진넣는위치 => '+i.to_s
2373
+ puts '사진넣는위치 => ' + i.to_s
2374
+
2375
+ # 링크가 있을 경우 링크 포함
2443
2376
  if @data['포스트설정']['내용사진링크'].checked?
2444
- image_memory << ""+'<a href="'+@data['포스트설정']['내용사진링크값'].text.to_s.force_encoding('utf-8').force_encoding('utf-8')+'"><img src="'+image_url+'" alt="'+keyword.force_encoding('utf-8')+'"></a>'+""
2445
- content5.insert(i, '**image**')
2377
+ image_memory << "<a href='" + @data['포스트설정']['내용사진링크값'].text.to_s.force_encoding('utf-8') + "'><img src='" + image_url + "' alt='" + keyword.force_encoding('utf-8') + "'></a>"
2378
+ content5[i] = '**image**' # 빈 줄에 이미지를 삽입
2446
2379
  else
2447
- image_memory << ""+'<img src="'+image_url+'" alt="'+keyword+'" class="aligncenter size-full">'+""
2448
- content5.insert(i, '**image**')
2380
+ image_memory << "<img src='" + image_url + "' alt='" + keyword + "' class='aligncenter size-full'>"
2381
+ content5[i] = '**image**' # 빈 줄에 이미지를 삽입
2449
2382
  end
2450
2383
  end
2451
-
2452
- if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt'].checked?
2453
- content = content5.join("\n")+'(자동생성글)'+content55
2454
- # iconv = Iconv.new('UTF-8', 'ASCII-8BIT')
2455
- # content = iconv.iconv(content)
2456
- # content = content.encode('UTF-8', 'binary', invalid: :replace, replace: '')
2457
- puts content
2458
- image_url = image_url22
2459
-
2460
- # if @data['포스트설정']['자동글 수식에 입력'].checked?
2461
-
2462
- # else
2463
- # if @data['포스트설정']['내용사진링크'].checked?
2464
- # content = content.split('(자동생성글)')[0]+""+'<a href="'+@data['포스트설정']['내용사진링크값'].text.to_s.force_encoding('utf-8')+'"><img src="'+image_url+'" alt="'+keyword+'"></a>'+""+'(자동생성글)'+content.split('(자동생성글)')[1]
2465
- # else
2466
- # content = content.split('(자동생성글)')[0]+""+'<img src="'+image_url+'" alt="'+keyword+'" >'+""+'(자동생성글)'+content.split('(자동생성글)')[1]
2467
- # end
2468
- # end
2384
+
2385
+ # 자동 생성된 내용과 합치기
2386
+ if @data['포스트설정']['내용과자동생성'].checked? || @data['포스트설정']['gpt키워드'].checked?
2387
+ content = content5.join("\n") + '(자동생성글)' + content55
2469
2388
  else
2470
2389
  content = content5.join("\n")
2471
2390
  end
2391
+
2392
+ puts content
2472
2393
  end
2473
2394
  end
2474
2395
 
@@ -2619,7 +2540,7 @@ class Wordpress
2619
2540
  # content = content
2620
2541
  # soosick_1 = content_end
2621
2542
  #else
2622
- if @data['포스트설정']['gpt'].checked?
2543
+ if @data['포스트설정']['gpt키워드'].checked?
2623
2544
  if @data['포스트설정']['gpt상단'].checked?
2624
2545
  content = content_end+"\n"+content+"\n"
2625
2546
  else
@@ -2688,27 +2609,27 @@ class Wordpress
2688
2609
 
2689
2610
 
2690
2611
  if @data['포스트설정']['전체공개'].checked?
2691
- option['전체공개'] = 'false'
2692
- else
2693
2612
  option['전체공개'] = 'true'
2613
+ else
2614
+ option['전체공개'] = 'false'
2694
2615
  end
2695
2616
 
2696
2617
  if @data['포스트설정']['비공개'].checked?
2697
- option['비공개'] = 'false'
2698
- else
2699
2618
  option['비공개'] = 'true'
2619
+ else
2620
+ option['비공개'] = 'false'
2700
2621
  end
2701
2622
 
2702
2623
  if @data['포스트설정']['댓글허용'].checked?
2703
- option['댓글허용'] = 'false'
2704
- else
2705
2624
  option['댓글허용'] = 'true'
2625
+ else
2626
+ option['댓글허용'] = 'false'
2706
2627
  end
2707
2628
 
2708
2629
  if @data['포스트설정']['댓글 비 허용'].checked?
2709
- option['댓글 비 허용'] = 'false'
2710
- else
2711
2630
  option['댓글 비 허용'] = 'true'
2631
+ else
2632
+ option['댓글 비 허용'] = 'false'
2712
2633
  end
2713
2634
 
2714
2635
 
@@ -2717,40 +2638,55 @@ class Wordpress
2717
2638
  end
2718
2639
 
2719
2640
  if @data['포스트설정']['중앙정렬'].checked?
2720
- option['중앙정렬'] = 'false'
2721
- else
2722
2641
  option['중앙정렬'] = 'true'
2642
+ else
2643
+ option['중앙정렬'] = 'false'
2723
2644
  end
2724
2645
 
2725
2646
  if @data['포스트설정']['우측정렬'].checked?
2726
- option['우측정렬'] = 'false'
2727
- else
2728
2647
  option['우측정렬'] = 'true'
2648
+ else
2649
+ option['우측정렬'] = 'false'
2729
2650
  end
2730
2651
 
2731
2652
  if @data['포스트설정']['좌측정렬'].checked?
2653
+ option['좌측정렬'] = 'true'
2654
+ else
2732
2655
  option['좌측정렬'] = 'false'
2656
+ end
2657
+
2658
+ if @data['포스트설정']['글발생하기'].checked?
2659
+ option['글발생하기'] = 'true'
2733
2660
  else
2734
- option['좌측정렬'] = 'true'
2661
+ option['글발생하기'] = 'false'
2662
+ end
2663
+
2664
+ if @data['포스트설정']['글임시저장'].checked?
2665
+ option['글임시저장'] = 'true'
2666
+ else
2667
+ option['글임시저장'] = 'false'
2735
2668
  end
2736
2669
 
2670
+
2737
2671
  @data['table'][index][-1] = 90
2738
2672
  @data['table'] << []
2739
2673
  @data['table'].pop
2740
2674
 
2741
2675
  p option
2742
2676
 
2743
- dd_time = @data['table'][index][9].to_s.force_encoding('utf-8').to_i
2677
+ #dd_time = @data['table'][index][8].to_s.force_encoding('utf-8').to_i
2744
2678
  url = @data['table'][index][3].to_s.force_encoding('utf-8')
2745
-
2679
+ captcha_api_key = @data['포스트설정']['captcha_api_key'].text.to_s.force_encoding('utf-8')
2680
+
2681
+
2746
2682
  puts 'start...'
2747
- naver.update(title,content,option, dd_time, url, keyword)
2683
+ naver.update(title,content,option, url, keyword, captcha_api_key)#dd_time
2748
2684
 
2749
- @data['table'][index][10] = @data['table'][index][10].to_i + 1
2685
+ @data['table'][index][8] = @data['table'][index][8].to_i + 1
2750
2686
  @data['table'][index][-1] = 100
2751
2687
  @data['table'] << []
2752
2688
  @data['table'].pop
2753
- sleep(@data['table'][index][8].to_i)
2689
+ sleep(@data['table'][index][7].to_i)
2754
2690
  end
2755
2691
  rescue => e
2756
2692
  puts e
@@ -3094,13 +3030,11 @@ class Wordpress
3094
3030
  horizontal_box{
3095
3031
  stretchy false
3096
3032
  horizontal_box{
3097
- @data['captcha_key'] = entry{
3098
- text 'captcha_api_key 입력'
3099
- }
3033
+
3100
3034
  button('등록'){
3101
3035
  on_clicked {
3102
- @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]
3103
- @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]
3036
+ @data['table'] << [false, @data['site_id_input'].text, @data['site_pw_input'].text,@data['게시판url'].text,@data['category'].text, @data['proxy'].text, 1, 1, 0,0]
3037
+ @data['table'] << [false, @data['site_id_input'].text, @data['site_pw_input'].text,@data['게시판url'].text,@data['category'].text, @data['proxy'].text, 1, 1, 0,0]
3104
3038
  @data['table'].pop
3105
3039
  }
3106
3040
  }
@@ -3112,8 +3046,8 @@ class Wordpress
3112
3046
  file_data.split("\n").each do |i|
3113
3047
  i3 = i.to_s.force_encoding('utf-8').to_s
3114
3048
  i2 = i3.split(',')
3115
- @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]
3116
- @data['table'] << [false, i2[0].to_s, i2[1].to_s,1,1,1,0,0]
3049
+ @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,0,0]
3050
+ @data['table'] << [false, i2[0].to_s, i2[1].to_s,1,1,0,0]
3117
3051
  @data['table'].pop
3118
3052
  end
3119
3053
  end
@@ -3168,19 +3102,16 @@ class Wordpress
3168
3102
  text_column('프록시'){
3169
3103
  editable true
3170
3104
  }
3171
- text_column('캡차api'){
3172
- editable true
3173
- }
3174
-
3105
+
3175
3106
  text_column('수량'){
3176
3107
  editable true
3177
3108
  }
3178
3109
  text_column('다음 작업 딜레이'){
3179
3110
  editable true
3180
3111
  }
3181
- text_column('등록 버튼 딜레이'){
3182
- editable true
3183
- }
3112
+ # text_column('등록 버튼 딜레이'){
3113
+ # editable true
3114
+ # }
3184
3115
  text_column('시도 횟수'){
3185
3116
 
3186
3117
  }
@@ -3192,27 +3123,28 @@ class Wordpress
3192
3123
 
3193
3124
  horizontal_box{
3194
3125
  stretchy false
3195
-
3196
- @data['captcha_key1'] = entry{
3197
- text 'captcha_api_key 입력'
3126
+
3127
+ @data['포스트설정']['captcha_api_key'] = entry(){
3128
+ text 'captcha_api_key 입력'
3198
3129
  }
3130
+
3199
3131
  @data['table_counter_input'] = entry{
3200
3132
  text '수량 ex) 3'
3201
3133
  }
3202
3134
  @data['table_delay_input'] = entry{
3203
3135
  text '딜레이 ex) 3'
3204
3136
  }
3205
- @data['table_delay_input2'] = entry{
3206
- text '등록전딜레이'
3207
- }
3137
+ #@data['table_delay_input2'] = entry{
3138
+ # text '등록전딜레이'
3139
+ #}
3208
3140
 
3209
3141
  button('전체설정'){
3210
3142
  on_clicked{
3211
3143
  for n in 0..@data['table'].length-1
3212
- @data['table'][n][6] = @data['captcha_key1'].text.to_s
3213
- @data['table'][n][7] = @data['table_counter_input'].text.to_i
3214
- @data['table'][n][8] = @data['table_delay_input'].text.to_i
3215
- @data['table'][n][9] = @data['table_delay_input2'].text.to_i
3144
+
3145
+ @data['table'][n][6] = @data['table_counter_input'].text.to_i
3146
+ @data['table'][n][7] = @data['table_delay_input'].text.to_i
3147
+ #@data['table'][n][8] = @data['table_delay_input2'].text.to_i
3216
3148
  @data['table'] << []
3217
3149
  @data['table'].pop
3218
3150
  end
@@ -3248,7 +3180,10 @@ class Wordpress
3248
3180
  }
3249
3181
  horizontal_box{
3250
3182
  stretchy false
3183
+ grid{
3251
3184
  button('전체선택'){
3185
+ top 1
3186
+ left 1
3252
3187
  on_clicked{
3253
3188
  for n in 0..@data['키워드설정']['키워드'].length-1
3254
3189
  @data['키워드설정']['키워드'][n][0] = true
@@ -3257,7 +3192,20 @@ class Wordpress
3257
3192
  end
3258
3193
  }
3259
3194
  }
3260
- button('키워드삭제'){
3195
+ button('선택해제'){
3196
+ top 1
3197
+ left 2
3198
+ on_clicked{
3199
+ for n in 0..@data['키워드설정']['키워드'].length-1
3200
+ @data['키워드설정']['키워드'][n][0] = false
3201
+ @data['키워드설정']['키워드'] << []
3202
+ @data['키워드설정']['키워드'].pop
3203
+ end
3204
+ }
3205
+ }
3206
+ button('삭제하기'){
3207
+ top 1
3208
+ left 3
3261
3209
  on_clicked{
3262
3210
  m = Array.new
3263
3211
  for n in 0..@data['키워드설정']['키워드'].length-1
@@ -3265,13 +3213,15 @@ class Wordpress
3265
3213
  m << n
3266
3214
  end
3267
3215
  end
3268
-
3216
+
3269
3217
  m.reverse.each do |i|
3270
3218
  @data['키워드설정']['키워드'].delete_at(i)
3271
3219
  end
3272
3220
  @data['키워드설정']['키워드'].delete(nil)
3273
3221
  }
3274
3222
  }
3223
+ }
3224
+
3275
3225
  @data['키워드설정']['순서사용'] = checkbox('순서사용'){
3276
3226
  stretchy false
3277
3227
  on_toggled{ |c|
@@ -3289,6 +3239,58 @@ class Wordpress
3289
3239
  }
3290
3240
  }
3291
3241
  }
3242
+ vertical_separator{
3243
+ stretchy false
3244
+ }
3245
+ horizontal_box{
3246
+ stretchy false
3247
+ grid{
3248
+ @data['포스트설정']['gpt키워드'] = checkbox('GPT 키워드 기반 글 생성'){
3249
+ top 1
3250
+ left 0
3251
+ #enabled false # 기본적으로 비활성화
3252
+ on_toggled {
3253
+ if @data['포스트설정']['gpt키워드'].checked?
3254
+ @data['포스트설정']['gpt상단'].enabled = true # '내용투명' 활성화
3255
+ @data['포스트설정']['gpt하단'].enabled = true # '내용투명' 활성화
3256
+ else
3257
+ @data['포스트설정']['gpt상단'].checked = false # 체크 해제
3258
+ @data['포스트설정']['gpt상단'].enabled = false # 비활성화
3259
+ @data['포스트설정']['gpt하단'].checked = false # 체크 해제
3260
+ @data['포스트설정']['gpt하단'].enabled = false # 비활성화
3261
+ end
3262
+ }
3263
+
3264
+ }
3265
+
3266
+ @data['포스트설정']['gpt상단'] = checkbox('원고 위에 넣기'){
3267
+ top 1
3268
+ left 1
3269
+ enabled false # 기본적으로 비활성화
3270
+ on_toggled{
3271
+ if @data['포스트설정']['gpt상단'].checked?
3272
+ @data['포스트설정']['gpt하단'].checked = false
3273
+ end
3274
+ }
3275
+ }
3276
+
3277
+ @data['포스트설정']['gpt하단'] = checkbox('원고 아래 넣기'){
3278
+ top 1
3279
+ left 2
3280
+ enabled false # 기본적으로 비활성화
3281
+ on_toggled{
3282
+ if @data['포스트설정']['gpt하단'].checked?
3283
+ @data['포스트설정']['gpt상단'].checked = false
3284
+ end
3285
+ }
3286
+ }
3287
+ } }
3288
+ horizontal_box{
3289
+ stretchy false
3290
+ grid{
3291
+ label('※ GPT 기능 사용시 포스트설정1에서 GPT사용에 체크 필수'){
3292
+ } } }
3293
+
3292
3294
  table{
3293
3295
  checkbox_column('선택'){
3294
3296
  editable true
@@ -3307,68 +3309,100 @@ class Wordpress
3307
3309
  vertical_box{
3308
3310
  horizontal_box{
3309
3311
  stretchy false
3310
- button('제목불러오기'){
3311
- on_clicked{
3312
- file = open_file
3313
- if file != nil
3314
- file_data = File.open(file, 'r', :encoding => 'utf-8').read()
3315
- file_data.split("\n").each do |title|
3316
- if title.split(" ").join('').length < 2
3312
+ button('제목불러오기'){
3313
+ on_clicked{
3314
+ file = open_file
3315
+ if file != nil
3316
+ file_data = File.open(file, 'r', :encoding => 'utf-8').read()
3317
+ file_data.split("\n").each do |title|
3318
+ if title.split(" ").join('').length < 2
3317
3319
 
3318
- else
3319
- @data['제목설정']['제목'] << [false, title]
3320
- @data['제목설정']['제목'] << [false, title]
3321
- @data['제목설정']['제목'].pop
3322
- end
3323
- end
3324
- end
3325
- }
3326
- }
3327
-
3328
- }
3329
- horizontal_box{
3330
- stretchy false
3331
- button('전체선택'){
3332
- on_clicked{
3333
- for n in 0..@data['제목설정']['제목'].length-1
3334
- @data['제목설정']['제목'][n][0] = true
3335
- @data['제목설정']['제목'] << []
3320
+ else
3321
+ @data['제목설정']['제목'] << [false, title]
3322
+ @data['제목설정']['제목'] << [false, title]
3336
3323
  @data['제목설정']['제목'].pop
3337
3324
  end
3338
- }
3339
- }
3340
- button('제목삭제'){
3341
- on_clicked{
3342
- m = Array.new
3343
- for n in 0..@data['제목설정']['제목'].length-1
3344
- if @data['제목설정']['제목'][n][0] == true
3345
- m << n
3346
- end
3347
- end
3325
+ end
3326
+ end
3327
+ }
3328
+ }
3348
3329
 
3349
- m.reverse.each do |i|
3350
- @data['제목설정']['제목'].delete_at(i)
3351
- end
3352
- @data['제목설정']['제목'].delete(nil)
3353
- }
3354
- }
3355
- @data['제목설정']['순서사용'] = checkbox('순서사용'){
3356
- stretchy false
3357
- on_toggled{ |c|
3358
- if c.checked?
3359
- @data['제목설정']['랜덤사용'].checked = false
3360
- end
3361
- }
3362
- }
3363
- @data['제목설정']['랜덤사용'] = checkbox('랜덤사용'){
3364
- stretchy false
3365
- on_toggled{ |c|
3366
- if c.checked?
3367
- @data['제목설정']['순서사용'].checked = false
3368
- end
3369
- }
3370
- }
3330
+ }
3331
+ horizontal_box{
3332
+ stretchy false
3333
+ grid{
3334
+ button('전체선택'){
3335
+ top 1
3336
+ left 1
3337
+ on_clicked{
3338
+ for n in 0..@data['제목설정']['제목'].length-1
3339
+ @data['제목설정']['제목'][n][0] = true
3340
+ @data['제목설정']['제목'] << []
3341
+ @data['제목설정']['제목'].pop
3342
+ end
3343
+ }
3344
+ }
3345
+ button('선택해제'){
3346
+ top 1
3347
+ left 2
3348
+ on_clicked{
3349
+ for n in 0..@data['제목설정']['제목'].length-1
3350
+ @data['제목설정']['제목'][n][0] = false
3351
+ @data['제목설정']['제목'] << []
3352
+ @data['제목설정']['제목'].pop
3353
+ end
3354
+ }
3355
+ }
3356
+ button('삭제하기'){
3357
+ top 1
3358
+ left 3
3359
+ on_clicked{
3360
+ m = Array.new
3361
+ for n in 0..@data['제목설정']['제목'].length-1
3362
+ if @data['제목설정']['제목'][n][0] == true
3363
+ m << n
3364
+ end
3365
+ end
3366
+
3367
+ m.reverse.each do |i|
3368
+ @data['제목설정']['제목'].delete_at(i)
3369
+ end
3370
+ @data['제목설정']['제목'].delete(nil)
3371
+ }
3372
+ }
3373
+ }
3374
+ @data['제목설정']['순서사용'] = checkbox('순서사용'){
3375
+ stretchy false
3376
+ on_toggled{ |c|
3377
+ if c.checked?
3378
+ @data['제목설정']['랜덤사용'].checked = false
3379
+ end
3380
+ }
3381
+ }
3382
+ @data['제목설정']['랜덤사용'] = checkbox('랜덤사용'){
3383
+ stretchy false
3384
+ on_toggled{ |c|
3385
+ if c.checked?
3386
+ @data['제목설정']['순서사용'].checked = false
3387
+ end
3371
3388
  }
3389
+ }
3390
+ }
3391
+ vertical_separator{
3392
+ stretchy false
3393
+ }
3394
+ horizontal_box{
3395
+ stretchy false
3396
+ grid{
3397
+ @data['포스트설정']['gpt제목'] = checkbox('제목을 이용해 GPT로 비슷한 제목 생성'){
3398
+
3399
+
3400
+ }}}
3401
+ horizontal_box{
3402
+ stretchy false
3403
+ grid{
3404
+ label('※ GPT 기능 사용시 포스트설정1에서 GPT사용에 체크 필수'){
3405
+ } } }
3372
3406
  table{
3373
3407
  checkbox_column('선택'){
3374
3408
  editable true
@@ -3402,11 +3436,14 @@ class Wordpress
3402
3436
  end
3403
3437
  }
3404
3438
  }
3405
-
3439
+
3406
3440
  }
3407
3441
  horizontal_box{
3408
3442
  stretchy false
3443
+ grid{
3409
3444
  button('전체선택'){
3445
+ top 1
3446
+ left 1
3410
3447
  on_clicked{
3411
3448
  for n in 0..@data['내용설정']['내용'].length-1
3412
3449
  @data['내용설정']['내용'][n][0] = true
@@ -3415,7 +3452,20 @@ class Wordpress
3415
3452
  end
3416
3453
  }
3417
3454
  }
3418
- button('내용삭제'){
3455
+ button('선택해제'){
3456
+ top 1
3457
+ left 2
3458
+ on_clicked{
3459
+ for n in 0..@data['내용설정']['내용'].length-1
3460
+ @data['내용설정']['내용'][n][0] = false
3461
+ @data['내용설정']['내용'] << []
3462
+ @data['내용설정']['내용'].pop
3463
+ end
3464
+ }
3465
+ }
3466
+ button('삭제하기'){
3467
+ top 1
3468
+ left 3
3419
3469
  on_clicked{
3420
3470
  m = Array.new
3421
3471
  for n in 0..@data['내용설정']['내용'].length-1
@@ -3423,13 +3473,14 @@ class Wordpress
3423
3473
  m << n
3424
3474
  end
3425
3475
  end
3426
-
3476
+
3427
3477
  m.reverse.each do |i|
3428
3478
  @data['내용설정']['내용'].delete_at(i)
3429
3479
  end
3430
3480
  @data['내용설정']['내용'].delete(nil)
3431
3481
  }
3432
3482
  }
3483
+ }
3433
3484
  @data['내용설정']['순서사용'] = checkbox('순서사용'){
3434
3485
  stretchy false
3435
3486
  on_toggled{ |c|
@@ -3447,6 +3498,21 @@ class Wordpress
3447
3498
  }
3448
3499
  }
3449
3500
  }
3501
+ vertical_separator{
3502
+ stretchy false
3503
+ }
3504
+ horizontal_box{
3505
+ stretchy false
3506
+ grid{
3507
+ @data['포스트설정']['gpt내용'] = checkbox('내용파일을 이용해 GPT로 글 변형'){
3508
+
3509
+
3510
+ }}}
3511
+ horizontal_box{
3512
+ stretchy false
3513
+ grid{
3514
+ label('※ GPT 기능 사용시 포스트설정1에서 GPT사용에 체크 필수'){
3515
+ } } }
3450
3516
  table{
3451
3517
  checkbox_column('선택'){
3452
3518
  editable true
@@ -3777,248 +3843,298 @@ class Wordpress
3777
3843
  }
3778
3844
 
3779
3845
  tab_item('포스트설정1'){
3780
- horizontal_box{
3781
- vertical_box{
3782
- stretchy false
3783
- grid{
3784
- stretchy false
3785
- @data['포스트설정']['제목키워드변경'] = checkbox('제목에 특정 단어를 내용에 사용할 키워드로 변경'){
3786
- top 0
3787
- left 0
3788
-
3789
- }
3790
- @data['포스트설정']['제목키워드변경단어'] = entry{
3791
- top 0
3792
- left 1
3793
- text '특정단어'
3794
- }
3795
-
3796
- # @data['포스트설정']['제목단어변경'] = checkbox('제목에 특정 단어를 변경'){
3797
- # top 1
3798
- # left 0
3799
- # }
3800
- # @data['포스트설정']['제목단어변경파일불러오기'] = button('설정 파일 불러오기'){
3801
- # top 1
3802
- # left 1
3803
- # on_clicked{
3804
- # file = open_file
3805
- # if file != nil
3806
- # file_data = File.open(file, 'r', :encoding => 'utf-8').read()
3807
- # file_data.split("\n").each do |i|
3808
- # i2 = i.split('>')
3809
- # text_key = i2[0].to_s
3810
- # text_val = i2[1].to_s.split(',')
3811
- # @data['포스트설정']['제목특정단어변경데이터'][text_key] = text_val
3812
- # end
3813
- # end
3814
- # }
3815
- # }
3816
- @data['포스트설정']['제목에키워드삽입'] = checkbox('제목에 키워드 삽입'){
3817
- top 2
3818
- left 0
3819
- }
3820
- @data['포스트설정']['제목에키워드삽입숫자1'] = entry(){
3821
- top 2
3822
- left 1
3823
- text '최소수량'
3824
- }
3825
- label('~'){
3826
- top 2
3827
- left 2
3828
- }
3829
- @data['포스트설정']['제목에키워드삽입숫자2'] = entry(){
3830
- top 2
3831
- left 3
3832
- text '최대수량'
3833
- }
3834
- label('ㄴ'){
3835
- top 3
3836
- left 2
3837
- }
3838
- @data['포스트설정']['제목앞'] = checkbox('제목에 키워드 삽입 제목 앞'){
3839
- top 3
3840
- left 3
3841
- on_toggled{
3842
- if @data['포스트설정']['제목앞'].checked? == true
3843
- if @data['포스트설정']['제목뒤'].checked?
3844
- @data['포스트설정']['제목뒤'].checked = false
3845
- end
3846
- end
3847
- }
3848
- }
3849
- label('ㄴ'){
3850
- top 4
3851
- left 2
3852
- }
3853
- @data['포스트설정']['제목뒤'] = checkbox('제목에 키워드 삽입 제목 뒤'){
3854
- top 4
3855
- left 3
3856
- on_toggled{
3857
- if @data['포스트설정']['제목뒤'].checked? == true
3858
- if @data['포스트설정']['제목앞'].checked?
3859
- @data['포스트설정']['제목앞'].checked = false
3860
- end
3861
- end
3862
- }
3863
- }
3864
- @data['포스트설정']['제목내용설정'] = checkbox('내용의 첫 문장을 제목으로 설정'){
3865
- top 4
3866
- left 0
3867
- }
3868
-
3869
- @data['포스트설정']['특수문자'] = checkbox('제목에 키워드 삽입 시 특수문자 삽입'){
3870
- top 5
3871
- left 0
3872
- }
3873
- @data['포스트설정']['제목을랜덤'] = checkbox('제목을 랜덤 단어 조합으로 자동 입력'){
3874
- top 6
3875
- left 0
3876
- }
3877
- @data['포스트설정']['내용키워드삽입'] = checkbox('내용 키워드 삽입'){
3878
- top 7
3879
- left 0
3880
- }
3881
- @data['포스트설정']['키워드삽입시작숫자'] = entry(){
3882
- top 7
3883
- left 1
3884
- text '최소수량'
3885
- }
3886
- label('~'){
3887
- top 7
3888
- left 2
3889
- }
3890
- @data['포스트설정']['키워드삽입끝숫자'] = entry(){
3891
- top 7
3892
- left 3
3893
- text '최대수량'
3894
- }
3895
- @data['포스트설정']['키워드삽입'] = checkbox('내용 키워드 삽입시 링크 삽입'){
3896
- top 8
3897
- left 0
3898
- }
3899
- @data['포스트설정']['키워드삽입시링크'] = entry(){
3900
- top 8
3901
- left 1
3902
- text 'URL'
3903
- }
3904
- @data['포스트설정']['내용을자동생성'] = checkbox('내용을 키워드 기반으로 자동 생성해서 포스팅'){
3905
- top 9
3906
- left 0
3907
- on_toggled{
3908
- if @data['포스트설정']['내용을자동생성'].checked?
3909
- if @data['포스트설정']['내용과자동생성'].checked?
3910
- @data['포스트설정']['내용과자동생성'].checked = false
3911
- end
3912
- end
3913
- }
3914
- }
3915
-
3916
- @data['포스트설정']['gpt'] = checkbox('내용을 키워드 기반의 GPT로 생성해서 포스팅'){
3917
- top 10
3918
- left 0
3919
- }
3920
-
3921
- @data['포스트설정']['api_key'] = entry(){
3922
- top 10
3923
- left 1
3924
- text 'api key'
3925
- }
3846
+ horizontal_box{
3847
+ vertical_box{
3848
+ stretchy false
3849
+ grid{
3850
+ stretchy false
3851
+ @data['포스트설정']['제목키워드변경'] = checkbox('제목에 특정 단어를 내용에 사용할 키워드로 변경'){
3852
+ top 0
3853
+ left 0
3926
3854
 
3927
- @data['포스트설정']['gpt상단'] = checkbox('원고내용 위에 넣기'){
3928
- top 10
3929
- left 3
3930
- on_toggled{
3931
- if @data['포스트설정']['gpt상단'].checked? == true
3932
- if @data['포스트설정']['gpt하단'].checked?
3933
- @data['포스트설정']['gpt하단'].checked = false
3934
- end
3935
- end
3936
- }
3937
- }
3855
+ }
3856
+ @data['포스트설정']['제목키워드변경단어'] = entry{
3857
+ top 0
3858
+ left 1
3859
+ text '특정단어'
3860
+ }
3938
3861
 
3939
- @data['포스트설정']['gpt하단'] = checkbox('원고내용 아래에 넣기'){
3940
- top 11
3941
- left 3
3942
- on_toggled{
3943
- if @data['포스트설정']['gpt하단'].checked? == true
3944
- if @data['포스트설정']['gpt상단'].checked?
3945
- @data['포스트설정']['gpt상단'].checked = false
3946
- end
3947
- end
3948
- }
3949
- }
3862
+ # @data['포스트설정']['제목단어변경'] = checkbox('제목에 특정 단어를 변경'){
3863
+ # top 1
3864
+ # left 0
3865
+ # }
3866
+ # @data['포스트설정']['제목단어변경파일불러오기'] = button('설정 파일 불러오기'){
3867
+ # top 1
3868
+ # left 1
3869
+ # on_clicked{
3870
+ # file = open_file
3871
+ # if file != nil
3872
+ # file_data = File.open(file, 'r', :encoding => 'utf-8').read()
3873
+ # file_data.split("\n").each do |i|
3874
+ # i2 = i.split('>')
3875
+ # text_key = i2[0].to_s
3876
+ # text_val = i2[1].to_s.split(',')
3877
+ # @data['포스트설정']['제목특정단어변경데이터'][text_key] = text_val
3878
+ # end
3879
+ # end
3880
+ # }
3881
+ # }
3882
+ @data['포스트설정']['제목에키워드삽입'] = checkbox('제목에 키워드 삽입'){
3883
+ top 2
3884
+ left 0
3885
+ #enabled false # 기본적으로 비활성화
3886
+ on_toggled {
3887
+ if @data['포스트설정']['제목에키워드삽입'].checked?
3888
+ @data['포스트설정']['제목앞'].enabled = true # '내용투명' 활성화
3889
+ @data['포스트설정']['제목뒤'].enabled = true # '내용투명' 활성화
3890
+ else
3891
+ @data['포스트설정']['제목앞'].checked = false # 체크 해제
3892
+ @data['포스트설정']['제목앞'].enabled = false # 비활성화
3893
+ @data['포스트설정']['제목뒤'].checked = false # 체크 해제
3894
+ @data['포스트설정']['제목뒤'].enabled = false # 비활성화
3895
+ end
3896
+ }
3897
+
3898
+ }
3899
+ @data['포스트설정']['제목에키워드삽입숫자1'] = entry(){
3900
+ top 2
3901
+ left 1
3902
+ text '최소수량'
3903
+ }
3904
+ label('~'){
3905
+ top 2
3906
+ left 2
3907
+ }
3908
+ @data['포스트설정']['제목에키워드삽입숫자2'] = entry(){
3909
+ top 2
3910
+ left 3
3911
+ text '최대수량'
3912
+ }
3913
+ label('ㄴ'){
3914
+ top 3
3915
+ left 2
3916
+ }
3917
+ @data['포스트설정']['제목앞'] = checkbox('제목에 키워드 삽입 제목 앞'){
3918
+ top 3
3919
+ left 3
3920
+ enabled false # 기본적으로 비활성화
3921
+ on_toggled{
3922
+ if @data['포스트설정']['제목앞'].checked? == true
3923
+ if @data['포스트설정']['제목뒤'].checked?
3924
+ @data['포스트설정']['제목뒤'].checked = false
3925
+ end
3926
+ end
3927
+ }
3928
+ }
3929
+ label('ㄴ'){
3930
+ top 4
3931
+ left 2
3932
+ }
3933
+ @data['포스트설정']['제목뒤'] = checkbox('제목에 키워드 삽입 제목 뒤'){
3934
+ top 4
3935
+ left 3
3936
+ enabled false # 기본적으로 비활성화
3937
+ on_toggled{
3938
+ if @data['포스트설정']['제목뒤'].checked? == true
3939
+ if @data['포스트설정']['제목앞'].checked?
3940
+ @data['포스트설정']['제목앞'].checked = false
3941
+ end
3942
+ end
3943
+ }
3944
+ }
3945
+
3946
+ @data['포스트설정']['특수문자'] = checkbox('제목에 키워드 삽입 시 특수문자 삽입'){
3947
+ top 4
3948
+ left 0
3949
+ }
3950
+ @data['포스트설정']['제목을랜덤'] = checkbox('제목을 랜덤 단어 조합으로 자동 입력'){
3951
+ top 5
3952
+ left 0
3953
+ on_toggled{
3954
+ if @data['포스트설정']['제목을랜덤'].checked? == true
3955
+ if @data['포스트설정']['제목내용설정'].checked?
3956
+ @data['포스트설정']['제목내용설정'].checked = false
3957
+ end
3958
+ end
3959
+ }
3960
+ }
3961
+ @data['포스트설정']['제목내용설정'] = checkbox('내용의 첫 문장을 제목으로 설정'){
3962
+ top 6
3963
+ left 0
3964
+ on_toggled{
3965
+ if @data['포스트설정']['제목내용설정'].checked? == true
3966
+ if @data['포스트설정']['제목을랜덤'].checked?
3967
+ @data['포스트설정']['제목을랜덤'].checked = false
3968
+ end
3969
+ end
3970
+ }
3971
+ }
3972
+ @data['포스트설정']['내용키워드삽입'] = checkbox('내용 키워드 삽입'){
3973
+ top 7
3974
+ left 0
3975
+ on_toggled {
3976
+ if @data['포스트설정']['내용키워드삽입'].checked?
3977
+ @data['포스트설정']['키워드삽입'].enabled = true # '내용투명' 활성화
3978
+ @data['포스트설정']['키워드삽입시링크'].enabled = true # '내용투명' 활성화
3979
+ else
3980
+ @data['포스트설정']['키워드삽입'].checked = false # 체크 해제
3981
+ @data['포스트설정']['키워드삽입'].enabled = false # 비활성화
3982
+ @data['포스트설정']['키워드삽입시링크'].text = 'URL' # 기본 텍스트 설정
3983
+ @data['포스트설정']['키워드삽입시링크'].enabled = false # 비활성화
3984
+ end
3985
+ }
3986
+ }
3987
+ @data['포스트설정']['키워드삽입시작숫자'] = entry(){
3988
+ top 7
3989
+ left 1
3990
+
3991
+ text '최소수량'
3992
+ }
3993
+ label('~'){
3994
+ top 7
3995
+ left 2
3996
+ }
3997
+ @data['포스트설정']['키워드삽입끝숫자'] = entry(){
3998
+ top 7
3999
+ left 3
4000
+ text '최대수량'
4001
+ }
4002
+ @data['포스트설정']['키워드삽입'] = checkbox('내용 키워드 삽입시 링크 삽입'){
4003
+ enabled false # 기본적으로 비활성화
4004
+ top 8
4005
+ left 0
4006
+
4007
+ }
4008
+ @data['포스트설정']['키워드삽입시링크'] = entry(){
4009
+ enabled false # 기본적으로 비활성화
4010
+ top 8
4011
+ left 1
4012
+ text 'URL'
4013
+ }
4014
+ @data['포스트설정']['내용을자동생성'] = checkbox('키워드기반 생성으로만 등록(GPT 미 사용시 자체 생성)'){
4015
+ top 9
4016
+ left 0
4017
+ on_toggled{
4018
+ if @data['포스트설정']['내용을자동생성'].checked?
4019
+ @data['포스트설정']['내용과자동생성'].checked = false
4020
+ @data['포스트설정']['내용투명'].checked = false
4021
+ @data['포스트설정']['자동글 수식에 입력'].checked = false
4022
+
4023
+ end
4024
+ }
4025
+ }
3950
4026
 
3951
- aa1 = 2
3952
- @data['포스트설정']['내용과자동생성'] = checkbox('내용을 내용 파일 + 자동 생성 조합으로 포스팅'){
3953
- top 10 + aa1
3954
- left 0
3955
- on_toggled{
3956
- if @data['포스트설정']['내용과자동생성'].checked?
3957
- if @data['포스트설정']['내용을자동생성'].checked?
3958
- @data['포스트설정']['내용을자동생성'].checked = false
3959
- end
3960
- end
3961
- }
3962
- }
3963
- @data['포스트설정']['내용투명'] = checkbox('키워드 기반 자동 생성글 안보이게 처리'){
3964
- top 11+ aa1
3965
- left 0
3966
- }
3967
- @data['포스트설정']['내용자동변경'] = checkbox('내용에 단어들을 자동 변경'){
3968
- top 12+ aa1
3969
- left 0
3970
- }
3971
- button('설정 파일 불러오기'){
3972
- top 12+ aa1
3973
- left 1
3974
- on_clicked{
3975
- file = open_file
3976
- if file != nil
3977
- file_data = File.open(file, 'r', :encoding => 'utf-8').read()
3978
- file_data.split("\n").each do |i|
3979
- key = i.split('>')[0]
3980
- v = i.split('>')[1].to_s.split(',')
3981
- @data['포스트설정']['내용자동변경값'][key] = v
3982
- end
3983
- end
3984
- }
3985
- }
3986
- @data['포스트설정']['제목에도적용'] = checkbox('제목에도 적용'){
3987
- top 12+ aa1
3988
- left 3
3989
- }
4027
+
4028
+ aa1 = 2
4029
+ @data['포스트설정']['내용과자동생성'] = checkbox('내용파일+키워드기반 생성 등록(GPT 미 사용시 자체 생성)') {
4030
+ top 10 + aa1
4031
+ left 0
4032
+ on_toggled {
4033
+ if @data['포스트설정']['내용과자동생성'].checked?
4034
+ @data['포스트설정']['내용을자동생성'].checked = false
4035
+ @data['포스트설정']['내용투명'].enabled = true # '내용투명' 활성화
4036
+ @data['포스트설정']['자동글 수식에 입력'].enabled = true # '내용투명' 활성화
4037
+ else
4038
+ @data['포스트설정']['내용투명'].checked = false # 체크 해제
4039
+ @data['포스트설정']['내용투명'].enabled = false # 비활성화
4040
+ @data['포스트설정']['자동글 수식에 입력'].checked = false # 체크 해제
4041
+ @data['포스트설정']['자동글 수식에 입력'].enabled = false # 비활성화
4042
+ end
4043
+ }
4044
+ }
4045
+
4046
+ @data['포스트설정']['내용투명'] = checkbox('키워드 기반 자동 생성글 안보이게 처리') {
4047
+ top 11 + aa1
4048
+ left 0
4049
+ enabled false # 기본적으로 비활성화
4050
+ on_toggled {
4051
+ if @data['포스트설정']['내용투명'].checked?
4052
+ @data['포스트설정']['내용을자동생성'].checked = false
4053
+ @data['포스트설정']['자동글 수식에 입력'].checked = false
4054
+ end
4055
+ }
4056
+ }
4057
+ @data['포스트설정']['내용자동변경'] = checkbox('내용에 단어들을 자동 변경'){
4058
+ top 12+ aa1
4059
+ left 0
4060
+ }
4061
+ button('설정 파일 불러오기'){
4062
+ top 12+ aa1
4063
+ left 1
4064
+ on_clicked{
4065
+ file = open_file
4066
+ if file != nil
4067
+ file_data = File.open(file, 'r', :encoding => 'utf-8').read()
4068
+ file_data.split("\n").each do |i|
4069
+ key = i.split('>')[0]
4070
+ v = i.split('>')[1].to_s.split(',')
4071
+ @data['포스트설정']['내용자동변경값'][key] = v
4072
+ end
4073
+ end
4074
+ }
4075
+ }
4076
+ @data['포스트설정']['제목에도적용'] = checkbox('제목에도 적용'){
4077
+ top 12+ aa1
4078
+ left 3
4079
+ }
3990
4080
 
3991
- @data['포스트설정']['내용사진자동삽입'] = checkbox('내용 사진 자동 삽입'){
3992
- top 13+ aa1
3993
- left 0
3994
- }
3995
- @data['포스트설정']['내용사진자동삽입시작숫자'] = entry(){
3996
- top 13+ aa1
3997
- left 1
3998
- text '최소수량'
3999
- }
4000
- label('~'){
4001
- top 13+ aa1
4002
- left 2
4003
- }
4004
- @data['포스트설정']['내용사진자동삽입끝숫자'] = entry(){
4005
- top 13+ aa1
4006
- left 3
4007
- text '최대수량'
4008
- }
4081
+ @data['포스트설정']['내용사진자동삽입'] = checkbox('내용 사진 자동 삽입'){
4082
+ top 13+ aa1
4083
+ left 0
4084
+ #enabled false # 기본적으로 비활성화
4085
+ on_toggled {
4086
+ if @data['포스트설정']['내용사진자동삽입'].checked?
4087
+ @data['포스트설정']['내용사진링크'].enabled = true # '내용투명' 활성화
4088
+ @data['포스트설정']['내용사진링크값'].enabled = true # '내용투명' 활성화
4089
+ else
4090
+ @data['포스트설정']['내용사진링크'].checked = false # 체크 해제
4091
+ @data['포스트설정']['내용사진링크'].enabled = false # 비활성화
4092
+ @data['포스트설정']['내용사진링크값'].text = 'URL' # 기본 텍스트 설정
4093
+ @data['포스트설정']['내용사진링크값'].enabled = false # 비활성화
4094
+ end
4095
+ }
4096
+ }
4097
+ @data['포스트설정']['내용사진자동삽입시작숫자'] = entry(){
4098
+ top 13+ aa1
4099
+ left 1
4100
+ text '최소수량'
4101
+ }
4102
+ label('~'){
4103
+ top 13+ aa1
4104
+ left 2
4105
+ }
4106
+ @data['포스트설정']['내용사진자동삽입끝숫자'] = entry(){
4107
+ top 13+ aa1
4108
+ left 3
4109
+ text '최대수량'
4110
+ }
4009
4111
 
4010
- @data['포스트설정']['내용사진링크'] = checkbox('내용 사진 자동 삽입시 링크 삽입'){
4011
- top 14+ aa1
4012
- left 0
4013
- }
4112
+ @data['포스트설정']['내용사진링크'] = checkbox('내용 사진 자동 삽입시 링크 삽입'){
4113
+ enabled false # 기본적으로 비활성화
4114
+ top 14+ aa1
4115
+ left 0
4116
+ }
4014
4117
 
4015
- @data['포스트설정']['내용사진링크값'] = entry(){
4016
- top 14+ aa1
4017
- left 1
4018
- text 'URL'
4019
- }
4020
- }
4118
+ @data['포스트설정']['내용사진링크값'] = entry(){
4119
+ enabled false # 기본적으로 비활성화
4120
+ top 14+ aa1
4121
+ left 1
4122
+ text 'URL'
4021
4123
  }
4124
+
4125
+ @data['포스트설정']['ChatGPT사용'] = checkbox('Chat GPT 사용하기'){
4126
+ top 15+ aa1
4127
+ left 0
4128
+ }
4129
+
4130
+ @data['포스트설정']['api_key'] = entry(){
4131
+ top 15+ aa1
4132
+ left 1
4133
+ text 'api key 입력 필수!!'
4134
+ }
4135
+
4136
+ }
4137
+ }
4022
4138
 
4023
4139
  vertical_separator{
4024
4140
  stretchy false
@@ -4230,6 +4346,20 @@ class Wordpress
4230
4346
  @data['포스트설정']['막글삽입'] = checkbox('내용 하단에 막글 삽입'){
4231
4347
  top 6
4232
4348
  left 0
4349
+ on_toggled {
4350
+ if @data['포스트설정']['막글삽입'].checked?
4351
+ @data['포스트설정']['막글투명'].enabled = true # '내용투명' 활성화
4352
+ @data['포스트설정']['막글그대로'].enabled = true # '내용투명' 활성화
4353
+
4354
+
4355
+ else
4356
+ @data['포스트설정']['막글투명'].checked = false # 체크 해제
4357
+ @data['포스트설정']['막글투명'].enabled = false # 비활성화
4358
+ @data['포스트설정']['막글그대로'].checked = false # 체크 해제
4359
+ @data['포스트설정']['막글그대로'].enabled = false # 비활성화
4360
+
4361
+ end
4362
+ }
4233
4363
  }
4234
4364
  @data['포스트설정']['막글삽입시작숫자'] = entry{
4235
4365
  top 6
@@ -4259,10 +4389,12 @@ class Wordpress
4259
4389
  @data['포스트설정']['막글투명'] = checkbox('막글 안보이게 처리'){
4260
4390
  top 7
4261
4391
  left 0
4392
+ enabled false
4262
4393
  }
4263
4394
  @data['포스트설정']['막글그대로'] = checkbox('막글 그대로 입력'){
4264
4395
  top 7
4265
4396
  left 1
4397
+ enabled false
4266
4398
  }
4267
4399
 
4268
4400
  @data['포스트설정']['태그삽입1'] = checkbox('태그삽입'){
@@ -4390,6 +4522,31 @@ class Wordpress
4390
4522
  @data['무한반복'] = checkbox('무한반복'){
4391
4523
  stretchy false
4392
4524
  }
4525
+
4526
+
4527
+
4528
+ @data['포스트설정']['글발생하기'] = checkbox('글 발행하기'){
4529
+ stretchy false
4530
+ on_toggled{
4531
+ if @data['포스트설정']['글발생하기'].checked? == true
4532
+ if @data['포스트설정']['글임시저장'].checked?
4533
+ @data['포스트설정']['글임시저장'].checked = false
4534
+ end
4535
+ end
4536
+ }
4537
+ }
4538
+ @data['포스트설정']['글임시저장'] = checkbox('글 임시저장'){
4539
+ stretchy false
4540
+ on_toggled{
4541
+ if @data['포스트설정']['글임시저장'].checked? == true
4542
+ if @data['포스트설정']['글발생하기'].checked?
4543
+ @data['포스트설정']['글발생하기'].checked = false
4544
+ end
4545
+ end
4546
+ }
4547
+ }
4548
+
4549
+
4393
4550
  button('작업시작'){
4394
4551
  on_clicked{
4395
4552
  if @user_login_ok == "0"
@@ -4430,7 +4587,7 @@ class Wordpress
4430
4587
  @data['포스트설정']['중앙정렬'].checked = true
4431
4588
  @data['포스트설정']['전체공개'].checked = true
4432
4589
  @data['포스트설정']['댓글허용'].checked = true
4433
-
4590
+ @data['포스트설정']['글발생하기'].checked = true
4434
4591
 
4435
4592
  }.show
4436
4593
  end