Stellen Sie die Funktionen kurz vor
1. Extrahieren Sie den Produktlink (Mobiltelefon) von Zeit zu Zeit (z. B. alle 1 Minute) von der JD Mobile Daily Flash Sale-Seite.
http://sale.360buy.com/act/8VTHFGr10CjMDyZ.html#01
2. Senden Sie Daten basierend auf dem extrahierten Produktlink an das Backend, um Produktpreis, Beschreibung, Rabatt, Lagerbestand (ob auf Lager) und andere Informationen zu erhalten.
3. Treffen Sie Urteile auf der Grundlage der erhaltenen Informationen.
Wenn die Bedingungen erfüllt sind, wird der Browser automatisch aufgerufen (vorausgesetzt, Chrome wird zur Umgebungsvariablen hinzugefügt oder der Code wird geändert, um den Pfad browser.exe zum Code hinzuzufügen und das Programm wird geändert), um die Produktbestellung zu öffnen Seite.
4. Tatsächlich wird dadurch ein Problem gelöst: Sie müssen die Webseite nicht mehr häufig aktualisieren oder selbst überprüfen;
Das Anmelden und Absenden von Bestellungen muss über den Browser gelöst werden (anscheinend sind diese Funktionspunkte komplizierter und wurden nicht verarbeitet).
Das Programm ist nicht perfekt:
Es gibt mehrere Stellen, die vor der Ausführung geändert werden müssen:
1. Umgebungsvariablen: Chrome fügt Browservariablen zum einfachen Aufrufen hinzu. . Oder ändern Sie den Quellcode selbst und öffnen Sie ihn auf andere Weise.
2. Die Preisinformationen für jedes Produkt in der Aktivität müssen festgelegt werden. Das ist nicht gut, der Quellcode muss geändert werden.
Die Änderung erfolgt in der Funktion filter().
3. Ein weiterer Ort, der geändert werden muss, ist
hasStore(String skuidkey)
address="http://price.360buy.com/stocksoa/StockHandler.ashx?callback=getProvinceStockCallback&type=pcastock&skuid="+skuidkey+"&provinceid=1&cityid=2800&areaid=2850";
Die cityid=2800&areaid=...Standortinformationen dieses Ortes. Dies wurde nicht verarbeitet. Sie müssen es selbst auf der Produktseite des Mobiltelefons herausfinden.
Eigentlich ist es relativ einfach. Chrome+F12, nachdem Sie die „Stadt“, die Region und andere Informationen geändert haben, wird eine Get-Anfrage an den Hintergrund gesendet. Dieser Link enthält die erforderlichen Informationen. (http://price.360buy.com/stocksoa/StockHandler.ashx?callback=getProvinceStockCallback&type=pcastock&skuid=64EBD0F20F593D95C72C6EED59B64658&provinceid=1&cityid=2805&areaid=2854) Entsprechend ändern.
Util.java
Kopieren Sie den Codecode wie folgt:
Paketansicht.Util;
import java.util.ArrayList;
öffentliche Klasse Util {
public static void print(Object o){
System.out.print(o);
}
public static void println(Object o){
if(null==o)
System.out.println();
anders
System.out.println(o);
}
öffentliche statische ArrayList<Integer> toArrayList(int[] ints){
if(ints.length==0)
null zurückgeben;
ArrayList<Integer> al=new ArrayList<Integer>();
for(int i=0;i<ints.length;i++){
al.add(ints[i]);
}
gib al zurück;
}
}
Miaosha360buy.java
Kopieren Sie den Codecode wie folgt:
Paket Jingdong;
öffentliche Klasse Miaosha360buy {
java.util.concurrent.CountDownLatch t= new java.util.concurrent.CountDownLatch(1);
/**
* @param args
*/
public static void main(String[] args) {
// TODO Automatisch generierter Methoden-Stub
System.out.println(Thread.currentThread().getName() + "start");
Miaosha360buy ms360=new Miaosha360buy();
new ThreadOne360buy(ms360.t).start();
while(true){
versuchen {
ms360.t.await();
} Catch (InterruptedException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
versuchen {
Thread.sleep(1000*60); // Wird alle 1 Minute aufgerufen?
} Catch (InterruptedException e) {
// TODO Automatisch generierter 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
Kopieren Sie den Codecode wie folgt:
Paket Jingdong;
öffentliche Klasse Miaosha360buy {
java.util.concurrent.CountDownLatch t= new java.util.concurrent.CountDownLatch(1);
/**
* @param args
*/
public static void main(String[] args) {
// TODO Automatisch generierter Methoden-Stub
System.out.println(Thread.currentThread().getName() + "start");
Miaosha360buy ms360=new Miaosha360buy();
new ThreadOne360buy(ms360.t).start();
while(true){
versuchen {
ms360.t.await();
} Catch (InterruptedException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
versuchen {
Thread.sleep(1000*60); // Wird alle 1 Minute aufgerufen?
} Catch (InterruptedException e) {
// TODO Automatisch generierter 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
Kopieren Sie den Codecode wie folgt:
Paket Jingdong;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
java.util.List importieren;
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;
Die öffentliche Klasse ThreadOne360buy erweitert Thread{
java.util.concurrent.CountDownLatch c;
ArrayList al;//Flash-Sale-Produktseite aufzeichnen
Float-Preis=0,0f;//Produktpreis
Float-Rabatt=0,0f;//Produktrabatt
//Wird zum Speichern von Thread-Informationen verwendet, was in diesem Projekt nicht sehr nützlich ist
private static List<Thread> runningThreads = new ArrayList<Thread>();
//Dies ist ein Zähler (nicht sehr gut darin, Threads haben sich schon immer komplizierter angefühlt)
public ThreadOne360buy(java.util.concurrent.CountDownLatch c) {
this.c=c;
}
@Override
public void run() {
register(this);//Registrieren, wenn der Thread startet
// Start-Tag drucken
System.out.println(Thread.currentThread().getName() + "Start...");
versuchen {
//Schauen Sie sich die Flash-Sale-Seite für Mobiltelefone von Jingdong an
this.getMessage("http://sale.360buy.com/act/8VTHFGr10CjMDyZ.html#01");
} Catch (ClientProtocolException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
c.countDown();
} Catch (IOException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
c.countDown();
}
c.countDown();
unRegist(this);//Registrierung aufheben, wenn der Thread endet
// End-Tag drucken
System.out.println(Thread.currentThread().getName() + „End.“);
}
öffentliches Leereregister (Thread t) {
synchronisiert (runningThreads) {
runningThreads.add(t);
}
}
public void unRegist(Thread t) {
synchronisiert (runningThreads) {
runningThreads.remove(t);
}
}
öffentlicher statischer boolescher Wert hasThreadRunning() {
// Indem Sie beurteilen, ob RunningThreads leer ist, können Sie feststellen, ob Threads vorhanden sind, die noch nicht ausgeführt wurden.
return (runningThreads.size() > 0);
}
/**
* Erhalten Sie den Produktlink, die Produkt-Skuid, den Skuidkey, den Preis und die Geschäftsinformationen von der mobilen Flash-Sale-Seite
* @param URL: Flash-Verkaufsseite für Mobilgeräte
* @throws ClientProtocolException
* @throwsIOException
*/
public void getMessage(String url) löst ClientProtocolException, IOException{ aus
al=getMainUrl(down(url));
Util.println(al);
if(al.size()==0){
c.countDown();
System.exit(0);
zurückkehren;
}
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());
//In der Karte werden der Produktname, der Preis und die Rabattinformationen gespeichert.
Util.println("Al("+i+") down:"+sb.toString());
HashMap<String, String> hm=parseProduct(down(sb.toString()));
//Wird zum Abgleichen von Preisinformationen verwendet. Bestandsinformationen abgleichen
filter(hm,openUrl.toString());//Filtern Sie den Preis und öffnen Sie den Browser, wenn die Bedingungen erfüllt sind
}
}
/**
* Eine Verifizierungsmethode
* @param hm enthält Preisinformationen
* @param URL-Produktseite
*/
public void filter(HashMap<String, String> hm,String url){//url ist die Produktseite
//view.Util.oenCMD.openWinExe(null,url);
//Sollten wir zuerst das Inventar überprüfen?
String skuidkey=parseSkuidkey(url);
if(!hasStore(skuidkey)){
Util.println("--------------------------");
Util.println("Ausverkauft!");
Util.println("--------------------------");
// Verringern Sie die Anzahl, damit der Hauptthread beurteilen kann
c.countDown();
//Sollten wir den untergeordneten Thread beenden?
zurückkehren;
}
if(hm.get("skuid").equals("201602")){//Judgement//Motorola skuid=201602
//Der Preis ist hier fest codiert und muss vor der Ausführung geändert werden.
this.setPrice(499.0f);
//Soll die Konsole geöffnet werden?
if(Float.parseFloat(hm.get("price"))<=this.getPrice()){
view.Util.oenCMD.openWinExe(null,url);
}
}else if(hm.get("skuid").equals("675647")){//Tianyu skuid=675647
////Der Preis ist hier fest codiert und muss vor der Ausführung geändert werden.
//this.setPrice(699.0f);
////Sollte die Konsole geöffnet werden?
//if(Float.parseFloat(hm.get("price"))<=this.getPrice()){
//view.Util.oenCMD.openWinExe(null,url);
//}
}
}
/**
* Name, Artikelnummer und Preisinformationen auf der Produktseite analysiert
* @paramdoc
* @zurückkehren
*/
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("//u"))
string=unicodeDecode(string);
String[] str=string.split(":");
hm.put(str[0], str[1]);
}
Util.println(hm);
zurück hm;
}
/**
* Verarbeiten Sie Unicode-Zeichen und konvertieren Sie sie in Anzeigezeichen (chinesische Zeichen), was nicht sehr vielseitig ist.
* @param it: /u6a5d
* @zurückkehren
*/
public static String unicodeDecode(String it){//Ein Nachteil ist, dass die vorherigen Zeichen nicht entfernt werden können
Util.println(it);
String regex="(////u[0-9a-f]{4})";
Muster 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();
}
/**
* Dokumentobjekt zurückgeben (Inhalt herunterladen)
* @param URL-Downloadseite
* @zurückkehren
* @throws ClientProtocolException
* @throwsIOException
*/
public static Document down(String url) wirft ClientProtocolException, IOException{
Dokumentdokument = null;
DefaultHttpClient httpClient=new DefaultHttpClient();
Util.println("Download:"+url);
HttpGet get=new HttpGet(url);
HttpResponse-Antwort;
Antwort = httpClient.execute(get);
HttpEntity-Entity = Response.getEntity();
doc = Jsoup.parse(entity.getContent(), "utf-8","");
//Ressourcen freigeben
EntityUtils.consume(entity);
//Verbindung schließen
httpClient.getConnectionManager().shutdown();
Rücksendedokument;
}
/**
* Codierungskontrollinformationen hinzugefügt
* @param URL-Seite, die heruntergeladen werden soll
* @param-Codekodierung
* @zurückkehren
* @throws ClientProtocolException
* @throwsIOException
*/
öffentliches statisches Dokument down(String url,String code) wirft ClientProtocolException, IOException{
Dokumentdokument = null;
DefaultHttpClient httpClient=new DefaultHttpClient();
Util.println("Download:"+url);
HttpGet get=new HttpGet(url);
HttpResponse-Antwort;
Antwort = httpClient.execute(get);
HttpEntity-Entity = Response.getEntity();
doc = Jsoup.parse(entity.getContent(), code,"");
//Ressourcen freigeben
EntityUtils.consume(entity);
//Verbindung schließen
httpClient.getConnectionManager().shutdown();
Rücksendedokument;
}
/**
* Wird zum Analysieren von Produkt-(Sammlungs-)Links auf Flash-Sale-Seiten verwendet
* @paramdoc
* @zurückkehren
*/
öffentliche statische ArrayList<String> getMainUrl(Dokumentdokument){
if(doc.equals("")||doc==null)
null zurückgeben;
versuchen {
Thread.sleep(50);
} Catch (InterruptedException e1) {
// TODO Automatisch generierter Catch-Block
e1.printStackTrace();
}
ArrayList<String> urls=new ArrayList<String>();
String Rule="map[name=Map] >area[href~=product]";
/**
* Beginnen Sie mit dem Parsen
*/
Elemente elements=doc.select(rule);
for (Element e : Elemente) {
//Util.println(e.absUrl("abs:href"));
urls.add(e.absUrl("abs:href"));
}
Rückgabe-URLs;
}
/**
* Erhalten Sie Skuidkey zum Abfragen von Produktinventarinformationen
* @param-URL
* @zurückkehren
*/
öffentlicher statischer String parseSkuidkey(String URL){
Dokument doc=null;
versuchen {
doc=down(url,"gb2312");
} Catch (ClientProtocolException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
} Catch (IOException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
//Util.println(doc.select("script"));
Zeichenfolgentext = null;
for(Element e : doc.select("script")){
if(e.data().contains("skuidkey:")){
text=e.data();
brechen;
}
}
//skuidkey:'7D45919EA8242511DAA5CC7C6D7B351C'
text=text.substring(text.indexOf("skuidkey:")+10, text.indexOf("skuidkey:")+42);
Util.println("------------------------------------------------");
Util.println(text);
Rückgabetext;
}
/**
* Inventarinformationen anzeigen
* @param skuidkey
* @zurückkehren
*/
public static boolean hasStore(String skuidkey){//Dieser Ort wird nicht verarbeitet, extrahieren Sie die Informationen direkt im Browser
String-Adresse = 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";
anders{
Util.println("Fehler beim Parsen von Skuidkey");
}
versuchen {
if(parseStore(down(address))){
hasStore=true;
}
} Catch (ClientProtocolException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
} Catch (IOException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
return hasStore;
}
/* if(array[1]=="34"||array[1]=="18"){
changeCart(false);
djdarea.stockInfoDom.html("<strong class='store-over'>Ausverkauft</strong>");
}
sonst if(array[1]=="0"){
changeCart(false);
djdarea.stockInfoDom.html("<strong class='store-over'>Ausverkauft</strong>");
}
sonst if(array[2]=="0"&&array[4]!="2"){
changeCart(false);
djdarea.stockInfoDom.html("Leider kann dieses Produkt nicht in die von Ihnen ausgewählte Region geliefert werden");
}
sonst if(array[1]=="33"||array[1]=="5"){
changeCart(true);
djdarea.stockInfoDom.html("<strong>Spot</strong>"+(array[4]=="1"?", der Bereich"+(array[3]=="0"?"Nein: ")+"Nachnahme unterstützen:"")+cashdesc);
}
sonst if(array[1]=="36"){
changeCart(true);
djdarea.stockInfoDom.html("<strong>Buchung</strong>"+(array[4]=="1"?", der Bereich"+(array[3]=="0"?"Nein: ")+"Nachnahme unterstützen:"")+cashdesc);
}
sonst if(array[1]=="39"){
changeCart(true);
djdarea.stockInfoDom.html("<strong>Im Transport</strong>"+(array[4]=="1"?", der Bereich"+(array[3]=="0"?"Nein": " ")+"Unterstützung per Nachnahme"")+cashdesc);
}
sonst if(array[1]=="40"){
changeCart(true);
djdarea.stockInfoDom.html("<strong>Verfügbar zur Verteilung</strong>"+(array[4]=="1"?", dieser Bereich"+(array[3]=="0"?"Nein" :"")+"Nachnahme unterstützen:"")+cashdesc);
}
*/
/**
* Inventarinformationen analysieren
* @paramdoc
* @zurückkehren
*/
öffentlicher statischer boolescher parseStore(Dokumentdokument){
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")){
//ausverkauft
Util.println("Hier nicht vorrätig");
return false;
}else if(store[1].equals("33") || store[1].equals("5")){
//Spotware
Util.println("Hier auf Lager");
return true;
}
Util.println(store[1]);
return false;
}
//Mehrere Bean-Methoden
öffentlicher Float getPrice() {
Rückgabepreis;
}
public void setPrice(float price) {
this.price = Preis;
}
öffentlicher Float getDiscount() {
Rückgaberabatt;
}
public void setDiscount(float discount) {
this.discount = Rabatt;
}
}
oenCMD.java
Kopieren Sie den Codecode wie folgt:
Paketansicht.Util;
öffentliche Klasse oenCMD {
//public static void main(String[] args) {
//// openWinExe(null);
// openExe(null,"http://www.baidu.com");
// }
// Verwenden Sie Java, um die exe-Datei des Windows-Systems aufzurufen, z. B. Notepad, Calc usw.
public static void openWinExe(String command,String url) {
if(command==null ||command.equals("")){
command = "chrome "+url;
}
Laufzeit rn = Runtime.getRuntime();
Prozess p = null;
versuchen {
p = rn.exec(Befehl);
} Catch (Ausnahme e) {
System.out.println("Fehler win exec!");
}
}
// Rufen Sie andere ausführbare Dateien auf, z. B. selbst erstellte EXE-Dateien oder heruntergeladene und installierte Software.
public static void openExe(String pathAndName,String url) {
if(pathAndName==null || pathAndName.equals("")){
pathAndName="C://Benutzer//Administrator//AppData//Local//Google//Chrome//Application//chrome.exe";
}
if(url!=null && !url.equals("")){
pathAndName+=" ";
pathAndName+=url;
}
Laufzeit rn = Runtime.getRuntime();
Prozess p = null;
versuchen {
p = rn.exec(pathAndName);
} Catch (Ausnahme e) {
System.out.println("Fehler exec!");
}
}
}