Perkenalkan secara singkat fungsinya
1. Ekstrak link produk (ponsel) dari halaman JD Mobile Daily Flash Sale sesekali (misalnya 1 menit).
http://sale.360buy.com/act/8VTHFGr10CjMDyZ.html#01
2. Mengirim data ke backend berdasarkan link produk yang diekstraksi untuk mendapatkan harga produk, deskripsi, diskon, inventaris (apakah tersedia) dan informasi lainnya.
3. Membuat penilaian berdasarkan informasi yang diperoleh.
Jika kondisi terpenuhi, browser akan dipanggil secara otomatis (asalkan chrome ditambahkan ke variabel lingkungan, atau kode diubah untuk menambahkan jalur browser.exe ke kode, dan program dimodifikasi) untuk membuka pemesanan produk halaman.
4. Faktanya, ini memecahkan masalah: Anda tidak perlu sering-sering menyegarkan halaman web, dan Anda tidak perlu memeriksanya sendiri;
Masuk dan mengirimkan pesanan harus diselesaikan oleh browser (tampaknya poin fungsional ini lebih rumit dan belum diproses)
Program ini tidak sempurna:
Ada beberapa tempat yang perlu dimodifikasi sebelum dijalankan:
1. Variabel lingkungan: chrome menambahkan variabel browser untuk memudahkan panggilan. . Atau modifikasi sendiri kode sumbernya dan buka dengan cara lain.
2. Informasi harga setiap produk dalam kegiatan perlu ditetapkan. Ini tidak bagus, kode sumbernya harus diubah.
Modifikasinya ada pada fungsi filter().
3. Tempat lain yang perlu dimodifikasi adalah
hasStore(String kunci skuid)
alamat="http://price.360buy.com/stocksoa/StockHandler.ashx?callback=getProvinceStockCallback&type=pcastock&skuid="+skuidkey+"&provinceid=1&cityid=2800&areaid=2850";
Cityid=2800&areaid=...informasi lokasi tempat ini. Ini tidak diproses. Anda perlu mencari tahu sendiri dari halaman produk ponsel.
Ini sebenarnya relatif sederhana. chrome+F12, setelah memodifikasi "kota", wilayah, dan informasi lainnya, Anda akan melihat permintaan get dikirim ke latar belakang. (http://price.360buy.com/stocksoa/StockHandler.ashx?callback=getProvinceStockCallback&type=pcastock&skuid=64EBD0F20F593D95C72C6EED59B64658&provinceid=1&cityid=2805&areaid=2854) Ubah dengan tepat.
Util.java
Copy kode kodenya sebagai berikut:
tampilan paket.Util;
impor java.util.ArrayList;
kelas publik Gunakan {
cetak kekosongan statis publik(Objek o){
Sistem.keluar.cetak(o);
}
public static void println(Objek o){
jika(batal==o)
Sistem.keluar.println();
kalau tidak
Sistem.keluar.println(o);
}
Daftar Array statis publik<Bilangan Bulat> ke DaftarArray(int[] int){
if(ints.panjang==0)
kembalikan nol;
ArrayList<Bilangan Bulat> al=Daftar Arraybaru<Bilangan Bulat>();
for(int i=0;i<ints.panjang;i++){
al.tambahkan(ints[i]);
}
kembalikan al;
}
}
Miaosha360buy.java
Copy kode kodenya sebagai berikut:
paket jingdong;
kelas publik Miaosha360beli {
java.util.concurrent.CountDownLatch t= java.util.concurrent.CountDownLatch(1);
/**
* @param argumen
*/
public static void main(String[] args) {
// TODO Stub metode yang dibuat secara otomatis
System.out.println(Thread.currentThread().getName() + "mulai");
Miaosha360buy ms360=baru Miaosha360buy();
new ThreadOne360buy(ms360.t).start();
sementara(benar){
mencoba {
ms360.t.menunggu();
} tangkapan (InterruptedException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
mencoba {
Thread.sleep(1000*60); // Dipanggil setiap 1 menit?
} tangkapan (InterruptedException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
ms360.t=java.util.concurrent.CountDownLatch(1);
new ThreadOne360buy(ms360.t).start();
System.out.println("Tapak Baru masuk sementara..");
}
}
}
Miaosha360buy.java
Copy kode kodenya sebagai berikut:
paket jingdong;
kelas publik Miaosha360beli {
java.util.concurrent.CountDownLatch t= java.util.concurrent.CountDownLatch(1);
/**
* @param argumen
*/
public static void main(String[] args) {
// TODO Stub metode yang dibuat secara otomatis
System.out.println(Thread.currentThread().getName() + "mulai");
Miaosha360buy ms360=baru Miaosha360buy();
new ThreadOne360buy(ms360.t).start();
sementara(benar){
mencoba {
ms360.t.menunggu();
} tangkapan (InterruptedException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
mencoba {
Thread.sleep(1000*60); // Dipanggil setiap 1 menit?
} tangkapan (InterruptedException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
ms360.t=java.util.concurrent.CountDownLatch(1);
new ThreadOne360buy(ms360.t).start();
System.out.println("Tapak Baru masuk sementara..");
}
}
}
ThreadOne360beli.java
Copy kode kodenya sebagai berikut:
paket jingdong;
impor java.io.IOException;
impor java.util.ArrayList;
impor java.util.HashMap;
impor 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;
impor tampilan.Util.Util;
kelas publik ThreadOne360buy memperluas Thread{
java.util.bersamaan.CountDownLatch c;
ArrayList al;//Rekam halaman produk penjualan kilat
harga mengambang=0,0f;//harga produk
diskon mengambang=0,0f;//Diskon produk
//Digunakan untuk menyimpan informasi thread, tidak terlalu berguna dalam proyek ini
Daftar statis pribadi<Thread> runningThreads = new ArrayList<Thread>();
//Ini adalah counter (tidak pandai menggunakannya, threading selalu terasa lebih rumit)
public ThreadOne360buy(java.util.concurrent.CountDownLatch c) {
ini.c=c;
}
@Mengesampingkan
menjalankan kekosongan publik() {
register(this);//Daftar saat thread dimulai
// cetak tag awal
System.out.println(Thread.currentThread().getName() + "Mulai...");
mencoba {
//Tangkap halaman penjualan flash ponsel Jingdong
this.getMessage("http://sale.360buy.com/act/8VTHFGr10CjMDyZ.html#01");
} tangkapan (ClientProtocolException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
c.hitung mundur();
} tangkapan (IOException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
c.hitung mundur();
}
c.hitung mundur();
batalkan Pendaftaran(ini);//Batalkan pendaftaran ketika thread berakhir
// cetak tag akhir
System.out.println(Thread.currentThread().getName() + "End.");
}
register kekosongan publik(Utas t) {
disinkronkan (runningThreads) {
runningThreads.add(t);
}
}
public void batalkan Pendaftaran(Utas t) {
disinkronkan (runningThreads) {
runningThreads.remove(t);
}
}
boolean statis publik hasThreadRunning() {
// Dengan menilai apakah runningThreads kosong, Anda dapat mengetahui apakah ada thread yang belum dieksekusi.
return (runningThreads.size() > 0);
}
/**
* Dapatkan link produk, skuid produk, skuidkey, harga, dan informasi toko dari halaman mobile flash sale
* @param url: halaman penjualan flash seluler
* @melempar ClientProtocolException
* @throwsIOException
*/
public void getMessage(String url) menampilkan ClientProtocolException, IOException{
al=getMainUrl(turun(url));
Util.println(al);
if(al.ukuran()==0){
c.hitung mundur();
Sistem.keluar(0);
kembali;
}
untuk(int i=0;i<al.ukuran();i++){
StringBuffer sb=StringBuffer baru();
StringBuffer openUrl = StringBuffer baru();
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=Rekomendasikan.cbRecoFittings");
Util.println(sb.toString());
//Yang tersimpan di peta adalah nama produk, harga, dan informasi diskon.
Util.println("Al("+i+") turun:"+sb.toString());
HashMap<String, String> hm=parseProduct(down(sb.toString()));
//Digunakan untuk mencocokkan informasi harga. Cocokkan informasi inventaris
filter(hm,openUrl.toString());//Filter harga dan buka browser jika kondisi terpenuhi
}
}
/**
* Metode verifikasi
* @param hm menyimpan informasi harga
* @param halaman produk url
*/
public void filter(HashMap<String, String> hm,String url){//url adalah halaman produk
//lihat.Util.oenCMD.openWinExe(null,url);
//Haruskah kita memeriksa inventarisnya terlebih dahulu?
String skuidkey=parseSkuidkey(url);
jika(!hasStore(kunci skuid)){
Util.println("----------------------------------------");
Util.println("Stok habis!");
Util.println("----------------------------------------");
//Kurangi hitungannya sehingga thread utama dapat menilai
c.hitung mundur();
//Haruskah kita mengakhiri thread anak?
kembali;
}
if(hm.get("skuid").equals("201602")){//Judgement//Motorola skuid=201602
//Harga di sini adalah hard-coded dan perlu diubah sebelum dijalankan.
this.setPrice(499.0f);
//Haruskah konsol dibuka?
if(Float.parseFloat(hm.get("harga"))<=ini.getPrice()){
view.Util.oenCMD.openWinExe(null,url);
}
}else if(hm.get("skuid").equals("675647")){//Tianyu skuid=675647
////Harga di sini bersifat hard-code dan perlu diubah sebelum dijalankan.
//ini.setHarga(699.0f);
////Haruskah konsol dibuka?
//if(Float.parseFloat(hm.get("harga"))<=ini.getPrice()){
//lihat.Util.oenCMD.openWinExe(null,url);
//}
}
}
/**
* Parsing nama, skuid, informasi harga di halaman produk
* @paramdoc
* @kembali
*/
public static HashMap<String, String> parseProduct(Dokumen dokumen){
String teks=doc.teks();
String docc=text.substring(text.indexOf("master")+9,text.indexOf("fittings")-3).replaceAll("[//s]", "");
String[] ss=docc.split(",");
HashMap<String, String> hm=HashMap baru<String, String>();
untuk(Rangkai: ss){
String string=itu.replaceAll("/"", "");
if(string.berisi("//u"))
string=unicodeDecode(string);
String[] str=string.split(":");
hm.put(str[0], str[1]);
}
Util.println(hm);
kembali hm;
}
/**
* Memproses karakter unicode dan mengubahnya menjadi karakter tampilan (karakter Cina), yang tidak terlalu serbaguna.
* @param itu: /u6a5d
* @kembali
*/
public static String unicodeDecode(String it){//Salah satu kelemahannya adalah karakter sebelumnya tidak dapat dihapus
Util.println(itu);
String regex="(////u[0-9a-f]{4})";
Pola pt= Pola.kompilasi(regex);
MC pencocok;
StringBuffer sb;
StringBuffer sba=StringBuffer baru();
mc=pt.matcher(itu);
while(mc.find()){
sb=StringBuffer baru();
mc.appendReplacement(sba,sb.append((char )Integer.parseInt((mc.group(1).substring(2)), 16)).toString());
}
kembalikan sba.toString();
}
/**
* Kembalikan objek dokumen (unduh konten)
* @param halaman unduh url
* @kembali
* @melempar ClientProtocolException
* @throwsIOException
*/
Dokumen statis publik turun (String url) memunculkan ClientProtocolException, IOException{
Dokumen dokumen = null;
DefaultHttpClient httpClient=DefaultHttpClient() baru;
Util.println("Unduh:"+url);
HttpGet get=HttpGet baru(url);
Respons HttpResponse;
respon = httpClient.execute(dapatkan);
Entitas HttpEntity = respon.getEntity();
doc = Jsoup.parse(entitas.getContent(), "utf-8","");
//Lepaskan sumber daya
EntityUtils.konsumsi(entitas);
//Tutup koneksi
httpClient.getConnectionManager().shutdown();
kembalikan dokumen;
}
/**
* Menambahkan informasi kontrol pengkodean
* Halaman url @param yang akan diunduh
* Pengkodean kode @param
* @kembali
* @melempar ClientProtocolException
* @throwsIOException
*/
Dokumen statis publik turun (String url, Kode string) memunculkan ClientProtocolException, IOException{
Dokumen dokumen = null;
DefaultHttpClient httpClient=Baru DefaultHttpClient();
Util.println("Unduh:"+url);
HttpGet get=HttpGet baru(url);
Respons HttpResponse;
respon = httpClient.execute(dapatkan);
Entitas HttpEntity = respon.getEntity();
doc = Jsoup.parse(entity.getContent(), kode,"");
//Lepaskan sumber daya
EntityUtils.konsumsi(entitas);
//Tutup koneksi
httpClient.getConnectionManager().shutdown();
kembalikan dokumen;
}
/**
* Digunakan untuk mengurai link produk (koleksi) di halaman penjualan flash
* @paramdoc
* @kembali
*/
public static ArrayList<String> getMainUrl(Dokumen dokumen){
if(doc.sama dengan("")||doc==null)
kembalikan nol;
mencoba {
Thread.tidur(50);
} tangkapan (InterruptedException e1) {
// TODO Blok tangkapan yang dibuat secara otomatis
e1.printStackTrace();
}
ArrayList<String> urls=Daftar Array baru<String>();
String rule="peta[nama=Peta] >area[href~=produk]";
/**
* Mulai penguraian
*/
Elemen elements=doc.select(aturan);
for (Elemen e : elemen) {
//Util.println(e.absUrl("abs:href"));
urls.add(e.absUrl("abs:href"));
}
mengembalikan url;
}
/**
* Dapatkan skuidkey untuk menanyakan informasi inventaris produk
* @param url
* @kembali
*/
parseSkuidkey String statis publik(String url){
Dokumen dokumen=null;
mencoba {
doc=bawah(url,"gb2312");
} tangkapan (ClientProtocolException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
} tangkapan (IOException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
//Util.println(doc.select("skrip"));
Teks string = nol;
for(Elemen e : doc.select("script")){
if(e.data().berisi("skuidkey:")){
teks=e.data();
merusak;
}
}
//kunci skuid:'7D45919EA8242511DAA5CC7C6D7B351C'
teks=teks.substring(teks.indexOf("skuidkey:")+10, teks.indexOf("skuidkey:")+42);
Util.println("---------------------------------");
Util.println(teks);
mengembalikan teks;
}
/**
* Lihat informasi inventaris
* @param skuidkey
* @kembali
*/
public static boolean hasStore(String skuidkey){//Tempat ini tidak diproses, dan informasi di browser diekstraksi secara langsung
Alamat string = null;
boolean hasStore=salah;
if(kunci skuid!=null && !"".sama dengan(kunci skuid))
alamat="http://price.360buy.com/stocksoa/StockHandler.ashx?callback=getProvinceStockCallback&type=pcastock&skuid="+skuidkey+"&provinceid=1&cityid=2800&areaid=2850";
kalau tidak{
Util.println("Kesalahan saat mengurai skuidkey");
}
mencoba {
if(parseStore(bawah(alamat))){
hasStore=benar;
}
} tangkapan (ClientProtocolException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
} tangkapan (IOException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
kembali hasStore;
}
/* if(array[1]=="34"||array[1]=="18"){
ubahKeranjang(salah);
djdarea.stockInfoDom.html("<strong class='store-over'>Stok habis</strong>");
}
lain jika(array[1]=="0"){
ubahKeranjang(salah);
djdarea.stockInfoDom.html("<strong class='store-over'>Stok habis</strong>");
}
lain jika(array[2]=="0"&&array[4]!="2"){
ubahKeranjang(salah);
djdarea.stockInfoDom.html("Maaf, produk ini tidak dapat dikirim ke wilayah yang Anda pilih");
}
lain jika(array[1]=="33"||array[1]=="5"){
ubahKeranjang(benar);
djdarea.stockInfoDom.html("<strong>Titik</strong>"+(array[4]=="1"?", area"+(array[3]=="0"?"Tidak":" ")+"Dukungan pembayaran tunai saat pengiriman":"")+cashdesc);
}
lain jika(array[1]=="36"){
ubahKeranjang(benar);
djdarea.stockInfoDom.html("<strong>Pemesanan</strong>"+(array[4]=="1"?", area"+(array[3]=="0"?"Tidak":" ")+"Dukungan pembayaran tunai saat pengiriman":"")+cashdesc);
}
lain jika(array[1]=="39"){
ubahKeranjang(benar);
djdarea.stockInfoDom.html("<strong>Dalam perjalanan</strong>"+(array[4]=="1"?", area"+(array[3]=="0"?"Tidak": " ")+"Dukungan pembayaran tunai saat pengiriman":"")+cashdesc);
}
lain jika(array[1]=="40"){
ubahKeranjang(benar);
djdarea.stockInfoDom.html("<strong>Tersedia untuk didistribusikan</strong>"+(array[4]=="1"?", area ini"+(array[3]=="0"?"Tidak" :"")+"Dukungan pembayaran tunai saat pengiriman":"")+cashdesc);
}
*/
/**
* Parsing informasi inventaris
* @paramdoc
* @kembali
*/
parseStore boolean statis publik(Dokumen dokumen){
String teks=doc.teks();
String docc=teks.substring(teks.indexOf("-")-1,teks.lastIndexOf(",")-1);
Util.println(docc);
String[] toko=docc.split("-");
if(toko[1].sama dengan("34") || toko[1].sama dengan("18")){
//stok Habis
Util.println("Stok di sini habis");
kembali salah;
}else if(toko[1].sama dengan("33") || toko[1].sama dengan("5")){
//Mencari barang
Util.println("Stok tersedia di sini");
kembali benar;
}
Util.println(toko[1]);
kembali salah;
}
//Beberapa metode kacang
getPrice pelampung publik() {
harga pengembalian;
}
public void setPrice(harga mengambang) {
this.harga = harga;
}
pelampung publik getDiscount() {
diskon pengembalian;
}
public void setDiscount(diskon mengambang) {
this.diskon = diskon;
}
}
oenCMD.java
Copy kode kodenya sebagai berikut:
tampilan paket.Util;
kelas publik oenCMD {
//public static void main(String[] args) {
//// openWinExe(null);
// openExe(null,"http://www.baidu.com");
// }
//Gunakan Java untuk memanggil file exe sistem windows, seperti notepad, calc, dll.
public static void openWinExe(Perintah string,String url) {
if(command==null ||command.equals("")){
perintah = "chrome "+url;
}
Waktu proses rn = Waktu proses.getRuntime();
Proses p = nol;
mencoba {
p = rn.exec(perintah);
} tangkapan (Pengecualian e) {
System.out.println("Kesalahan menangkan exec!");
}
}
//Panggil file lain yang dapat dieksekusi, seperti exe yang dibuat sendiri, atau perangkat lunak yang diunduh dan diinstal.
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("")){
jalurDanNama+=" ";
jalurDanNama+=url;
}
Waktu proses rn = Waktu proses.getRuntime();
Proses p = nol;
mencoba {
p = rn.exec(jalurDanNama);
} tangkapan (Pengecualian e) {
System.out.println("Kesalahan exec!");
}
}
}