14 Februari 2017 - 01:50:13 - Read: 345

Grab Free Proxy Lists Dari Frontend HideMyAss Tanpa API

Kita gak membahas tentang web proxy loh yak ^_^

Mungkin cara gak sopan ini sangat merepotkan jika kita bisa mendapatkan list IP Proxy secara gratis dari interface website Hide My Ass dengan segala opsi pilihan yang sangat memudahkan. Tapi cara ini akan sangat bermanfaat saat kita membutuhkan free proxy untuk kebutuhan server yang processnya berjalan di belakang layar. :)

Dan cara ini akan dua kali lebih merepotkan jika ternyata ada cara yang lebih mudah :D

Tapi terlepas dari quote diatas, dengan menerapkan konsep grabbing di artikel ini, berarti setidaknya kita belajar satu hal, bahwa nyaris tidak ada interface yang tidak bisa kita grabbing, selama tidak dilindungi oleh advanced captcha, atau delay realtime load content seperti AJAX. Bisa, tapi mungkin kalo gak bikin muntah, minimal bikin kejang-kejang. :p

Baiklah, terlepas lagi dari penjelasan ultra rumit diatas, dibawah ini akan kita jelaskan terlebih dahulu kenapa artikel ini perlu ditulis. :)

Kisah nyata ini adalah ketika tools HTTP Tools perlu berjalan dibalik proxy saat akan melakukan request dari fitur "curl", "dirscanner" atau "sqlmap" yang bisa disalah gunakan. Karena free proxy bisa down setiap saat (bahkan bisa dalam hitungan menit), jadi kita punya 2 opsi. Pertama, selalu melakukan update IP Proxy atau opsi kedua, berlangganan service berbayar biar bisa dapet API sesuai kebutuhan.

Opsi kedua tidak mungkin, karena selain HTTP Tools adalah aplikasi gratis dan tidak memiliki income, dianggaran belanja bulanan rumah tangga gak ada budget buat bayar langganan Premium ini. :p Yarp, berarti opsi pertama lah yang terpaksa kita ambil. Dan disinilah masalah dimulai...

  1. Beberapa server proxy seperti http://freeproxylists.net/ akan menampilkan advanced captcha nya Google jika kita sudah melakukan request berulang, apalagi jika request yang kita kirim tidak menyertakan meta standar browser (seperti useragent, referer) jika menggunakan default "curl" atau apalagi fungsi instant seperti "file_get_contents()" ala PHP. :p
  2. Beberapa server penyedia API proxy juga ternyata 'meng-grab' list nya dari server proxy lain. Berarti mending grab sendiri kan?
  3. Beberapa server lainnya menawarkan list yang terlalu sedikit pilihan.

Dan akhirnya pilihan pun jatuh pada website HideMyAss, karena pilihan server paling banyak dan beragam. Hanya saja sepertinya layout HTML list proxy yang ditampilkan tak seindah CSS nya. T_T

Coba perhatikan 1 baris list dari Free Proxy yang ditawarkan HideMyAss dibawah ini

Coba deh, view source codenya trus cari string "124.88.67.24" :D

Nih, penggalan source code baris diatas

<tr class="altshade"  rel="31176501">
    <td class="leftborder timestamp" rel="1486998361">
        <span class="updatets ">
            5mins        </span>
    </td>
    <td>
        <span>
          <style>
.nsDS{display:none}
.KBJA{display:inline}
.zdp1{display:none}
.aY8_{display:inline}
.gydg{display:none}
.sUvQ{display:inline}
.v8wb{display:none}
.AFbj{display:inline}
</style><span class="sUvQ">124</span><span style="display:none">172</span><span class="gydg">172</span><div style="display:none">172</div>.88<span class="226">.</span><span style="display:none">6</span><span class="nsDS">6</span><div style="display:none">6</div><span style="display:none">19</span><div style="display:none">19</div><span style="display:none">22</span><span class="nsDS">22</span><div style="display:none">22</div><span class="nsDS">32</span><div style="display:none">32</div>67<div style="display:none">71</div><span style="display:none">106</span><span class="zdp1">106</span><div style="display:none">106</div><div style="display:none">109</div><span style="display:none">113</span><span style="display:none">154</span><span></span><div style="display:none">155</div><span style="display:none">197</span><div style="display:none">197</div><span style="display:none">205</span><span class="zdp1">205</span><div style="display:none">205</div><span class="AFbj">.</span><span style="display: inline">24</span>        </span>
    </td>	
    <td>
        83    </td>
        <td style="text-align:left" class="country" rel="cn">
        <span  style="white-space:nowrap;">
            <img src="/browse.php/7F7suRnk/6Uvi54xZ/mEbAyRvD/5xHWw4wt/G7Tdh8Ua/jf8i6mbk/IydvsWk_/3D/b5/" style="width: 16px; height: 11px; margin-right: 5px;" class="flags-cn" alt="flag "/>
            China        </span>
    </td>
    <td>
        <div class="progress-indicator response_time" style="width: 114px" value="653" levels="speed" rel="653">
                    <div class="indicator" style="width: 93%; background-color: rgb(0, 173, 173)"></div>
        </div>
    </td>
    <td> 
        <div class="progress-indicator connection_time" style="width: 114px" title="" rel="213" value="213" levels="speed">
                   <div class="indicator" style="width: 96%; background-color: rgb(0, 173, 173)"></div>
              
       </div>
    </td>
    <td>
        HTTP    </td>
    <td nowrap>
        High +KA    </td>
</tr>

