if (!empty($rate) && $rate < 76 && $item->{"Availability"} != "Sold Out" && !empty($info->{'LegoID'})) { $ret = publish_SaleMessage("toysrus.com", $ToysrusID, $price, $info->{'LegoID'}); if (!$ret->{'Status'}) { echo "[Info][" . date('Y-m-d H:i:s') . "] " . $info->{'LegoID'} . " on sale for \$" . $price . " (" . $rate . "% off from reg. \$" . $info->{'MSRP'} . ") www.toysrus.com/product/index.jsp?productId=" . $ToysrusID . "\n"; } else { echo "[Warning][" . date('Y-m-d H:i:s') . "] Failed to publish tweet due to " . $ret->{'Message'} . ": " . $info->{'LegoID'} . " on sale for \$" . $price . " (" . $rate . "% off from reg. \$" . $info->{'MSRP'} . ")\n"; } } } elseif (!empty($item->{'LegoID'})) { $legoID = $item->{'LegoID'}; db_insert("Toysrus_Item", array("LegoID" => $legoID, "ToysrusID" => $ToysrusID), null, true); echo "[Info][" . date('Y-m-d H:i:s') . "] New item added by legoid: " . $legoID . " - " . $item->{'Title'} . " www.toysrus.com/product/index.jsp?productId=" . $ToysrusID . "\n"; send_Message(NOTIFICATION_RECIPIENT, "New Toysrus_Item " . $legoID . " - " . $item->{'Title'} . " listed on www.toysrus.com/product/index.jsp?productId=" . $ToysrusID); } else { // try to match the legoid by title. $ret = search_legoid(array("Title" => $item->{'Title'})); if (isset($ret->{'MatchID'})) { $legoID = $ret->{'MatchID'}; db_insert("Toysrus_Item", array("LegoID" => $legoID, "ToysrusID" => $ToysrusID), null, true); } else { $legoID = null; db_insert("Toysrus_Item", array("LegoID" => "", "ToysrusID" => $ToysrusID), null, true); } echo "[Info][" . date('Y-m-d H:i:s') . "] New item added by title: " . $legoID . " - " . $item->{'Title'} . " www.toysrus.com/product/index.jsp?productId=" . $ToysrusID . "\n"; send_Message(NOTIFICATION_RECIPIENT, "New Toysrus_Item " . $legoID . " - " . $item->{'Title'} . " listed on www.toysrus.com/product/index.jsp?productId=" . $ToysrusID); } } if (!empty($arrNoupdate)) { $ret = db_update("Toysrus_Item", array("LastUpdateTime" => gmdate('Y-m-d H:i:s')), "ToysrusID IN (" . implode(",", $arrNoupdate) . ")"); echo "[Info][" . date('Y-m-d H:i:s') . "] No update for " . count($arrNoupdate) . " items\n"; }
function price_scan($provider) { $tlbName = $provider . "_Item"; if ($provider == "Amazon") { $idName = "ASIN"; } else { $idName = $provider . "ID"; } $ret = db_query($tlbName . " LEFT JOIN DB_Set ON " . $tlbName . ".LegoID = DB_Set.LegoID LEFT JOIN DB_Theme ON DB_Set.ThemeID = DB_Theme.ThemeID", array($idName, $tlbName . ".LegoID AS LegoID", "ETitle AS Title", "ETheme AS Theme", $tlbName . ".Availability AS Availability", "Price", "USPrice AS MSRP"), null); if (!$ret->{'Status'}) { foreach ($ret->{'Results'} as $item) { $idx = $item->{$idName}; $dbItems["{$idx}"] = $item; } } echo "[Info][" . date('Y-m-d H:i:s') . "] " . count($dbItems) . " items loaded from DB Table {$tlbName}\n"; $ret = crawl_price($provider); if ($ret->{'ItemCount'}) { $crawlItems = $ret->{'Items'}; } echo "[Info][" . date('Y-m-d H:i:s') . "] " . count($crawlItems) . " items crawled from page " . $ret->{'URL'} . "\n"; $arrNoupdate = array(); foreach ($crawlItems as $crawlitem) { $itemID = $crawlitem->{$idName}; if (isset($dbItems["{$itemID}"])) { $dbitem = $dbItems["{$itemID}"]; $msrp = $dbitem->{'MSRP'}; $price = $crawlitem->{'Price'}; if ($msrp && $price) { $rate = 100 - round($price / $msrp * 100); } else { $rate = null; } $arrfields = array(); $arrProp = array("Price", "Availability"); foreach ($arrProp as $prop) { if (!empty($crawlitem->{"{$prop}"}) && $crawlitem->{"{$prop}"} != $dbitem->{"{$prop}"}) { $arrfields[$prop] = $crawlitem->{$prop}; } } if ($arrfields['Availability'] == "Unknown") { unset($arrfields['Availability']); } if (!empty($arrfields)) { $arrfields['LastUpdateTime'] = gmdate('Y-m-d H:i:s'); $ret = db_update($tlbName, $arrfields, array($idName => $itemID)); if (!$ret->{'Status'}) { unset($arrfields['LastUpdateTime']); $strupdate = ""; foreach ($arrfields as $prop => $value) { $strupdate .= $prop . "[" . $dbitem->{$prop} . "=>" . $value . "], "; } $strupdate = trim($strupdate, ", "); echo "[Info][" . date('Y-m-d H:i:s') . "] " . $tlbName . " " . $dbitem->{'LegoID'} . " - " . $dbitem->{'Title'} . " updated: " . $strupdate . " " . get_url_by_itemID($provider, $itemID) . "\n"; //send_Message(NOTIFICATION_RECIPIENT, "Toysrus_Item ".$dbitem->{'LegoID'}." - ".$dbitem->{'Title'}." updated: ".$strupdate." www.toysrus.com/product/index.jsp?productId=$ToysrusID"); } if (!empty($rate) && $rate > 25 && ($crawlitem->{"Availability"} == "Available" || $crawlitem->{"Availability"} == "Shipping Only") && !empty($dbitem->{'LegoID'})) { $ret = db_query("Twitter_Pool", array("TweetID", "Price"), "Provider='" . $provider . "' AND ItemID='" . $itemID . "' AND AddTime > '" . gmdate('Y-m-d H:i:s', strtotime('-7 days')) . "' ORDER BY AddTime DESC"); if (!$ret->{'Status'} && $ret->{'Results'}) { $tweetID = $ret->{'Results'}[0]->{"TweetID"}; $lastPrice = $ret->{'Results'}[0]->{"Price"}; $lastRate = 100 - round($lastPrice / $msrp * 100); if ($rate - $lastRate > 2) { $message = "[" . $dbitem->{'LegoID'} . "] " . $dbitem->{'Theme'} . " - " . ${$dbitem}->{'Title'} . " was reduced even further to \$" . $price . " (" . $rate . "% off from reg.\$" . $msrp . ") "; //retweet. add_deal_tweet_pool($provider, $message, $itemID, $dbitem->{'LegoID'}, $price); //send_Message(NOTIFICATION_RECIPIENT, $message); } else { $message = "[" . $dbitem->{'LegoID'} . "] is on sale for \$" . $price . " (" . $rate . "% off from reg.\$" . $msrp . ") has been posted by " . $tweetID; } } else { $message = "[" . $dbitem->{'LegoID'} . "] " . $dbitem->{'Theme'} . " - " . $dbitem->{'Title'} . " is on sale for \$" . $price . " (" . $rate . "% off from reg.\$" . $msrp . ") "; //new tweet. add_deal_tweet_pool($provider, $message, $itemID, $dbitem->{'LegoID'}, $price); } //echo "[Info][".date('Y-m-d H:i:s')."] ".$message."\n"; } } else { array_push($arrNoupdate, $itemID); } } elseif (!empty($crawlitem->{'LegoID'})) { $legoID = $crawlitem->{'LegoID'}; db_insert($tlbName, array("LegoID" => $legoID, $idName => $itemID), null, true); echo "[Info][" . date('Y-m-d H:i:s') . "] New item added by legoid: " . $legoID . " - " . $crawlitem->{'Title'} . " " . get_url_by_itemID($provider, $itemID) . "\n"; //send_Message(NOTIFICATION_RECIPIENT, "New Toysrus_Item ".$legoID." - ".$crawlitem->{'Title'}." listed on www.toysrus.com/product/index.jsp?productId=".$ToysrusID); } else { // try to match the legoid by title. $ret = search_legoid(array("Title" => $crawlitem->{'Title'})); if (isset($ret->{'MatchID'})) { $legoID = $ret->{'MatchID'}; db_insert($tlbName, array("LegoID" => $legoID, $idName => $itemID), null, true); } else { $legoID = null; db_insert($tlbName, array("LegoID" => "", $idName => $itemID), null, true); } echo "[Info][" . date('Y-m-d H:i:s') . "] New item added by title: " . $legoID . " - " . $crawlitem->{'Title'} . " " . get_url_by_itemID($provider, $itemID) . "\n"; //send_Message(NOTIFICATION_RECIPIENT, "New ".$tlbName." ".$legoID." - ".$crawlitem->{'Title'}." listed on ".get_url_by_itemID($provider, $itemID); } } if (!empty($arrNoupdate)) { $ret = db_update($tlbName, array("LastUpdateTime" => gmdate('Y-m-d H:i:s')), $idName . " IN (" . implode(",", $arrNoupdate) . ")"); echo "[Info][" . date('Y-m-d H:i:s') . "] No update for " . count($arrNoupdate) . " items\n"; } }
function crawl_target() { $page = 1; $perpage = 120; // max per page = 40 $ret = new stdClass(); $ret->{'Provider'} = "www.target.com"; $ret->{'URL'} = "http://redsky.target.com/v1/plp/search?category=5xtb0&sort_by=Featured&faceted_value=56h5n"; $ret->{'ItemCount'} = 0; $ret->{'Items'} = array(); for ($i = 0; $i < $page; $i++) { $url = $ret->{'URL'} . "&count=" . $perpage . "&offset=" . $i * $perpage; $response = json_decode(curl($url)); $total = intval($response->search_response->metaData[1]->value); $page = ceil($total / $perpage); $items = $response->search_response->items->Item; foreach ($items as $item) { $retItem = new stdClass(); $retItem->{'Price'} = str_replace("\$", "", $item->offer_price->price); $retItem->{'Title'} = $item->title; $retItem->{'TargetID'} = $item->tcin; $availability = $item->availability_status; if ($availability == "IN_STOCK") { $retItem->{'Availability'} = "Available"; } elseif ($availability == "OUT_OF_STOCK") { $retItem->{'Availability'} = "Out of Stock"; } else { $retItem->{'Availability'} = "Unknown"; } preg_match_all("/\\d{4,8}/u", $retItem->{'Title'}, $matches); if (isset($matches)) { $legoID = intval(array_pop(array_pop($matches))); if ($legoID > intval(gmdate('Y'))) { $retItem->{'LegoID'} = $legoID; } } else { $retSearch = search_legoid(array("Barcode" => $item->upc)); if (isset($retSearch->{'MatchID'})) { $retItem->{'LegoID'} = $retSearch->{'MatchID'}; } else { $retItem->{'LegoID'} = null; } } if (!in_array($retItem, $ret->{'Items'}) && !empty($retItem->{'TargetID'})) { $ret->{'ItemCount'}++; array_push($ret->{'Items'}, $retItem); } } } return $ret; }