@@ -139,6 +139,7 @@ import { createHash } from 'crypto';
139139import EventEmitter2 from 'eventemitter2' ;
140140import ffmpeg from 'fluent-ffmpeg' ;
141141import FormData from 'form-data' ;
142+ import { getLinkPreview } from 'link-preview-js' ;
142143import Long from 'long' ;
143144import mimeTypes from 'mime-types' ;
144145import NodeCache from 'node-cache' ;
@@ -2221,6 +2222,43 @@ export class BaileysStartupService extends ChannelStartupService {
22212222 }
22222223 }
22232224
2225+ private async generateLinkPreview ( text : string ) {
2226+ try {
2227+ const linkRegex = / h t t p s ? : \/ \/ [ ^ \s ] + / ;
2228+ const match = text . match ( linkRegex ) ;
2229+
2230+ if ( ! match ) return undefined ;
2231+
2232+ const url = match [ 0 ] ;
2233+ const previewData = await getLinkPreview ( url , {
2234+ imagesPropertyType : 'og' , // fetches only open-graph images
2235+ headers : {
2236+ 'user-agent' : 'googlebot' , // fetches with googlebot to prevent login pages
2237+ } ,
2238+ } ) as any ;
2239+
2240+ if ( ! previewData || ! previewData . title ) return undefined ;
2241+
2242+ const image = previewData . images && previewData . images . length > 0 ? previewData . images [ 0 ] : undefined ;
2243+
2244+ return {
2245+ externalAdReply : {
2246+ title : previewData . title ,
2247+ body : previewData . description ,
2248+ mediaType : 2 , // 2 for video/image preview, though usually 1 is for thumbnail
2249+ thumbnailUrl : image ,
2250+ sourceUrl : url ,
2251+ mediaUrl : url ,
2252+ renderLargerThumbnail : true ,
2253+ showAdAttribution : true
2254+ }
2255+ } ;
2256+ } catch ( error ) {
2257+ this . logger . error ( `Error generating link preview: ${ error } ` ) ;
2258+ return undefined ;
2259+ }
2260+ }
2261+
22242262 private async sendMessage (
22252263 sender : string ,
22262264 message : any ,
@@ -2432,7 +2470,12 @@ export class BaileysStartupService extends ChannelStartupService {
24322470 }
24332471 }
24342472
2435- const linkPreview = options ?. linkPreview != false ? undefined : false ;
2473+ const linkPreview = options ?. linkPreview === false ? false : undefined ;
2474+
2475+ let previewContext : any = undefined ;
2476+ if ( linkPreview !== false && ( message as any ) ?. conversation ) {
2477+ previewContext = await this . generateLinkPreview ( ( message as any ) . conversation ) ;
2478+ }
24362479
24372480 let quoted : WAMessage ;
24382481
@@ -2486,6 +2529,7 @@ export class BaileysStartupService extends ChannelStartupService {
24862529 quoted ,
24872530 null ,
24882531 group ?. ephemeralDuration ,
2532+ previewContext ,
24892533 // group?.participants,
24902534 ) ;
24912535 } else {
@@ -2499,6 +2543,7 @@ export class BaileysStartupService extends ChannelStartupService {
24992543 unsigned : false ,
25002544 } ,
25012545 disappearingMode : { initiator : 0 } ,
2546+ ...previewContext ,
25022547 } ;
25032548 messageSent = await this . sendMessage (
25042549 sender ,
0 commit comments