Kelkoo.php 5.83 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
<?php

namespace app\Models\parserSkripte;

use App\Models\Searchengine;
use Log;

class Kelkoo extends Searchengine
{
    public $results = [];
Aria Givi's avatar
Aria Givi committed
11
    public $unsignedGetString = "";
12
13
14
15

    public function __construct($name, \StdClass $engine, \App\MetaGer $metager)
    {
        parent::__construct($name, $engine, $metager);
Aria Givi's avatar
Aria Givi committed
16
17
18
        $this->unsignedGetString = $this->getString;
        $this->getString = $this->UrlSigner($this->unsignedGetString);
        # var_dump($this->getString);
19
20
21
22
23
24
25
        $this->hash = md5($this->engine->host . $this->getString . $this->engine->port . $this->name);
    }

       
    public function loadResults($result)
    {
        $result = preg_replace("/\r\n/si", "", $result);
Aria Givi's avatar
Aria Givi committed
26
27
       # var_dump($result);
       # die();
28
29
        # delete namespace, allowing easier xpath access
        $result = str_replace('xmlns="urn:yahoo:prods"', '', $result);
30
31
32
33
34
        try {
            $content = simplexml_load_string($result);
            if (!$content) {
                return;
            }
35
36
37
38
39
40
41
42
43
            # Kekloo gives us the total Result Count
            $resultCount = $content->xpath('/ProductSearch/Products/@totalResultsAvailable');
            if (sizeof($resultCount) > 0) {
                $resultCount = intval($resultCount[0]->__toString());
            } else {
                $resultCount = 0;
            }
            $this->totalResults = $resultCount;
            $results = $content->xpath('/ProductSearch/Products/Product/Offer');
44
45
46

            foreach ($results as $result) {
                $result      = simplexml_load_string($result->saveXML());
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

                $title       = $result->Title[0]->__toString();
                
                $price = floatval($result->Price[0]->Price[0]);
                $deliveryPrice = floatval($result->Price[0]->DeliveryCost[0]);
                $totalPrice = $price + $deliveryPrice;

                $descr = "";
            
                if(isset($result->Description[0]))
                {
                    $descr       = $result->Description[0]->__toString();
                }
                $descr .= "<p>Preis: " . $price . " €</p>";
                $image       = $result->Images[0]->Image[0]->Url[0]->__toString();
                $link        = $result->Url[0]->__toString();
                $anzeigeLink = $result->Merchant[0]->Name[0]->__toString();
64
65
66
67
68
69
70
71
72
                $this->counter++;
                $this->results[] = new \App\Models\Result(
                    $this->engine,
                    $title,
                    $link,
                    $anzeigeLink,
                    $descr,
                    $this->engine->{"display-name"},$this->engine->homepage,
                    $this->counter,
73
74
                    ['image' => $image,
                     'price' => $totalPrice * 100]
75
76
77
78
79
80
81
82
83
                );
            }
        } catch (\Exception $e) {
            Log::error("A problem occurred parsing results from $this->name:");
            Log::error($e->getMessage());
            return;
        }
    }

84
85
    public function getNext(\App\MetaGer $metager, $result)
    {
Aria Givi's avatar
Aria Givi committed
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
        $result = preg_replace("/\r\n/si", "", $result);
        # delete namespace, allowing easier xpath access
        $result = str_replace('xmlns="urn:yahoo:prods"', '', $result);
        try {
            $content = simplexml_load_string($result);
            if (!$content) {
                return;
            }
        } catch (\Exception $e) {
            Log::error("A problem occurred parsing results from $this->name:");
            Log::error($e->getMessage());
            return;
        }
        # Kekloo gives us the total Result Count
        $resultCount = $content->xpath('/ProductSearch/Products/@totalResultsAvailable');
        if (sizeof($resultCount) > 0) {
            $resultCount = intval($resultCount[0]->__toString());
        } else {
            $resultCount = 0;
        }
        $this->totalResults = $resultCount;

        // Get the current Result Position
        $current = 0;
        if (strpos($this->getString, "&start=") !== false) {
            $tmp = substr($this->getString, strpos($this->getString, "&start=") + 7);
            if (strpos($tmp, "&") !== false) {
                $tmp = substr($tmp, 0, strpos($tmp, "&"));
            }
            $current = intval($tmp);
        }

        if ($current >= ($this->totalResults - 20)) {
            return;
        }

        # Erstellen des neuen Suchmaschinenobjekts und anpassen des GetStrings:
        $next = new Kelkoo($this->name, $this->engine, $metager);
        $next->unsignedGetString .= "&start=" . ($current + 20);
        $next->getString = $next->UrlSigner($next->unsignedGetString);
        
        $next->hash = md5($next->engine->host . $next->getString . $next->engine->port . $next->name);
        $this->next = $next;
129
130
    }

131
132

    # kelkoogroup.com/kelkoo-customer-service/kelkoo-developer-network/shopping-services/samples/signing-url-php/
Aria Givi's avatar
Aria Givi committed
133
    public function UrlSigner($path){
134
        
Aria Givi's avatar
Aria Givi committed
135
        $urlPath = $path;
136
137
138
139
140
141
142
143
144
145
146
147
148
149
        $partner = $this->engine->{"http-auth-credentials"}->ID;
        $key = $this->engine->{"http-auth-credentials"}->Key;

        $URL_sig = "hash";
        $URL_ts = "timestamp";
        $URL_partner = "aid"; 
        $URLreturn = "";
        $URLtmp = "";
        $s = "";
        // get the timestamp
        $time = time();
        // replace " " by "+"
        $urlPath = str_replace(" ", "+", $urlPath);
        // format URL
Aria Givi's avatar
Aria Givi committed
150
        $URLtmp = $urlPath . "&" . $URL_partner . "=" . $partner . "&" . $URL_ts . "=" . $time;
151
152
153
154
155
156
157
158
159
160
161
       
        // URL needed to create the token
        $s = $urlPath . "&" . $URL_partner . "=" . $partner . "&" . $URL_ts . "=" . $time . $key;
        $token = "";
        $token = base64_encode(pack('H*', md5($s)));
        $token = str_replace(array("+", "/", "="), array(".", "_", "-"), $token);
        $URLreturn = $URLtmp . "&" . $URL_sig . "=" . $token;
        return $URLreturn;

    }
}