cafe_basics 0.1.39 → 0.1.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/cafe_basics.rb +141 -62
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4b7d3f7b0073073b27e6cc35d4f42bd3c92d134e6c0d1f2f0c86479f22ee3eb6
4
- data.tar.gz: 67833a88ebecd09acf24879cb4cacfbda0870fa422f624815c2388279fbef316
3
+ metadata.gz: 664038efea4ab22edff62d90296fa46a585afdbcdcddf25c0f583d74d0949299
4
+ data.tar.gz: 501f147f6085475e49942e6a1e489dfd9f13d5d203d23444567abb34cd1a6fa9
5
5
  SHA512:
6
- metadata.gz: 7bda928e68fdab7f7a224fea59d791d1cea8033cd2f297e8f56c332d697d4345776a5560e2245713e8cc5fe4a49895fddaeb22bc77c7da36923a5355fcef2da3
7
- data.tar.gz: df5c31c0c0b68ad9ff3e0096103d0ab7ddc2c8c643e5c7c2f05cc4f1db284565ce4274edb39c5f539058aa067736adcd92ccc4df8ecd933f898db4dd34ac76d3
6
+ metadata.gz: 39cd755984562579ee0f6e9cc1c826a0409afca6fb7495e4a7e8567c145b7f9e5f64b2219723bb8c99682f8aaafd92b912bedd65b01cc712e99a2fb95e06a709
7
+ data.tar.gz: 77a54824410ae82c383794eafa81002ed7aedb5d474b6df33eb05f25b138506938f6b7f4a03f475552502051ce38d8cc68d83d3841a6fe2e357f3217f15c3bdd
data/lib/cafe_basics.rb CHANGED
@@ -18,19 +18,21 @@ require 'digest'
18
18
  require 'auto_click'
19
19
  require 'rainbow/refinement'
20
20
  require 'httpclient'
21
- require 'win32ole'
21
+ #require 'win32ole'
22
22
  include AutoClickMethods
23
23
  using Rainbow
24
24
  include Glimmer
25
25
 
26
+
26
27
  class Chat
27
- def initialize(api_key, gpt_keyword_prompt)
28
+ def initialize(api_key, gpt_keyword_prompt, model)
28
29
  @api_key = api_key
29
30
  @gpt_keyword_prompt = gpt_keyword_prompt
31
+ @model = model # 모델을 인자로 받도록 수정
30
32
  end
31
33
 
32
34
  def message(keyword)
33
- puts 'Sending request to GPT...(키워드 기반 글 생성 중...)'
35
+ puts 'Sending request to GPT...(키워드 기반 글 생성 중...)'.cyan
34
36
 
35
37
  # "키워드 기반 글 생성 중..." 메시지 출력 스레드
36
38
  thread = Thread.new do
@@ -54,7 +56,7 @@ class Chat
54
56
 
55
57
  # 요청 데이터 설정
