php監控apple store是否有貨【2014-09-15】(服務器端)

一年一度的蘋果新品剛發佈後的幾天,9月12號就正式上市了,按照慣例,果農們又得在網上拼個你死我活了,香港蘋果店在12號下午3點後正式開放購買,還沒來得及寫好腳本,經過不斷的按F5和enter,不懈努力之下,搶到了1臺!

搶收過後,特意寫下這個腳本,監控蘋果網上商店是否有貨,有貨第一時間發出郵件通知我j_0061.gif,網上有類似的訂閱服務,留個郵件地址也能收到相關的提醒,也有chrom或者firefox的插件能夠在瀏覽器定時監控,有貨第一時間發出窗口通知或者播放警告聲。

此類服務的原理大多使用同一原理,就是發送get請求,獲取蘋果服務器的迴應json字符串,判斷裏面的值,比如這次有isBuyable:true/false.獲取方法有很多,比如我這次寫的php,運行在服務器端,也能用javascript寫,在瀏覽器定時運行,也能做成瀏覽器插件,接收來自服務器的返回信息並根據對應的迴應進行相關的觸發提醒。

至於怎麼獲取或者怎麼知道蘋果服務器的get url,有開發經驗的童鞋肯定用過firefox 的firebug, 打開http://store.apple.com/hk-zh/buy-iphone/iphone6/ 購買的網頁後,打開firebug,然後按照正常購買的流程,比如選擇"iphone 6 plus"->"金色"->"64GB",留意這些選項都選中之後,在firebug的網絡模塊裏可以看到瀏覽器發出了"http://store.apple.com/hk-zh/buyFlowSelectionSummary/IPHONE6P?node=home/shop_iphone/family/iphone6&step=select&option.dimensionScreensize=5_5inch&option.dimensionColor=gold&option.dimensionCapacity=128gb&option.carrierModel=UNLOCKED%2FWW&carrierPolicyType=UNLOCKED" 這樣的請求,然後打開該請求的響應信息,內容很長,基本如下:

{"head":{"status":"200","data":{}},
 "body":{"content":{"pageURL":"5.5-吋螢幕-128gb-金色-已解鎖",
 "selected":{"productImage":"<img src=\"http://store.storep_w_picpaths.cdn-apple.com/7872/as-p_w_picpaths.apple.com/is/p_w_picpath/AppleInc/aos/published/p_w_picpaths/i/ph/iphone6p/gold/iphone6p-gold-select-2014_GEO_HK_LANG_ZH?wid=110&amp;hei=78&amp;fmt=jpeg&amp;qlt=95&amp;op_sharpen=0&amp;resMode=bicub&amp;op_usm=0.5,1.5,0,0&amp;iccEmbed=0&amp;layer=comp&amp;.v=1410265171755\"  alt=\"\" width=\"110\" height=\"78\" data-scale-params-2=\"wid=220&amp;hei=156&amp;fmt=jpeg&amp;qlt=95&amp;op_sharpen=0&amp;resMode=bicub&amp;op_usm=0.5,1.5,0,0&amp;iccEmbed=0&amp;layer=comp&amp;.v=1410265171755\"  itemprop=\"p_w_picpath\"/>",
 "productTitle":"iPhone 6 Plus 128GB 金色 已解鎖",
 "purchaseOptions":{"financing":"\n\n\n\n\n\n",
                   "promotions":"\n\n<span class=\"gift-card\">\n\n</span>\n",
                   "shippingPrice":"\n<span class=\"freeshipping promo-text\">免費運送</span>",
                   "shippingLead":"\n預計出貨時間<b>:</b><br/>\n<span class=\"customer_commit_display\">暫時無法提供</span>\n\n",
                   "price":"\n<span class=\"current_price\">\n<span itemscope=\"itemscope\" itemprop=\"offers\" itemtype=\"http://schema.org/Offer\">\n\n<meta itemprop=\"priceCurrency\" content=\"HKD\"/>\n<span itemprop=\"price\">\nHK$8,088\n</span>\n</span>\n</span>\n\n\n",
                   "isBuyable":false},
 "partNumber":"MGAF2ZP/A"},
 "pageTitle":"iPhone 6 Plus 128GB 金色 已解鎖 - Apple Store (香港)"}}}


返回的json裏面,包含了isBuyable的參數,估計蘋果就是利用這個響應來判斷是否有存貨,並且來控制頁面的操作。


知道這個原理後,就可以着手寫腳本了,主要是用curl的api來發送請求,將返回的json轉換爲array,並判斷該字段的值,false爲無貨,true爲有貨,代碼已完成,摘錄如下:

<?php
$recipient="[email protected],[email protected],[email protected]";
$from="From: [email protected]\r\n";
$subject="iPhone6 available";
$headers = $from."Content-type: text/html\r\n";
$user_agent="Mozilla/5.0 (Windows NT 6.1; rv:32.0) Gecko/20100101 Firefox/32.0";
$iphone6=array(
                0=>array('screensize'=>'4_7inch','color'=>'silver','capacity'=>'16gb'),
                1=>array('screensize'=>'4_7inch','color'=>'space_gray','capacity'=>'16gb'),
                2=>array('screensize'=>'4_7inch','color'=>'gold','capacity'=>'16gb'),
                3=>array('screensize'=>'4_7inch','color'=>'silver','capacity'=>'64gb'),
                4=>array('screensize'=>'4_7inch','color'=>'space_gray','capacity'=>'64gb'),
                5=>array('screensize'=>'4_7inch','color'=>'gold','capacity'=>'64gb'),
                6=>array('screensize'=>'4_7inch','color'=>'silver','capacity'=>'128gb'),
                7=>array('screensize'=>'4_7inch','color'=>'space_gray','capacity'=>'128gb'),
                8=>array('screensize'=>'4_7inch','color'=>'gold','capacity'=>'128gb'),
                );
