cafe_buy_duo 0.1.50 → 0.1.52

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_buy_duo.rb +302 -149
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d175759283e10e853b8e01ff3ffa18a94e0d4c286453b632c9f9f1f28885c43a
4
- data.tar.gz: a573fa72410379015539a55e60b3d9781f80725a3db17229bc531f536e39a7a0
3
+ metadata.gz: bb6262162997d15877bbefc16791064e678caa15cba1fe4502669f9e1a4b58c2
4
+ data.tar.gz: ae6f20b8fa94e6704f2e596749019afa47297e4757105ee55f07586c4f441609
5
5
  SHA512:
6
- metadata.gz: ca9040c713f82d0c6e7fc208beadc54b9f0493be064d179967817cc4a864be13ca06bfa5a764f4dbf2b6a9cc45a620abd413ff711f20006707e9712b1a35c5bc
7
- data.tar.gz: bc0589789af52270236a856c7319f4b701a7232a4033436b53975b9f5886afc39135bc09eb7f2b66f40c07041bd963779e39b2ac7ba52148e99da0b98cb219ca
6
+ metadata.gz: 4a07c7159f00755c9721322c8a4a0315717e4b4dce78d1ef5bf2960a5055c940fd33322b9a1bf04acc6e46f7e29500c8bfd485aa2439982ca8647db2bb95c4c7
7
+ data.tar.gz: e73ef5468ac924cdeae86cc0263c1e2b99b15925dddcbeab5ca60ebaf3f684c003bb50fa67a575385c777ee1d11658b4f123e561aa405a79a235adcd89ab5b6c
data/lib/cafe_buy_duo.rb CHANGED
@@ -23,14 +23,16 @@ 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
@@ -2401,84 +2434,112 @@ class Wordpress
2401
2434
 
2402
2435
 
2403
2436
 
2437
+ def crop_image_height_under_width(path, min_crop_ratio = 0.625)
2438
+ img = Magick::Image.read(path).first
2439
+ width = img.columns
2440
+ height = img.rows
2441
+
2442
+
2443
+
2444
+ if height > width
2445
+ min_height = (width * min_crop_ratio).to_i
2446
+ new_height = rand(min_height..width)
2447
+ crop_top = ((height - new_height) / 2.0).round
2448
+
2449
+ cropped = img.crop(0, crop_top, width, new_height, true)
2450
+ cropped.write(path)
2451
+
2452
+
2453
+ else
2454
+
2455
+ end
2456
+ end
2457
+
2404
2458
  def auto_image(keyword = nil)
2405
- keyword ||= @keyword
2406
- puts "키워드: #{keyword}"
2407
-
2408
- client = HTTPClient.new
2409
- client.default_header = {
2410
- 'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '\
2411
- '(KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36',
2412
- 'Accept' => 'application/json, text/javascript, */*; q=0.01',
2413
- 'Accept-Language' => 'en-US,en;q=0.9',
2414
- 'Referer' => "https://unsplash.com/s/photos/#{URI.encode_www_form_component(keyword)}",
2415
- 'X-Requested-With' => 'XMLHttpRequest'
2416
- }
2459
+ # auto_image 내부에서만 crop 호출
2460
+ keyword ||= @keyword
2461
+ puts "키워드: #{keyword}"
2462
+
2463
+ client = HTTPClient.new
2464
+ client.default_header = {
2465
+ 'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '\
2466
+ '(KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36',
2467
+ 'Accept' => 'application/json, text/javascript, */*; q=0.01',
2468
+ 'Accept-Language' => 'en-US,en;q=0.9',
2469
+ 'Referer' => "https://unsplash.com/s/photos/#{URI.encode_www_form_component(keyword)}",
2470
+ 'X-Requested-With' => 'XMLHttpRequest'
2471
+ }
2472
+
2473
+ retry_count = 0
2474
+ max_retries = 10
2475
+ results = []
2417
2476
 
