@@ -117,37 +117,85 @@ def parser
117117 "OK"
118118end
119119
120+ def storeContent ( message_id :, message_type :)
121+ case message_type
122+ when :video , :audio
123+ max_retries = 10
124+
125+ max_retries . times do |i |
126+ body , status_code , _headers = blob_client . get_message_content_transcoding_by_message_id_with_http_info (
127+ message_id : message_id
128+ )
129+
130+ unless status_code == 200
131+ logger . warn "get_message_content_transcoding_by_message_id failed. status_code=#{ status_code } , error=#{ body } "
132+ sleep 1
133+ next
134+ end
135+
136+ current_status = body . status
137+
138+ if current_status == 'succeeded'
139+ logger . info "Transcoding succeeded for message_id=#{ message_id } "
140+ break
141+ elsif current_status == 'failed'
142+ logger . error "Transcoding failed for message_id=#{ message_id } "
143+ return nil
144+ else
145+ ## waiting: transcoding in progress
146+ sleep 1
147+ if i == max_retries - 1
148+ logger . error "Transcoding timed out for message_id=#{ message_id } "
149+ return nil
150+ end
151+ end
152+ end
153+ end
154+
155+ content , _ , headers = blob_client . get_message_content_with_http_info ( message_id : message_id )
156+ content_type = headers [ 'content-type' ]
157+ ext = case content_type
158+ when 'image/jpeg' then 'jpg'
159+ when 'image/png' then 'png'
160+ when 'image/gif' then 'gif'
161+ when 'video/mp4' then 'mp4'
162+ else
163+ logger . warn "Unknown content type: #{ content_type } "
164+ 'bin'
165+ end
166+
167+ filename = "#{ message_id } .#{ ext } "
168+ save_path = File . join ( settings . root , 'public' , 'statics' , filename )
169+ logger . info "Saving content to #{ save_path } "
170+ File . open ( save_path , 'wb' ) { |f | f . write ( content ) }
171+
172+ return File . join ( settings . app_base_url , 'statics' , filename )
173+ end
174+
120175def handle_message_event ( event )
121176 message = event . message
122177
123178 case message
124179 when Line ::Bot ::V2 ::Webhook ::ImageMessageContent
125180 message_id = message . id
126- response = blob_client . get_message_content ( message_id : message_id )
127- tf = Tempfile . open ( "content" )
128- tf . write ( response )
129- reply_text ( event , "[MessageType::IMAGE]\n id:#{ message_id } \n received #{ tf . size } bytes data" )
181+ logger . info "Image message ID: #{ message_id } "
182+ url = storeContent ( message_id : message_id , message_type : :image )
183+ reply_text ( event , "[MessageType::IMAGE]\n Stored file: #{ url } " )
130184
131185 when Line ::Bot ::V2 ::Webhook ::VideoMessageContent
132186 message_id = message . id
133- response = blob_client . get_message_content ( message_id : message_id )
134- tf = Tempfile . open ( "content" )
135- tf . write ( response )
136- reply_text ( event , "[MessageType::VIDEO]\n id:#{ message_id } \n received #{ tf . size } bytes data" )
187+ url = storeContent ( message_id : message_id , message_type : :video )
188+ reply_text ( event , "[MessageType::VIDEO]\n Stored file: #{ url } " )
137189
138190 when Line ::Bot ::V2 ::Webhook ::AudioMessageContent
139191 message_id = message . id
140- response = blob_client . get_message_content ( message_id : message_id )
141- tf = Tempfile . open ( "content" )
142- tf . write ( response )
143- reply_text ( event , "[MessageType::AUDIO]\n id:#{ message_id } \n received #{ tf . size } bytes data" )
192+ url = storeContent ( message_id : message_id , message_type : :audio )
193+ reply_text ( event , "[MessageType::AUDIO]\n Stored file: #{ url } " )
144194
145195 when Line ::Bot ::V2 ::Webhook ::FileMessageContent
146196 message_id = message . id
147- response = blob_client . get_message_content ( message_id : message_id )
148- tf = Tempfile . open ( "content" )
149- tf . write ( response )
150- reply_text ( event , "[MessageType::FILE]\n id:#{ message_id } \n received #{ tf . size } bytes data" )
197+ url = storeContent ( message_id : message_id , message_type : :file )
198+ reply_text ( event , "[MessageType::FILE]\n Stored file: #{ url } " )
151199
152200 when Line ::Bot ::V2 ::Webhook ::StickerMessageContent
153201 reply_text ( event , "[MessageType::STICKER]\n package_id: #{ message . package_id } \n sticker_id: #{ message . sticker_id } " )
0 commit comments