@@ -138,6 +138,7 @@ import { createHash } from 'crypto';
138138import EventEmitter2 from 'eventemitter2' ;
139139import ffmpeg from 'fluent-ffmpeg' ;
140140import FormData from 'form-data' ;
141+ import { getLinkPreview } from 'link-preview-js' ;
141142import Long from 'long' ;
142143import mimeTypes from 'mime-types' ;
143144import NodeCache from 'node-cache' ;
@@ -434,7 +435,7 @@ export class BaileysStartupService extends ChannelStartupService {
434435 qrcodeTerminal . generate ( qr , { small : true } , ( qrcode ) =>
435436 this . logger . log (
436437 `\n{ instance: ${ this . instance . name } pairingCode: ${ this . instance . qrcode . pairingCode } , qrcodeCount: ${ this . instance . qrcode . count } }\n` +
437- qrcode ,
438+ qrcode ,
438439 ) ,
439440 ) ;
440441
@@ -1052,16 +1053,16 @@ export class BaileysStartupService extends ChannelStartupService {
10521053
10531054 const messagesRepository : Set < string > = new Set (
10541055 chatwootImport . getRepositoryMessagesCache ( instance ) ??
1055- (
1056- await this . prismaRepository . message . findMany ( {
1057- select : { key : true } ,
1058- where : { instanceId : this . instanceId } ,
1059- } )
1060- ) . map ( ( message ) => {
1061- const key = message . key as { id : string } ;
1056+ (
1057+ await this . prismaRepository . message . findMany ( {
1058+ select : { key : true } ,
1059+ where : { instanceId : this . instanceId } ,
1060+ } )
1061+ ) . map ( ( message ) => {
1062+ const key = message . key as { id : string } ;
10621063
1063- return key . id ;
1064- } ) ,
1064+ return key . id ;
1065+ } ) ,
10651066 ) ;
10661067
10671068 if ( chatwootImport . getRepositoryMessagesCache ( instance ) === null ) {
@@ -2220,6 +2221,46 @@ export class BaileysStartupService extends ChannelStartupService {
22202221 }
22212222 }
22222223
2224+ private async generateLinkPreview ( text : string ) {
2225+ try {
2226+ const linkRegex = / h t t p s ? : \/ \/ [ ^ \s ] + / ;
2227+ const match = text . match ( linkRegex ) ;
2228+
2229+ if ( ! match ) return undefined ;
2230+
2231+ // Trim common trailing punctuation that may follow URLs in natural text
2232+ const url = match [ 0 ] . replace ( / [ . , ) ; \] ] + $ / u, '' ) ;
2233+ if ( ! url ) return undefined ;
2234+
2235+ const previewData = await getLinkPreview ( url , {
2236+ imagesPropertyType : 'og' , // fetches only open-graph images
2237+ headers : {
2238+ 'user-agent' : 'googlebot' , // fetches with googlebot to prevent login pages
2239+ } ,
2240+ } ) as any ;
2241+
2242+ if ( ! previewData || ! previewData . title ) return undefined ;
2243+
2244+ const image = previewData . images && previewData . images . length > 0 ? previewData . images [ 0 ] : undefined ;
2245+
2246+ return {
2247+ externalAdReply : {
2248+ title : previewData . title ,
2249+ body : previewData . description ,
2250+ mediaType : 2 , // 2 for video/image preview, though usually 1 is for thumbnail
2251+ thumbnailUrl : image ,
2252+ sourceUrl : url ,
2253+ mediaUrl : url ,
2254+ renderLargerThumbnail : true
2255+ // showAdAttribution: true // Removed to prevent "Sent via ad" label
2256+ }
2257+ } ;
2258+ } catch ( error ) {
2259+ this . logger . error ( `Error generating link preview: ${ error } ` ) ;
2260+ return undefined ;
2261+ }
2262+ }
2263+
22232264 private async sendMessage (
22242265 sender : string ,
22252266 message : any ,
@@ -2431,7 +2472,12 @@ export class BaileysStartupService extends ChannelStartupService {
24312472 }
24322473 }
24332474
2434- const linkPreview = options ?. linkPreview != false ? undefined : false ;
2475+ const linkPreview = options ?. linkPreview === false ? false : undefined ;
2476+
2477+ let previewContext : any = undefined ;
2478+ if ( linkPreview !== false && ( message as any ) ?. conversation ) {
2479+ previewContext = await this . generateLinkPreview ( ( message as any ) . conversation ) ;
2480+ }
24352481
24362482 let quoted : WAMessage ;
24372483
@@ -2485,6 +2531,7 @@ export class BaileysStartupService extends ChannelStartupService {
24852531 quoted ,
24862532 null ,
24872533 group ?. ephemeralDuration ,
2534+ previewContext ,
24882535 // group?.participants,
24892536 ) ;
24902537 } else {
@@ -2498,6 +2545,7 @@ export class BaileysStartupService extends ChannelStartupService {
24982545 unsigned : false ,
24992546 } ,
25002547 disappearingMode : { initiator : 0 } ,
2548+ ...previewContext ,
25012549 } ;
25022550 messageSent = await this . sendMessage (
25032551 sender ,
0 commit comments