tblog_duopack 0.0.1 → 0.0.2

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 +948 -972
  3. metadata +2 -2
data/lib/tblog_duopack.rb CHANGED
@@ -1,32 +1,4 @@
1
- require 'glimmer-dsl-libui'
2
- require 'selenium-webdriver'
3
- # require 'webdrivers'
4
- require 'iconv'
5
- require 'nokogiri'
6
- require 'http'
7
- require 'json'
8
- require 'down'
9
- require 'rmagick'
10
- require 'fileutils'
11
- require 'rest-client'
12
- require 'open3'
13
- require 'clipboard'
14
- require 'crack'
15
- require 'uri'
16
- require 'cgi'
17
- require 'digest'
18
- require 'auto_click'
19
- require 'rainbow/refinement'
20
- include AutoClickMethods
21
- using Rainbow
22
-
23
-
24
-
25
-
26
-
27
- #driver.find_element(:class, 'highlight-java')
28
- # or
29
- #driver.find_element(:class_name, 'highlight-java')
1
+
30
2
  class Chat
31
3
  def initialize(api_key)
32
4
  @api_key = api_key
@@ -39,10 +11,11 @@ class Chat
39
11
  'Authorization' => 'Bearer ' + @api_key
40
12
  }
41
13
  d = {
42
- 'model' => 'gpt-3.5-turbo',
14
+ #'model' => 'gpt-3.5-turbo',
15
+ 'model' => 'gpt-4',
43
16
  'messages' => [{
44
17
  "role" => "assistant",
45
- "content" => keyword.to_s+" 소개하는 글을 1000자에서 2000자 사이로 만들어줘"
18
+ "content" => keyword.to_s+" 소개하는 글을 1500자에서 2500자 사이로 만들어줘"
46
19
  }]
47
20
  }
48
21
  answer = ''
@@ -73,10 +46,11 @@ class Chat
73
46
  'Authorization' => 'Bearer ' + @api_key
74
47
  }
75
48
  d = {
76
- 'model' => 'gpt-3.5-turbo',
49
+ #'model' => 'gpt-3.5-turbo',
50
+ 'model' => 'gpt-4',
77
51
  'messages' => [{
78
52
  "role" => "assistant",
79
- "content" => keyword.to_s+" 관련된 글을 1000자에서 2000자 사이로 만들어줘"
53
+ "content" => keyword.to_s+" 관련된 글을 1500자에서 2500자 사이로 만들어줘"
80
54
  }]
81
55
  }
82
56
  answer = ''
@@ -107,215 +81,237 @@ class Chat
107
81
  end
108
82
  end
109
83
 
110
- class Naver
111
- def initialize
112
- @seed = 1
113
- @cookie = ''
84
+ class Chat_title
85
+ def initialize(api_key)
86
+ @api_key = api_key
114
87
  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
88
 
144
- @driver = Selenium::WebDriver.for(:chrome, capabilities: options)
145
- rescue
146
- @driver = Selenium::WebDriver.for(:chrome, capabilities: options)
89
+ def message(title)
90
+ url = 'https://api.openai.com/v1/chat/completions'
91
+ headers = {
92
+ 'Content-Type' => 'application/json',
93
+ 'Authorization' => 'Bearer ' + @api_key
94
+ }
95
+ data = {
96
+ 'model' => 'gpt-4',
97
+ 'messages' => [{
98
+ "role" => "system",
99
+ "content" => "너는 매우 친절하고 성의 있게 답변하는 AI 어시스턴트야."
100
+ },
101
+ {
102
+ "role" => "user",
103
+ "content" => "#{title}\n위 문장을 비슷한 길이로 ChatGPT의 멘트는 빼고 표현을 더 추가해서 하나만 만들어줘."
104
+ }]
105
+ }
106
+
107
+ begin
108
+ req = HTTP.headers(headers).post(url, json: data)
109
+ puts "HTTP Status: #{req.status}" # 상태 코드 확인
110
+ response = JSON.parse(req.body.to_s)
111
+ puts "API Response: #{response}" # 전체 응답 출력
112
+
113
+ if req.status == 429
114
+ return "API 요청 제한을 초과했습니다. 플랜 및 할당량을 확인하세요."
147
115
  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
116
 
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')
117
+ # 응답 데이터에서 안전하게 값 추출
118
+ answer = response.dig('choices', 0, 'message', 'content')
119
+ answer ||= (title) # 응답이 없을 경우 기본 메시지 설정
120
+ rescue => e
121
+ puts "Error: #{e.message}"
122
+ answer = "오류가 발생했습니다."
123
+ end
124
+
125
+ puts 'API return ==> '
126
+ puts answer
127
+ answer
128
+ end
129
+ end
130
+
131
+ class Chat_content
132
+ def initialize(api_key)
133
+ @api_key = api_key
134
+ end
135
+
136
+ def message(content)
203
137
 
204
- options.add_argument('--disable-translate')
205
- options.add_argument('--disable-extensions-file-access-check')
206
- options.add_argument('--disable-impl-side-painting')
138
+ url = 'https://api.openai.com/v1/chat/completions'
139
+ headers = {
140
+ 'Content-Type' => 'application/json',
141
+ 'Authorization' => 'Bearer ' + @api_key
142
+ }
143
+ data = {
144
+ 'model' => 'gpt-4',
145
+ 'messages' => [{
146
+ "role" => "system",
147
+ "content" => "너는 매우 친절하고 성의 있게 답변하는 AI 어시스턴트야."
148
+ },
149
+ {
150
+ "role" => "user",
151
+ "content" => "#{content}\nChatGPT의 멘트는 빼고 위 전체적인 내용의 형식을 똑같이 표현을 더 추가하고 유사어로 변경하여 하나 만들어줘! 전화번호,연락처,가격,홈페이지안내 ,상담안내 관련 문구는 유지해야해"
152
+ }]
153
+ }
207
154
 
208
- @driver = Selenium::WebDriver.for(:chrome, capabilities: options)
209
- rescue
210
- @driver = Selenium::WebDriver.for(:chrome, capabilities: options)
211
- end
155
+ begin
156
+ req = HTTP.headers(headers).post(url, json: data)
157
+ puts "HTTP Status: #{req.status}" # 상태 코드 확인
158
+ response = JSON.parse(req.body.to_s)
159
+ puts "API Response: #{response}" # 전체 응답 출력
160
+
161
+ if req.status == 429
162
+ return "API 요청 제한을 초과했습니다. 플랜 및 할당량을 확인하세요."
212
163
  end
164
+
165
+ # 응답 데이터에서 안전하게 값 추출
166
+ answer = response.dig('choices', 0, 'message', 'content')
167
+ answer ||= (content) # 응답이 없을 경우 기본 메시지 설정
168
+ rescue => e
169
+ puts "Error: #{e.message}"
170
+ answer = "오류가 발생했습니다."
213
171
  end
172
+
173
+ puts 'API return ==> '
174
+ puts answer
175
+ answer
176
+ end
177
+ end
178
+
179
+
180
+ #############################################gpt############################################
181
+
182
+ class Naver
183
+ def initialize
184
+ @seed = 1
185
+ @cookie = ''
214
186
  end
187
+
188
+ def chrome_start(proxy)
189
+ # 공통 옵션 설정
190
+ Selenium::WebDriver::Chrome::Service.driver_path = './chromedriver.exe'
191
+ options = Selenium::WebDriver::Chrome::Options.new
192
+
193
+ options.add_argument('--disable-blink-features=AutomationControlled')
194
+ options.add_argument('--disable-popup-blocking')
195
+ options.add_argument('--dns-prefetch-disable')
196
+ options.add_argument('--disable-dev-shm-usage')
197
+ options.add_argument('--disable-software-rasterizer')
198
+ options.add_argument('--ignore-certificate-errors')
199
+ options.add_argument('--disable-gpu') # GPU 가속 끄기
200
+ 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 위조
201
+ options.add_argument('--disable-web-security')
202
+ options.add_argument('--allow-running-insecure-content')
203
+ options.add_argument('--allow-insecure-localhost')
204
+ options.add_argument('--no-sandbox')
205
+ options.add_argument('--disable-translate')
206
+ options.add_argument('--disable-extensions-file-access-check')
207
+ options.add_argument('--disable-impl-side-painting')
208
+
209
+ # 자동화된 테스트 제거
210
+ options.exclude_switches = ['enable-automation'] # 'excludeSwitches'를 'exclude_switches'로 수정
211
+
212
+ prefs = {
213
+ "profile.password_manager_enabled" => false, # 비밀번호 관리자 비활성화
214
+ "credentials_enable_service" => false, # 비밀번호 저장 관련 기능 비활성화
215
+ "password_manager.enabled" => false, # 비밀번호 관리자 비활성화 (추가적인 설정)
216
+ "profile.managed_default_content_settings.cookies" => 2, # 쿠키 관련 팝업 차단
217
+ "profile.default_content_setting_values.notifications" => 2 # 알림 관련 팝업 차단
218
+ }
219
+ options.add_preference('prefs', prefs)
215
220
 
