zl程序教程

您现在的位置是:首页 >  后端

当前栏目

java实现京东秒杀功能分享京东秒杀软件

JAVA软件 实现 功能 分享 京东 秒杀
2023-06-13 09:15:16 时间

简单介绍下功能

1.每隔一段时间(比如1分钟)在京东手机每日一秒杀页面提取产品(手机)链接。
http://sale.360buy.com/act/8VTHFGr10CjMDyZ.html#01
2.根据提取到得产品链接给后台发送数据,以便获取产品价格,描述,折扣,库存(是否有货)等信息。
3.根据得到的信息,进行判断。

若符合条件自动调用浏览器(前提是chrome加入环境变量,或者改代码将浏览器.exe路径加入代码,修改程序)打开产品订购页面。
4.其实也就解决了一个问题:不用自己频繁的刷新网页了,不用自己查看;
登陆,提交订单还得浏览器解决(貌似这几个功能点比较复杂,没做处理)

程序做的不太完善:
运行前需要修改几个地方:
1.环境变量:chrome加入浏览器变量,以便调用。。或者自己修改源代码用其它方式打开。
2.活动中每个产品的价格信息需要设置。这个比较不好,必须修改源代码。
修改的地方在filter()这个函数里。
3.另外一个需要修改的地方是
hasStore(Stringskuidkey)