2418
- retry_count = 0
2419
- max_retries = 10
2420
- results = []
2477
+ begin
2478
+ page = rand(1..15)
2479
+ url = "https://unsplash.com/napi/search/photos?query=#{URI.encode_www_form_component(keyword)}&page=#{page}&per_page=20"
2480
+ puts "Request URL: #{url}"
2481
+ res = client.get(url)
2482
+
2483
+ unless res.status == 200
2484
+ puts "HTTP Error: #{res.status}"
2485
+ raise "HTTP Error"
2486
+ end
2421
2487
 
2422
- begin
2423
- page = rand(1..15)
2424
- url = "https://unsplash.com/napi/search/photos?query=#{URI.encode_www_form_component(keyword)}&page=#{page}&per_page=20"
2425
- puts "Request URL: #{url}"
2426
- res = client.get(url)
2427
-
2428
- unless res.status == 200
2429
- puts "HTTP Error: #{res.status}"
2430
- raise "HTTP Error"
2431
- end
2488
+ json = JSON.parse(res.body)
2489
+ results = json['results']
2490
+ mm = []
2432
2491
 
2433
- json = JSON.parse(res.body)
2434
- results = json['results']
2435
- mm = []
2492
+ results.each do |photo|
2493
+ full_url = photo.dig('urls', 'full').to_s
2494
+ regular_url = photo.dig('urls', 'regular').to_s
2436
2495
 
2437
- results.each do |photo|
2438
- full_url = photo.dig('urls', 'full').to_s
2439
- regular_url = photo.dig('urls', 'regular').to_s
2496
+ if full_url.start_with?("https://images.unsplash.com/photo-") &&
2497
+ regular_url.include?("1080")
2498
+ mm << full_url
2499
+ end
2500
+ end
2440
2501
 
2441
- if full_url.start_with?("https://images.unsplash.com/photo-") &&
2442
- regular_url.include?("1080")
2443
- mm << full_url
2444
- end
2445
- end
2502
+ if mm.empty?
2503
+ raise "No matching image"
2504
+ end
2446
2505
 
2447
- if mm.empty?
2448
- raise "No matching image"
2449
- end
2506
+ selected_url = mm.sample
2507
+ destination_path = "./image/memory.png"
2508
+ Down.download(selected_url, destination: destination_path)
2509
+ puts "이미지 다운로드 완료: #{selected_url}"
2450
2510
 
2451
- selected_url = mm.sample
2452
- Down.download(selected_url, destination: "./image/memory.png")
2453
- puts "이미지 다운로드 완료: #{selected_url}"
2511
+ # 오직 auto_image에서만 자르기 호출
2512
+ crop_image_height_under_width(destination_path)
2454
2513
 
2455
- rescue => e
2456
- retry_count += 1
2457
- puts "auto_image 에러: #{e.message} (재시도 #{retry_count}/#{max_retries})"
2458
- sleep(3)
2459
- if retry_count < max_retries
2460
- retry
2461
- else
2462
- puts "최대 재시도 초과. 조건 무시하고 랜덤 이미지 다운로드 시도..."
2463
-
2464
- if results && !results.empty?
2465
- random_photo = results.sample
2466
- fallback_url = random_photo.dig('urls', 'full')
2467
- if fallback_url
2468
- Down.download(fallback_url, destination: "./image/memory.png")
2469
- puts "랜덤 이미지 다운로드 완료: #{fallback_url}"
2470
- else
2471
- puts "랜덤 이미지 URL을 찾을 수 없습니다. 단색 배경 이미지 생성합니다."
2472
- color_image
2473
- end
2514
+ rescue => e
2515
+ retry_count += 1
2516
+ puts "auto_image 에러: #{e.message} (재시도 #{retry_count}/#{max_retries})"
2517
+ sleep(3)
2518
+ if retry_count < max_retries
2519
+ retry
2520
+ else
2521
+ puts "최대 재시도 초과. 조건 무시하고 랜덤 이미지 다운로드 시도..."
2522
+
2523
+ if results && !results.empty?
2524
+ random_photo = results.sample
2525
+ fallback_url = random_photo.dig('urls', 'full')
2526
+ if fallback_url
2527
+ Down.download(fallback_url, destination: "./image/memory.png")
2528
+ puts "랜덤 이미지 다운로드 완료: #{fallback_url}"
2529
+ crop_image_height_under_width("./image/memory.png")
2474
2530
  else