$iphone6plus=array(
                0=>array('screensize'=>'5_5inch','color'=>'silver','capacity'=>'16gb'),
                1=>array('screensize'=>'5_5inch','color'=>'space_gray','capacity'=>'16gb'),
                2=>array('screensize'=>'5_5inch','color'=>'gold','capacity'=>'16gb'),
                3=>array('screensize'=>'5_5inch','color'=>'silver','capacity'=>'64gb'),
                4=>array('screensize'=>'5_5inch','color'=>'space_gray','capacity'=>'64gb'),
                5=>array('screensize'=>'5_5inch','color'=>'gold','capacity'=>'64gb'),
                6=>array('screensize'=>'5_5inch','color'=>'silver','capacity'=>'128gb'),
                7=>array('screensize'=>'5_5inch','color'=>'space_gray','capacity'=>'128gb'),
                8=>array('screensize'=>'5_5inch','color'=>'gold','capacity'=>'128gb'),
                );

// iphone 6 
foreach ($iphone6 as $model)
{
    $screensize=$model['screensize'];
    $color=$model['color'];
    $capacity=$model['capacity'];
    $json_url="http://store.apple.com/hk/buyFlowSelectionSummary/IPHONE6?node=home/shop_iphone/family/iphone6&step=select&option.dimensionScreensize=".$screensize."&option.dimensionColor=".$color."&option.dimensionCapacity=".$capacity."&option.carrierModel=UNLOCKED%2FWW&carrierPolicyType=UNLOCKED";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $json_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);//僞裝成瀏覽器
    $str=curl_exec($ch);
    $str_array=json_decode($str,true);
    curl_close($ch);
    $available=$str_array['body']['content']['selected']['purchaseOptions']['isBuyable'];
    $partnumber=$str_array['body']['content']['selected']['partNumber'];
    if ($available!==false)
        {
            echo $screensize."-".$color."-".$capacity.": is available, please go to http://store.apple.com/hk-zh/buy-iphone/iphone6?cppart=UNLOCKED/WW&product=".$partnumber."&step=accessories"."\n";
            $iphone6msg.="<p>".$screensize." ".$color." ".$capacity." is available, <a target=_blank href=\"http://store.apple.com/hk-zh/buy-iphone/iphone6?cppart=UNLOCKED/WW&product=".$partnumber."&step=accessories\">http://store.apple.com/hk-zh/buy-iphone/iphone6?cppart=UNLOCKED/WW&product=".$partnumber."&step=accessories</a></p>";
        }
}
// iphone 6 plus
foreach ($iphone6plus as $model)
{
    $screensize=$model['screensize'];
    $color=$model['color'];
    $capacity=$model['capacity'];
    $json_url="http://store.apple.com/hk/buyFlowSelectionSummary/IPHONE6P?node=home/shop_iphone/family/iphone6&step=select&option.dimensionScreensize=".$screensize."&option.dimensionColor=".$color."&option.dimensionCapacity=".$capacity."&option.carrierModel=UNLOCKED%2FWW&carrierPolicyType=UNLOCKED";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $json_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
    $str=curl_exec($ch);
    $str_array=json_decode($str,true);
    curl_close($ch);
    $available=$str_array['body']['content']['selected']['purchaseOptions']['isBuyable'];
    $partnumber=$str_array['body']['content']['selected']['partNumber'];
    if ($available!==false)
        {
            echo $screensize."-".$color."-".$capacity.": is available, please go to http://store.apple.com/hk-zh/buy-iphone/iphone6?cppart=UNLOCKED/WW&product=".$partnumber."&step=accessories"."\n";
            $iphone6msg.="<p>".$screensize." ".$color." ".$capacity." is available, <a target=_blank href=\"http://store.apple.com/hk-zh/buy-iphone/iphone6?cppart=UNLOCKED/WW&product=".$partnumber."&step=accessories\">http://store.apple.com/hk-zh/buy-iphone/iphone6?cppart=UNLOCKED/WW&product=".$partnumber."&step=accessories</a></p>";
        }
}
    
    if (!empty($iphone6msg))
            {
                mail($recipient,$subject,$iphone6msg,$headers);
            }
    //$json_url="http://store.apple.com/hk/buyFlowSelectionSummary/IPHONE6P?node=home/shop_iphone/family/iphone6&step=select&option.dimensionScreensize=".$screensize."&option.dimensionColor=".$color."&option.dimensionCapacity=".$capacity."&option.carrierModel=UNLOCKED%2FWW&carrierPolicyType=UNLOCKED";
//var_dump($i6);

?>

至於該監控是否準確,有待驗證,只能坐等蘋果有好消息了,希望延遲不會超過10分鐘(假如郵件能夠正常發送成功的話)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章