221
+ # Proxy가 설정되었으면 proxy 서버 설정
222
+ if proxy != ''
223
+ options.add_argument('--proxy-server=' + proxy.to_s.force_encoding('utf-8'))
224
+ end
225
+
226
+ # 브라우저 실행
227
+ begin
228
+ @driver = Selenium::WebDriver.for(:chrome, options: options)
229
+ @driver.get("https://www.tistory.com/auth/login")
230
+ rescue => e
231
+ puts "Error: #{e.message}"
232
+ puts 'Using default Chrome driver without proxy'
233
+ @driver = Selenium::WebDriver.for(:chrome, options: options)
234
+ @driver.get("https://www.tistory.com/auth/login")
235
+ end
236
+ end
216
237
 
238
+ def solve_captcha(captcha_api_key)
239
+ page_url = @driver.current_url
240
+ iframe_element = @driver.find_element(:css, "iframe[title='reCAPTCHA']")
241
+ iframe_src = iframe_element.attribute("src")
242
+
243
+ google_key = URI.parse(iframe_src).query.split("&").map { |param| param.split("=") }.to_h["k"]
244
+
245
+ raise "reCAPTCHA site key를 iframe에서 찾을 수 없습니다." if google_key.nil?
246
+
247
+ response = HTTParty.post("http://2captcha.com/in.php", body: {
248
+ method: 'userrecaptcha',
249
+ googlekey: google_key,
250
+ pageurl: page_url,
251
+ key: captcha_api_key,
252
+ json: 1
253
+ })
254
+
255
+ if response.code != 200 || JSON.parse(response.body)["status"] != 1
256
+ raise "2Captcha 요청에 실패했습니다. 응답: #{response.body}"
257
+ end
258
+
259
+ captcha_id = JSON.parse(response.body)["request"]
260
+
261
+ # CAPTCHA 해결을 기다립니다.
262
+ wait = Selenium::WebDriver::Wait.new(:timeout => 30)
263
+ result = nil
264
+
265
+ loop do
266
+ result = HTTParty.get("http://2captcha.com/res.php?key=#{captcha_api_key}&action=get&id=#{captcha_id}&json=1")
267
+ parsed_result = JSON.parse(result.body)
268
+
269
+ if parsed_result["status"] == 1
270
+ return parsed_result["request"]
271
+ elsif parsed_result["request"] != "CAPCHA_NOT_READY"
272
+ raise "2Captcha 에러 발생: #{parsed_result['request']}"
273
+ end
274
+ sleep(5) # 5초 간격으로 재시도
275
+ end
276
+ end
277
+
217
278
 
218
279
 
219
- def login(user_id, user_pw, proxy ,captcha_key)
280
+ def login(user_id, user_pw, proxy, captcha_api_key)
220
281
  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
- ####################탭나누기 수정중######################################
282
+ @captcha_api_key = captcha_api_key
283
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)
288
-
289
- user_cookie_file = Array.new
290
- begin
291
- Dir.entries('./cookie').each do |i|
292
- if i == '.' or i == '..'
293
284
 
294
- else
295
- user_cookie_file << i
285
+ user_cookie_file = []
286
+ begin
287
+ Dir.entries('./cookie').each do |i|
288
+ if i != '.' && i != '..'
289
+ user_cookie_file << i
296
290
  end
297
291
  end
298
292
  rescue
299
293
  end
300
294
 
301
- @cookie4 = Hash.new
295
+ @cookie4 = {}
302
296
  if user_cookie_file.include?(user_id+'.txt')
303
297
  f = File.open('./cookie/'+user_id+'.txt', 'r')
304
- @cookie4 = JSON.parse(f.read())
298
+ @cookie4 = JSON.parse(f.read)
305
299
  f.close
306
300
  end
307
301
 
302
+ # 기존 쿠키가 있으면 쿠키를 추가
308
303
  begin
309
304
  @cookie4.each do |i|
310
- p i
311
305
  @driver.manage.add_cookie(name: i['name'], value: i['value'], same_site: i['same_site'], domain: i['domain'], path: i['path'])
312
306
  end
313
307
  rescue
314
308
  end
315
-
316
- sleep(1)
309
+
317
310
  @driver.get('https://www.tistory.com/auth/login')
311
+ sleep(1)
318
312
  begin
313
+ wait = Selenium::WebDriver::Wait.new(:timeout => 3)
314
+ wait.until { @driver.find_element(:xpath, '//*[@id="cMain"]/div/div/div/div/a[2]/span[2]') }
319
315
  @driver.find_element(:xpath, '//*[@id="cMain"]/div/div/div/div/a[2]/span[2]').click
320
316
  check_cookie_login = 0
321
317
  rescue
@@ -323,122 +319,146 @@ class Naver
323
319
  end
324
320
 
325
321
  if check_cookie_login == 0
326
- sleep(3)
322
+ wait = Selenium::WebDriver::Wait.new(:timeout => 3)
323
+ wait.until { @driver.find_element(:xpath, '//*[@id="loginId--1"]') }
327
324
  @driver.find_element(:xpath, '//*[@id="loginId--1"]').click
328
325
  Clipboard.copy(user_id)
326
+ sleep(0.5)
329
327
  @driver.action.key_down(:control).send_keys('v').key_up(:control).perform
330
328
  puts '-[√] 1 아이디 입력.......'.yellow
331
- sleep(3)
329
+
330
+ wait = Selenium::WebDriver::Wait.new(:timeout => 3)
331
+ wait.until { @driver.find_element(:xpath, '//*[@id="password--2"]') }
332
332
  @driver.find_element(:xpath, '//*[@id="password--2"]').click
333
333
  Clipboard.copy(user_pw)
334
+ sleep(0.5)
334
335
  @driver.action.key_down(:control).send_keys('v').key_up(:control).perform
335
336
  puts '-[√] 2 비밀번호 입력.......'.yellow
336
- sleep(3)
337
+
338
+ wait = Selenium::WebDriver::Wait.new(:timeout => 3)
339
+ wait.until { @driver.find_element(:xpath, '//*[@type="submit"]') }
337
340
  @driver.find_element(:xpath, '//*[@type="submit"]').click
338
- #@driver.find_element(:xpath, '//*[@id="mainContent"]/div/div/form/div[4]/button[1]').click
339
341
  puts '-[√] 3 로그인 버튼 클릭.......'.yellow
340
-
341
- sleep(5)
342
342
 
343
-
344
- puts '-[√] 3 캡챠 발생 및 이메일 인증 유무 확인.......'.green
345
- sleep(1)
346
- puts '-[√] 3 캡챠 발생 및 이메일 인증 유무 확인.......'.green
347
- sleep(1)
348
- puts '-[√] 3 캡챠 발생 및 이메일 인증 유무 확인.......'.green
349
- sleep(1)
350
-
343
+ #예외 변수
344
+ begin
345
+ # CAPTCHA iframe 찾기
346
+ captcha_iframe = wait.until {
347
+ @driver.find_elements(:tag_name, "iframe").find do |iframe|
348
+ iframe.attribute("title") == "reCAPTCHA" || (iframe.attribute("src")&.include?("google.com/recaptcha"))
349
+ end
350
+ }
351
+ sleep(1)
352
+
353
+ # CAPTCHA iframe이 없다면 예외 처리
354
+ if captcha_iframe.nil?
355
+ puts 'CAPTCHA 없음, 로그인 진행 중...'.cyan
356
+ else
357
+ # CAPTCHA iframe으로 전환
358
+ @driver.switch_to.frame(captcha_iframe)
359
+ puts 'CAPTCHA iframe 전환 성공'.cyan
360
+ sleep(2)
361
+
362
+ # CAPTCHA 클릭
363
+ recaptcha_element = wait.until { @driver.find_element(:id, "recaptcha-anchor") }
364
+ recaptcha_element.click
365
+ puts 'CAPTCHA 클릭 완료'.cyan
366
+ sleep(3)
367
+
368
+ # CAPTCHA 해결
369
+ @captcha_api_key = captcha_api_key
370
+ captcha_answer = solve_captcha(@captcha_api_key)
371
+ puts "CAPTCHA 해결된 답: #{captcha_answer}".cyan
372
+ sleep(5)
351
373
 
