Adding images to scraping data (#157)

* Fredy now supports pulling the main Image from the listing and send it together with the usual information
This commit is contained in:
Christian Kellner
2025-08-30 21:21:34 +02:00
committed by GitHub
parent da743c8279
commit f0b146fd7f
26 changed files with 1141 additions and 1135 deletions

View File

@@ -0,0 +1,123 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Listings</title>
<style type="text/css">
body { margin:0; padding:0; background:#000000; }
table { border-collapse:collapse; }
img { border:0; outline:none; text-decoration:none; display:block; }
a { text-decoration:none; }
.container { width:100%; max-width:640px; margin:0 auto; }
.card { background:#111111; border:1px solid #222222; border-radius:8px; overflow:hidden; }
.divider { height:2px; line-height:2px; font-size:0; background:#00dc73; }
.h1 { font:700 18px/1.4 Arial, Helvetica, sans-serif; color:#ffffff; margin:0; }
.h2 { font:700 16px/1.4 Arial, Helvetica, sans-serif; color:#ffffff; margin:0; }
.p { font:400 14px/1.6 Arial, Helvetica, sans-serif; color:#d9d9d9; margin:0; }
.meta { font:400 13px/1.5 Arial, Helvetica, sans-serif; color:#bfbfbf; }
.btn { background:#00dc73; color:#0b0b0b; font:700 14px/1 Arial, Helvetica, sans-serif; padding:12px 18px; border-radius:6px; display:inline-block; }
.sp-8 { height:8px; line-height:8px; font-size:0; }
.sp-12 { height:12px; line-height:12px; font-size:0; }
.sp-16 { height:16px; line-height:16px; font-size:0; }
.sp-20 { height:20px; line-height:20px; font-size:0; }
.sp-24 { height:24px; line-height:24px; font-size:0; }
@media screen and (max-width:480px){
.container { width:100% !important; }
.stack { display:block !important; width:100% !important; }
}
</style>
</head>
<body style="background:#000000;">
<table role="presentation" width="100%" bgcolor="#000000">
<tr>
<td align="center">
<table role="presentation" class="container" width="640">
<tr><td class="sp-20"></td></tr>
<tr>
<td align="center">
<h1 class="h1" style="text-align:center;">
Service {{serviceName}} found {{numberOfListings}} new listings
</h1>
</td>
</tr>
<tr><td class="sp-12"></td></tr>
<tr><td class="divider"></td></tr>
<tr><td class="sp-16"></td></tr>
{{#each listings}}
<tr>
<td>
<table role="presentation" class="card" width="100%">
{{#if this.hasImage}}
<tr>
<td>
<a href="{{this.link}}" target="_blank">
<img src="cid:{{this.imageCid}}" alt="{{this.title}}" width="640"
style="width:100%; height:auto; background:#1a1a1a;" />
</a>
</td>
</tr>
{{/if}}
<tr>
<td style="padding:16px 18px 0 18px;">
<a href="{{this.link}}" target="_blank" style="color:#ffffff;">
<h2 class="h2">{{this.title}}</h2>
</a>
</td>
</tr>
<tr><td class="sp-8"></td></tr>
<tr>
<td style="padding:0 18px;">
<table role="presentation" width="100%">
<tr>
<td class="stack" style="vertical-align:top; width:50%; padding-right:8px;">
<p class="meta"><strong>Price</strong><br/>{{#if this.price}}{{this.price}}{{else}}unknown{{/if}}</p>
</td>
<td class="stack" style="vertical-align:top; width:50%; padding-left:8px;">
<p class="meta"><strong>Size</strong><br/>{{#if this.size}}{{this.size}}{{else}}unknown{{/if}}</p>
</td>
</tr>
<tr><td class="sp-8"></td><td class="sp-8"></td></tr>
<tr>
<td colspan="2">
<p class="meta"><strong>Address</strong><br/>{{#if this.address}}{{this.address}}{{else}}unknown{{/if}}</p>
</td>
</tr>
</table>
</td>
</tr>
<tr><td class="sp-16"></td></tr>
<tr>
<td align="left" style="padding:0 18px 18px 18px;">
<a href="{{this.link}}" class="btn" target="_blank">View Listing</a>
</td>
</tr>
</table>
</td>
</tr>
<tr><td class="sp-24"></td></tr>
{{/each}}
<tr><td class="divider"></td></tr>
<tr><td class="sp-16"></td></tr>
<tr>
<td align="center">
<p class="p" style="color:#9f9f9f;">Powered by Fredy</p>
</td>
</tr>
<tr><td class="sp-20"></td></tr>
</table>
</td>
</tr>
</table>
</body>
</html>

View File

@@ -1,237 +1,131 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html data-editor-version="2" class="sg-campaigns" xmlns="http://www.w3.org/1999/xhtml"><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">
<!--[if !mso]><!-->
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<!--<![endif]-->
<!--[if (gte mso 9)|(IE)]>
<xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
<o:PixelsPerInch>96</o:PixelsPerInch>
</o:OfficeDocumentSettings>
</xml>
<![endif]-->
<!--[if (gte mso 9)|(IE)]>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Fredy found some new listings</title>
<style type="text/css">
body {width: 600px;margin: 0 auto;}
table {border-collapse: collapse;}
table, td {mso-table-lspace: 0pt;mso-table-rspace: 0pt;}
img {-ms-interpolation-mode: bicubic;}
</style>
<![endif]-->
<style type="text/css">
body, p, div {
font-family: arial,helvetica,sans-serif;
font-size: 14px;
}
body {
color: #000000;
}
body a {
color: #42ee99;
text-decoration: none;
}
p { margin: 0; padding: 0; }
table.wrapper {
width:100% !important;
table-layout: fixed;
-webkit-font-smoothing: antialiased;
-webkit-text-size-adjust: 100%;
-moz-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
}
img.max-width {
max-width: 100% !important;
}
.column.of-2 {
width: 50%;
}
.column.of-3 {
width: 33.333%;
}
.column.of-4 {
width: 25%;
}
@media screen and (max-width:480px) {
.preheader .rightColumnContent,
.footer .rightColumnContent {
text-align: left !important;
}
.preheader .rightColumnContent div,
.preheader .rightColumnContent span,
.footer .rightColumnContent div,
.footer .rightColumnContent span {
text-align: left !important;
}
.preheader .rightColumnContent,
.preheader .leftColumnContent {
font-size: 80% !important;
padding: 5px 0;
}
table.wrapper-mobile {
width: 100% !important;
table-layout: fixed;
}
img.max-width {
height: auto !important;
max-width: 100% !important;
}
a.bulletproof-button {
display: block !important;
width: auto !important;
font-size: 80%;
padding-left: 0 !important;
padding-right: 0 !important;
}
.columns {
width: 100% !important;
}
.column {
display: block !important;
width: 100% !important;
padding-left: 0 !important;
padding-right: 0 !important;
margin-left: 0 !important;
margin-right: 0 !important;
}
body { margin:0; padding:0; background:#000000; }
table { border-collapse:collapse; }
img { border:0; outline:none; text-decoration:none; display:block; }
a { text-decoration:none; }
.container { width:100%; max-width:640px; margin:0 auto; }
.card { background:#111111; border:1px solid #222222; border-radius:8px; overflow:hidden; }
.divider { height:2px; line-height:2px; font-size:0; background:#00dc73; }
.h1 { font:700 18px/1.4 Arial, Helvetica, sans-serif; color:#ffffff; margin:0; }
.h2 { font:700 16px/1.4 Arial, Helvetica, sans-serif; color:#ffffff; margin:0; }
.p { font:400 14px/1.6 Arial, Helvetica, sans-serif; color:#d9d9d9; margin:0; }
.meta { font:400 13px/1.5 Arial, Helvetica, sans-serif; color:#bfbfbf; }
.btn { background:#00dc73; color:#0b0b0b; font:700 14px/1 Arial, Helvetica, sans-serif; padding:12px 18px; border-radius:6px; display:inline-block; }
.sp-8 { height:8px; line-height:8px; font-size:0; }
.sp-12 { height:12px; line-height:12px; font-size:0; }
.sp-16 { height:16px; line-height:16px; font-size:0; }
.sp-20 { height:20px; line-height:20px; font-size:0; }
.sp-24 { height:24px; line-height:24px; font-size:0; }
@media screen and (max-width:480px){
.container { width:100% !important; }
.stack { display:block !important; width:100% !important; }
}
</style>
<!--user entered Head Start-->
<!--End Head user entered-->
</head>
<body>
<center class="wrapper" data-link-color="#42ee99" data-body-style="font-size:14px; font-family:arial,helvetica,sans-serif; color:#000000; background-color:#000000;">
<div class="webkit">
<table cellpadding="0" cellspacing="0" border="0" width="100%" class="wrapper" bgcolor="#000000">
<tbody><tr>
<td valign="top" bgcolor="#000000" width="100%">
<table width="100%" role="content-container" class="outer" align="center" cellpadding="0" cellspacing="0" border="0">
<tbody><tr>
<td width="100%">
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tbody><tr>
<body style="background:#000000;">
<table role="presentation" width="100%" bgcolor="#000000">
<tr>
<td align="center">
<table role="presentation" class="container" width="640">
<tr><td class="sp-20"></td></tr>
<tr>
<td align="center">
<table role="presentation" width="100%">
<tr>
<td align="center">
<h1 class="h1" style="text-align:center;">
Service {{serviceName}} found {{numberOfListings}} new listings
</h1>
</td>
</tr>
<tr><td class="sp-12"></td></tr>
<tr><td class="divider"></td></tr>
<tr><td class="sp-16"></td></tr>
</table>
</td>
</tr>
{{#each listings}}
<tr>
<td>
<table role="presentation" class="card" width="100%">
{{#if this.hasImage}}
<tr>
<td>
<!--[if mso]>
<center>
<table><tr><td width="600">
<![endif]-->
<table width="100%" cellpadding="0" cellspacing="0" border="0" style="width:100%; max-width:600px;" align="center">
<tbody><tr>
<td role="modules-container" style="padding:0px 0px 0px 0px; color:#000000; text-align:left;" bgcolor="#FFFFFF" width="100%" align="left"><table class="module preheader preheader-hide" role="module" data-type="preheader" border="0" cellpadding="0" cellspacing="0" width="100%" style="display: none !important; mso-hide: all; visibility: hidden; opacity: 0; color: transparent; height: 0; width: 0;">
</table><table class="module" role="module" data-type="spacer" border="0" cellpadding="0" cellspacing="0" width="100%" style="table-layout: fixed;" data-muid="vB9TDziyvx65CC2nx3oyRH">
<tbody><tr>
<td style="padding:0px 0px 20px 0px;" role="module-content" bgcolor="#000000">
</td>
</tr>
</tbody></table><table class="wrapper" role="module" data-type="image" border="0" cellpadding="0" cellspacing="0" width="100%" style="table-layout: fixed;" data-muid="uXsDxMnn1bRMmDcX8NB6rW">
</table><table class="module" role="module" data-type="text" border="0" cellpadding="0" cellspacing="0" width="100%" style="table-layout: fixed;" data-muid="hL6wjQ2qknNd5qDwT1p7Up">
<tbody><tr>
<td style="background-color:#000000; padding:10px 20px 10px 20px; line-height:40px; text-align:justify;" height="100%" valign="top" bgcolor="#000000"><div><h1 style="text-align: center"><span style="color: #ffffff; font-size: 14px; font-family: verdana,geneva,sans-serif"><strong>Service {{serviceName}} found {{numberOfListings}} new listing(s)!</strong></span></h1><div></div></div></td>
</tr>
</tbody></table>
<table border="0" cellpadding="0" cellspacing="0" align="center" width="100%" height="1px" style="line-height:3px; font-size:3px;">
<tbody><tr>
<td style="padding:0px 0px 1px 0px;" bgcolor="#42ee99"></td>
</tr>
</tbody></table>
</td>
</tr>
</tbody>
</table>
<table class="module" role="module" data-type="text" border="0" cellpadding="0" cellspacing="0" width="100%" style="table-layout: fixed;" data-muid="qk51Jjn4bm3rn2Yb31Dxzb">
<tbody>
{{#each listings}}
<tr>
<td style="padding:50px 50px 10px 50px; line-height:22px; text-align:center; color:white" bgcolor="#000000" height="100%" valign="top">
<div>
<span style="font-size: 12px; font-family: verdana,geneva,sans-serif; color: white;"><b>{{this.title}}</b></span>
<br/>
<span style="font-size: 12px; font-family: verdana,geneva,sans-serif; color: white;">Size: {{#if this.size}}{{this.size}}{{else}}unknown{{/if}}</span>
<br/>
<span style="font-size: 12px; font-family: verdana,geneva,sans-serif; color: white;">Price: {{#if this.price}}{{this.price}}{{else}}unknown{{/if}}</span>
<br/>
<span style="font-size: 12px; font-family: verdana,geneva,sans-serif; color: white;">{{#if this.address}}{{this.address}}{{else}}unknown{{/if}}</span>
<br/>
<a href="{{this.link}}" target="_blank" style="color:#00dc73; font-size:13px">{{this.link}}</a>
<br/>
<span style="color: white;">---------------------------</span>
</div>
</td>
</tr>
{{/each}}
</tbody>
</table>
<table class="module" role="module" data-type="spacer" border="0" cellpadding="0" cellspacing="0" width="100%" style="table-layout: fixed;" data-muid="2ga5f7koD5ApvUfnqUK6aT">
<tbody><tr>
<td style="padding:0px 0px 30px 0px;" role="module-content" bgcolor="#000000">
</td>
</tr>
</tbody></table>
<table class="module" role="module" data-type="divider" border="0" cellpadding="0" cellspacing="0" width="100%" style="table-layout: fixed;" data-muid="c3nRrjMndqXf1snYDFPSF9">
<tbody><tr>
<td style="padding:0px 0px 0px 0px;" role="module-content" height="100%" valign="top" bgcolor="#000000">
<table border="0" cellpadding="0" cellspacing="0" align="center" width="100%" height="2px" style="line-height:1px; font-size:2px;">
<tbody><tr>
<td style="padding:0px 0px 2px 0px;" bgcolor="#42ee99"></td>
</tr>
</tbody></table>
</td>
</tr>
</tbody>
</table>
<table class="module" role="module" data-type="spacer" border="0" cellpadding="0" cellspacing="0" width="100%" style="table-layout: fixed;" data-muid="pa9PeYjCEFyByuP5878Sd2">
<tbody><tr>
<td style="padding:0px 0px 30px 0px;" role="module-content" bgcolor="#000000">
</td>
</tr>
</tbody></table>
<table class="module" role="module" data-type="social" align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="table-layout: fixed;" data-muid="n7FceQWVnLmounEt32B1gj">
<tbody>
<tr>
<td valign="top" style="padding:0px 0px 0px 0px; font-size:6px; line-height:10px; background-color:#000000;" align="center">
<table align="center">
<tbody>
<tr><td style="padding: 0px 5px;">
<a href="https://github.com/orangecoding/fredy" target="_blank" alt="Fredy" title="Powered by Fredy" style="color:#00dc73; font-size:17px">
Powered by Fredy
</a>
</td></tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table></table><table class="module" role="module" data-type="spacer" border="0" cellpadding="0" cellspacing="0" width="100%" style="table-layout: fixed;" data-muid="35xFa9abxGTBYt9yR9BeQ2">
<tbody><tr>
<td style="padding:0px 0px 30px 0px;" role="module-content" bgcolor="#000000">
<a href="{{this.link}}" target="_blank">
<img src="{{this.image}}" alt="{{this.title}}" width="640" style="width:100%;height:auto;background:#1a1a1a;" />
</a>
</td>
</tr>
{{/if}}
<tr>
<td style="padding:16px 18px 0 18px;">
<a href="{{this.link}}" target="_blank" style="color:#ffffff;">
<h2 class="h2">{{this.title}}</h2>
</a>
</td>
</tr>
</tbody></table></td>
</tr>
</tbody></table>
<!--[if mso]>
</td>
</tr>
</table>
</center>
<tr><td class="sp-8"></td></tr>
<tr>
<td style="padding:0 18px;">
<table role="presentation" width="100%">
<tr>
<td class="stack" style="vertical-align:top; width:50%; padding-right:8px;">
<p class="meta"><strong>Price</strong><br/>{{#if this.price}}{{this.price}}{{else}}unknown{{/if}}</p>
</td>
<td class="stack" style="vertical-align:top; width:50%; padding-left:8px;">
<p class="meta"><strong>Size</strong><br/>{{#if this.size}}{{this.size}}{{else}}unknown{{/if}}</p>
</td>
</tr>
<tr><td class="sp-8"></td><td class="sp-8"></td></tr>
<tr>
<td colspan="2">
<p class="meta"><strong>Address</strong><br/>{{#if this.address}}{{this.address}}{{else}}unknown{{/if}}</p>
</td>
</tr>
</table>
</td>
</tr>
<tr><td class="sp-16"></td></tr>
<tr>
<td align="left" style="padding:0 18px 18px 18px;">
<!--[if mso]>
<v:roundrect xmlns:v="urn:schemas-microsoft-com:vml" href="{{this.link}}" arcsize="8%" strokecolor="#00dc73" strokeweight="0" fillcolor="#00dc73" style="height:40px;v-text-anchor:middle;width:180px;">
<w:anchorlock/>
<center style="color:#0b0b0b;font-family:Arial;font-size:14px;font-weight:bold;">
View Listing
</center>
</v:roundrect>
<![endif]-->
</td>
</tr>
</tbody></table>
</td>
</tr>
</tbody></table>
</td>
</tr>
</tbody></table>
</div>
</center>
<!--[if !mso]><!-- -->
<a href="{{this.link}}" class="btn" target="_blank">View Listing</a>
<!--<![endif]-->
</td>
</tr>
</table>
</td>
</tr>
<tr><td class="sp-24"></td></tr>
{{/each}}
</body></html>
<tr><td class="divider"></td></tr>
<tr><td class="sp-16"></td></tr>
<tr>
<td align="center">
<p class="p" style="color:#9f9f9f;">Powered by Fredy</p>
</td>
</tr>
<tr><td class="sp-20"></td></tr>
</table>
</td>
</tr>
</table>
</body>
</html>