address="http://price.360buy.com/stocksoa/StockHandler.ashx?callback=getProvinceStockCallback&type=pcastock&skuid="+skuidkey+"&provinceid=1&cityid=2800&areaid=2850";
这个地方的cityid=2800&areaid=...地里位置信息。这个没做处理。需要从手机产品页自己搞出来。
其实也比较简单。chrome+F12,修改“城市”,区域等信息后,会看到一个get请求发送到后台,这个链接里面包含了需要的信息。(http://price.360buy.com/stocksoa/StockHandler.ashx?callback=getProvinceStockCallback&type=pcastock&skuid=64EBD0F20F593D95C72C6EED59B64658&provinceid=1&cityid=2805&areaid=2854)适当修改。

Util.java

复制代码代码如下:


packageview.Util;

importjava.util.ArrayList;

publicclassUtil{
 publicstaticvoidprint(Objecto){
  System.out.print(o);
 }
 publicstaticvoidprintln(Objecto){
  if(null==o)
   System.out.println();
  else
  System.out.println(o);
 }
 publicstaticArrayList<Integer>toArrayList(int[]ints){
  if(ints.length==0)
  returnnull;
  ArrayList<Integer>al=newArrayList<Integer>();
  for(inti=0;i<ints.length;i++){
   al.add(ints[i]);
  }
  returnal;
 }
}

Miaosha360buy.java

复制代码代码如下:


packagejingdong;

publicclassMiaosha360buy{
 java.util.concurrent.CountDownLatcht=newjava.util.concurrent.CountDownLatch(1);

 /**
 *@paramargs
 */
 publicstaticvoidmain(String[]args){
  //TODOAuto-generatedmethodstub
  System.out.println(Thread.currentThread().getName()+"开始");
  Miaosha360buyms360=newMiaosha360buy();
  newThreadOne360buy(ms360.t).start();
  while(true){
   try{
    ms360.t.await();
   }catch(InterruptedExceptione){
    //TODOAuto-generatedcatchblock
    e.printStackTrace();
   }
   try{
    Thread.sleep(1000*60);//间隔1分钟调用一次?
   }catch(InterruptedExceptione){
    //TODOAuto-generatedcatchblock
    e.printStackTrace();
   }
   ms360.t=newjava.util.concurrent.CountDownLatch(1);
   newThreadOne360buy(ms360.t).start();
   System.out.println("NewTreadinwhile..");
  }
 }

}

Miaosha360buy.java

复制代码代码如下:
packagejingdong;

publicclassMiaosha360buy{
 java.util.concurrent.CountDownLatcht=newjava.util.concurrent.CountDownLatch(1);

 /**
 *@paramargs
 */
 publicstaticvoidmain(String[]args){
  //TODOAuto-generatedmethodstub
  System.out.println(Thread.currentThread().getName()+"开始");
  Miaosha360buyms360=newMiaosha360buy();
  newThreadOne360buy(ms360.t).start();
  while(true){
   try{
    ms360.t.await();
   }catch(InterruptedExceptione){
    //TODOAuto-generatedcatchblock
    e.printStackTrace();
   }
   try{
    Thread.sleep(1000*60);//间隔1分钟调用一次?
   }catch(InterruptedExceptione){
    //TODOAuto-generatedcatchblock
    e.printStackTrace();
   }
   ms360.t=newjava.util.concurrent.CountDownLatch(1);
   newThreadOne360buy(ms360.t).start();
   System.out.println("NewTreadinwhile..");
  }
 }

}

ThreadOne360buy.java

复制代码代码如下:
packagejingdong;

importjava.io.IOException;
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;
importjava.util.regex.Matcher;
importjava.util.regex.Pattern;

importorg.apache.http.HttpEntity;
importorg.apache.http.HttpResponse;
importorg.apache.http.client.ClientProtocolException;
importorg.apache.http.client.methods.HttpGet;
importorg.apache.http.impl.client.DefaultHttpClient;
importorg.apache.http.util.EntityUtils;
importorg.jsoup.Jsoup;
importorg.jsoup.nodes.Document;
importorg.jsoup.nodes.Element;
importorg.jsoup.select.Elements;

importview.Util.Util;

publicclassThreadOne360buyextendsThread{
 java.util.concurrent.CountDownLatchc;
 ArrayListal;//记录秒杀产品页面
 floatprice=0.0f;//商品价格
 floatdiscount=0.0f;//商品折扣

 //用于保存线程信息,在这个项目里用处不大
 privatestaticList<Thread>runningThreads=newArrayList<Thread>();

 //这个是一个计数器(不太会用,线程这方面一直感觉是比较复杂的)
 publicThreadOne360buy(java.util.concurrent.CountDownLatchc){
  this.c=c;
 }

 @Override
 publicvoidrun(){
  regist(this);//线程开始时注册
  //打印开始标记
  System.out.println(Thread.currentThread().getName()+"开始...");
  try{
   //抓取京东手机秒杀页面
   this.getMessage("http://sale.360buy.com/act/8VTHFGr10CjMDyZ.html#01");

  }catch(ClientProtocolExceptione){
   //TODOAuto-generatedcatchblock
   e.printStackTrace();
   c.countDown();
  }catch(IOExceptione){
   //TODOAuto-generatedcatchblock
   e.printStackTrace();
   c.countDown();
  }
  c.countDown();
  unRegist(this);//线程结束时取消注册
  //打印结束标记
  System.out.println(Thread.currentThread().getName()+"结束.");
 }

 publicvoidregist(Threadt){
  synchronized(runningThreads){
   runningThreads.add(t);
  }
 }

 publicvoidunRegist(Threadt){
  synchronized(runningThreads){
   runningThreads.remove(t);
  }
 }

 publicstaticbooleanhasThreadRunning(){
  //通过判断runningThreads是否为空就能知道是否还有线程未执行完
  return(runningThreads.size()>0);
 }
 /**
 *从手机秒杀页面获取prodcut链接,productskuid,skuidkey,price,store信息
 *@paramurl:手机秒杀页面
 *@throwsClientProtocolException
 *@throwsIOException
 */
 publicvoidgetMessage(Stringurl)throwsClientProtocolException,IOException{
  al=getMainUrl(down(url));

  Util.println(al);
  if(al.size()==0){
   c.countDown();
   System.exit(0);
   return;
  }

  for(inti=0;i<al.size();i++){
   StringBuffersb=newStringBuffer();
   StringBufferopenUrl=newStringBuffer();
   openUrl.append("http://www.360buy.com/product/");
   openUrl.append(al.get(i).toString().subSequence(al.get(i).toString().lastIndexOf("/")+1,al.get(i).toString().lastIndexOf(".")));
   openUrl.append(".html");
//   557673
   sb.append("http://d.360buy.com/fittingInfo/get?skuId=");
   sb.append(al.get(i).toString().subSequence(al.get(i).toString().lastIndexOf("/")+1,al.get(i).toString().lastIndexOf(".")));
   sb.append("&callback=Recommend.cbRecoFittings");
   Util.println(sb.toString());
   //map中保存的是产品name,price,折扣信息
   Util.println("Al("+i+")down:"+sb.toString());
   HashMap<String,String>hm=parseProduct(down(sb.toString()));
   //用来匹配价格信息。匹配库存信息
   filter(hm,openUrl.toString());//过滤价格,如果条件符合就打开浏览器
  }
 }
 /**
 *一个验证方法
 *@paramhm保存着价格信息
 *@paramurl产品页面
 */
 publicvoidfilter(HashMap<String,String>hm,Stringurl){//url既是产品页面
//  view.Util.oenCMD.openWinExe(null,url);
//  是不是应该先查看库存?
  Stringskuidkey=parseSkuidkey(url);
  if(!hasStore(skuidkey)){
   Util.println("-------------------------------------");
   Util.println("没有库存了!");
   Util.println("-------------------------------------");
   //减掉计数,以便主线程判断
   c.countDown();
   //应该结束子线程哦?
   return;
  }

  if(hm.get("skuid").equals("201602")){//判断//摩托罗拉skuid=201602
   //这里的价格是写死了,运行前得改过来才行。
   this.setPrice(499.0f);
   //是不是应该打开控制台?
   if(Float.parseFloat(hm.get("price"))<=this.getPrice()){
    view.Util.oenCMD.openWinExe(null,url);
   }
  }elseif(hm.get("skuid").equals("675647")){//天语skuid=675647
//   //这里的价格是写死了,运行前得改过来才行。
//   this.setPrice(699.0f);
//   //是不是应该打开控制台?
//   if(Float.parseFloat(hm.get("price"))<=this.getPrice()){
//    view.Util.oenCMD.openWinExe(null,url);
//   }
  }

 }
 /**
 *解析了产品页面中name,skuid,price信息
 *@paramdoc
 *@return
 */
 publicstaticHashMap<String,String>parseProduct(Documentdoc){
  Stringtext=doc.text();
  Stringdocc=text.substring(text.indexOf("master")+9,text.indexOf("fittings")-3).replaceAll("[\\s]","");
  String[]ss=docc.split(",");
  HashMap<String,String>hm=newHashMap<String,String>();
  for(Stringit:ss){
   Stringstring=it.replaceAll("\"","");
   if(string.contains("\\u"))
   string=unicodeDecode(string);

   String[]str=string.split(":");
   hm.put(str[0],str[1]);
  }
  Util.println(hm);
  returnhm;
 }
 /**
 *处理unicode字符,转换成显示字符(汉字),不太通用
 *@paramit:\u6a5d
 *@return
 */
 publicstaticStringunicodeDecode(Stringit){//有个缺点,就是前面的字符无法去掉
  Util.println(it);
  Stringregex="(\\\\u[0-9a-f]{4})";
  Patternpt=Pattern.compile(regex);
  Matchermc;
  StringBuffersb;
  StringBuffersba=newStringBuffer();
  mc=pt.matcher(it);
  while(mc.find()){
   sb=newStringBuffer();
   mc.appendReplacement(sba,sb.append((char)Integer.parseInt((mc.group(1).substring(2)),16)).toString());
  }
  returnsba.toString();
 }
 /**
 *返回文档对象(下载内容)
 *@paramurl下载页面
 *@return
 *@throwsClientProtocolException
 *@throwsIOException
 */
 publicstaticDocumentdown(Stringurl)throwsClientProtocolException,IOException{
  Documentdoc=null;
  DefaultHttpClienthttpClient=newDefaultHttpClient();
  Util.println("DownLoad:"+url);
  HttpGetget=newHttpGet(url);
  HttpResponseresponse;
  response=httpClient.execute(get);
  HttpEntityentity=response.getEntity();
  doc=Jsoup.parse(entity.getContent(),"utf-8","");
  //释放资源
  EntityUtils.consume(entity);
  //关闭连接
  httpClient.getConnectionManager().shutdown();
  returndoc;
 }
 /**
 *加入了编码控制信息
 *@paramurl待下载页面
 *@paramcode编码
 *@return
 *@throwsClientProtocolException
 *@throwsIOException
 */
 publicstaticDocumentdown(Stringurl,Stringcode)throwsClientProtocolException,IOException{
  Documentdoc=null;
  DefaultHttpClienthttpClient=newDefaultHttpClient();
  Util.println("DownLoad:"+url);
  HttpGetget=newHttpGet(url);
  HttpResponseresponse;
  response=httpClient.execute(get);
  HttpEntityentity=response.getEntity();
  doc=Jsoup.parse(entity.getContent(),code,"");
  //释放资源
  EntityUtils.consume(entity);
  //关闭连接
  httpClient.getConnectionManager().shutdown();
  returndoc;
 }
 /**
 *用来解析秒杀页面中的产品(收集)链接
 *@paramdoc
 *@return
 */
 publicstaticArrayList<String>getMainUrl(Documentdoc){
  if(doc.equals("")||doc==null)
   returnnull;
  try{
   Thread.sleep(50);
  }catch(InterruptedExceptione1){
   //TODOAuto-generatedcatchblock
   e1.printStackTrace();
  }
  ArrayList<String>urls=newArrayList<String>();
  Stringrule="map[name=Map]>area[href~=product]";
  /**
  *开始解析
  */
  Elementselements=doc.select(rule);
  for(Elemente:elements){
//   Util.println(e.absUrl("abs:href"));
   urls.add(e.absUrl("abs:href"));
  }
  returnurls;
 }
 /**
 *获取skuidkey,用于查询商品库存信息
 *@paramurl
 *@return
 */
 publicstaticStringparseSkuidkey(Stringurl){
  Documentdoc=null;
  try{
   doc=down(url,"gb2312");
  }catch(ClientProtocolExceptione){
   //TODOAuto-generatedcatchblock
   e.printStackTrace();
  }catch(IOExceptione){
   //TODOAuto-generatedcatchblock
   e.printStackTrace();
  }
//  Util.println(doc.select("script"));
  Stringtext=null;
  for(Elemente:doc.select("script")){
   if(e.data().contains("skuidkey:")){
    text=e.data();
    break;
   }
  }
  //skuidkey:"7D45919EA8242511DAA5CC7C6D7B351C"
  text=text.substring(text.indexOf("skuidkey:")+10,text.indexOf("skuidkey:")+42);
  Util.println("---------------------------------");
  Util.println(text);
  returntext;
 }
 /**
 *查看库存信息
 *@paramskuidkey
 *@return
 */
 publicstaticbooleanhasStore(Stringskuidkey){//这个地方没有处理,直接提取浏览器中的信息
  Stringaddress=null;
  booleanhasStore=false;
  if(skuidkey!=null&&!"".equals(skuidkey))
  address="http://price.360buy.com/stocksoa/StockHandler.ashx?callback=getProvinceStockCallback&type=pcastock&skuid="+skuidkey+"&provinceid=1&cityid=2800&areaid=2850";
  else{
   Util.println("解析skuidkey错误");
  }
  try{
   if(parseStore(down(address))){
    hasStore=true;
   }
  }catch(ClientProtocolExceptione){
   //TODOAuto-generatedcatchblock
   e.printStackTrace();
  }catch(IOExceptione){
   //TODOAuto-generatedcatchblock
   e.printStackTrace();
  }
  returnhasStore;
 }
/*if(array[1]=="34"||array[1]=="18"){
 changeCart(false);
djdarea.stockInfoDom.html("<strongclass="store-over">无货</strong>");
}
elseif(array[1]=="0"){
changeCart(false);
djdarea.stockInfoDom.html("<strongclass="store-over">无货</strong>");
}
elseif(array[2]=="0"&&array[4]!="2"){
changeCart(false);
djdarea.stockInfoDom.html("很抱歉,该商品无法送至您选择的区域");
}
elseif(array[1]=="33"||array[1]=="5"){
changeCart(true);
djdarea.stockInfoDom.html("<strong>现货</strong>"+(array[4]=="1"?",该区域"+(array[3]=="0"?"不":"")+"支持货到付款":"")+cashdesc);
}
elseif(array[1]=="36"){
changeCart(true);
djdarea.stockInfoDom.html("<strong>预订</strong>"+(array[4]=="1"?",该区域"+(array[3]=="0"?"不":"")+"支持货到付款":"")+cashdesc);
}
elseif(array[1]=="39"){
changeCart(true);
djdarea.stockInfoDom.html("<strong>在途</strong>"+(array[4]=="1"?",该区域"+(array[3]=="0"?"不":"")+"支持货到付款":"")+cashdesc);
}
elseif(array[1]=="40"){
changeCart(true);
djdarea.stockInfoDom.html("<strong>可配货</strong>"+(array[4]=="1"?",该区域"+(array[3]=="0"?"不":"")+"支持货到付款":"")+cashdesc);
}
 */
 /**
 *解析库存信息
 *@paramdoc
 *@return
 */
 publicstaticbooleanparseStore(Documentdoc){
  Stringtext=doc.text();
  Stringdocc=text.substring(text.indexOf("-")-1,text.lastIndexOf(",")-1);
  Util.println(docc);
  String[]store=docc.split("-");
  if(store[1].equals("34")||store[1].equals("18")){
   //无货
   Util.println("此地无货");
   returnfalse;
  }elseif(store[1].equals("33")||store[1].equals("5")){
   //现货
   Util.println("此地现货");
   returntrue;
  }
  Util.println(store[1]);
  returnfalse;
 }
 //几个bean方法
 publicfloatgetPrice(){
  returnprice;
 }
 publicvoidsetPrice(floatprice){
  this.price=price;
 }
 publicfloatgetDiscount(){
  returndiscount;
 }
 publicvoidsetDiscount(floatdiscount){
  this.discount=discount;
 }
 

}

oenCMD.java

复制代码代码如下:
packageview.Util;

publicclassoenCMD{
// publicstaticvoidmain(String[]args){
////   openWinExe(null);
//   openExe(null,"http://www.baidu.com");
//   }
   //用Java调用windows系统的exe文件,比如notepad,calc之类
   publicstaticvoidopenWinExe(Stringcommand,Stringurl){
    if(command==null||command.equals("")){
     command="chrome"+url;
    }
   Runtimern=Runtime.getRuntime();
   Processp=null;
   try{

   p=rn.exec(command);
   }catch(Exceptione){
   System.out.println("Errorwinexec!");
   }
   }
   //调用其他的可执行文件,例如:自己制作的exe,或是下载安装的软件.
   publicstaticvoidopenExe(StringpathAndName,Stringurl){
    if(pathAndName==null||pathAndName.equals("")){
     pathAndName="C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe";
    }
    if(url!=null&&!url.equals("")){
     pathAndName+="";
     pathAndName+=url;
    }
   Runtimern=Runtime.getRuntime();
   Processp=null;
   try{
   p=rn.exec(pathAndName);
   }catch(Exceptione){
   System.out.println("Errorexec!");
   }
   }
}