374
+ # CAPTCHA 답 입력
375
+ begin
376
+ # 다시 `wait`을 사용하여 `g-recaptcha-response` 필드를 기다립니다
377
+ captcha_input = wait.until { @driver.find_element(:id, "g-recaptcha-response") }
378
+ @driver.execute_script("arguments[0].style.display = 'block';", captcha_input) # 숨겨진 CAPTCHA 입력 필드를 표시
379
+ captcha_input.send_keys(captcha_answer)
380
+ puts 'CAPTCHA 답 입력 완료'.cyan
381
+ rescue Selenium::WebDriver::Error::NoSuchElementError => e
382
+ puts "g-recaptcha-response 필드를 찾을 수 없습니다. 다시 시도해주세요.".red
383
+ raise e
384
+ end
385
+
386
+ # 로그인 버튼 다시 클릭
387
+ wait.until { @driver.find_element(:xpath, '//*[@class="btn_g highlight submit"]') }
388
+ @driver.find_element(:xpath, '//*[@class="btn_g highlight submit"]').click
389
+ puts '-[√] 3-3 로그인 버튼 다시 클릭.......'.cyan
390
+ end
391
+
392
+ rescue Selenium::WebDriver::Error::NoSuchElementError => e
393
+ puts 'CAPTCHA 없음, 로그인 진행 중...'.cyan
394
+ rescue => e
395
+ puts "로그인 처리 중 오류 발생: #{e.message}".red
396
+ end
352
397
 
353
398
 
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
-
401
399
 
400
+ # 아이디/비밀번호 오류 처리 부분
401
+ begin
402
+ @driver.find_element(:xpath, '//*[@class="desc_error"]')
403
+ sleep(1)
404
+ @driver.close
405
+ puts 'error = 아이디/비밀번호 오류'.yellow
406
+ rescue
407
+ end
402
408
 
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
409
+
410
+ #예외 변수
411
+ begin
412
+ # 타임아웃을 10초로 설정
413
+ wait = Selenium::WebDriver::Wait.new(:timeout => 1)
414
+ #요소가 나타날 때까지 3초 동안 기다립니다.
415
+ wait.until { @driver.find_element(:xpath, '//*[@class="ico_comm ico_mail"]') }
416
+ @driver.find_element(:xpath, '//*[@class="ico_comm ico_mail"]')
417
+ print "이메일 인증 요구 발생!! 수동으로 인증 완료 후 여기에 엔터를 쳐주세요".cyan
418
+ input = gets.chomp()
419
+ rescue
420
+ end
421
+
422
+ #예외 변수
423
+ begin
424
+ @driver.find_element(:xpath, '//*[@class="link_comm link_g"]').click
425
+ puts '비밀번호 요청 다음에하기 클릭'.yellow
426
+ sleep(1)
427
+ rescue
428
+ end
429
+
430
+ #예외 변수
431
+ begin
432
+ @driver.find_element(:xpath, '//*[@class="inner_error inner_error_type2"]')
433
+ puts 'error = 평소와 다른 로그인이 감지되어 추가 인증이 필요합니다.'.yellow
434
+ sleep(1)
435
+ @driver.close
436
+ rescue
437
+ end
438
+
423
439
  end
424
440
 
425
441
  @cookie = ''
426
- cookie2 = Array.new
442
+ cookie2 = []
427
443
  @driver.manage.all_cookies.each do |i|
428
- puts i
429
- @cookie += i[:name]+'='+i[:value]+'; '
430
444
  cookie2 << i
431
445
  end
432
446
 
447
+ # 쿠키 만료 시간을 1년으로 설정
448
+ cookie2.each do |cookie|
449
+ cookie[:expiry] = Time.now.to_i + 365 * 24 * 60 * 60 # 만료 시간을 1년 후로 설정
450
+ end
451
+
433
452
  File.open('./cookie/'+user_id+'.txt', 'w') do |ff|
434
453
  ff.write(cookie2.to_json)
435
454
  end
436
455
  end
437
-
438
456
 
439
457
  sleep(2)
440
458
 
441
- def update(title, content, option, dd_time, url, keyword)
459
+
460
+
461
+ def update(title, content, option, dd_time, url, keyword, captcha_api_key)
442
462
  puts 'start...'.yellow
443
463
  puts(url)
444
464
  sleep(1)
@@ -448,11 +468,10 @@ class Naver
448
468
 
449
469
 
450
470
  begin
451
- #@driver.switch_to.window(@driver.window_handles[1])
471
+
452
472
  @driver.switch_to.alert.dismiss
453
473
  rescue
454
- #@driver.switch_to.window(@driver.window_handles[0])
455
- #@driver.switch_to.alert.dismiss
474
+
456
475
  end
457
476
 
458
477
  sleep(1)
@@ -489,7 +508,8 @@ class Naver
489
508
  rescue => e
490
509
  puts '-[√] 카테고리 ERROR 발생.......'.red
491
510
  puts '-[√] 다음 작업이 준비중이니 1~60 초 정도 기다려주세요.......'.green
492
- puts e
511
+ @driver.close
512
+ return 0
493
513
  end
494
514
 
495
515
 
@@ -503,8 +523,10 @@ class Naver
503
523
 
504
524
  begin
505
525
  @driver.find_element(:xpath, '//*[@id="post-title-inp"]').send_keys(title)
506
- rescue
507
- puts '-[√] 페이지 로드(로딩)시간 초과로 작업을 중지합니다.......'.red
526
+ rescue => e
527
+ @driver.close
528
+ return 0
529
+ puts '-[√] 페이지 로드(로딩)시간 초과 및 알수없는 오류로 종료.......'.red
508
530
  puts '-[√] 다음 작업이 준비중이니 1~60 초 정도 기다려주세요.......'.green
509
531
  puts e
510
532
  end
@@ -517,61 +539,26 @@ class Naver
517
539
 
518
540
  sleep(1)
519
541
 
542
+ begin
543
+ @driver.find_element(:xpath, '//*[@id="mceu_9-button"]').click()
544
+ @driver.find_element(:xpath, '//*[@id="mceu_9-button"]').click()
545
+ rescue => e
546
+ @driver.close
547
+ return 0
548
+ puts '-[√] 페이지 로드(로딩)시간 초과 및 알수없는 오류로 종료.......'.red
549
+ puts '-[√] 다음 작업이 준비중이니 1~60 초 정도 기다려주세요.......'.green
550
+
551
+ end
520
552
 
521
- @driver.find_element(:xpath, '//*[@id="mceu_9-button"]').click()
522
- @driver.find_element(:xpath, '//*[@id="mceu_9-button"]').click()
523
-
524
553
 
525
554
  puts content
526
555
  noko = Nokogiri::HTML(content, nil, Encoding::UTF_8.to_s)
527
556
  toomung = 0
528
557
  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'
558
+
547
559
 
548
560
  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
- # }
561
+
575
562
 
576
563
  check_position = 1
577
564
  noko.css('p').each do |i|
@@ -971,7 +958,7 @@ class Naver
971
958
  end
972
959
 
973
960
 
974
- #######################################여기까지 복원코드#########################################################
961
+
975
962
 
976
963
 
977
964
  #링크 넣는 코드 ↓
@@ -1042,22 +1029,7 @@ class Naver
1042
1029
  end
1043
1030
  end
1044
1031
  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
-
1032
+
1061
1033
 
1062
1034
 
1063
1035
  @driver.action.key_down(:end).key_up(:end).perform
@@ -1069,24 +1041,6 @@ class Naver
1069
1041
 
1070
1042
  sleep(1)
1071
1043
 
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
1044
  end
1091
1045
 
1092
1046
 
@@ -1181,30 +1135,32 @@ class Naver
1181
1135
  if option['전체공개'] == 'false'
1182
1136
  puts '-[√] 전체공개 선택.......'.yellow
1183
1137
  begin
1184
- sleep(2)
1138
+
1185
1139
  @driver.find_element(:xpath, '//*[@id="open20"]').click
1140
+ sleep(2)
1186
1141
  rescue
1187
1142
  end
1188
1143
  end
1189
- sleep(2)
1144
+
1190
1145
 
1191
1146
  if option['비공개'] == 'false'
1192
1147
  puts '-[√] 비공개 선택.......'.yellow
1193
1148
  begin
1194
- sleep(2)
1195
1149
  @driver.find_element(:xpath, '//*[@id="open0"]').click
1150
+ sleep(2)
1196
1151
  rescue