Tuh, cantik kan? :D

Baiklah, coba kita inspect element nya

Span nya cuma 1 aja, tapi isinya... makk.. Gimana nge-regex-nya ini? :D

Belum lagi tidak ada nama class atau style yang bisa kita jadikan patokan. Karena ada element yang memiliki attribute "display:none" langsung di element dan ada juga dari nama class yang digenerate secara random, seperti pada baris

<style>.nsDS{display:none}</style>
<span class="nsDS">6</span>

dan tentu saja dengan innerText yang tak kalah random nya.

Tapi bukan Cafelinux namanya kalo melakukan sesuatu dengan cara mudah. Mari kita persulit hidup kita :D

Pertama kita grab seluruh halaman, kita cari tabel yang menampilkan daftar list free proxy nya. Lalu kita looping masing-masing baris sampai menemukan kondisi yang kita inginkan. Dalam hal ini kita akan mencari proxy dengan Anon "High +KA"

$url='http://proxylist.hidemyass.com';
$curl=new czUrl;
$curl->url=$url;
$curl->referer=$url;
$curl->useragent='Mozilla/5.0 (X11; Linux x86_64; rv:48.0) Gecko/20100101 Firefox/48.0';
$grab=$curl->fetch();
$fp=$grab['html'];

$e=explode('class="leftborder',$fp);
$row='';
for($i=1;$i<count($e)-1;$i++){
	if(stripos($e[$i],'High +KA')){
		$row=$e[$i];
		break;
	}
}
if($row=='') $row=$e[1];
$row=str_replace('div','span',$row);
$f=explode('</span>',$row);

Lalu kita inisialisasi nama class yang akan menampilkan digit IP yang sebenarnya

$g=explode('{display:',$f[1]);
for($i=0;$i<count($g);$i++){
	if(strpos($g[$i],'none') !== false){
		$class[]=str_replace(array(" ","\n",'<style>','inline}.','</td><td><span>.'),"",$g[$i-1]);
	}
}

Inisialisasi digit IP pertama, dan kita simpan kedalam array $ip[]

$k=explode('>',$f[1]);
$ip[]=$k[count($k)-1];

Lalu kita looping lagi dan bersihkan semua innerText dari element HTML, dan ubah semua valuenya menjadi integer. Dengan begini, jika innerText bukan digit angka, maka akan menghasilkan nilai 0. Jika 0 maka buang.

for($i=2;$i<count($f);$i++){
	$exist[$i]=true;
	for($j=0;$j<count($class);$j++){
		if(strpos($f[$i],$class[$j]) !== false){
			$exist[$i]=false;
			break;
		}
	}
}

foreach($exist as $k=>$v){
	if($v == true) $ips[]=$f[$k];
}
$ips=array_map("strip_tags",$ips);
for($i=0;$i<count($ips);$i++){
	$val=(int)str_replace('.','',$ips[$i]);
	if($val > 0){
		$ip[]=$val;
	}
}

 Dari looping diatas, kita akan mendapatkan array $ip[] dengan 5 buah value, yang terdiri dari 4 value pertama sebagai IP, dan index terakhir sebagai portnya.

$IP_PORT=$ip[0].'.'.$ip[1].'.'.$ip[2].'.'.$ip[3].':'.$ip[4];
return $IP_PORT;

Berikut ini code lengkapnya

<?php
// include class curl, silahkan menyesuaikan dengan cara grabbing masing-masing untuk mendapatkan html utuhnya.
	include 'inc/class/libcurl.php';
	function getfreeproxy(){
		$url='http://proxylist.hidemyass.com';
		$curl=new czUrl;
		$curl->url=$url;
		$curl->referer=$url;
		$curl->useragent='Mozilla/5.0 (X11; Linux x86_64; rv:48.0) Gecko/20100101 Firefox/48.0';
		$grab=$curl->fetch();
		$fp=$grab['html'];
		$e=explode('class="leftborder',$fp);
		$row='';
		for($i=1;$i<count($e)-1;$i++){
			if(stripos($e[$i],'High +KA')){
				$row=$e[$i];
				break;
			}
		}
		if($row=='') $row=$e[1];
		$row=str_replace('div','span',$row);
		$f=explode('</span>',$row);
		$g=explode('{display:',$f[1]);
		for($i=0;$i<count($g);$i++){
			if(strpos($g[$i],'none') !== false){
				$class[]=str_replace(array(" ","\n",'<style>','inline}.','</td><td><span>.'),"",$g[$i-1]);
			}
		}
		$class[]='none';
		$k=explode('>',$f[1]);
		$ip[]=$k[count($k)-1];
		
		for($i=2;$i<count($f);$i++){
			$exist[$i]=true;
			for($j=0;$j<count($class);$j++){
				if(strpos($f[$i],$class[$j]) !== false){
					$exist[$i]=false;
					break;
				}
			}
		}
		foreach($exist as $k=>$v){
			if($v == true) $ips[]=$f[$k];
		}
		$ips=array_map("strip_tags",$ips);
		for($i=0;$i<count($ips);$i++){
			$val=(int)str_replace('.','',$ips[$i]);	
			if($val > 0){
				$ip[]=$val;
			}
		}
		$IP_PORT=$ip[0].'.'.$ip[1].'.'.$ip[2].'.'.$ip[3].':'.$ip[4];
		return $IP_PORT;
	}
	
	echo getfreeproxy();

Yarp, memang cara yang konyol. tapi

Last but not least, jika kalian punya cara yang lebih cerdas, share di komentar yak ^_^