php监控apple store是否有货【2014-09-15】(服务器端)

一年一度的苹果新品刚发布后的几天,9月12号就正式上市了,按照惯例,果农们又得在网上拼个你死我活了,香港苹果店在12号下午3点后正式开放购买,还没来得及写好脚本,经过不断的按F5和enter,不懈努力之下,抢到了1台!

抢收过后,特意写下这个脚本,监控苹果网上商店是否有货,有货第一时间发出邮件通知我,网上有类似的订阅服务,留个邮件地址也能收到相关的提醒,也有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.storeimages.cdn-apple.com/7872/as-images.apple.com/is/image/AppleInc/aos/published/images/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=\"image\"/>",
 "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分钟(假如邮件能够正常发送成功的话)。

时间: 2024-08-24 07:42:19

php监控apple store是否有货【2014-09-15】(服务器端)的相关文章

2014/09/15

新的一周又开始了,包括连绵不断的雨,和上周没什么不同,但是心里面却空落落的,总希望这就是一个梦,臭蛋去京城了,送到北客站后,还都认为只是出去那么几天,很快就回来了,一年半载啊,不知道有多久... 这周有两个期待,都和堕落有关,一当然是今天明天就工资到账的事情,二是买了一个3D的投影仪,相信顺丰很快就会送到的,周末把房间收拾出一块空地,然后投出100寸的大屏幕看3D电影,想想就很有感觉啊...

极路由访问Apple Store可以浏览但是不能下载的解决方案

最近在家里上网突然发现Apple Store不能更新了.重启路由器发现最开始一会是能下载更新的,但是过了一会就完全不能下载更新了.很是奇怪,今天特意分析了一下这个问题. 首先,抓包确定Apple Store的下载域名为:iosapps.itunes.apple.com: 第二步,ping一下下载域名看是否能够ping通,发现连域名都不能解析,确定应该是DNS的问题: [email protected]:~# ping -c 5 iosapps.itunes.apple.com ping: bad

2014 5 15

今天   去报名那个啥子辅修专业了,报的是复旦大学的金融学,他们好多都说这个辅修没多大用处,而且很水,我只想说呵呵..因为我看到了一个职业是金融软件工程师,然后个人对金融这块还比较感兴趣,学的什么国际金融,还有证卷什么的,感觉高大上啊! 无所谓,个人觉得还行,啥子认真学都好吧,关键是现在的大时代下,我要强大自己,感觉学金融结合计算机,以后好些! 今天中午我收到短信,关于明天对毕业生寄语的拍摄,瞬间有了各大部长的电话,挨着挨着发短信.苦逼吧.. 晚上么有啥子纠结,吃完饭,来了一杯大大的奶昔,吃的哥

12.我们不是在真空里谈软件工程, 软件要运行在硬件芯片上面, 下面看看一个计算机芯片的发展历史: http://perspectives.mvdirona.com/2014/09/august-21-2014-computer-history-museum-presentation/ http://mvdirona.com/jrh/TalksAndPapers/DileepBhandar

电脑芯片的诞生和发展是20世纪最伟大的发明之一,芯片技术决定了计算机升级换代的速度,决定了计算机小型化实现的程度,决定了计算机智能化的程度,决定了计算机普及化的应用深度. 1971年11月15日,英特尔公司推出了第一枚微处理器——4004芯片.这一举措不仅改变了公司的未来,而且对整个工业产生了深远的影响.同年,intel推出了1103DRAM核心内纯. 1974年,英特尔公司推出了划时代的处理器,Intel 8080.采用了复杂的 指令集以及40管脚封装,8080的处理能力大为提高,其功能是80

每天学点linux (更新:2014.08.15)

1.shell脚本如何debug? 第一次写了300行的shell脚本,这么一大坨怎么debug呀?难道一块一块拿出来测试吗? [[email protected] ~]# sh [-nvx] scripts.sh 选项与参数: -n :不要运行 script,仅查询语法的问题: -v :再运行 sccript 前,先将 scripts 的内容输出到萤幕上: -x :将使用到的 script 内容显示到萤幕上,这是很有用的参数! 参考:http://vbird.dic.ksu.edu.tw/li

2014.7.15 项目合作方案大纲

第一章 项目背景 1.合作双方基本情况: 编写要点:公司名称,主营业务,注册地区,公司地点,电话传真联系人. 项目公司与关联公司.公司组织结构.管理层构成.地理位置.发展战略 2.行业背景和政策背景: 编写要点:行业发展历史及趋势,那些行业的变化对产品利润,利润率影响较大,进入该行业的技术壁垒,贸易壁垒,政策限制等,行业市场前景分析与预测 行业情况.产品原料市场分析.目标区域产品供应现状与预测(目标市场分析).产品市场供给状况分析.产品市场需求状况分析.产品市场平衡性分析. 产品销售渠道分析.竞

PHP——封装数据库的函数(增,删,改)2014.5.15的总结

1:完整版的封装函数(增(insert),删(delete),改(update)) 例:<?php //编写数据库操作的封装函数 function mysql_bind(){ //首先我们不知道外面会传入多少个参数    //可以用func_get_args()方法来获取全部传入参数,这个方法返回全部参数的数组   //和func_get_args()方法相对应的其实还有一个func_num_args()来获取参数个数    $args = func_get_args();     //通过使用

oracle__学习笔记2014.09.05

oracle学习笔记2014.09.05 测试数据库配置的信息 全局数据库名:xiuhao 系统标识符(SID):xiuhao 服务器参数文件名:c:\oracle\dbs\spfilexiuhao.ora database control URL: http://C-1:5500/em sys以及system解锁 edit 以文本格式打开当前命令/ / 执行当前命令 l [num] 显示缓存区命令 get [file] 把file中的文件加入到缓冲区 c /[str] /[str] 修改当前语

19.12添加自定义监控项目19.13-14配置邮件告警19.15测试告警19.16不发邮件问题处理

19.12添加自定义监控项目客户端上编辑配置文件 vim /etc/zabbix/zabbix_agentd.conf//增加UnsafeUserParameters=1 //表示使用自定义脚本UserParameter=my.estab.count[],/usr/local/sbin/estab.sh//自定义监控项的key为my.estab.count,后面的[]里面写脚本的参数,如果没有参数则可以省略,脚本为/usr/local/sbin/estab.sh搜索 /UnsafeUserPar