亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

java實現京東秒殺功能分享 京東秒殺軟件

2019-11-26 15:43:44
字體:
來源:轉載
供稿:網友

簡單介紹下功能

1.每隔一段時間(比如1分鐘)在京東手機每日一秒殺頁面提取產品(手機)鏈接。
http://sale.360buy.com/act/8VTHFGr10CjMDyZ.html#01
2.根據提取到得產品鏈接給后臺發送數據,以便獲取產品價格,描述,折扣,庫存(是否有貨)等信息。
3.根據得到的信息,進行判斷。

若符合條件自動調用瀏覽器(前提是chrome加入環境變量,或者改代碼將瀏覽器.exe路徑加入代碼,修改程序)打開產品訂購頁面。
4.其實也就解決了一個問題:不用自己頻繁的刷新網頁了,不用自己查看;
登陸,提交訂單還得瀏覽器解決(貌似這幾個功能點比較復雜,沒做處理)

程序做的不太完善:
運行前需要修改幾個地方:
1.環境變量:chrome 加入瀏覽器變量,以便調用。?;蛘咦约盒薷脑创a用其它方式打開。
2.活動中每個產品的價格信息需要設置。這個比較不好,必須修改源代碼。
修改的地方在filter()這個函數里。
3.另外一個需要修改的地方是
hasStore(String skuidkey)

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

復制代碼 代碼如下:

package view.Util;

import java.util.ArrayList;

public class Util {
 public static void print(Object o){
  System.out.print(o);
 }
 public static void println(Object o){
  if(null==o)
   System.out.println();
  else
  System.out.println(o);
 }
 public static ArrayList<Integer> toArrayList(int[] ints){
  if(ints.length==0)
  return null;
  ArrayList<Integer> al=new ArrayList<Integer>();
  for(int i=0;i<ints.length;i++){
   al.add(ints[i]);
  }
  return al;
 }
}

Miaosha360buy.java

復制代碼 代碼如下:

package jingdong;

public class Miaosha360buy {
 java.util.concurrent.CountDownLatch t= new java.util.concurrent.CountDownLatch(1);

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  System.out.println(Thread.currentThread().getName() + "開始");
  Miaosha360buy ms360=new Miaosha360buy();
  new ThreadOne360buy(ms360.t).start();
  while(true){
   try {
    ms360.t.await();
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   try {
    Thread.sleep(1000*60);//間隔1分鐘調用一次?
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   ms360.t=new java.util.concurrent.CountDownLatch(1);
   new ThreadOne360buy(ms360.t).start();
   System.out.println("New Tread in while..");
  }
 }

}

Miaosha360buy.java

復制代碼 代碼如下:

package jingdong;

public class Miaosha360buy {
 java.util.concurrent.CountDownLatch t= new java.util.concurrent.CountDownLatch(1);

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  System.out.println(Thread.currentThread().getName() + "開始");
  Miaosha360buy ms360=new Miaosha360buy();
  new ThreadOne360buy(ms360.t).start();
  while(true){
   try {
    ms360.t.await();
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   try {
    Thread.sleep(1000*60);//間隔1分鐘調用一次?
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   ms360.t=new java.util.concurrent.CountDownLatch(1);
   new ThreadOne360buy(ms360.t).start();
   System.out.println("New Tread in while..");
  }
 }

}

ThreadOne360buy.java

復制代碼 代碼如下:

package jingdong;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

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

import view.Util.Util;

public class ThreadOne360buy extends Thread{
 java.util.concurrent.CountDownLatch c;
 ArrayList al;//記錄秒殺產品頁面
 float price=0.0f;//商品價格
 float discount=0.0f;//商品折扣

 //用于保存線程信息,在這個項目里用處不大
 private static List<Thread> runningThreads = new ArrayList<Thread>();

 //這個是一個計數器(不太會用,線程這方面一直感覺是比較復雜的)
 public ThreadOne360buy(java.util.concurrent.CountDownLatch c) {
  this.c=c;
 }

 @Override
 public void run() {
  regist(this);// 線程開始時注冊
  // 打印開始標記
  System.out.println(Thread.currentThread().getName() + "開始...");
  try {
   //抓取京東手機秒殺頁面
   this.getMessage("http://sale.360buy.com/act/8VTHFGr10CjMDyZ.html#01");

  } catch (ClientProtocolException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   c.countDown();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   c.countDown();
  }
  c.countDown();
  unRegist(this);// 線程結束時取消注冊
  // 打印結束標記
  System.out.println(Thread.currentThread().getName() + "結束.");
 }

 public void regist(Thread t) {
  synchronized (runningThreads) {
   runningThreads.add(t);
  }
 }

 public void unRegist(Thread t) {
  synchronized (runningThreads) {
   runningThreads.remove(t);
  }
 }