1197
1152
  end
1198
1153
  end
1199
- sleep(2)
1154
+
1200
1155
 
1201
1156
  if option['댓글허용'] == 'false'
1202
1157
  puts '-[√] 댓글허용 선택.......'.yellow
1203
1158
  begin
1204
- sleep(2)
1159
+
1205
1160
  @driver.find_element(:xpath, '//*[@class="mce-btn-type1"]').click
1206
1161
  sleep(2)
1207
1162
  @driver.find_element(:partial_link_text, '댓글 허용').click
1163
+ sleep(2)
1208
1164
  rescue
1209
1165
  end
1210
1166
  end
@@ -1213,182 +1169,63 @@ class Naver
1213
1169
  if option['댓글 비 허용'] == 'false'
1214
1170
  puts '-[√] 댓글 비 허용 선택.......'.yellow
1215
1171
  begin
1216
- sleep(2)
1217
1172
  @driver.find_element(:xpath, '//*[@class="mce-btn-type1"]').click
1218
1173
  sleep(2)
1219
1174
  @driver.find_element(:partial_link_text, '댓글 비허용').click
1175
+ sleep(2)
1220
1176
  rescue
1221
1177
  end
1222
1178
  end
1223
-
1224
-
1225
- puts '-[√] 캡챠 발생 유무 확인.......'.green
1226
- sleep(1)
1227
- puts '-[√] 캡챠 발생 유무 확인.......'.green
1228
- sleep(1)
1229
- puts '-[√] 캡챠 발생 유무 확인.......'.green
1179
+
1180
+
1181
+ sleep(dd_time.to_i) # 등록버튼 누르기 딜레이
1182
+ # 등록 버튼 클릭
1183
+ @driver.find_element(:xpath, '//*[@id="publish-btn"]').click
1184
+ puts '-[√] 포스트 등록 성공 여부 확인 중.......'.yellow
1185
+ sleep(2)
1186
+ # 리캡챡 발생 여부 확인
1187
+ begin
1188
+ # 리캡챡 요소 확인 (예: 구글 reCAPTCHA의 iframe을 찾는 방법)
1189
+ wait = Selenium::WebDriver::Wait.new(:timeout => 3)
1190
+ wait.until { @driver.find_element(:xpath, '//*[@id="recaptcha-anchor"]') }
1191
+
1192
+ puts '-[√] 리캡챡 감지됨! 자동 해결 시도...'.yellow
1193
+
1194
+ # 리캡챡 해결 함수 호출
1195
+ @captcha_api_key = captcha_api_key
1230
1196
  sleep(1)
1197
+ captcha_solution = solve_captcha(captcha_api_key)
1198
+
1199
+ # 리캡챡 응답 필드에 해결된 값을 입력
1200
+ @driver.execute_script("document.getElementById('g-recaptcha-response').innerHTML='#{captcha_solution}'")
1201
+ sleep(3) # 잠시 대기 후
1202
+ @driver.find_element(:xpath, '//*[@id="publish-btn"]').click # 등록 버튼 다시 클릭
1203
+ puts '-[√] 리캡챡 해결 후 등록 시도.......'.yellow
1204
+ sleep(2)
1205
+ rescue
1206
+ # 리캡챡이 없다면 바로 진행
1207
+ puts '-[√] 리캡챡 없음, 바로 등록 진행.......'.yellow
1208
+ end
1231
1209
 
1210
+ # 포스트 등록 완료 확인
1232
1211
  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
1212
+ # 포스트 등록 완료를 확인할 수 있는 요소(예: 등록 후 확인 페이지로 이동)
1213
+ wait.until { @driver.find_element(:xpath, '//*[@class="post_cont"]') }
1214
+ puts '-[] 포스트 등록 완료.......'.yellow
1269
1215
  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"]') }
1216
+ puts '-[×] 포스트 등록 실패!'.red
1217
+ end
1218
+
1219
+
1220
+ # 브라우저 종료
1221
+ @driver.close
1222
+
1223
+
1224
+
1294
1225
 
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
1226
+
1227
+ end
1228
+ end
1392
1229
 
1393
1230
 
1394
1231
  class Wordpress
@@ -1595,11 +1432,11 @@ class Wordpress
1595
1432
 
1596
1433
 
1597
1434
 
1598
- def chrome_start(url, user_id, user_pw, captcha_key)
1435
+ def chrome_start(url, user_id, user_pw, captcha_api_key)
1599
1436
  @url = url
1600
1437
  @user_id = user_id
1601
1438
  @user_pw = user_pw
1602
- @captcha_key = captcha_key
1439
+ @captcha_api_key = captcha_api_key
1603
1440
  begin
1604
1441
  Selenium::WebDriver::Chrome::Service.driver_path = './chromedriver.exe'
1605
1442
  @driver = Selenium::WebDriver.for :chrome
@@ -1608,95 +1445,7 @@ class Wordpress
1608
1445
  end
1609
1446
  end
1610
1447
 
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
1448
+
1700
1449
 
1701
1450
  def auto_image
1702
1451
  begin
@@ -1951,6 +1700,7 @@ class Wordpress
1951
1700
  option['category'] = ''
1952
1701
  end
1953
1702
 
1703
+
1954
1704
  #begin
1955
1705
  # option['category2'] = table[5].to_s.force_encoding('utf-8').to_s
1956
1706
  # if option['category2'].to_s == '편집모드'
@@ -1975,6 +1725,7 @@ class Wordpress
1975
1725
 
1976
1726
  puts table[7]
1977
1727
  puts table[10]
1728
+
1978
1729
  if table[7].to_i > table[10].to_i
1979
1730
  if @data['포스트설정']['테더링'].checked?
1980
1731
  puts 'tedering ip change...'
@@ -2023,6 +1774,14 @@ class Wordpress
2023
1774
  end
2024
1775
  end
2025
1776
  end
1777
+
1778
+ if @data['포스트설정']['gpt제목'].checked?
1779
+ chat = Chat_title.new(@data['포스트설정']['api_key'].text.to_s.force_encoding('utf-8'))
1780
+ gpt_text1 = chat.message(title)
1781
+ title = gpt_text1.to_s
1782
+ end
1783
+
1784
+
2026
1785
  @data['table'][index][-1] = 5
2027
1786
  @data['table'] << []
2028
1787
  @data['table'].pop
@@ -2060,6 +1819,25 @@ class Wordpress
2060
1819
  end
2061
1820
  end
2062
1821
  end
1822
+
1823
+ if @data['포스트설정']['gpt내용'].checked?
1824
+ api_key = @data['포스트설정']['api_key'].text.to_s.force_encoding('utf-8')
1825
+ #key_change = @data['포스트설정']['특정단어키워드로변경값'].text.to_s.force_encoding('utf-8')
1826
+ #imotcon_change = @data['포스트설정']['스티커로변경단어'].text.to_s.force_encoding('utf-8')
1827
+ #template_change = @data['포스트설정']['내템플릿변경단어'].text.to_s.force_encoding('utf-8')
1828
+ #ttdanar_change = @data['포스트설정']['단어링크적용단어'].text.to_s.force_encoding('utf-8')
1829
+ #sajine_change = @data['포스트설정']['단어사진으로변경단어'].text.to_s.force_encoding('utf-8')
1830
+ #mov_change = @data['포스트설정']['영상으로변경단어'].text.to_s.force_encoding('utf-8')
1831
+ #map_change = @data['포스트설정']['지도로변경단어'].text.to_s.force_encoding('utf-8')
1832
+ #inyong9_change = @data['포스트설정']['인용구변경단어'].text.to_s.force_encoding('utf-8')
1833
+
1834
+
1835
+ chat = Chat_content.new(api_key)
1836
+ gpt_text3 = chat.message(content)
1837
+ content = gpt_text3.to_s
1838
+ end
1839
+
1840
+
2063
1841
  content_tag = content.split('@##@')[1]
2064
1842
  content = content.split('@##@')[0]
2065
1843
  @data['table'][index][-1] = 15
@@ -2076,14 +1854,14 @@ class Wordpress
2076
1854
  proxy = table[3].to_s
2077
1855
  user_id = table[1].to_s
2078
1856
  user_pw = table[2].to_s
2079
- captcha_key = table[6].to_s
1857
+ captcha_api_key = @data['포스트설정']['captcha_api_key'].text.to_s.force_encoding('utf-8')
2080
1858
  naver = Naver.new
2081
1859
  @data['table'][index][-1] = 25
2082
1860
  @data['table'] << []
2083
1861
  @data['table'].pop
2084
1862
 
