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