56
58
  data = {
57
- 'model' => 'gpt-4',
59
+ 'model' => @model,
58
60
  'messages' => [
59
61
  {
60
62
  "role" => "assistant",
@@ -64,9 +66,10 @@ class Chat
64
66
  'max_tokens' => max_response_tokens # 최대 응답 토큰 설정
65
67
  }
66
68
 
67
-
68
-
69
69
  answer = ''
70
+ retry_count = 0
71
+ max_retries = 5 # 최대 재시도 횟수
72
+
70
73
  begin
71
74
  req = HTTP.headers(headers).post(url, :json => data)
72
75
 
@@ -77,7 +80,6 @@ class Chat
77
80
 
78
81
  # 응답 내용 출력 (디버깅용)
79
82
  response = JSON.parse(req.to_s)
80
-
81
83
 
82
84
  # 응답 데이터에서 안전하게 값 추출
83
85
  if response['choices'] && response['choices'][0] && response['choices'][0]['message']
@@ -88,14 +90,21 @@ class Chat
88
90
  rescue => e
89
91
  # 오류 메시지 출력
90
92
  puts "Error occurred: #{e.message}"
91
- answer = "오류가 발생했습니다."
93
+ if e.message.include?('502') && retry_count < max_retries
94
+ retry_count += 1
95
+ puts "Retrying... Attempt ##{retry_count}"
96
+ sleep(5) # 잠시 대기 후 재시도
97
+ retry
98
+ else
99
+ answer = "오류가 발생했습니다."
100
+ end
92
101
  end
93
102
 
94
103
  # "생성 중..." 메시지 출력 종료
95
104
  thread.kill
96
105
 
97
106
  # 결과 로그 출력
98
- puts "Final API response ==> #{answer}"
107
+ puts "Final API response ==> #{answer}".cyan
99
108
  return answer
100
109
  end
101
110
 
@@ -108,16 +117,16 @@ end
108
117
 
109
118
 
110
119
 
111
-
112
-
113
120
  class Chat_title
114
- def initialize(api_key, gpt_title_prompt)
121
+ def initialize(api_key, gpt_title_prompt, model)
115
122
  @api_key = api_key
116
123
  @gpt_title_prompt = gpt_title_prompt
124
+ @model = model # 모델을 인자로 받도록 수정
117
125
  end
118
126
 
119
127
  def message(title)
120
- puts 'Sending request to GPT...(제목 생성 중...)'
128
+ puts 'Sending request to GPT...(제목 생성 중...)'.cyan
129
+
121
130
  # "키워드 기반 글 생성 중..." 메시지를 별도 스레드로 처리
122
131
  thread = Thread.new do
123
132
  while true
@@ -125,13 +134,15 @@ class Chat_title
125
134
  sleep(3)
126
135
  end
127
136
  end
137
+
128
138
  url = 'https://api.openai.com/v1/chat/completions'
129
139
  headers = {
130
140
  'Content-Type' => 'application/json',
131
141
  'Authorization' => 'Bearer ' + @api_key
132
142
  }
143
+
133
144
  data = {
134
- 'model' => 'gpt-4',
145
+ 'model' => @model,
135
146
  'messages' => [{
136
147
  "role" => "system",
137
148
  "content" => "너는 매우 친절하고 성의 있게 답변하는 AI 어시스턴트야."
@@ -142,11 +153,14 @@ class Chat_title
142
153
  }]
143
154
  }
144
155
 
156
+ answer = ''
157
+ retry_count = 0
158
+ max_retries = 5 # 최대 재시도 횟수
159
+
145
160
  begin
146
161
  req = HTTP.headers(headers).post(url, json: data)
147
162
 
148
163
  response = JSON.parse(req.body.to_s)
149
-
150
164
 
151
165
  if req.status == 429
152
166
  return "API 요청 제한을 초과했습니다. 플랜 및 할당량을 확인하세요."
@@ -161,28 +175,37 @@ class Chat_title
161
175
  answer ||= title # 응답이 없을 경우 기본 메시지 설정
162
176
  rescue => e
163
177
  puts "Error: #{e.message}"
164
- answer = "오류가 발생했습니다."
178
+ if e.message.include?('502') && retry_count < max_retries
179
+ retry_count += 1
180
+ puts "Retrying... Attempt ##{retry_count}"
181
+ sleep(5) # 잠시 대기 후 재시도
182
+ retry
183
+ else
184
+ answer = "오류가 발생했습니다."
185
+ end
165
186
  end
166
187
 
167
188
  # "생성 중..." 메시지 출력 종료
168
189
  thread.kill
169
190
 
170
- puts 'API return ==> '
171
- puts answer
191
+ puts 'API return ==> '.cyan
192
+ puts answer.cyan
172
193
  answer
173
194
  end
174
195
  end
175
196
 
176
197
 
177
198
  class Chat_content
178
- def initialize(api_key, gpt_content_prompt)
199
+ def initialize(api_key, gpt_content_prompt, model)
179
200
  @api_key = api_key
180
201
  @gpt_content_prompt = gpt_content_prompt
202
+ @model = model # 모델을 인자로 받도록 수정
181
203
  end
182
204
 
183
205
  def message(content)
184
- puts '주의:GPT 특성상 원고 길이가 공백 포함 4천자를 넘기면 오류가 발생할 수 있습니다.'
185
- puts 'Sending request to GPT...(내용 변형 중...)'
206
+ puts '주의:GPT 특성상 원고 길이가 공백 포함 4천자를 넘기면 오류가 발생할 수 있습니다.'.cyan
207
+ puts 'Sending request to GPT...(내용 변형 중...)'.cyan
208
+
186
209
  # "키워드 기반 글 생성 중..." 메시지를 별도 스레드로 처리
187
210
  thread = Thread.new do
188
211
  while true
@@ -190,14 +213,15 @@ class Chat_content
190
213
  sleep(3)
191
214
  end
192
215
  end
193
-
216
+
194
217
  url = 'https://api.openai.com/v1/chat/completions'
195
218
  headers = {
196
219
  'Content-Type' => 'application/json',
197
220
  'Authorization' => 'Bearer ' + @api_key
198
221
  }
222
+
199
223
  data = {
200
- 'model' => 'gpt-4',
224
+ 'model' => @model,
201
225
  'messages' => [{
202
226
  "role" => "system",
203
227
  "content" => "너는 매우 친절하고 성의 있게 답변하는 AI 어시스턴트야."
@@ -205,16 +229,18 @@ class Chat_content
205
229
  {
206
230
  "role" => "user",
207
231
  "content" => "#{@gpt_content_prompt}\n#{content}"
208
-
209
232
  }]
210
233
  }
211
234
 
235
+ answer = ''
236
+ retry_count = 0
237
+ max_retries = 5 # 최대 재시도 횟수
238
+
212
239
  begin
213
240
  req = HTTP.headers(headers).post(url, json: data)
214
241
 
215
242
  response = JSON.parse(req.body.to_s)
216
-
217
-
243
+
218
244
  if req.status == 429
219
245
  return "API 요청 제한을 초과했습니다. 플랜 및 할당량을 확인하세요."
220
246
  end
@@ -224,14 +250,21 @@ class Chat_content
224
250
  answer ||= (content) # 응답이 없을 경우 기본 메시지 설정
225
251
  rescue => e
226
252
  puts "Error: #{e.message}"
227
- answer = "오류가 발생했습니다."
253
+ if e.message.include?('502') && retry_count < max_retries
254
+ retry_count += 1
255
+ puts "Retrying... Attempt ##{retry_count}"
256
+ sleep(5) # 잠시 대기 후 재시도
257
+ retry
258
+ else
259
+ answer = "오류가 발생했습니다."
260
+ end
228
261
  end
229
262
 
230
263
  # "생성 중..." 메시지 출력 종료
231
264
  thread.kill
232
265
 
233
- puts 'API return ==> '
234
- puts answer
266
+ puts 'API return ==> '.cyan
267
+ puts answer.cyan
235
268
  answer
236
269
  end
237
270
  end
@@ -243,37 +276,37 @@ end
243
276
  class Naver
244
277
  def initialize
245
278
  @seed = 1
246
- kill_selenium_chrome #기존 창 모두 닫는 명령
247
- sleep(1)
279
+ #kill_selenium_chrome #기존 창 모두 닫는 명령
280
+ #sleep(1)
248
281
  end
249
282
 
250
- def kill_selenium_chrome #기존 창 모두 닫는 코드
251
- wmi = WIN32OLE.connect("winmgmts://")
252
- chrome_procs = wmi.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'chrome.exe'")
283
+ #def kill_selenium_chrome #기존 창 모두 닫는 코드
284
+ # wmi = WIN32OLE.connect("winmgmts://")
285
+ # chrome_procs = wmi.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'chrome.exe'")
253
286
 
254
- chrome_procs.each do |proc|
255
- cmd = proc.CommandLine
256
- if cmd && cmd.include?("user-data-dir=C:/naver_cookie")
257
- puts "→ 크롬 창 초기화: PID #{proc.ProcessId}"
258
- begin
259
- proc.Terminate
260
- rescue
287
+ # chrome_procs.each do |proc|
288
+ # cmd = proc.CommandLine
289
+ # if cmd && cmd.include?("user-data-dir=C:/naver_cookie")
290
+ # puts "→ 크롬 창 초기화: PID #{proc.ProcessId}"
291
+ # begin
292
+ # proc.Terminate
293
+ # rescue
261
294
  #puts "→ 이미 종료된 프로세스: #{proc.ProcessId}"
262
- end
263
- end
264
- end
295
+ # end
296
+ # end
297
+ # end
265
298
 
266
299
  # chromedriver도 같이 종료
267
- chromedrivers = wmi.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'chromedriver.exe'")
268
- chromedrivers.each do |proc|
269
- puts "→ 크롬 창 초기화: PID #{proc.ProcessId}"
270
- begin
271
- proc.Terminate
272
- rescue
300
+ # chromedrivers = wmi.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'chromedriver.exe'")
301
+ # chromedrivers.each do |proc|
302
+ # puts "→ 크롬 창 초기화: PID #{proc.ProcessId}"
303
+ # begin
304
+ # proc.Terminate
305
+ # rescue
273
306
  #puts "→ 이미 종료된 chromedriver: #{proc.ProcessId}"
274
- end
275
- end
276
- end
307
+ # end
308
+ # end
309
+ #end
277
310
 
278
311
 
279
312
  def chrome_setup(user_id, proxy)
@@ -2498,6 +2531,19 @@ class Wordpress
2498
2531
  end
2499
2532
  end
2500
2533
 
2534
+ if @data['포스트설정']['gpt35'].checked? || @data['포스트설정']['gpt4turbo'].checked? || @data['포스트설정']['gpt4'].checked?
2535
+ gpt_model = if @data['포스트설정']['gpt35'].checked?
2536
+ 'gpt-3.5-turbo'
2537
+ elsif @data['포스트설정']['gpt4turbo'].checked?
2538
+ 'gpt-4-turbo'
2539
+ elsif @data['포스트설정']['gpt4'].checked?
2540
+ 'gpt-4'
2541
+ end
2542
+ puts "선택 된 GPT model: #{gpt_model}".green
2543
+ else
2544
+
2545
+ end
2546
+
2501
2547
  if @data['포스트설정']['gpt제목'].checked?
2502
2548
  gpt_title_prompt = @data['포스트설정']['gpt제목_프롬프트'].text.to_s.force_encoding('utf-8')
2503
2549
 
@@ -2505,7 +2551,7 @@ class Wordpress
2505
2551
  gpt_title_prompt_sample = gpt_title_prompt.strip.empty? ? "프롬프트: 문장을 비슷한 길이로 ChatGPT의 멘트는 빼고 표현을 더 추가해서 하나만 만들어줘." : gpt_title_prompt
2506
2552
 
2507
2553
  # gpt_title_prompt_sample을 Chat_title 객체에 전달
2508
- chat = Chat_title.new(@data['포스트설정']['api_key'].text.to_s.force_encoding('utf-8'), gpt_title_prompt_sample)
2554
+ chat = Chat_title.new(@data['포스트설정']['api_key'].text.to_s.force_encoding('utf-8'), gpt_title_prompt_sample, gpt_model)
2509
2555
 
2510
2556
  # 메시지 요청 후 title에 저장
2511
2557
  gpt_text1 = chat.message(title)
@@ -2559,7 +2605,7 @@ class Wordpress
2559
2605
  gpt_content_prompt_sample = gpt_content_prompt.strip.empty? ? "프롬프트:ChatGPT의 멘트는 빼고 위 전체적인 내용의 형식을 똑같이 표현을 더 추가하고 유사어로 변경하여 하나 만들어줘! 전화번호,연락처,가격,홈페이지안내 ,상담안내 관련 문구는 유지해야해" : gpt_content_prompt
2560
2606
 
2561
2607
  # Chat_content 객체 생성 시 api_key와 gpt_content_prompt_sample을 두 개의 인자로 전달
2562
- chat = Chat_content.new(api_key, gpt_content_prompt_sample)
2608
+ chat = Chat_content.new(api_key, gpt_content_prompt_sample, gpt_model)
2563
2609
 
2564
2610
  # 메시지 요청 후 content에 저장
2565
2611
  gpt_text3 = chat.message(content)
@@ -2707,7 +2753,7 @@ class Wordpress
2707
2753
  if @data['포스트설정']['gpt키워드'].checked?
2708
2754
  gpt_keyword_prompt = @data['포스트설정']['gpt키워드_프롬프트'].text.to_s.force_encoding('utf-8')
2709
2755
  gpt_keyword_prompt_sample = gpt_keyword_prompt.strip.empty? ? "프롬프트: 관련된 글을 1500자에서 2500자 사이로 만들어줘" : gpt_keyword_prompt
2710
- chat = Chat.new(@data['포스트설정']['api_key'].text.to_s.force_encoding('utf-8'), gpt_keyword_prompt)
2756
+ chat = Chat.new(@data['포스트설정']['api_key'].text.to_s.force_encoding('utf-8'), gpt_keyword_prompt, gpt_model)
2711
2757
  gpt_text = chat.message(keyword)
2712
2758
  #content = content.to_s + "\n(자동생성글)\n" + gpt_text.to_s
2713
2759
  content = content.to_s + "(자동생성글)" + gpt_text.to_s
@@ -5033,17 +5079,49 @@ class Wordpress
5033
5079
  top 15+ aa1
5034
5080
  left 0
5035
5081
  }
5036
-
5037
- @data['포스트설정']['ChatGPT사용'] = checkbox('Chat GPT 사용하기'){
5038
- top 16+ aa1
5082
+ }
5083
+ grid{
5084
+ stretchy false
5085
+ @data['포스트설정']['ChatGPT사용'] = checkbox('Chat GPT 사용하기             '){
5086
+ top 1
5039
5087
  left 0
5040
5088
  }
5041
-
5089
+
5042
5090
  @data['포스트설정']['api_key'] = entry(){
5043
- top 16+ aa1
5091
+ top 1
5044
5092
  left 1
5045
- text 'api key 입력 필수!!'
5093
+ text 'api key 입력'
5094
+ }
5095
+ @data['포스트설정']['gpt35'] = checkbox('GPT 3.5-turbo'){
5096
+ top 1
5097
+ left 2
5098
+ on_toggled {
5099
+ if @data['포스트설정']['gpt35'].checked?
5100
+ @data['포스트설정']['gpt4'].checked = false
5101
+ @data['포스트설정']['gpt4turbo'].checked = false
5102
+ end
5103
+ }
5046
5104
  }
5105
+ @data['포스트설정']['gpt4'] = checkbox('GPT 4'){
5106
+ top 1
5107
+ left 3
5108
+ on_toggled {
5109
+ if @data['포스트설정']['gpt4'].checked?
5110
+ @data['포스트설정']['gpt35'].checked = false
5111
+ @data['포스트설정']['gpt4turbo'].checked = false
5112
+ end
5113
+ }
5114
+ }
5115
+ @data['포스트설정']['gpt4turbo'] = checkbox('GPT 4-turbo'){
5116
+ top 1
5117
+ left 4
5118
+ on_toggled {
5119
+ if @data['포스트설정']['gpt4turbo'].checked?
5120
+ @data['포스트설정']['gpt35'].checked = false
5121
+ @data['포스트설정']['gpt4'].checked = false
5122
+ end
5123
+ }
5124
+ }
5047
5125
  }
5048
5126
  }
5049
5127
 
@@ -5555,6 +5633,7 @@ class Wordpress
5555
5633
  @data['포스트설정']['CCL사용'].checked = false
5556
5634
  @data['포스트설정']['인용구랜덤'].checked = true
5557
5635
  @data['이미지설정']['글자순서'].checked = true
5636
+ @data['포스트설정']['gpt35'].checked = true
5558
5637
  }.show
5559
5638
  end
5560
5639
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cafe_basics
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.39
4
+ version: 0.1.51
5
5
  platform: ruby
6
6
  authors:
7
7
  - zon
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-05-29 00:00:00.000000000 Z
10
+ date: 2025-06-25 00:00:00.000000000 Z
11
11
  dependencies: []
12
12
  description: File to Clipboard gem
13
13
  email: mymin26@naver.com