2085
- #네이버로그인
2086
- login_check = naver.login(user_id, user_pw, option['proxy'], captcha_key)
1863
+ #네이버로그인login(user_id, user_pw, proxy ,captcha_api_key)
1864
+ login_check = naver.login(user_id, user_pw, option['proxy'], captcha_api_key)
2087
1865
  if login_check == 0
2088
1866
  black_users << table[1].to_s
2089
1867
  next
@@ -2255,11 +2033,11 @@ class Wordpress
2255
2033
  content = content2
2256
2034
  end
2257
2035
  end
2258
-
2036
+
2259
2037
  @data['table'][index][-1] = 50
2260
2038
  @data['table'] << []
2261
2039
  @data['table'].pop
2262
- if @data['포스트설정']['gpt'].checked?
2040
+ if @data['포스트설정']['gpt키워드'].checked?
2263
2041
  chat = Chat.new(@data['포스트설정']['api_key'].text.to_s.force_encoding('utf-8'))
2264
2042
  gpt_text = chat.message(keyword)
2265
2043
  content = content.to_s + "\n(자동생성글)\n" + gpt_text.to_s
@@ -2280,7 +2058,7 @@ class Wordpress
2280
2058
  joongbok_check = 0
2281
2059
  counter10 = 0
2282
2060
  while joongbok_check == 0
2283
- if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt'].checked?
2061
+ if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt키워드'].checked?
2284
2062
  content22 = content.split("(자동생성글)")[1].split("\n")
2285
2063
  else
2286
2064
  content22 = content.split("\n")
@@ -2304,12 +2082,12 @@ class Wordpress
2304
2082
  content2 = content.split("\n")
2305
2083
  end
2306
2084
 
2307
- if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt'].checked?
2085
+ if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt키워드'].checked?
2308
2086
  content2 = content.split("(자동생성글)")[1].split("\n")
2309
2087
  position.pop
2310
2088
  end
2311
2089
 
2312
- if @data['포스트설정']['내용과자동생성'].checked? == false and @data['포스트설정']['내용을자동생성'].checked? == false and @data['포스트설정']['gpt'].checked? == false
2090
+ if @data['포스트설정']['내용과자동생성'].checked? == false and @data['포스트설정']['내용을자동생성'].checked? == false and @data['포스트설정']['gpt키워드'].checked? == false
2313
2091
  content2 = content.split("\n")
2314
2092
  end
2315
2093
 
@@ -2355,7 +2133,7 @@ class Wordpress
2355
2133
  content = content3.join("\n")
2356
2134
  end
2357
2135
 
2358
- if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt'].checked?
2136
+ if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt키워드'].checked?
2359
2137
  content2.each_with_index do |con, index|
2360
2138
  if position.include?(index)
2361
2139
  insert_keyword_text = keyword.to_s
@@ -2385,7 +2163,7 @@ class Wordpress
2385
2163
  end
2386
2164
  end
2387
2165
 
2388
- if @data['포스트설정']['내용과자동생성'].checked? == false and @data['포스트설정']['내용을자동생성'].checked? == false and @data['포스트설정']['gpt'].checked? == false
2166
+ if @data['포스트설정']['내용과자동생성'].checked? == false and @data['포스트설정']['내용을자동생성'].checked? == false and @data['포스트설정']['gpt키워드'].checked? == false
2389
2167
  begin
2390
2168
  content2.each_with_index do |con, index|
2391
2169
  if position.include?(index)
@@ -2473,7 +2251,7 @@ class Wordpress
2473
2251
  end
2474
2252
  end
2475
2253
 
2476
- if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt'].checked?
2254
+ if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt키워드'].checked?
2477
2255
  content5 = content.split("(자동생성글)")[0].to_s.split("\n")
2478
2256
  content55 = content.split("(자동생성글)")[1].to_s
2479
2257
 
@@ -2501,7 +2279,7 @@ class Wordpress
2501
2279
 
2502
2280
  position = position.sort
2503
2281
 
2504
- if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt'].checked?
2282
+ if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt키워드'].checked?
2505
2283
  image_url22 = get_image_file().force_encoding('utf-8')
2506
2284
  end
2507
2285
 
@@ -2519,7 +2297,7 @@ class Wordpress
2519
2297
  end
2520
2298
  end
2521
2299
 
2522
- if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt'].checked?
2300
+ if @data['포스트설정']['내용과자동생성'].checked? or @data['포스트설정']['gpt키워드'].checked?
2523
2301
  content = content5.join("\n")+'(자동생성글)'+content55
2524
2302
  # iconv = Iconv.new('UTF-8', 'ASCII-8BIT')
2525
2303
  # content = iconv.iconv(content)
@@ -2689,7 +2467,7 @@ class Wordpress
2689
2467
  # content = content
2690
2468
  # soosick_1 = content_end
2691
2469
  #else
2692
- if @data['포스트설정']['gpt'].checked?
2470
+ if @data['포스트설정']['gpt키워드'].checked?
2693
2471
  if @data['포스트설정']['gpt상단'].checked?
2694
2472
  content = content_end+"\n"+content+"\n"
2695
2473
  else
@@ -2812,9 +2590,11 @@ class Wordpress
2812
2590
 
2813
2591
  dd_time = @data['table'][index][9].to_s.force_encoding('utf-8').to_i
2814
2592
  url = @data['table'][index][3].to_s.force_encoding('utf-8')
2815
-
2593
+ captcha_api_key = @data['포스트설정']['captcha_api_key'].text.to_s.force_encoding('utf-8')
2594
+
2595
+
2816
2596
  puts 'start...'
2817
- naver.update(title,content,option, dd_time, url, keyword)
2597
+ naver.update(title,content,option, dd_time, url, keyword, captcha_api_key)
2818
2598
 
2819
2599
  @data['table'][index][10] = @data['table'][index][10].to_i + 1
2820
2600
  @data['table'][index][-1] = 100
@@ -3170,13 +2950,11 @@ class Wordpress
3170
2950
  horizontal_box{
3171
2951
  stretchy false
3172
2952
  horizontal_box{
3173
- @data['captcha_key'] = entry{
3174
- text 'captcha_api_key 입력'
3175
- }
2953
+
3176
2954
  button('등록'){
3177
2955
  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]
2956
+ @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]
2957
+ @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
2958
  @data['table'].pop
3181
2959
  }
3182
2960
  }
@@ -3188,7 +2966,7 @@ class Wordpress
3188
2966
  file_data.split("\n").each do |i|
3189
2967
  i3 = i.to_s.force_encoding('utf-8').to_s
3190
2968
  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]
2969
+ @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
2970
  @data['table'] << [false, i2[0].to_s, i2[1].to_s,1,1,1,0,0]
3193
2971
  @data['table'].pop
3194
2972
  end
@@ -3244,10 +3022,7 @@ class Wordpress
3244
3022
  text_column('프록시'){
3245
3023
  editable true
3246
3024
  }
3247
- text_column('캡차api'){
3248
- editable true
3249
- }
3250
-
3025
+
3251
3026
  text_column('수량'){
3252
3027
  editable true
3253
3028
  }
@@ -3268,10 +3043,10 @@ class Wordpress
3268
3043
 