2475
- puts "이미지 결과가 없어 다운로드할 수 없습니다. 단색 배경 이미지 생성합니다."
2476
- color_image
2477
- end
2531
+ puts "랜덤 이미지 URL을 찾을 수 없습니다. 단색 배경 이미지 생성합니다."
2532
+ color_image
2478
2533
  end
2534
+ else
2535
+ puts "이미지 결과가 없어 다운로드할 수 없습니다. 단색 배경 이미지 생성합니다."
2536
+ color_image
2479
2537
  end
2538
+ end
2539
+ end
2480
2540
  end
2481
2541
 
2542
+
2482
2543
  def color_image
2483
2544
  color = File.open('./color.ini', 'r', :encoding => 'utf-8').read().split("\n")
2484
2545
  image = Magick::Image.new(740, 740) { |k| k.background_color = color.sample }
@@ -2571,57 +2632,104 @@ class Wordpress
2571
2632
  end
2572
2633
 
2573
2634
 
2574
- def image_text(text1, text2)
2635
+ def image_text(text1, text2)
2636
+ begin
2637
+ color = File.open('./color.ini', 'r', encoding: 'utf-8').read.split("\n").map(&:strip).reject(&:empty?)
2638
+ font_files = Dir.entries('./fonts').select { |f| f.downcase.end_with?('.ttf') }
2639
+ font2 = './fonts/' + font_files.sample
2640
+
2641
+ # 랜덤 글자색 선택
2642
+ color2 = color.sample
2643
+
2644
+ # 헬퍼 함수: 색상 문자열 '#RRGGBB' -> [R,G,B] 배열로 변환
2645
+ def hex_to_rgb(hex)
2646
+ hex = hex.delete('#')
2647
+ [hex[0..1], hex[2..3], hex[4..5]].map { |c| c.to_i(16) }
2648
+ end
2649
+
2650
+ # 헬퍼 함수: 두 RGB 색상의 차이 계산 (간단한 유클리드 거리)
2651
+ def color_distance(c1, c2)
2652
+ Math.sqrt(
2653
+ (c1[0] - c2[0])**2 +
2654
+ (c1[1] - c2[1])**2 +
2655
+ (c1[2] - c2[2])**2
2656
+ )
2657
+ end
2658
+
2659
+ # 대비가 충분히 되는 테두리 색상 선택
2660
+ max_attempts = 10
2661
+ stroke_color = nil
2662
+ base_rgb = hex_to_rgb(color2)
2663
+
2664
+ max_attempts.times do
2665
+ candidate = color.sample
2666
+ candidate_rgb = hex_to_rgb(candidate)
2667
+ dist = color_distance(base_rgb, candidate_rgb)
2668
+
2669
+ # 거리(차이) 임계값 100 (0~441 범위) — 필요시 조절 가능
2670
+ if dist > 100
2671
+ stroke_color = candidate
2672
+ break
2673
+ end
2674
+ end
2675
+ stroke_color ||= '#000000' # 만약 충분히 다른 색 없으면 검정색 기본값
2676
+
2677
+ img = Magick::Image.read('./image/memory.png').first
2678
+ draw = Magick::Draw.new
2679
+
2680
+ raw_message = "#{text1}\n#{text2}".strip
2681
+ max_width = img.columns * 0.85
2682
+ max_height = img.rows * 0.6
2683
+
2575
2684
  begin
