试用Delphi XE7制作Iphone6抢购工具

暑期没地方去,闲着无聊,看到Delphi XE7已出,又加上最近香港Iphone6抢购的火热,而我之前也有关注过Iphone6的抢购,故趁此闲暇时光,做个抢购工具给需要的朋友用一下。

程序的流程,主要是借用了Swish大侠的qworker,HTTPS主要是用了Idhttp去实现,数据的保存使用了JSON

程序下载

http://download.csdn.net/detail/cntlis/8002561

具体的预约代码如下,里边代码不算精炼,主要考虑循环次数有限

procedure DoStartReserveProc(AJob: PQJob);
var
  FTaskInfo: PReserveTasklInfo;
  FHttp: TPNHttp;
  FFindProduct, FFindTimeSlot, FReserveSucess: Boolean;
  FHttpResult, FPartNumbers, FselectedPartNumber, FselectedTimeSlotId: string;
  FHttpParams: TStrings;
  FTimeSlotResultJo, FTimeSlotJa, FPhoneResultJo, FPhoneJa, FReserveResultJo, FReserveErrJa: ISuperObject;
  i, j, k, l, FReserveProductIndex: Integer;
begin
  try
    OnBeginProcessData(AJob, FTaskInfo, FHttp);
    if FTaskInfo.RunStatus<> rsRun then begin
      Workers.Signal(Signal_Stop, AJob.Data);
      Exit;
    end;
    FReserveSucess:= False;
    Inc(FTaskInfo^.CurrReserveStoreIndex);
    if (FTaskInfo^.CurrReserveStoreIndex<0) or (FTaskInfo^.CurrReserveStoreIndex>= Length(FTaskInfo^.UserInfo^.ReserveInfo.StoreList)) then
      FTaskInfo^.CurrReserveStoreIndex:= 0;
    WriteLog(‘开始获取开放预订信息[‘+ FTaskInfo^.UserInfo^.ReserveInfo.StoreList[FTaskInfo^.CurrReserveStoreIndex].StoreName+ ‘]..‘, FTaskInfo.UserIndex, 1);

    FHttp:= CreateHttp(FTaskInfo.CookieMgr);
    try
      FHttpParams:= TStringList.Create;
      FHttpParams.Add(‘_eventId=timeslots‘);
      FHttpParams.Add(‘ajaxSource=true‘);
      FHttpParams.Add(‘p_ie=‘+ FTaskInfo.Param_p_ie);
      FHttpParams.Add(‘storeNumber=‘+ FTaskInfo^.UserInfo^.ReserveInfo.StoreList[FTaskInfo^.CurrReserveStoreIndex].StoreNumber);
      FHttpResult:= FHttp.HttpPost(FUrlToReserveMain+ ‘reserve/iPhone?execution=e1s3‘, FHttpParams, True, True, TEncoding.UTF8);
    finally
      FreeAndNil(FHttpParams);
    end;
    if Pos(FUrlSignInMain, FHttp.Url)> 0 then begin
      WriteLog(‘登录超时,请重新登录..‘, FTaskInfo.UserIndex, 1);
      Workers.Signal(Signal_Login, AJob.Data);
      Exit;
    end;
    FTimeSlotResultJo:= SO(FHttpResult);
    FTimeSlotJa:= FTimeSlotResultJo.N[‘timeslots‘];
    if not FTimeSlotJa.IsType(stArray) then begin
      WriteLog(‘获取店铺开放预订信息失败,‘+ IntToStr(FTaskInfo.UserInfo^.ReservalInterval)+ ‘毫秒后尝试下一店铺‘, FTaskInfo.UserIndex, 1);
      Workers.Delay(DoStartReserveProc, FTaskInfo.UserInfo^.ReservalInterval* 10, AJob.Data);
      Exit;
      //重新开始下一步了哇
    end;
    if FTimeSlotJa.AsArray.Length<= 0 then begin
      WriteLog(‘获取店铺开放预订信息时间戳个数为0,‘+ IntToStr(FTaskInfo.UserInfo^.ReservalInterval)+ ‘毫秒后尝试下一店铺‘, FTaskInfo.UserIndex, 1);
      Workers.Delay(DoStartReserveProc, FTaskInfo.UserInfo^.ReservalInterval* 10, AJob.Data);
      Exit;
      //重新开始下一步了哇
    end else begin
      WriteLog(‘获取店铺开放预订信息成功,时间戳个数:‘+ IntToStr(FTimeSlotJa.AsArray.Length), FTaskInfo.UserIndex, 1);
    end;

    {查询商品库存}
    //拼凑要查询的商品信息
    FFindProduct:= False;
    FPartNumbers:= ‘‘;
    for i := 0 to Length(FTaskInfo.UserInfo^.ReserveInfo.ProductList)- 1 do begin
      if FPartNumbers= ‘‘ then
        FPartNumbers:= FPartNumbers+ FTaskInfo.UserInfo^.ReserveInfo.ProductList[i].part_number
      else
        FPartNumbers:= FPartNumbers+ ‘,‘+ FTaskInfo.UserInfo^.ReserveInfo.ProductList[i].part_number
    end;

    try
      FHttpParams:= TStringList.Create;
      FHttpParams.Add(‘_eventId=availability‘);
      FHttpParams.Add(‘ajaxSource=true‘);
      FHttpParams.Add(‘partNumbers=‘+ FPartNumbers);
      FHttpParams.Add(‘p_ie=‘+ FTaskInfo.Param_p_ie);
      FHttpParams.Add(‘selectedContractType=UNLOCKED‘);
      FHttpParams.Add(‘storeNumber=‘+ FTaskInfo^.UserInfo^.ReserveInfo.StoreList[FTaskInfo^.CurrReserveStoreIndex].StoreNumber);
      FHttpResult:= FHttp.HttpPost(FUrlToReserveMain+ ‘reserve/iPhone?execution=e1s3‘, FHttpParams, True, True, TEncoding.UTF8);
    finally
      FreeAndNil(FHttpParams);
    end;
    if Pos(FUrlSignInMain, FHttp.Url)> 0 then begin
      WriteLog(‘登录超时,请重新登录..‘, FTaskInfo.UserIndex, 1);
      Workers.Signal(Signal_Login, AJob.Data);
      Exit;
    end;
    FPhoneResultJo:= SO(FHttpResult);
    FPhoneJa:= FPhoneResultJo.N[‘inventories‘];
    if not FPhoneJa.IsType(stArray) then begin
      WriteLog(‘获取店铺开放预订型号失败,‘+ IntToStr(FTaskInfo.UserInfo^.ReservalInterval)+ ‘毫秒后尝试下一店铺‘, FTaskInfo.UserIndex, 1);
      Workers.Delay(DoStartReserveProc, FTaskInfo.UserInfo^.ReservalInterval* 10, AJob.Data);
      Exit;
      //重新开始下一步了哇
    end;
    FFindTimeSlot:= False;
    for i := 0 to FPhoneJa.AsArray.Length- 1 do begin
      if FPhoneJa.AsArray[i].B[‘available‘] then begin
        //找有效时间了啊
        for j := 0 to Length(FTaskInfo.UserInfo^.ReserveInfo.TimeSlotList)- 1 do begin
          if FFindTimeSlot then Break;
          for k := 0 to FTimeSlotJa.AsArray.Length- 1 do begin
            if Pos(FTaskInfo.UserInfo^.ReserveInfo.TimeSlotList[j].TimeFormat, FTimeSlotJa.AsArray[k].S[‘timeSlotId‘])> 0 then begin
              FFindTimeSlot:= True;
              FselectedTimeSlotId:= FTimeSlotJa.AsArray[k].S[‘timeSlotId‘];
              Break;
            end;
          end;
        end;
        if Not FFindTimeSlot then begin
          WriteLog(‘获取店铺有效开放时间失败,‘+ IntToStr(FTaskInfo.UserInfo^.ReservalInterval)+ ‘毫秒后尝试下一店铺‘, FTaskInfo.UserIndex, 1);
          Workers.Delay(DoStartReserveProc, FTaskInfo.UserInfo^.ReservalInterval* 10, AJob.Data);
          Exit;
        end;

        //商品有库存了啊
        FFindProduct:= True;
        //先找到具体是哪个商品
        FselectedPartNumber:= FPhoneJa.AsArray[i].S[‘partNumber‘];
        FReserveProductIndex:= -1;
        for j := 0 to Length(FTaskInfo.UserInfo^.ReserveInfo.ProductList)- 1 do
          if FTaskInfo.UserInfo^.ReserveInfo.ProductList[j].part_number= FselectedPartNumber then begin
            FReserveProductIndex:= j;
            Break;
          end;
        if FReserveProductIndex< 0 then Continue; //没有找到该商品的代码, 那就不要抢啊

        WriteLog(‘店铺[‘+ FTaskInfo^.UserInfo^.ReserveInfo.StoreList[FTaskInfo^.CurrReserveStoreIndex].StoreName
          + ‘]开始抢购商品[‘+ FTaskInfo.UserInfo^.ReserveInfo.ProductList[FReserveProductIndex].part_number+ ‘]...‘, FTaskInfo.UserIndex, 1);
        try
          FHttpParams:= TStringList.Create;
          FHttpParams.Add(‘_eventId=next‘);
          FHttpParams.Add(‘_flowExecutionKey=e1s3‘);
          FHttpParams.Add(‘color=‘+ FTaskInfo.UserInfo^.ReserveInfo.ProductList[FReserveProductIndex].color);
          FHttpParams.Add(‘email=‘+ FTaskInfo.UserInfo^.GovtIdInfo.Email);
          FHttpParams.Add(‘firstName=‘+ FTaskInfo.UserInfo^.GovtIdInfo.FirstName);
          FHttpParams.Add(‘govtId=‘+ FTaskInfo.UserInfo^.GovtIdInfo.GovId);
          FHttpParams.Add(‘lastName=‘+ FTaskInfo.UserInfo^.GovtIdInfo.LastName);
          FHttpParams.Add(‘product=‘+ FTaskInfo.UserInfo^.ReserveInfo.ProductList[FReserveProductIndex].localizedName);
          FHttpParams.Add(‘p_ie=‘+ FTaskInfo.Param_p_ie);
          FHttpParams.Add(‘selectedContractType=UNLOCKED‘);
          FHttpParams.Add(‘selectedGovtIdType=‘+ FTaskInfo.UserInfo^.GovtIdInfo.GovIdType);
          FHttpParams.Add(‘selectedPartNumber=‘+ FselectedPartNumber);
          FHttpParams.Add(‘selectedQuantity=‘+ IntToStr(FTaskInfo.UserInfo^.ReserveInfo.Quantity));
          FHttpParams.Add(‘selectedStoreNumber=‘+ FTaskInfo^.UserInfo^.ReserveInfo.StoreList[FTaskInfo^.CurrReserveStoreIndex].StoreNumber);
          FHttpParams.Add(‘selectedTimeSlotId=‘+ FselectedTimeSlotId);
          FHttpResult:= FHttp.HttpPost(FUrlToReserveMain+ ‘reserve/iPhone?execution=e1s3‘, FHttpParams, True, True, TEncoding.UTF8);
        finally
          FreeAndNil(FHttpParams);
        end;
        if Pos(FUrlSignInMain, FHttp.Url)> 0 then begin
          WriteLog(‘登录超时,请重新登录..‘, FTaskInfo.UserIndex, 1);
          Workers.Signal(Signal_Login, AJob.Data);
          Exit;
        end;

        //获取抢购结果
        FHttpResult:= FHttp.HttpGet(FUrlToReserveMain+ ‘reserve/iPhone?execution=e1s4&ajaxSource=true&_eventId=context‘, True, True, TEncoding.UTF8);
        if Pos(FUrlSignInMain, FHttp.Url)> 0 then begin
          WriteLog(‘登录超时,请重新登录..‘, FTaskInfo.UserIndex, 1);
          Workers.Signal(Signal_Login, AJob.Data);
          Exit;
        end;
        if Pos(‘{‘, FHttpResult)<> 1 then begin
          WriteLog(‘店铺[‘+ FTaskInfo^.UserInfo^.ReserveInfo.StoreList[FTaskInfo^.CurrReserveStoreIndex].StoreName
            + ‘]抢购商品[‘+ FTaskInfo.UserInfo^.ReserveInfo.ProductList[FReserveProductIndex].part_number+ ‘]结果未知...‘, FTaskInfo.UserIndex, 1);
          Continue;
        end;
        FReserveResultJo:= SO(FHttpResult);
        FReserveErrJa:= FTimeSlotResultJo.N[‘errors‘];
        if FTimeSlotJa.IsType(stArray) then begin
          WriteLog(‘店铺[‘+ FTaskInfo^.UserInfo^.ReserveInfo.StoreList[FTaskInfo^.CurrReserveStoreIndex].StoreName
            + ‘]抢购商品[‘+ FTaskInfo.UserInfo^.ReserveInfo.ProductList[FReserveProductIndex].part_number+ ‘]结果失败[‘+ FTimeSlotJa.AsString+ ‘]...‘, FTaskInfo.UserIndex, 1);
          Workers.Delay(DoStartReserveProc, FTaskInfo.UserInfo^.ReservalInterval* 10, AJob.Data);
          Continue;;
          //重新开始下一步了哇
        end else begin
          //这里应该是抢购成功了哦
          WriteLog(‘店铺[‘+ FTaskInfo^.UserInfo^.ReserveInfo.StoreList[FTaskInfo^.CurrReserveStoreIndex].StoreName
            + ‘]抢购商品[‘+ FTaskInfo.UserInfo^.ReserveInfo.ProductList[FReserveProductIndex].part_number+ ‘]结果成功[‘+ FReserveResultJo.AsString+ ‘]...‘, FTaskInfo.UserIndex, 1);
          FTaskInfo^.HttpError:= FReserveResultJo.AsString;
          Workers.Signal(Signal_ReserveSucess, AJob.Data);
          FReserveSucess:= True;
        end;
      end;
    end;

    //没有找到商品库存
    if not FFindProduct then begin
      WriteLog(‘店铺[‘+ FTaskInfo^.UserInfo^.ReserveInfo.StoreList[FTaskInfo^.CurrReserveStoreIndex].StoreName+ ‘]已无可预订的型号,‘+ IntToStr(FTaskInfo.UserInfo^.ReservalInterval)+ ‘毫秒后尝试下一店铺‘, FTaskInfo.UserIndex, 1);
      Workers.Delay(DoStartReserveProc, FTaskInfo.UserInfo^.ReservalInterval* 10, AJob.Data);
      Exit;
    end;
    if not FReserveSucess then begin
      WriteLog(‘店铺[‘+ FTaskInfo^.UserInfo^.ReserveInfo.StoreList[FTaskInfo^.CurrReserveStoreIndex].StoreName+ ‘]未预订到相关型号,‘+ IntToStr(FTaskInfo.UserInfo^.ReservalInterval)+ ‘毫秒后尝试下一店铺‘, FTaskInfo.UserIndex, 1);
      Workers.Delay(DoStartReserveProc, FTaskInfo.UserInfo^.ReservalInterval* 10, AJob.Data);
      Exit;
    end;

  finally
    OnAfterProcessData(AJob, FTaskInfo, FHttp);
  end;
end;

  

时间: 2024-11-07 03:56:42

试用Delphi XE7制作Iphone6抢购工具的相关文章

Delphi XE7 安装

delphi xe7是一款跨平台的应用程序开发工具,它能快速开发Windows.Mac.iOS.Android和各种电子产品的平台的应用程序, 新版xe7使用了Microsoft Windows图形用户界面的许多先进特性和设计思想,采用了弹性可重复利用的完整的面向对象程序语言(Object-Oriented Language),通过全新的控件和样式使您的Windows应用变得现代化,具有简单.高效.功能强大的特点. 在移动端方面,delphi xe7提供mobile apps的连结功能,可以支援

DELPHI XE7 新的并行库

DELPHI XE7 的新功能列表里面增加了并行库System.Threading, System.SyncObjs. 为什么要增加新的并行库? 还是为了跨平台.以前要并行编程只能从TThread类继承进行多线程处理,大家知道TThread类是从WINDOWS的线程API封装起来的,它封装的是WINDOWS的多线程的东西,是不能脱离WINDOWS的,当然是不能跨平台的.DELPHI现在走的是原生跨平台的道路,一切DELPHI的基础类库都要从只支持WINDOWS改为支持多平台,这是一个庞大而缓慢的

Delphi XE7的安卓程序如何调用JAVA的JAR,使用JAVA的类?

本文使用工具和全部源码下载: http://download.csdn.net/detail/sunylat/8190765 为什么我们要在Delphi XE7的安卓程序调用Java的JAR,使用JAVA的类?如果能够这样做,那么就意味着我们把Delphi开发的安卓程序扩展到了一个更大的开发范围了,理论上可以调用任意JAVA编写的代码,对于同时精通Delphi和JAVA的程序员来说,简直如虎添翼!! 我差不多用了一天时间吧,最终在老猫的帮助下,成功实现了在Delphi XE7的安卓程序中调用JA

Delphi XE7中使用JSON

Delphi XE7有一个对JSON处理的单元,在你需要使用JSON的单元里面引入"System.json",随后你就可以用Delphi自己的json处理类了.我写的小例子只是对包含字符串和数组的JSON进行解析,这两种数据类型,我觉得是实际使用中最常用.有用的类型,所以我仅仅用这两种例子做演示! 演示代码: { 功能:DelphiXE7中使用JSON -------------------------------------------------------------------

Delphi XE7实现的任意位置弹出菜单

Delphi XE7中目前还没有弹出菜单组件,这个弹出菜单应用很普遍,在Java开发的安卓程序中很简单就可以用上了,应该说是一个标准控件.看了一些例子,但是都不能满足我想在任意位置弹出菜单需求,于是自己在网上找了一个例子,修改后实现了我的在任意位置弹出菜单需求!全部代码如下: { 功能:DelphiXE7里面实现的弹出菜单 ------------------------------------------------------------------------------ 说明:实现在任意

RemObjects SDK Source For Delphi XE7

根据网上RemObjects SDK for Delphi - 7.0.63.1055 retail FullSource源码版本修改支持Delphi XE7. 原文:http://blog.csdn.net/tht2009/article/details/39545545 1.目前官网最新版本是RemObjects SDK for Delphi and all Clients - 8.1.85.1141 - Trial.exe(30天试用),需购买注册才有源码. 原文:http://blog.

Delphi XE7中使用Moto 360

Hello Moto 360 from Delphi XE7(翻译版) 我真的很喜欢我的Moto 360手表.它看起来很棒,也很为我的Android手机的一种延伸,当然最重要的问题是如何使一个应用程序.仅使用RAD Studio X7,Delphi或C + +来设计app.由于新FireUI多设备设计我可以创建UI的自定义视图做出完美的用户界面设计的微风.这里有一些我制作APP的细节,其次是下载我的样品和自定义视图. 底线是,它只是工作,这真的不是一个惊喜.最新的Android设备使用ARMv7

国内首发,好不容易找到的李大师Delphi XE7的视频

最近真是运气不错,拿到了李大师的内部培训资料,国内首发, 还不赶快过目,不敢私藏,来吧,程序猿们,一起来XE7,强大的工具上路了. 李大师是谁?Delphi不知李大师,编写程序也枉然!! 李大师就是李维先生:Embarcadero大中华技术中心技术总监哦 时空门:http://v.youku.com/v_show/id_XODMxNDU4NDI4.html

SynEdit(Delphi XE7)的安装和基本使用

一.花絮 delphi自带的memo显示sql语句看的太累人了,今天决定美化一下.最起码要有“语法着色”.“显示行号”这2个功能. 意外发现了 SynEdit 控件. SynEdit是一个免费的文字编辑器,支持37种程序语言语法高亮度显示,可以一次编辑多个文件 SynEdit 支持语法高亮.word-wrap.代码自动完成.模版组件.导出到 html 等格式的功能. SynEdit 是一个纯 VCL/CLX 控件,无须任何其他运行库支持,著名的 HeidiSQL 数据库管理工具就是使用该控件开发