mirror of
https://github.com/RSS-Bridge/rss-bridge.git
synced 2024-11-27 03:50:42 +03:00
6408123330
* Added header with useragent * copy paste error from local test environment * Fixed missing space in New before * fixed missing space after comma in argument list
185 lines
6.8 KiB
PHP
185 lines
6.8 KiB
PHP
<?php
|
|
|
|
class IdealoBridge extends BridgeAbstract
|
|
{
|
|
const NAME = 'Idealo.de Bridge';
|
|
const URI = 'https://www.idealo.de';
|
|
const DESCRIPTION = 'Tracks the price for a product on idealo.de. Pricealarm if specific price is set';
|
|
const MAINTAINER = 'SebLaus';
|
|
const CACHE_TIMEOUT = 60 * 30; // 30 min
|
|
const PARAMETERS = [
|
|
[
|
|
'Link' => [
|
|
'name' => 'Idealo.de Link to productpage',
|
|
'required' => true,
|
|
'exampleValue' => 'https://www.idealo.de/preisvergleich/OffersOfProduct/202007367_-s7-pro-ultra-roborock.html'
|
|
],
|
|
'ExcludeNew' => [
|
|
'name' => 'Priceupdate: Do not track new items',
|
|
'type' => 'checkbox',
|
|
'value' => 'c'
|
|
],
|
|
'ExcludeUsed' => [
|
|
'name' => 'Priceupdate: Do not track used items',
|
|
'type' => 'checkbox',
|
|
'value' => 'uc'
|
|
],
|
|
'MaxPriceNew' => [
|
|
'name' => 'Pricealarm: Maximum price for new Product',
|
|
'type' => 'number'
|
|
],
|
|
'MaxPriceUsed' => [
|
|
'name' => 'Pricealarm: Maximum price for used Product',
|
|
'type' => 'number'
|
|
],
|
|
]
|
|
];
|
|
|
|
public function getIcon()
|
|
{
|
|
return 'https://cdn.idealo.com/storage/ids-assets/ico/favicon.ico';
|
|
}
|
|
|
|
public function collectData()
|
|
{
|
|
// Needs header with user-agent to function properly.
|
|
$header = [
|
|
'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2.1 Safari/605.1.15'
|
|
];
|
|
|
|
$link = $this->getInput('Link');
|
|
$html = getSimpleHTMLDOM($link, $header);
|
|
|
|
// Get Productname
|
|
$titleobj = $html->find('.oopStage-title', 0);
|
|
$Productname = $titleobj->find('span', 0)->plaintext;
|
|
|
|
// Create product specific Cache Keys with the link
|
|
$KeyNEW = $link;
|
|
$KeyNEW .= 'NEW';
|
|
|
|
$KeyUSED = $link;
|
|
$KeyUSED .= 'USED';
|
|
|
|
// Load previous Price
|
|
$OldPriceNew = $this->loadCacheValue($KeyNEW);
|
|
$OldPriceUsed = $this->loadCacheValue($KeyUSED);
|
|
|
|
// First button is new. Found at oopStage-conditionButton-wrapper-text class (.)
|
|
$FirstButton = $html->find('.oopStage-conditionButton-wrapper-text', 0);
|
|
if ($FirstButton) {
|
|
$PriceNew = $FirstButton->find('strong', 0)->plaintext;
|
|
}
|
|
|
|
// Second Button is used
|
|
$SecondButton = $html->find('.oopStage-conditionButton-wrapper-text', 1);
|
|
if ($SecondButton) {
|
|
$PriceUsed = $SecondButton->find('strong', 0)->plaintext;
|
|
}
|
|
|
|
// Only continue if a price has changed
|
|
if ($PriceNew != $OldPriceNew || $PriceUsed != $OldPriceUsed) {
|
|
// Get Product Image
|
|
$image = $html->find('.datasheet-cover-image', 0)->src;
|
|
|
|
// Generate Content
|
|
if ($PriceNew > 1) {
|
|
$content = "<p><b>Price New:</b><br>$PriceNew</p>";
|
|
$content .= "<p><b>Price New before:</b><br>$OldPriceNew</p>";
|
|
}
|
|
|
|
if ($this->getInput('MaxPriceNew') != '') {
|
|
$content .= sprintf('<p><b>Max Price Used:</b><br>%s,00 €</p>', $this->getInput('MaxPriceNew'));
|
|
}
|
|
|
|
if ($PriceUsed > 1) {
|
|
$content .= "<p><b>Price Used:</b><br>$PriceUsed</p>";
|
|
$content .= "<p><b>Price Used before:</b><br>$OldPriceUsed</p>";
|
|
}
|
|
|
|
if ($this->getInput('MaxPriceUsed') != '') {
|
|
$content .= sprintf('<p><b>Max Price Used:</b><br>%s,00 €</p>', $this->getInput('MaxPriceUsed'));
|
|
}
|
|
|
|
$content .= "<img src=$image>";
|
|
|
|
|
|
$now = date('d.m.j H:m');
|
|
|
|
$Pricealarm = 'Pricealarm %s: %s %s %s';
|
|
|
|
// Currently under Max new price
|
|
if ($this->getInput('MaxPriceNew') != '') {
|
|
if ($PriceNew < $this->getInput('MaxPriceNew')) {
|
|
$title = sprintf($Pricealarm, 'Used', $PriceNew, $Productname, $now);
|
|
$item = [
|
|
'title' => $title,
|
|
'uri' => $link,
|
|
'content' => $content,
|
|
'uid' => md5($title)
|
|
];
|
|
$this->items[] = $item;
|
|
}
|
|
}
|
|
|
|
// Currently under Max used price
|
|
if ($this->getInput('MaxPriceUsed') != '') {
|
|
if ($PriceUsed < $this->getInput('MaxPriceUsed')) {
|
|
$title = sprintf($Pricealarm, 'Used', $PriceUsed, $Productname, $now);
|
|
$item = [
|
|
'title' => $title,
|
|
'uri' => $link,
|
|
'content' => $content,
|
|
'uid' => md5($title)
|
|
];
|
|
$this->items[] = $item;
|
|
}
|
|
}
|
|
|
|
// General Priceupdate
|
|
if ($this->getInput('MaxPriceUsed') == '' && $this->getInput('MaxPriceNew') == '') {
|
|
// check if a relevant pricechange happened
|
|
if (
|
|
(!$this->getInput('ExcludeNew') && $PriceNew != $OldPriceNew ) ||
|
|
(!$this->getInput('ExcludeUsed') && $PriceUsed != $OldPriceUsed )
|
|
) {
|
|
$title .= 'Priceupdate! ';
|
|
|
|
if (!$this->getInput('ExcludeNew')) {
|
|
if ($PriceNew < $OldPriceNew) {
|
|
$title .= 'NEW:⬇ '; // Arrow Down Emoji
|
|
}
|
|
if ($PriceNew > $OldPriceNew) {
|
|
$title .= 'NEW:⬆ '; // Arrow Up Emoji
|
|
}
|
|
}
|
|
|
|
|
|
if (!$this->getInput('ExcludeUsed')) {
|
|
if ($PriceUsed < $OldPriceUsed) {
|
|
$title .= 'USED:⬇ '; // Arrow Down Emoji
|
|
}
|
|
if ($PriceUsed > $OldPriceUsed) {
|
|
$title .= 'USED:⬆ '; // Arrow Up Emoji
|
|
}
|
|
}
|
|
$title .= $Productname;
|
|
$title .= ' ';
|
|
$title .= $now;
|
|
|
|
$item = [
|
|
'title' => $title,
|
|
'uri' => $link,
|
|
'content' => $content,
|
|
'uid' => md5($title)
|
|
];
|
|
$this->items[] = $item;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Save current price
|
|
$this->saveCacheValue($KeyNEW, $PriceNew);
|
|
$this->saveCacheValue($KeyUSED, $PriceUsed);
|
|
}
|
|
}
|