2576
- color = File.open('./color.ini', 'r', :encoding => 'utf-8').read().split("\n")
2577
- font_files = Dir.entries('./fonts').select { |f| f.downcase.end_with?('.ttf') }
2578
- font2 = './fonts/' + font_files.sample
2579
- color2 = color.sample
2580
-
2581
- img = Magick::Image.read('./image/memory.png').first
2582
- draw = Magick::Draw.new
2583
-
2584
- raw_message = "#{text1}\n#{text2}".strip
2585
- max_width = img.columns * 0.85
2586
- max_height = img.rows * 0.6
2587
-
2588
- begin
2589
- size = rand(@data['이미지설정']['이미지글자1크기1'].text.to_i..@data['이미지설정']['이미지글자1크기2'].text.to_i)
2590
- rescue
2591
- size = 30
2592
- end
2593
-
2594
- wrapped_message, adjusted_size = wrap_text_to_fit(draw, raw_message, max_width, max_height, font2, size)
2595
-
2596
- if @data['이미지설정']['글자그림자'].checked?
2597
- img.annotate(draw, 0, 0, 2, 2, wrapped_message) do
2598
- draw.gravity = Magick::CenterGravity
2599
- draw.pointsize = adjusted_size
2600
- draw.fill = '#000000'
2601
- draw.font = font2
2602
- end
2603
- end
2604
-
2605
- draw2 = Magick::Draw.new
2606
- img.annotate(draw2, 0, 0, 0, 0, wrapped_message) do
2607
- draw2.gravity = Magick::CenterGravity
2608
- draw2.pointsize = adjusted_size
2609
- draw2.fill = color2
2610
- draw2.font = font2
2611
- if @data['이미지설정']['글자테두리'].checked?
2612
- draw2.stroke_width = 2
2613
- draw2.stroke = '#000000'
2614
- end
2615
- end
2616
-
2617
- img.write('./image/memory.png')
2685
+ size = rand(@data['이미지설정']['이미지글자1크기1'].text.to_i..@data['이미지설정']['이미지글자1크기2'].text.to_i)
2618
2686
  rescue
2619
- puts '이미지 폰트 불러오기 오류 재시도...'
2620
- sleep(3)
2621
- retry
2687
+ size = 30
2688
+ end
2689
+
2690
+ wrapped_message, adjusted_size = wrap_text_to_fit(draw, raw_message, max_width, max_height, font2, size)
2691
+
2692
+ if @data['이미지설정']['글자그림자'].checked?
2693
+ img.annotate(draw, 0, 0, 2, 2, wrapped_message) do
2694
+ draw.gravity = Magick::CenterGravity
2695
+ draw.pointsize = adjusted_size
2696
+ draw.fill = '#000000'
2697
+ draw.font = font2
2698
+ end
2699
+ end
2700
+
2701
+ if @data['이미지설정']['글자테두리'].checked?
2702
+ draw_stroke = Magick::Draw.new
2703
+ img.annotate(draw_stroke, 0, 0, 0, 0, wrapped_message) do
2704
+ draw_stroke.gravity = Magick::CenterGravity
2705
+ draw_stroke.pointsize = adjusted_size
2706
+ draw_stroke.fill = 'none'
2707
+ draw_stroke.stroke = stroke_color
2708
+ draw_stroke.stroke_width = rand(5..10)
2709
+ draw_stroke.font = font2
2710
+ end
2711
+ end
2712
+
2713
+ draw2 = Magick::Draw.new
2714
+ img.annotate(draw2, 0, 0, 0, 0, wrapped_message) do
2715
+ draw2.gravity = Magick::CenterGravity
2716
+ draw2.pointsize = adjusted_size
2717
+ draw2.fill = color2
2718
+ draw2.stroke = 'none'
2719
+ draw2.font = font2
2622
2720
  end
2721
+
2722
+ img.write('./image/memory.png')
2723
+
2724
+ rescue => e
2725
+ puts "이미지 폰트 불러오기 오류 재시도... (#{e.message})"
2726
+ sleep(3)
2727
+ retry
2728
+ end
2623
2729
  end
