@@ -750,33 +750,46 @@ async function handleImageRequest(request, DATABASE, TG_BOT_TOKEN) {
750750 const cachedResponse = await cache . match ( cacheKey ) ;
751751 if ( cachedResponse ) return cachedResponse ;
752752 const result = await DATABASE . prepare ( 'SELECT fileId FROM media WHERE url = ?' ) . bind ( requestedUrl ) . first ( ) ;
753- if ( result ) {
754- const fileId = result . fileId ;
755- const getFileResponse = await fetch ( `https://api.telegram.org/bot${ TG_BOT_TOKEN } /getFile?file_id=${ fileId } ` ) ;
756- if ( ! getFileResponse . ok ) return new Response ( null , { status : 404 } ) ;
757- const fileData = await getFileResponse . json ( ) ;
758- const filePath = fileData . result . file_path ;
759- const telegramFileUrl = `https://api.telegram.org/file/bot${ TG_BOT_TOKEN } /${ filePath } ` ;
760- const response = await fetch ( telegramFileUrl ) ;
761- if ( response . ok ) {
762- const fileExtension = requestedUrl . split ( '.' ) . pop ( ) . toLowerCase ( ) ;
763- let contentType = 'text/plain' ;
764- if ( fileExtension === 'jpg' || fileExtension === 'jpeg' ) contentType = 'image/jpeg' ;
765- if ( fileExtension === 'png' ) contentType = 'image/png' ;
766- if ( fileExtension === 'gif' ) contentType = 'image/gif' ;
767- if ( fileExtension === 'webp' ) contentType = 'image/webp' ;
768- if ( fileExtension === 'mp4' ) contentType = 'video/mp4' ;
769- const headers = new Headers ( response . headers ) ;
770- headers . set ( 'Content-Type' , contentType ) ;
771- headers . set ( 'Content-Disposition' , 'inline' ) ;
772- const responseToCache = new Response ( response . body , { status : response . status , headers } ) ;
773- await cache . put ( cacheKey , responseToCache . clone ( ) ) ;
774- return responseToCache ;
753+ if ( ! result ) {
754+ return new Response ( '未匹配到url' , { status : 404 } ) ;
755+ }
756+ const fileId = result . fileId ;
757+ let filePath ;
758+ let attempts = 0 ;
759+ const maxAttempts = 3 ;
760+ while ( attempts < maxAttempts ) {
761+ const getFilePath = await fetch ( `https://api.telegram.org/bot${ TG_BOT_TOKEN } /getFile?file_id=${ fileId } ` ) ;
762+ if ( ! getFilePath . ok ) {
763+ return new Response ( '请求文件路径失败' , { status : 500 } ) ;
764+ }
765+ const fileData = await getFilePath . json ( ) ;
766+ if ( fileData . ok && fileData . result . file_path ) {
767+ filePath = fileData . result . file_path ;
768+ break ;
775769 }
770+ attempts ++ ;
771+ }
772+ if ( ! filePath ) {
773+ return new Response ( '未找到文件路径' , { status : 404 } ) ;
774+ }
775+ const getFileResponse = `https://api.telegram.org/file/bot${ TG_BOT_TOKEN } /${ filePath } ` ;
776+ const response = await fetch ( getFileResponse ) ;
777+ if ( ! response . ok ) {
778+ return new Response ( '获取文件内容失败' , { status : 500 } ) ;
776779 }
777- const notFoundResponse = new Response ( null , { status : 404 } ) ;
778- await cache . put ( cacheKey , notFoundResponse . clone ( ) ) ;
779- return notFoundResponse ;
780+ const fileExtension = requestedUrl . split ( '.' ) . pop ( ) . toLowerCase ( ) ;
781+ let contentType = 'text/plain' ;
782+ if ( fileExtension === 'jpg' || fileExtension === 'jpeg' ) contentType = 'image/jpeg' ;
783+ if ( fileExtension === 'png' ) contentType = 'image/png' ;
784+ if ( fileExtension === 'gif' ) contentType = 'image/gif' ;
785+ if ( fileExtension === 'webp' ) contentType = 'image/webp' ;
786+ if ( fileExtension === 'mp4' ) contentType = 'video/mp4' ;
787+ const headers = new Headers ( response . headers ) ;
788+ headers . set ( 'Content-Type' , contentType ) ;
789+ headers . set ( 'Content-Disposition' , 'inline' ) ;
790+ const responseToCache = new Response ( response . body , { status : response . status , headers } ) ;
791+ await cache . put ( cacheKey , responseToCache . clone ( ) ) ;
792+ return responseToCache ;
780793}
781794
782795async function handleBingImagesRequest ( request ) {
0 commit comments