 public static boolean hasThreadRunning() {
  // 通過判斷runningThreads是否為空就能知道是否還有線程未執行完
  return (runningThreads.size() > 0);
 }
 /**
  * 從手機秒殺頁面獲取 prodcut鏈接,product skuid,skuidkey,price,store信息
  * @param url:手機秒殺頁面
  * @throws ClientProtocolException
  * @throws IOException
  */
 public void getMessage(String url) throws ClientProtocolException, IOException{
  al=getMainUrl(down(url));

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

  for(int i=0;i<al.size();i++){
   StringBuffer sb=new StringBuffer();
   StringBuffer openUrl = new StringBuffer();
   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());//過濾價格,如果條件符合就打開瀏覽器
  }
 }
 /**
  * 一個驗證方法
  * @param hm 保存著價格信息
  * @param url 產品頁面
  */
 public void filter(HashMap<String, String> hm,String url){//url既是產品頁面
//  view.Util.oenCMD.openWinExe(null,url);
//  是不是應該先查看庫存?
  String skuidkey=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);
   }
  }else if(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信息
  * @param doc
  * @return
  */
 public static HashMap<String, String> parseProduct(Document doc){
  String text=doc.text();
  String docc=text.substring(text.indexOf("master")+9,text.indexOf("fittings")-3).replaceAll("[//s]", "");
  String[] ss=docc.split(",");
  HashMap<String, String> hm=new HashMap<String, String>();
  for(String it: ss){
   String string=it.replaceAll("/"", "");
   if(string.contains("http://u"))
   string=unicodeDecode(string);

   String[] str=string.split(":");
   hm.put(str[0], str[1]);
  }
  Util.println(hm);
  return hm;
 }
 /**
  * 處理unicode字符,轉換成顯示字符(漢字),不太通用
  * @param it: /u6a5d
  * @return
  */
 public static String unicodeDecode(String it){//有個缺點,就是前面的字符無法去掉
  Util.println(it);
  String regex="(////u[0-9a-f]{4})";
  Pattern pt= Pattern.compile(regex);
  Matcher mc;
  StringBuffer sb;
  StringBuffer sba=new StringBuffer();
  mc=pt.matcher(it);
  while(mc.find()){
   sb=new StringBuffer();
    mc.appendReplacement(sba,sb.append((char )Integer.parseInt((mc.group(1).substring(2)), 16)).toString());
  }
  return sba.toString();
 }
 /**
  * 返回文檔對象(下載內容)
  * @param url 下載頁面
  * @return
  * @throws ClientProtocolException
  * @throws IOException
  */
 public static Document down(String url) throws ClientProtocolException, IOException{
  Document doc = null;
  DefaultHttpClient httpClient=new DefaultHttpClient();
  Util.println("DownLoad:"+url);
  HttpGet get=new HttpGet(url);
  HttpResponse response;
  response = httpClient.execute(get);
  HttpEntity entity = response.getEntity();
  doc = Jsoup.parse(entity.getContent(), "utf-8","");
  //釋放資源
  EntityUtils.consume(entity);
  //關閉連接
  httpClient.getConnectionManager().shutdown();
  return doc;
 }
 /**
  * 加入了編碼控制信息
  * @param url 待下載頁面
  * @param code 編碼
  * @return
  * @throws ClientProtocolException
  * @throws IOException
  */
 public static Document down(String url,String code) throws ClientProtocolException, IOException{
  Document doc = null;
  DefaultHttpClient httpClient=new DefaultHttpClient();
  Util.println("DownLoad:"+url);
  HttpGet get=new HttpGet(url);
  HttpResponse response;
  response = httpClient.execute(get);
  HttpEntity entity = response.getEntity();
  doc = Jsoup.parse(entity.getContent(), code,"");
  //釋放資源
  EntityUtils.consume(entity);
  //關閉連接
  httpClient.getConnectionManager().shutdown();
  return doc;
 }
 /**
  * 用來解析 秒殺頁面中的產品(收集)鏈接
  * @param doc
  * @return
  */
 public static ArrayList<String> getMainUrl(Document doc){
  if(doc.equals("")||doc==null)
   return null;
  try {
   Thread.sleep(50);
  } catch (InterruptedException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }
  ArrayList<String> urls=new ArrayList<String>();
  String rule="map[name=Map] >area[href~=product]";
  /**
   * 開始解析
   */
  Elements elements=doc.select(rule);
  for (Element e : elements) {
//   Util.println(e.absUrl("abs:href"));
   urls.add(e.absUrl("abs:href"));
  }
  return urls;
 }
 /**
  * 獲取skuidkey,用于查詢商品庫存信息
  * @param url
  * @return
  */
 public static String parseSkuidkey(String url){
  Document doc=null;
  try {
   doc=down(url,"gb2312");
  } catch (ClientProtocolException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
//  Util.println(doc.select("script"));
  String text = null;
  for(Element e : 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);
  return text;
 }
 /**
  * 查看庫存信息
  * @param skuidkey
  * @return
  */
 public static boolean hasStore(String skuidkey){//這個地方沒有處理,直接提取瀏覽器中的信息
  String address = null;
  boolean hasStore=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 (ClientProtocolException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return hasStore;
 }
/* if(array[1]=="34"||array[1]=="18"){
 changeCart(false);
djdarea.stockInfoDom.html("<strong class='store-over'>無貨</strong>");
}
else if(array[1]=="0"){
changeCart(false);
djdarea.stockInfoDom.html("<strong class='store-over'>無貨</strong>");
}
else if(array[2]=="0"&&array[4]!="2"){
changeCart(false);
djdarea.stockInfoDom.html("很抱歉,該商品無法送至您選擇的區域");
}
else if(array[1]=="33"||array[1]=="5"){
changeCart(true);
djdarea.stockInfoDom.html("<strong>現貨</strong>"+(array[4]=="1"?",該區域"+(array[3]=="0"?"不":"")+"支持貨到付款":"")+cashdesc);
}
else if(array[1]=="36"){
changeCart(true);
djdarea.stockInfoDom.html("<strong>預訂</strong>"+(array[4]=="1"?",該區域"+(array[3]=="0"?"不":"")+"支持貨到付款":"")+cashdesc);
}
else if(array[1]=="39"){
changeCart(true);
djdarea.stockInfoDom.html("<strong>在途</strong>"+(array[4]=="1"?",該區域"+(array[3]=="0"?"不":"")+"支持貨到付款":"")+cashdesc);
}
else if(array[1]=="40"){
changeCart(true);
djdarea.stockInfoDom.html("<strong>可配貨</strong>"+(array[4]=="1"?",該區域"+(array[3]=="0"?"不":"")+"支持貨到付款":"")+cashdesc);
}
 */
 /**
  * 解析庫存信息
  * @param doc
  * @return
  */
 public static boolean parseStore(Document doc){
  String text=doc.text();
  String docc=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("此地無貨");
   return false;
  }else if(store[1].equals("33") || store[1].equals("5")){
   //現貨
   Util.println("此地現貨");
   return true;
  }
  Util.println(store[1]);
  return false;
 }
 //幾個bean方法
 public float getPrice() {
  return price;
 }
 public void setPrice(float price) {
  this.price = price;
 }
 public float getDiscount() {
  return discount;
 }
 public void setDiscount(float discount) {
  this.discount = discount;
 }
 

}

oenCMD.java

復制代碼 代碼如下:

package view.Util;

public class oenCMD {
// public static void main(String[] args) {
////    openWinExe(null);
//    openExe(null,"http://www.baidu.com");
//    }
    //用 Java 調用windows系統的exe文件,比如notepad,calc之類
    public static void openWinExe(String command,String url) {
     if(command==null ||command.equals("")){
      command = "chrome "+url;
     }
    Runtime rn = Runtime.getRuntime();
    Process p = null;
    try {

    p = rn.exec(command);
    } catch (Exception e) {
    System.out.println("Error win exec!");
    }
    }
    //調用其他的可執行文件,例如:自己制作的exe,或是 下載 安裝的軟件.
    public static void openExe(String pathAndName,String url) {
     if(pathAndName==null || pathAndName.equals("")){
      pathAndName="C://Users//Administrator//AppData//Local//Google//Chrome//Application//chrome.exe";
     }
     if(url!=null && !url.equals("")){
      pathAndName+=" ";
      pathAndName+=url;
     }
    Runtime rn = Runtime.getRuntime();
    Process p = null;
    try {
    p = rn.exec(pathAndName);
    } catch (Exception e) {
    System.out.println("Error exec!");
    }
    }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美亚洲成人免费| 亚洲第一区在线| 欧美巨乳在线观看| 亚洲精品456在线播放狼人| 国产精品va在线播放我和闺蜜| 成人亲热视频网站| 97国产在线观看| 国产精品女视频| 成人妇女淫片aaaa视频| 亚洲欧洲在线观看| 久久99久久久久久久噜噜| 久久久精品免费| 亚洲永久在线观看| 一区二区三区日韩在线| 亚洲香蕉av在线一区二区三区| 欧美成人合集magnet| 国产精品欧美一区二区三区奶水| 国产不卡精品视男人的天堂| 狠狠躁夜夜躁人人躁婷婷91| 91爱爱小视频k| 97碰碰碰免费色视频| 久久久久久国产精品美女| 91理论片午午论夜理片久久| 久久久免费精品视频| 成人福利视频网| 在线成人激情黄色| 2018国产精品视频| 在线成人激情黄色| 亚洲小视频在线观看| 国产一区二区精品丝袜| 成人性生交大片免费看视频直播| 69av视频在线播放| 国产精品一区二区三区在线播放| 国产精品一香蕉国产线看观看| 亚洲图片在线综合| 国产精品自产拍在线观看中文| 精品视频在线播放色网色视频| 日韩av电影手机在线| 九九精品在线播放| 成人福利网站在线观看| 亚洲国产精品va在看黑人| 欧美人与物videos| 欧美中文在线观看| 亚洲精品一区中文| 亚洲人成在线观| 日韩美女免费观看| 一本色道久久综合狠狠躁篇的优点| 日韩精品视频免费在线观看| 欧美在线视频一区二区| 亚洲欧美日韩一区在线| 国产成人av在线播放| 国产精品狼人色视频一区| 久热在线中文字幕色999舞| 亚洲黄色www| 欧美成在线视频| 欧美在线观看视频| 亚洲国产精品网站| 欧美电影电视剧在线观看| 亚洲欧美在线免费观看| 日韩精品在线影院| 亚洲xxxx在线| 国产精品成人在线| 成人444kkkk在线观看| 91精品国产综合久久香蕉最新版| 欧美日韩亚洲国产一区| 7777精品视频| 亚洲理论在线a中文字幕| 国产亚洲在线播放| 成人午夜一级二级三级| 97精品欧美一区二区三区| 欧美激情一区二区久久久| 欧美中在线观看| 国产日韩精品入口| 日韩一区二区精品视频| 国产欧美一区二区三区久久| 欧美激情视频播放| 久久天天躁狠狠躁夜夜躁2014| 欧美精品18videos性欧| 国产精品白丝av嫩草影院| 91av在线播放视频| 欧美在线性视频| 欧美精品在线看| 久久精品国产成人| 亚洲护士老师的毛茸茸最新章节| 久久精品国产亚洲精品2020| 中文字幕国产精品久久| 欧美美女操人视频| 色综合91久久精品中文字幕| 91精品综合视频| 国产精品视频免费在线观看| 精品国产乱码久久久久久天美| 亚洲男人天堂九九视频| 欧美在线观看视频| 国产精品视频网址| 国产在线观看精品一区二区三区| 国产欧美一区二区三区在线| 97**国产露脸精品国产| 韩曰欧美视频免费观看| 亚洲国产精品yw在线观看| 亚洲男人天堂2019| 国产成人精品一区二区在线| 97超级碰在线看视频免费在线看| 国产丝袜高跟一区| 在线成人激情视频| 日本电影亚洲天堂| 亚洲精品一区二区三区不| 亚洲国产精品悠悠久久琪琪| 国产精品999| 欧美激情久久久久| 久久频这里精品99香蕉| 国产精品久久久久久久久久东京| 国产成人av在线播放| 欧美黄色免费网站| 欧美激情一级欧美精品| 日韩在线免费视频| 日本亚洲精品在线观看| 亚洲人成网站999久久久综合| 91九色综合久久| 姬川优奈aav一区二区| 久久免费福利视频| 亚洲jizzjizz日本少妇| 国产精品尤物福利片在线观看| 日韩av在线影视| 亚洲石原莉奈一区二区在线观看| 一本色道久久综合亚洲精品小说| 最近2019免费中文字幕视频三| 亚洲另类xxxx| 日韩av123| 亚洲品质视频自拍网| 欧美交受高潮1| 亚洲r级在线观看| 国产精品入口尤物| xx视频.9999.com| 亚洲欧洲高清在线| 国产欧美日韩中文| 78m国产成人精品视频| 欧美国产日韩一区二区在线观看| 亚洲第一精品久久忘忧草社区| 亚洲国产欧美一区二区三区同亚洲| 欧美一级在线播放| 国产成人精品午夜| 91精品久久久久久综合乱菊| 亚洲丝袜在线视频| 精品亚洲一区二区三区在线观看| 这里只有精品在线播放| 国产精品久久婷婷六月丁香| 欧美日韩国产丝袜另类| 国产精品亚洲第一区| 久久视频在线视频| 久久久久久久久久久免费精品| 美女福利视频一区| 亚洲tv在线观看| 国产国语videosex另类| 久久久亚洲国产天美传媒修理工| 91在线观看免费高清完整版在线观看| 欧美国产亚洲视频| 国产91亚洲精品| 国产一区二区精品丝袜| 国产主播精品在线| 国产不卡av在线| 欧美视频不卡中文| 国产美女久久精品香蕉69| 精品国产一区二区三区四区在线观看| 亚洲跨种族黑人xxx|