2624
2730
 
2731
+
2732
+
2625
2733
  def border()
2626
2734
  color = File.open('./color.ini', 'r',:encoding => 'utf-8').read().split("\n")
2627
2735
  img = Magick::Image.read('./image/memory.png').first
@@ -2917,6 +3025,19 @@ class Wordpress
2917
3025
  end
2918
3026
  end
2919
3027
 
3028
+ if @data['포스트설정']['gpt35'].checked? || @data['포스트설정']['gpt4turbo'].checked? || @data['포스트설정']['gpt4'].checked?
3029
+ gpt_model = if @data['포스트설정']['gpt35'].checked?
3030
+ 'gpt-3.5-turbo'
3031
+ elsif @data['포스트설정']['gpt4turbo'].checked?
3032
+ 'gpt-4-turbo'
3033
+ elsif @data['포스트설정']['gpt4'].checked?
3034
+ 'gpt-4'
3035
+ end
3036
+ puts "선택 된 GPT model: #{gpt_model}".green
3037
+ else
3038
+
3039
+ end
3040
+
2920
3041
  if @data['포스트설정']['gpt제목'].checked?
2921
3042
  gpt_title_prompt = @data['포스트설정']['gpt제목_프롬프트'].text.to_s.force_encoding('utf-8')
2922
3043
 
@@ -2924,7 +3045,7 @@ class Wordpress
2924
3045
  gpt_title_prompt_sample = gpt_title_prompt.strip.empty? ? "프롬프트: 문장을 비슷한 길이로 ChatGPT의 멘트는 빼고 표현을 더 추가해서 하나만 만들어줘." : gpt_title_prompt
2925
3046
 
2926
3047
  # gpt_title_prompt_sample을 Chat_title 객체에 전달
2927
- chat = Chat_title.new(@data['포스트설정']['api_key'].text.to_s.force_encoding('utf-8'), gpt_title_prompt_sample)
3048
+ chat = Chat_title.new(@data['포스트설정']['api_key'].text.to_s.force_encoding('utf-8'), gpt_title_prompt_sample, gpt_model)
2928
3049
 
2929
3050
  # 메시지 요청 후 title에 저장
2930
3051
  gpt_text1 = chat.message(title)
@@ -2978,7 +3099,7 @@ class Wordpress
2978
3099
  gpt_content_prompt_sample = gpt_content_prompt.strip.empty? ? "프롬프트:ChatGPT의 멘트는 빼고 위 전체적인 내용의 형식을 똑같이 표현을 더 추가하고 유사어로 변경하여 하나 만들어줘! 전화번호,연락처,가격,홈페이지안내 ,상담안내 관련 문구는 유지해야해" : gpt_content_prompt
2979
3100
 
2980
3101
  # Chat_content 객체 생성 시 api_key와 gpt_content_prompt_sample을 두 개의 인자로 전달
2981
- chat = Chat_content.new(api_key, gpt_content_prompt_sample)
3102
+ chat = Chat_content.new(api_key, gpt_content_prompt_sample, gpt_model)
2982
3103
 
2983
3104
  # 메시지 요청 후 content에 저장
2984
3105
  gpt_text3 = chat.message(content)
@@ -3126,7 +3247,7 @@ class Wordpress
3126
3247
  if @data['포스트설정']['gpt키워드'].checked?
3127
3248
  gpt_keyword_prompt = @data['포스트설정']['gpt키워드_프롬프트'].text.to_s.force_encoding('utf-8')
3128
3249
  gpt_keyword_prompt_sample = gpt_keyword_prompt.strip.empty? ? "프롬프트: 관련된 글을 1500자에서 2500자 사이로 만들어줘" : gpt_keyword_prompt