3269
3044
  horizontal_box{
3270
3045
  stretchy false
3271
-
3272
- @data['captcha_key1'] = entry{
3273
- text 'captcha_api_key 입력'
3046
+ @data['포스트설정']['captcha_api_key'] = entry(){
3047
+ text 'captcha_api_key 입력'
3274
3048
  }
3049
+
3275
3050
  @data['table_counter_input'] = entry{
3276
3051
  text '수량 ex) 3'
3277
3052
  }
@@ -3285,10 +3060,10 @@ class Wordpress
3285
3060
  button('전체설정'){
3286
3061
  on_clicked{
3287
3062
  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
3063
+
3064
+ @data['table'][n][6] = @data['table_counter_input'].text.to_i
3065
+ @data['table'][n][7] = @data['table_delay_input'].text.to_i
3066
+ @data['table'][n][8] = @data['table_delay_input2'].text.to_i
3292
3067
  @data['table'] << []
3293
3068
  @data['table'].pop
3294
3069
  end
@@ -3324,7 +3099,10 @@ class Wordpress
3324
3099
  }
3325
3100
  horizontal_box{
3326
3101
  stretchy false
3102
+ grid{
3327
3103
  button('전체선택'){
3104
+ top 1
3105
+ left 1
3328
3106
  on_clicked{
3329
3107
  for n in 0..@data['키워드설정']['키워드'].length-1
3330
3108
  @data['키워드설정']['키워드'][n][0] = true
@@ -3333,7 +3111,20 @@ class Wordpress
3333
3111
  end
3334
3112
  }
3335
3113
  }
3336
- button('키워드삭제'){
3114
+ button('선택해제'){
3115
+ top 1
3116
+ left 2
3117
+ on_clicked{
3118
+ for n in 0..@data['키워드설정']['키워드'].length-1
3119
+ @data['키워드설정']['키워드'][n][0] = false
3120
+ @data['키워드설정']['키워드'] << []
3121
+ @data['키워드설정']['키워드'].pop
3122
+ end
3123
+ }
3124
+ }
3125
+ button('삭제하기'){
3126
+ top 1
3127
+ left 3
3337
3128
  on_clicked{
3338
3129
  m = Array.new
3339
3130
  for n in 0..@data['키워드설정']['키워드'].length-1
@@ -3341,13 +3132,15 @@ class Wordpress
3341
3132
  m << n
3342
3133
  end
3343
3134
  end
3344
-
3135
+
3345
3136
  m.reverse.each do |i|
3346
3137
  @data['키워드설정']['키워드'].delete_at(i)
3347
3138
  end
3348
3139
  @data['키워드설정']['키워드'].delete(nil)
3349
3140
  }
3350
3141
  }
3142
+ }
3143
+
3351
3144
  @data['키워드설정']['순서사용'] = checkbox('순서사용'){
3352
3145
  stretchy false
3353
3146
  on_toggled{ |c|
@@ -3365,6 +3158,58 @@ class Wordpress
3365
3158
  }
3366
3159
  }
3367
3160
  }
3161
+ vertical_separator{
3162
+ stretchy false
3163
+ }
3164
+ horizontal_box{
3165
+ stretchy false
3166
+ grid{
3167
+ @data['포스트설정']['gpt키워드'] = checkbox('GPT 키워드 기반 글 생성'){
3168
+ top 1
3169
+ left 0
3170
+ #enabled false # 기본적으로 비활성화
3171
+ on_toggled {
3172
+ if @data['포스트설정']['gpt키워드'].checked?
3173
+ @data['포스트설정']['gpt상단'].enabled = true # '내용투명' 활성화
3174
+ @data['포스트설정']['gpt하단'].enabled = true # '내용투명' 활성화
3175
+ else
3176
+ @data['포스트설정']['gpt상단'].checked = false # 체크 해제
3177
+ @data['포스트설정']['gpt상단'].enabled = false # 비활성화
3178
+ @data['포스트설정']['gpt하단'].checked = false # 체크 해제
3179
+ @data['포스트설정']['gpt하단'].enabled = false # 비활성화
3180
+ end
3181
+ }
3182
+
3183
+ }
3184
+
3185
+ @data['포스트설정']['gpt상단'] = checkbox('원고 위에 넣기'){
3186
+ top 1
3187
+ left 1
3188
+ enabled false # 기본적으로 비활성화
3189
+ on_toggled{
3190
+ if @data['포스트설정']['gpt상단'].checked?
3191
+ @data['포스트설정']['gpt하단'].checked = false
3192
+ end
3193
+ }
3194
+ }
3195
+
3196
+ @data['포스트설정']['gpt하단'] = checkbox('원고 아래 넣기'){
3197
+ top 1
3198
+ left 2
3199
+ enabled false # 기본적으로 비활성화
3200
+ on_toggled{
3201
+ if @data['포스트설정']['gpt하단'].checked?
3202
+ @data['포스트설정']['gpt상단'].checked = false
3203
+ end
3204
+ }
3205
+ }
3206
+ } }
3207
+ horizontal_box{
3208
+ stretchy false
3209
+ grid{
3210
+ label('※ GPT 기능 사용시 포스트설정1에서 GPT사용에 체크 필수'){
3211
+ } } }
3212
+
3368
3213
  table{
3369
3214
  checkbox_column('선택'){
3370
3215
  editable true
@@ -3383,68 +3228,100 @@ class Wordpress
3383
3228
  vertical_box{
3384
3229
  horizontal_box{
3385
3230
  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
3231
+ button('제목불러오기'){
3232
+ on_clicked{
3233
+ file = open_file
3234
+ if file != nil
3235
+ file_data = File.open(file, 'r', :encoding => 'utf-8').read()
3236
+ file_data.split("\n").each do |title|
3237
+ if title.split(" ").join('').length < 2
3393
3238
 
3394
- else
3395
- @data['제목설정']['제목'] << [false, title]
3396
- @data['제목설정']['제목'] << [false, title]
3397
- @data['제목설정']['제목'].pop
3398
- end
3399
- end
3239
+ else
3240
+ @data['제목설정']['제목'] << [false, title]
3241
+ @data['제목설정']['제목'] << [false, title]
3242
+ @data['제목설정']['제목'].pop
3400
3243
  end
3401
- }
3402
- }
3244
+ end
3245
+ end
3246
+ }
3247
+ }
3403
3248
 
3249
+ }
3250
+ horizontal_box{
3251
+ stretchy false
3252
+ grid{
3253
+ button('전체선택'){
3254
+ top 1
3255
+ left 1
3256
+ on_clicked{
3257
+ for n in 0..@data['제목설정']['제목'].length-1
3258
+ @data['제목설정']['제목'][n][0] = true
3259
+ @data['제목설정']['제목'] << []
3260
+ @data['제목설정']['제목'].pop
3261
+ end
3404
3262
  }
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
3263
+ }
3264
+ button('선택해제'){
3265
+ top 1
3266
+ left 2
3267
+ on_clicked{
3268
+ for n in 0..@data['제목설정']['제목'].length-1
3269
+ @data['제목설정']['제목'][n][0] = false
3270
+ @data['제목설정']['제목'] << []
3271
+ @data['제목설정']['제목'].pop
3272
+ end
3273
+ }
3274
+ }
3275
+ button('삭제하기'){
3276
+ top 1
3277
+ left 3
3278
+ on_clicked{
3279
+ m = Array.new
3280
+ for n in 0..@data['제목설정']['제목'].length-1
3281
+ if @data['제목설정']['제목'][n][0] == true
3282
+ m << n
3283
+ end
3284
+ end
3424
3285
 
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
- }
3286
+ m.reverse.each do |i|
3287
+ @data['제목설정']['제목'].delete_at(i)
3288
+ end
3289
+ @data['제목설정']['제목'].delete(nil)
3447
3290
  }
3291
+ }
3292
+ }
3293
+ @data['제목설정']['순서사용'] = checkbox('순서사용'){
3294
+ stretchy false
3295
+ on_toggled{ |c|
3296
+ if c.checked?
3297
+ @data['제목설정']['랜덤사용'].checked = false
3298
+ end
3299
+ }
3300
+ }
3301
+ @data['제목설정']['랜덤사용'] = checkbox('랜덤사용'){
3302
+ stretchy false
3303
+ on_toggled{ |c|
3304
+ if c.checked?
3305
+ @data['제목설정']['순서사용'].checked = false
3306
+ end
3307
+ }
3308
+ }
3309
+ }
3310
+ vertical_separator{
3311
+ stretchy false
3312
+ }
3313
+ horizontal_box{
3314
+ stretchy false
3315
+ grid{
3316
+ @data['포스트설정']['gpt제목'] = checkbox('제목을 이용해 GPT로 비슷한 제목 생성'){
3317
+
3318
+
3319
+ }}}
3320
+ horizontal_box{
3321
+ stretchy false
3322
+ grid{
3323
+ label('※ GPT 기능 사용시 포스트설정1에서 GPT사용에 체크 필수'){
3324
+ } } }
3448
3325
  table{
3449
3326
  checkbox_column('선택'){
3450
3327
  editable true
@@ -3478,11 +3355,14 @@ class Wordpress
3478
3355
  end
3479
3356
  }
3480
3357
  }
3481
-
3358
+
3482
3359
  }
3483
3360
  horizontal_box{
3484
3361
  stretchy false
3362
+ grid{
3485
3363
  button('전체선택'){
3364
+ top 1
3365
+ left 1
3486
3366
  on_clicked{
3487
3367
  for n in 0..@data['내용설정']['내용'].length-1
3488
3368
  @data['내용설정']['내용'][n][0] = true
@@ -3491,7 +3371,20 @@ class Wordpress
3491
3371
  end
3492
3372
  }
3493
3373
  }
3494
- button('내용삭제'){
3374
+ button('선택해제'){
3375
+ top 1
3376
+ left 2
3377
+ on_clicked{
3378
+ for n in 0..@data['내용설정']['내용'].length-1
3379
+ @data['내용설정']['내용'][n][0] = false
3380
+ @data['내용설정']['내용'] << []
3381
+ @data['내용설정']['내용'].pop
3382
+ end
3383
+ }
3384
+ }
3385
+ button('삭제하기'){
3386
+ top 1
3387
+ left 3
3495
3388
  on_clicked{
3496
3389
  m = Array.new
3497
3390
  for n in 0..@data['내용설정']['내용'].length-1
@@ -3499,13 +3392,14 @@ class Wordpress
3499
3392
  m << n
3500
3393
  end
3501
3394
  end
3502
-
3395
+
3503
3396
  m.reverse.each do |i|
3504
3397
  @data['내용설정']['내용'].delete_at(i)
3505
3398
  end
3506
3399
  @data['내용설정']['내용'].delete(nil)
3507
3400
  }
3508
3401
  }
3402
+ }
3509
3403
  @data['내용설정']['순서사용'] = checkbox('순서사용'){
3510
3404
  stretchy false
3511
3405
  on_toggled{ |c|
@@ -3523,6 +3417,21 @@ class Wordpress
3523
3417
  }
3524
3418
  }
3525
3419
  }
3420
+ vertical_separator{
3421
+ stretchy false
3422
+ }
3423
+ horizontal_box{
3424
+ stretchy false
3425
+ grid{
3426
+ @data['포스트설정']['gpt내용'] = checkbox('내용파일을 이용해 GPT로 글 변형'){
3427
+
3428
+
3429
+ }}}
3430
+ horizontal_box{
3431
+ stretchy false
3432
+ grid{
3433
+ label('※ GPT 기능 사용시 포스트설정1에서 GPT사용에 체크 필수'){
3434
+ } } }
3526
3435
  table{
3527
3436
  checkbox_column('선택'){
3528
3437
  editable true
@@ -3853,248 +3762,298 @@ class Wordpress
3853
3762
  }
3854
3763
 
3855
3764
  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
- }
3765
+ horizontal_box{
3766
+ vertical_box{
3767
+ stretchy false
3768
+ grid{
3769
+ stretchy false
3770
+ @data['포스트설정']['제목키워드변경'] = checkbox('제목에 특정 단어를 내용에 사용할 키워드로 변경'){
3771
+ top 0
3772
+ left 0
4002
3773
 
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
- }
3774
+ }
3775
+ @data['포스트설정']['제목키워드변경단어'] = entry{
3776
+ top 0
3777
+ left 1
3778
+ text '특정단어'
3779
+ }
4014
3780
 
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
- }
3781
+ # @data['포스트설정']['제목단어변경'] = checkbox('제목에 특정 단어를 변경'){
3782
+ # top 1
3783
+ # left 0
3784
+ # }
3785
+ # @data['포스트설정']['제목단어변경파일불러오기'] = button('설정 파일 불러오기'){
3786
+ # top 1
3787
+ # left 1
3788
+ # on_clicked{
3789
+ # file = open_file
3790
+ # if file != nil
3791
+ # file_data = File.open(file, 'r', :encoding => 'utf-8').read()
3792
+ # file_data.split("\n").each do |i|
3793
+ # i2 = i.split('>')
3794
+ # text_key = i2[0].to_s
3795
+ # text_val = i2[1].to_s.split(',')
3796
+ # @data['포스트설정']['제목특정단어변경데이터'][text_key] = text_val
3797
+ # end
3798
+ # end
3799
+ # }
3800
+ # }
3801
+ @data['포스트설정']['제목에키워드삽입'] = checkbox('제목에 키워드 삽입'){
3802
+ top 2
3803
+ left 0
3804
+ #enabled false # 기본적으로 비활성화
3805
+ on_toggled {
3806
+ if @data['포스트설정']['제목에키워드삽입'].checked?
3807
+ @data['포스트설정']['제목앞'].enabled = true # '내용투명' 활성화
3808
+ @data['포스트설정']['제목뒤'].enabled = true # '내용투명' 활성화
3809
+ else
3810
+ @data['포스트설정']['제목앞'].checked = false # 체크 해제
3811
+ @data['포스트설정']['제목앞'].enabled = false # 비활성화
3812
+ @data['포스트설정']['제목뒤'].checked = false # 체크 해제
3813
+ @data['포스트설정']['제목뒤'].enabled = false # 비활성화
3814
+ end
3815
+ }
3816
+
3817
+ }
3818
+ @data['포스트설정']['제목에키워드삽입숫자1'] = entry(){
3819
+ top 2
3820
+ left 1
3821
+ text '최소수량'
3822
+ }
3823
+ label('~'){
3824
+ top 2
3825
+ left 2
3826
+ }
3827
+ @data['포스트설정']['제목에키워드삽입숫자2'] = entry(){
3828
+ top 2
3829
+ left 3
3830
+ text '최대수량'
3831
+ }
3832
+ label('ㄴ'){
3833
+ top 3
3834
+ left 2
3835
+ }
3836
+ @data['포스트설정']['제목앞'] = checkbox('제목에 키워드 삽입 제목 앞'){
3837
+ top 3
3838
+ left 3
3839
+ enabled false # 기본적으로 비활성화
3840
+ on_toggled{
3841
+ if @data['포스트설정']['제목앞'].checked? == true
3842
+ if @data['포스트설정']['제목뒤'].checked?
3843
+ @data['포스트설정']['제목뒤'].checked = false
3844
+ end
3845
+ end
3846
+ }
3847
+ }
3848
+ label('ㄴ'){
3849
+ top 4
3850
+ left 2
3851
+ }
3852
+ @data['포스트설정']['제목뒤'] = checkbox('제목에 키워드 삽입 제목 뒤'){
3853
+ top 4
3854
+ left 3
3855
+ enabled false # 기본적으로 비활성화
3856
+ on_toggled{
3857
+ if @data['포스트설정']['제목뒤'].checked? == true
3858
+ if @data['포스트설정']['제목앞'].checked?
3859
+ @data['포스트설정']['제목앞'].checked = false
3860
+ end
3861
+ end
3862
+ }
3863
+ }
3864
+
3865
+ @data['포스트설정']['특수문자'] = checkbox('제목에 키워드 삽입 시 특수문자 삽입'){
3866
+ top 4
3867
+ left 0
3868
+ }
3869
+ @data['포스트설정']['제목을랜덤'] = checkbox('제목을 랜덤 단어 조합으로 자동 입력'){
3870
+ top 5
3871
+ left 0
3872
+ on_toggled{
3873
+ if @data['포스트설정']['제목을랜덤'].checked? == true
3874
+ if @data['포스트설정']['제목내용설정'].checked?
3875
+ @data['포스트설정']['제목내용설정'].checked = false
3876
+ end
3877
+ end
3878
+ }
3879
+ }
3880
+ @data['포스트설정']['제목내용설정'] = checkbox('내용의 첫 문장을 제목으로 설정'){
3881
+ top 6
3882
+ left 0
3883
+ on_toggled{
3884
+ if @data['포스트설정']['제목내용설정'].checked? == true
3885
+ if @data['포스트설정']['제목을랜덤'].checked?
3886
+ @data['포스트설정']['제목을랜덤'].checked = false
3887
+ end
3888
+ end
3889
+ }
3890
+ }
3891
+ @data['포스트설정']['내용키워드삽입'] = checkbox('내용 키워드 삽입'){
3892
+ top 7
3893
+ left 0
3894
+ on_toggled {
3895
+ if @data['포스트설정']['내용키워드삽입'].checked?
3896
+ @data['포스트설정']['키워드삽입'].enabled = true # '내용투명' 활성화
3897
+ @data['포스트설정']['키워드삽입시링크'].enabled = true # '내용투명' 활성화
3898
+ else
3899
+ @data['포스트설정']['키워드삽입'].checked = false # 체크 해제
3900
+ @data['포스트설정']['키워드삽입'].enabled = false # 비활성화
3901
+ @data['포스트설정']['키워드삽입시링크'].text = 'URL' # 기본 텍스트 설정
3902
+ @data['포스트설정']['키워드삽입시링크'].enabled = false # 비활성화
3903
+ end
3904
+ }
3905
+ }
3906
+ @data['포스트설정']['키워드삽입시작숫자'] = entry(){
3907
+ top 7
3908
+ left 1
3909
+
3910
+ text '최소수량'
3911
+ }
3912
+ label('~'){
3913
+ top 7
3914
+ left 2
3915
+ }
3916
+ @data['포스트설정']['키워드삽입끝숫자'] = entry(){
3917
+ top 7
3918
+ left 3
3919
+ text '최대수량'
3920
+ }
3921
+ @data['포스트설정']['키워드삽입'] = checkbox('내용 키워드 삽입시 링크 삽입'){
3922
+ enabled false # 기본적으로 비활성화
3923
+ top 8
3924
+ left 0
3925
+
3926
+ }
3927
+ @data['포스트설정']['키워드삽입시링크'] = entry(){
3928
+ enabled false # 기본적으로 비활성화
3929
+ top 8
3930
+ left 1
3931
+ text 'URL'
3932
+ }
3933
+ @data['포스트설정']['내용을자동생성'] = checkbox('키워드기반 생성으로만 등록(GPT 미 사용시 자체 생성)'){
3934
+ top 9
3935
+ left 0
3936
+ on_toggled{
3937
+ if @data['포스트설정']['내용을자동생성'].checked?
3938
+ @data['포스트설정']['내용과자동생성'].checked = false
3939
+ @data['포스트설정']['내용투명'].checked = false
3940
+ @data['포스트설정']['자동글 수식에 입력'].checked = false
3941
+
3942
+ end
3943
+ }
3944
+ }
4026
3945
 
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
- }
3946
+
3947
+ aa1 = 2
3948
+ @data['포스트설정']['내용과자동생성'] = checkbox('내용파일+키워드기반 생성 등록(GPT 미 사용시 자체 생성)') {
3949
+ top 10 + aa1
3950
+ left 0
3951
+ on_toggled {
3952
+ if @data['포스트설정']['내용과자동생성'].checked?
3953
+ @data['포스트설정']['내용을자동생성'].checked = false
3954
+ @data['포스트설정']['내용투명'].enabled = true # '내용투명' 활성화
3955
+ @data['포스트설정']['자동글 수식에 입력'].enabled = true # '내용투명' 활성화
3956
+ else
3957
+ @data['포스트설정']['내용투명'].checked = false # 체크 해제
3958
+ @data['포스트설정']['내용투명'].enabled = false # 비활성화
3959
+ @data['포스트설정']['자동글 수식에 입력'].checked = false # 체크 해제
3960
+ @data['포스트설정']['자동글 수식에 입력'].enabled = false # 비활성화
3961
+ end
3962
+ }
3963
+ }
3964
+
3965
+ @data['포스트설정']['내용투명'] = checkbox('키워드 기반 자동 생성글 안보이게 처리') {
3966
+ top 11 + aa1
3967
+ left 0
3968
+ enabled false # 기본적으로 비활성화
3969
+ on_toggled {
3970
+ if @data['포스트설정']['내용투명'].checked?
3971
+ @data['포스트설정']['내용을자동생성'].checked = false
3972
+ @data['포스트설정']['자동글 수식에 입력'].checked = false
3973
+ end
3974
+ }
3975
+ }
3976
+ @data['포스트설정']['내용자동변경'] = checkbox('내용에 단어들을 자동 변경'){
3977
+ top 12+ aa1
3978
+ left 0
3979
+ }
3980
+ button('설정 파일 불러오기'){
3981
+ top 12+ aa1
3982
+ left 1
3983
+ on_clicked{
3984
+ file = open_file
3985
+ if file != nil
3986
+ file_data = File.open(file, 'r', :encoding => 'utf-8').read()
3987
+ file_data.split("\n").each do |i|
3988
+ key = i.split('>')[0]
3989
+ v = i.split('>')[1].to_s.split(',')
3990
+ @data['포스트설정']['내용자동변경값'][key] = v
3991
+ end
3992
+ end
3993
+ }
3994
+ }
3995
+ @data['포스트설정']['제목에도적용'] = checkbox('제목에도 적용'){
3996
+ top 12+ aa1
3997
+ left 3
3998
+ }
4066
3999
 
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
- }
4000
+ @data['포스트설정']['내용사진자동삽입'] = checkbox('내용 사진 자동 삽입'){
4001
+ top 13+ aa1
4002
+ left 0
4003
+ #enabled false # 기본적으로 비활성화
4004
+ on_toggled {
4005
+ if @data['포스트설정']['내용사진자동삽입'].checked?
4006
+ @data['포스트설정']['내용사진링크'].enabled = true # '내용투명' 활성화
4007
+ @data['포스트설정']['내용사진링크값'].enabled = true # '내용투명' 활성화
4008
+ else
4009
+ @data['포스트설정']['내용사진링크'].checked = false # 체크 해제
4010
+ @data['포스트설정']['내용사진링크'].enabled = false # 비활성화
4011
+ @data['포스트설정']['내용사진링크값'].text = 'URL' # 기본 텍스트 설정
4012
+ @data['포스트설정']['내용사진링크값'].enabled = false # 비활성화
4013
+ end
4014
+ }
4015
+ }
4016
+ @data['포스트설정']['내용사진자동삽입시작숫자'] = entry(){
4017
+ top 13+ aa1
4018
+ left 1
4019
+ text '최소수량'
4020
+ }
4021
+ label('~'){
4022
+ top 13+ aa1
4023
+ left 2
4024
+ }
4025
+ @data['포스트설정']['내용사진자동삽입끝숫자'] = entry(){
4026
+ top 13+ aa1
4027
+ left 3
4028
+ text '최대수량'
4029
+ }
4085
4030
 
4086
- @data['포스트설정']['내용사진링크'] = checkbox('내용 사진 자동 삽입시 링크 삽입'){
4087
- top 14+ aa1
4088
- left 0
4089
- }
4031
+ @data['포스트설정']['내용사진링크'] = checkbox('내용 사진 자동 삽입시 링크 삽입'){
4032
+ enabled false # 기본적으로 비활성화
4033
+ top 14+ aa1
4034
+ left 0
4035
+ }
4090
4036
 
4091
- @data['포스트설정']['내용사진링크값'] = entry(){
4092
- top 14+ aa1
4093
- left 1
4094
- text 'URL'
4095
- }
4096
- }
4037
+ @data['포스트설정']['내용사진링크값'] = entry(){
4038
+ enabled false # 기본적으로 비활성화
4039
+ top 14+ aa1
4040
+ left 1
4041
+ text 'URL'
4042
+ }
4043
+
4044
+ @data['포스트설정']['ChatGPT사용'] = checkbox('Chat GPT 사용하기'){
4045
+ top 15+ aa1
4046
+ left 0
4097
4047
  }
4048
+
4049
+ @data['포스트설정']['api_key'] = entry(){
4050
+ top 15+ aa1
4051
+ left 1
4052
+ text 'api key 입력 필수!!'
4053
+ }
4054
+
4055
+ }
4056
+ }
4098
4057
 
