array( 'name' => 'ASIN', 'required' => true, 'exampleValue' => 'B071GB1VMQ', // https://stackoverflow.com/a/12827734 'pattern' => 'B[\dA-Z]{9}|\d{9}(X|\d)', ), 'tld' => array( 'name' => 'Country', 'type' => 'list', 'values' => array( 'Australia' => 'com.au', 'Brazil' => 'com.br', 'Canada' => 'ca', 'China' => 'cn', 'France' => 'fr', 'Germany' => 'de', 'India' => 'in', 'Italy' => 'it', 'Japan' => 'co.jp', 'Mexico' => 'com.mx', 'Netherlands' => 'nl', 'Spain' => 'es', 'Sweden' => 'se', 'United Kingdom' => 'co.uk', 'United States' => 'com', ), 'defaultValue' => 'com', ), )); const PRICE_SELECTORS = array( '#priceblock_ourprice', '.priceBlockBuyingPriceString', '#newBuyBoxPrice', '#tp_price_block_total_price_ww', 'span.offer-price', '.a-color-price', ); protected $title; /** * Generates domain name given a amazon TLD */ private function getDomainName() { return 'https://www.amazon.' . $this->getInput('tld'); } /** * Generates URI for a Amazon product page */ public function getURI() { if (!is_null($this->getInput('asin'))) { return $this->getDomainName() . '/dp/' . $this->getInput('asin'); } return parent::getURI(); } /** * Scrapes the product title from the html page * returns the default title if scraping fails */ private function getTitle($html) { $titleTag = $html->find('#productTitle', 0); if (!$titleTag) { return $this->getDefaultTitle(); } else { return trim(html_entity_decode($titleTag->innertext, ENT_QUOTES)); } } /** * Title used by the feed if none could be found */ private function getDefaultTitle() { return 'Amazon.' . $this->getInput('tld') . ': ' . $this->getInput('asin'); } /** * Returns name for the feed * Uses title (already scraped) if it has one */ public function getName() { if (isset($this->title)) { return $this->title; } else { return parent::getName(); } } private function parseDynamicImage($attribute) { $json = json_decode(html_entity_decode($attribute), true); if ($json and count($json) > 0) { return array_keys($json)[0]; } } /** * Returns a generated image tag for the product */ private function getImage($html) { $imageSrc = $html->find('#main-image-container img', 0); if ($imageSrc) { $hiresImage = $imageSrc->getAttribute('data-old-hires'); $dynamicImageAttribute = $imageSrc->getAttribute('data-a-dynamic-image'); $image = $hiresImage ?: $this->parseDynamicImage($dynamicImageAttribute); } $image = $image ?: 'https://placekitten.com/200/300'; return << EOT; } /** * Return \simple_html_dom object * for the entire html of the product page */ private function getHtml() { $uri = $this->getURI(); return getSimpleHTMLDOM($uri) ?: returnServerError('Could not request Amazon.'); } private function scrapePriceFromMetrics($html) { $asinData = $html->find('#cerberus-data-metrics', 0); //