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.
- checksums.yaml +4 -4
- data/lib/tblog_duopack.rb +948 -972
- metadata +2 -2
data/lib/tblog_duopack.rb
CHANGED
@@ -1,32 +1,4 @@
|
|
1
|
-
|
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+" 소개하는 글을
|
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+" 관련된 글을
|
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
|
111
|
-
def initialize
|
112
|
-
@
|
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
|
-
|
145
|
-
|
146
|
-
|
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
|
-
|
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')
|
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
|
-
|
205
|
-
|
206
|
-
|
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
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
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
|
280
|
+
def login(user_id, user_pw, proxy, captcha_api_key)
|
220
281
|
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
|
-
####################탭나누기 수정중######################################
|
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
|
-
|
295
|
-
|
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 =
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
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
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
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 =
|
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
|
-
|
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
|
-
|
471
|
+
|
452
472
|
@driver.switch_to.alert.dismiss
|
453
473
|
rescue
|
454
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
1138
|
+
|
1185
1139
|
@driver.find_element(:xpath, '//*[@id="open20"]').click
|
1140
|
+
sleep(2)
|
1186
1141
|
rescue
|
1187
1142
|
end
|
1188
1143
|
end
|
1189
|
-
|
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
|
-
|
1154
|
+
|
1200
1155
|
|
1201
1156
|
if option['댓글허용'] == 'false'
|
1202
1157
|
puts '-[√] 댓글허용 선택.......'.yellow
|
1203
1158
|
begin
|
1204
|
-
|
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
|
-
|
1226
|
-
|
1227
|
-
|
1228
|
-
|
1229
|
-
|
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
|
-
|
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
|
1212
|
+
# 포스트 등록 완료를 확인할 수 있는 요소(예: 등록 후 확인 페이지로 이동)
|
1213
|
+
wait.until { @driver.find_element(:xpath, '//*[@class="post_cont"]') }
|
1214
|
+
puts '-[√] 포스트 등록 완료.......'.yellow
|
1269
1215
|
rescue
|
1270
|
-
|
1271
|
-
|
1272
|
-
|
1273
|
-
|
1274
|
-
|
1275
|
-
|
1276
|
-
|
1277
|
-
|
1278
|
-
|
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
|
-
|
1297
|
-
|
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,
|
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
|
-
@
|
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
|
-
|
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
|
-
|
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'],
|
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
|
-
|
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
|
3179
|
-
@data['table'] << [false, @data['site_id_input'].text, @data['site_pw_input'].text,@data['게시판url'].text,@data['category'].text, @data['proxy'].text
|
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,
|
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
|
-
|
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
|
-
|
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
|
-
|
3289
|
-
@data['table'][n][
|
3290
|
-
@data['table'][n][
|
3291
|
-
@data['table'][n][
|
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
|
-
|
3387
|
-
|
3388
|
-
|
3389
|
-
|
3390
|
-
|
3391
|
-
|
3392
|
-
|
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
|
-
|
3395
|
-
|
3396
|
-
|
3397
|
-
|
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
|
-
|
3406
|
-
|
3407
|
-
|
3408
|
-
|
3409
|
-
|
3410
|
-
|
3411
|
-
|
3412
|
-
|
3413
|
-
|
3414
|
-
|
3415
|
-
|
3416
|
-
|
3417
|
-
|
3418
|
-
|
3419
|
-
|
3420
|
-
|
3421
|
-
|
3422
|
-
|
3423
|
-
|
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
|
-
|
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
|
-
}
|
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
|
-
|
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
|
-
}
|
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
|
-
|
4004
|
-
|
4005
|
-
|
4006
|
-
|
4007
|
-
|
4008
|
-
|
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
|
-
|
4016
|
-
|
4017
|
-
|
4018
|
-
|
4019
|
-
|
4020
|
-
|
4021
|
-
|
4022
|
-
|
4023
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
4068
|
-
|
4069
|
-
|
4070
|
-
|
4071
|
-
|
4072
|
-
|
4073
|
-
|
4074
|
-
|
4075
|
-
|
4076
|
-
|
4077
|
-
|
4078
|
-
|
4079
|
-
|
4080
|
-
|
4081
|
-
|
4082
|
-
|
4083
|
-
|
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
|
-
|
4087
|
-
|
4088
|
-
|
4089
|
-
|
4031
|
+
@data['포스트설정']['내용사진링크'] = checkbox('내용 사진 자동 삽입시 링크 삽입'){
|
4032
|
+
enabled false # 기본적으로 비활성화
|
4033
|
+
top 14+ aa1
|
4034
|
+
left 0
|
4035
|
+
}
|
4090
4036
|
|
4091
|
-
|
4092
|
-
|
4093
|
-
|
4094
|
-
|
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{
|