4099
4058
  vertical_separator{
4100
4059
  stretchy false
@@ -4306,6 +4265,20 @@ class Wordpress
4306
4265
  @data['포스트설정']['막글삽입'] = checkbox('내용 하단에 막글 삽입'){
4307
4266
  top 6
4308
4267
  left 0
4268
+ on_toggled {
4269
+ if @data['포스트설정']['막글삽입'].checked?
4270
+ @data['포스트설정']['막글투명'].enabled = true # '내용투명' 활성화
4271
+ @data['포스트설정']['막글그대로'].enabled = true # '내용투명' 활성화
4272
+
4273
+
4274
+ else
4275
+ @data['포스트설정']['막글투명'].checked = false # 체크 해제
4276
+ @data['포스트설정']['막글투명'].enabled = false # 비활성화
4277
+ @data['포스트설정']['막글그대로'].checked = false # 체크 해제
4278
+ @data['포스트설정']['막글그대로'].enabled = false # 비활성화
4279
+
4280
+ end
4281
+ }
4309
4282
  }
4310
4283
  @data['포스트설정']['막글삽입시작숫자'] = entry{
4311
4284
  top 6
@@ -4335,10 +4308,12 @@ class Wordpress
4335
4308
  @data['포스트설정']['막글투명'] = checkbox('막글 안보이게 처리'){
4336
4309
  top 7
4337
4310
  left 0
4311
+ enabled false
4338
4312
  }
4339
4313
  @data['포스트설정']['막글그대로'] = checkbox('막글 그대로 입력'){
4340
4314
  top 7
4341
4315
  left 1
4316
+ enabled false
4342
4317
  }
4343
4318
 
4344
4319
  @data['포스트설정']['태그삽입1'] = checkbox('태그삽입'){
@@ -4459,6 +4434,7 @@ class Wordpress
4459
4434
  }
4460
4435
  }
4461
4436
 
4437
+
4462
4438
 
4463
4439
 
4464
4440
  horizontal_box{