Saya selalu ingin mempraktikkan perampasan data multi-threading Java.
Suatu hari saya menemukan bahwa situs web resmi Rings Duoduo (http://www.shoujiduoduo.com/main/) memiliki sejumlah besar data.
Dengan mengamati Ajax front-end mereka untuk mendapatkan data nada dering
http://www.shoujiduoduo.com/ringweb/ringweb.php?type=getlist&listid= {category id} & page = {nomor halaman pagination}
Sangat mudah untuk menemukan bahwa dengan mengubah ListID dan halaman, Anda bisa mendapatkan data JSON dari nada dering dari server, dan dengan mem -parsing data JSON,
Anda dapat melihat bahwa mereka semua memiliki instruksi seperti {"Hasmore": 1, "Curpage": 1}. Dengan menilai nilai Hasmore, kami memutuskan apakah akan merangkak halaman berikutnya.
Namun, alamat unduhan di JSON dikembalikan melalui tautan di atas tanpa nada dering tidak tersedia di JSON
Anda akan segera menemukan bahwa Anda akan melihatnya dengan mengklik "Unduh" di halaman.
Melalui permintaan berikut, Anda bisa mendapatkan alamat unduhan nada dering
http://www.shoujiduoduo.com/ringweb/ringweb.php?type=getUrl&act=Down&rid={ringtone id}
Oleh karena itu, data mereka mudah dicuri. Jadi saya mulai ...
Kode sumber telah diposting di GitHub. Jika Anda tertarik dengan sepatu anak -anak, silakan periksa
GitHub: https://github.com/yongbo000/duoduoaudiorobot
Pada kode:
Paket Me.yongbo.duoduoringrobot; impor java.io.bufferedreader; impor java.io.file; impor java.io.filewriter; java.util.iterator; import java.util.regex.matcher; import java.util.regex.pattern; import com.google.gson.gson; import com.google.gson.jsonarray; import com.google.gson.jsonelement; import com.google.gson.gson.json; 2013/4/16 * * */kelas publik DuoduoringRoBotClient mengimplementasikan runnable {public static string get_ringinfo_url = "http:/www.shoujiduoduo.com/ringweb/ringweb.php?type=getlist&listid=%1$$$CEB mA "http://www.shoujiduoduo.com/ringweb/ringweb.php?type=getUrl&act=Down&rid=%1$d"; string statis public alib.msg =" DATADID DATADID STATUS PUBLIK; PUBLIK STATUS DAN TELAH TELAH DIHAPUS OTOMATIS. HALAMAN STATUS SEBAGI 2 $ DATURAN "PUBLIK" PUBUK KETATER "PUBUK PUBLIK; PUBLIK PUBLIK," PUBUK ADATIONAL "STATUS PUBUT; %1 $ d, Halaman saat ini: %2 $ d "; string statis publik file_dir =" e:/ringdata/"; string statis public file_name =" listid = %1 $ d.txt "; private boolean errorflag = false; listId private; halaman int private int endpage = -1; private int haspore = 1; private dbhel dbhel; @param halaman mulai nomor halaman* @param endpage nomor halaman akhir**/public duoduoringroBoTclient (int listId, int beginpage, int endpage) {this.listId = listId; this.page = beginpage; this.endpage = endpage; this.dbhelper = new dbhelper ();} @@dbhelper* listor* dbhelper (); */public DuoduoRingRobotClient(int listId, int page) {this(listId, page, -1);}/** * Get ringtone* */public void getRings() {String url = String.format(GET_RINGINFO_URL, listId, page);String responseStr = httpGet(url);hasMore = getHasmore(responseStr);page = getNextPage (responseStr); ringparse (responseStr.Replaceall ("// {/" hasmore/": [0-9]*,/" Curpage/": [0-9]* //},", "") .replaceall (",]", " httpGet(String webUrl){URL url;URLConnection conn;StringBuilder sb = new StringBuilder();String resultStr = "";try {url = new URL(webUrl);conn = url.openConnection();conn.connect();InputStream is = conn.getInputStream();InputStreamReader isr = new InputStreamReader (IS); bufferedReader bufreader = new bufferedReader (ISR); string linetext; while ((linetext = bufreader.readline ())! = null) {sb.append (linetext);} resultStr = sb.toString ();} catch (exception e) {errorFlag = true; // txtring ke txtwritetile (string.Format (error_msg, listid, page, page); Ring Object dan simpan di txt* @param json json string**/public void ringparse (string json) {ring ring = null; jsoneLement element = new jsonparser (). Parse (json); jsonarray array = element.getAsjsonray (); // traverse array iterator <Jsonelement = array = arron =) greonor ();/traverse array <Jsonelor = JSONElEMent> ARRAYRET =); (it.hasnext () &&! errorFlag) {jsoneLement e = it.next (); // Konversi JSONElement ke Javabean Object Ring = gson.fromjson (e, ring.class); ring.setDownUrl (getringdownUrl (ring.getid ()); if (Isavailablering (getringdownurl (ring.getid ())); ifeailablering (getringdownUrl (ring.getid ())); if (Isavailablering (getringdownurl (ring.getid ())); ifeailablering (getringdownurl (ring.getid ())); ifeailablering (getringdownurl (ring.getid ())); {System.out.println (ring.toString ()); // Anda dapat memilih untuk menulis ke database atau ke teks // writeToFile (ring.toString ()); writeTodatabase (ring);}}/** * Txt * @param string data string */public void writoTeTir String.format (file_name, listId); file dir = file baru (file_dir); file file = file baru (path); fileWriter fw = null; if (! Dir.exists ()) {dir.mkdirs ();} coba {if (! true); fw.write (data); fw.write ("/r/n"); fw.flush ();} catch (ioException e) {// TODO AUTO-Auto Catch Blocke.printStackTrace ();} akhirnya {coba {if (fw! = null) {fw.close (); Tangkapan yang dihasilkan secara otomatis blocke.printstacktrace ();}}}/*** Tulis ke database* @param Ring Sebuah instance cincin**/public void writeTodatabase (cincin cincin) {dbhelper.execute ("addring", ring);} @overridePUBLIC void run () () {{everpling) {{overplon {{overing) {{overpling) {{overpling) {{everpling) {dbhelper () {{everpling) {{everige) {{everple) {{everpling) {{everpling) ! = -1) {if (halaman> endpage) {break; }} System.out.println (string.format (status_msg, listid, halaman)); getRings (); System.out.println (string.Format ("Data yang ditulis pada halaman ini selesai"));} System.out.println ("Ending ...");} Private int gethasmore (string hancur) ("ending ...");} private int gethasmore (string hancur) {pater = (ending ... ");} private int gethasmore (string hancur) {pater = {pater ="); Pola.compile ("/" hasmore/": ([0-9]*),/" Curpage/": ([0-9]*)"); Pencocokan pencocokan = p.matcher (hasil); if (match.find ()) {return integer.parseint (match.group (1)); } return 0;}private int getNextPage(String resultStr){Pattern p = Pattern.compile("/"hasmore/":([0-9]*),/"curpage/":([0-9]*)");Matcher match = p.matcher(resultStr);if (match.find()) {return Integer.parseInt(match.group(2));}return 0;}/** * Tentukan apakah cincin saat ini memenuhi kondisi tersebut. Ketika nama cincin lebih besar dari 50 karakter atau durasi adalah desimal, itu tidak memenuhi kondisi dan akan dihapus. * @param Ring Current Object Object Instance**/Private Boolean Isavailablering (Ring Ring) {Pattern P = Pattern.Compile ("^[1-9] [0-9]* $"); Matcher Match = p.matcher (ring.getDuration ()); if (! ||.