3129
- chat = Chat.new(@data['포스트설정']['api_key'].text.to_s.force_encoding('utf-8'), gpt_keyword_prompt)
3250
+ chat = Chat.new(@data['포스트설정']['api_key'].text.to_s.force_encoding('utf-8'), gpt_keyword_prompt, gpt_model)
3130
3251
  gpt_text = chat.message(keyword)
3131
3252
  #content = content.to_s + "\n(자동생성글)\n" + gpt_text.to_s
3132
3253
  content = content.to_s + "(자동생성글)" + gpt_text.to_s
@@ -3988,7 +4109,7 @@ class Wordpress
3988
4109
  @data['포스트설정']['프록시리스트'] = Array.new
3989
4110
  @data['포스트설정']['인용구'] = Array.new
3990
4111
  @user_login_ok = 4
3991
- window('카페 상품 게시판 등록기', 800, 570) {
4112
+ window('카페 상품 게시판 등록기', 800, 610) {
3992
4113
  margined true
3993
4114
 
3994
4115
  vertical_box {
@@ -5489,17 +5610,49 @@ class Wordpress
5489
5610
  top 15+ aa1
5490
5611
  left 0
5491
5612
  }
5492
-
5493
- @data['포스트설정']['ChatGPT사용'] = checkbox('Chat GPT 사용하기'){
5494
- top 16+ aa1
5613
+ }
5614
+ grid{
5615
+ stretchy false
5616
+ @data['포스트설정']['ChatGPT사용'] = checkbox('Chat GPT 사용하기             '){
5617
+ top 1
5495
5618
  left 0
5496
5619
  }
5497
-
5620
+
5498
5621
  @data['포스트설정']['api_key'] = entry(){
5499
- top 16+ aa1
5622
+ top 1
5500
5623
  left 1
5501
- text 'api key 입력 필수!!'
5624
+ text 'api key 입력'
5502
5625
  }
5626
+ @data['포스트설정']['gpt35'] = checkbox('GPT 3.5-turbo'){
5627
+ top 1
5628
+ left 2
5629
+ on_toggled {
5630
+ if @data['포스트설정']['gpt35'].checked?
5631
+ @data['포스트설정']['gpt4'].checked = false
5632
+ @data['포스트설정']['gpt4turbo'].checked = false
5633
+ end
5634
+ }
5635
+ }
5636
+ @data['포스트설정']['gpt4'] = checkbox('GPT 4'){
5637
+ top 1
5638
+ left 3
5639
+ on_toggled {
5640
+ if @data['포스트설정']['gpt4'].checked?
5641
+ @data['포스트설정']['gpt35'].checked = false
5642
+ @data['포스트설정']['gpt4turbo'].checked = false
5643
+ end
5644
+ }
5645
+ }
5646
+ @data['포스트설정']['gpt4turbo'] = checkbox('GPT 4-turbo'){
5647
+ top 1
5648
+ left 4
5649
+ on_toggled {
5650
+ if @data['포스트설정']['gpt4turbo'].checked?
5651
+ @data['포스트설정']['gpt35'].checked = false
5652
+ @data['포스트설정']['gpt4'].checked = false
5653
+ end
5654
+ }
5655
+ }
5503
5656
  }
5504
5657
  }
5505
5658
 
@@ -6225,7 +6378,7 @@ class Wordpress
6225
6378
  @data['포스트설정']['CCL사용'].checked = false
6226
6379
  @data['포스트설정']['인용구랜덤'].checked = true
6227
6380
  @data['이미지설정']['글자순서'].checked = true
6228
-
6381
+ @data['포스트설정']['gpt35'].checked = true
6229
6382
  }.show
6230
6383
  end
6231
6384
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cafe_buy_duo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.50
4
+ version: 0.1.52
5
5
  platform: ruby
6
6
  authors:
7
7
  - zon
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-05-30 00:00:00.000000000 Z
10
+ date: 2025-06-26 00:00:00.000000000 Z
11
11
  dependencies: []
12
12
  description: File to Clipboard gem
13
13
  email: mymin26@naver.com