Cara Ambil Harga Pengiriman JNE dengan PHP

Sebelumnya lebih baik teman-teman baca artikel saya dulu yang sebelumnya. Setelah membaca dan yakin ingin menggunakan cara kedua, ya baik…Saya coba buat kode untuk melakukan cara ambil harga JNE dengan PHP [cara kedua].

Pertama saya buat folder dengan nama get_price_jne, lalu di dalamnya saya buat file index.php dimana isi dari file ini adalah sebuah form untuk memasukan kota asal pengiriman, kota tujuan pengiriman dan berat barang yang akan dikirim. Berikut kodenya :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Tutorial Sederhana Parsing Harga Pengiriman JNE - Adiputra</title>
</head>
<body>
	<center>
		<h1>Create by Adiputra, Basic Code from Om Andriant</h1>
		<form action='get_harga.php' method='post'>
			<table border='1'>
				<tr>
					<th colspan='2'>Demo Parsing Harga Pengiriman JNE</th>
				<tr>
					<td>Masukan Kota Asal Pengiriman</td>
					<td><input type='text' name='kota_asal' size='20'></td>
				</tr>
				<tr>
					<td>Masukan Kota Tujuan Pengiriman</td>
					<td><input type='text' name='kota_tujuan' size='20'></td>
				</tr>
				<tr>
					<td>Masukan berat barang [integer]</td>
					<td><input type='text' name='berat' size='5'> per kilo</td>
				</tr>
				<tr>
					<td></td>
					<td><input type='submit' name='lihat' value='Cek Harga'></td>
				</tr>
			</table>
		</form>
	</center>
</body>
</html>

Setelah itu saya buat action dari form tersebut dengan nama file get_harga.php yang merupakan teknik parsing atau ambil data dari website lain. Berikut adalah kodenya :

<?php
	/*
		file name : get_harga.php
		created by : Om Andriant - member of forumphp.web.id
		edited by : adiputra - member of forumphp.web.id
		source link : http://forumphp.web.id/viewtopic.php?p=37363&highlight=jne#37363
	*/
        # ambil data kota asal dan kota tujuan serta berat dari form
		$asal = $_POST['kota_asal'];
		$tujuan = $_POST['kota_tujuan'];
		$berat = $_POST['berat'];
		
		if (!function_exists("curl_init")){
            die('CURL tidak ada');
        }else{
			$chp = curl_init();
			//variable for cookies access
			curl_setopt($chp, CURLOPT_COOKIEJAR, $cookiesjar);    
			//variable for cookies store , same as previous line
			curl_setopt($chp, CURLOPT_COOKIEFILE, $cookiesjar);    
			//simulating user agent - shadow
			curl_setopt($chp, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1"); 
			//ingroring server redirect
			curl_setopt($chp, CURLOPT_FOLLOWLOCATION, 1);
			//accepting returns from server
			curl_setopt($chp, CURLOPT_RETURNTRANSFER, 1);    
			
			// cari kode asal
			$url = "http://www.jne.co.id/tariff.php?q=$asal&limit=20&timestamp=".time();
			curl_setopt($chp, CURLOPT_URL, $url);
			$content = curl_exec($chp);
			if ($content != "")
			{
				$kode = preg_split("%\n%si",$content);
				$kode = trim($kode[0]);
				$kode = explode('|',$kode);
				$koreksikotaasal = $kode[0];
				$kodeasal = $kode[1];
			}
			// cek kode tujuan
			$url = "http://www.jne.co.id/tariff.php?q=$tujuan&limit=20&timestamp=".time();
			curl_setopt($chp, CURLOPT_URL, $url);
			$content = curl_exec($chp);
			if ($content != "")
			{
				$kode = preg_split("%\n%si",$content);
				$kode = trim($kode[0]);
				$kode = explode('|',$kode);
				$koreksikotatujuan = $kode[0];
				$kodetujuan = $kode[1];
			}
			// kalo kode asal dan kode tujuan berhasil ketarik, ambil data
			if ($kodeasal != "" && $kodetujuan != "")
			{
				$url = "http://www.jne.co.id/index.php?mib=tariff&lang=IN"; 
				//$params = 'from=JAKARTA&origin_code=Q0dLMTAwMDBK&to=BANDUNG&destination_code=QkRPMTAwMDBK&weight=1&checktariff=';
				$params = "from=$koreksikotaasal&origin_code=$kodeasal&to=$koreksikotatujuan&destination_code=$kodetujuan&weight=$berat&checktariff=";
				curl_setopt($chp, CURLOPT_REFERER, "http://www.jne.co.id/index.php");
				curl_setopt($chp, CURLOPT_POSTFIELDS,$params);    
				curl_setopt($chp, CURLOPT_URL, $url);
				//open the url with our mentioned variables
				$content = curl_exec($chp);
				if (preg_match('%Nama Layanan.*?Tarif.*?</tr>(.*?)</table>%si', $content,$matches)) {
					preg_match_all('%<tr.*?><td.*?>(.*?)</td>.*?<td.*?>(.*?)</td><td.*?>Rp. (.*?)</td>.*?</tr>%si', $matches[1], $result, PREG_PATTERN_ORDER);
					array_shift($result);
					for ($i=0;$i<count($result);$i++)
					{
						echo("Nama Layanan {$result[0][$i]}<br />");
						echo("Jenis Kiriman {$result[1][$i]}<br />");
						echo("Berat $berat<br />");
						echo("Tarif {$result[2][$i]}<br /><br />");
					}
				}
				else{
					echo('gagal menarik data');
				}
			}
			else{
				echo('gagal menarik data');
			}
			
			curl_close($chp);
		}
?>

Baiknya teman-teman membaca apa itu CURL, apa itu preg_match, konsep regex. Jujur pertama kali saya lihat kode ini dari Om Andriant saya baca lagi manual PHP nya :D.

Setelah itu tinggal jalankan. Berikut adalah tampilan awal form di localhost saya

Dan hasilnya bisa dilihat pada gambar di bawah ini.

Dari form ke hasil membutuhkan kira-kira 10 detik-an kalau di komputer local saya. Agak lambat ya..

Selesai ?? Belum,,teman-teman sebenarnya mesti melakukan teknik ambil value dari hasil yang sudah terlihat diatas. Gunakan teknik DOM dengan Javascript atau lebih mudah dengan jquery.

Bingung ?? lebih jelasnya, coba teman-teman mampir ke situs Bhinneka untuk melihat studi kasus saat kita memilih jasa pengiriman. Lebih menarik ya…

Moga bermanfaat…:)

[download code]

Sumber : forumphp.web.id – Dari Om Andriant dengan sedikit modifikasi dari saya…

Iklan

53 thoughts on “Cara Ambil Harga Pengiriman JNE dengan PHP

  1. ooo ternyata seperti itu tho,…
    kemarin temen sy juga membuat app mobile utk android tentang JNE
    berarti menggunakan metode yg sama y,
    thnks mas sy jd ngerti sekarang :D, good jobs

  2. @wahyuprio : kurang lebih seperti itu mas…metode / cara ini saya sebut mencuri data dari JNE..kecuali pihak JNE ngebuat API untuk developer apps…hehe

  3. 1. bro… klo diliat di web jne.. hasilnya ada paket OKE.. seharusnya total jenis paket pengiriman ada 4… tp kok di tampilkan hny 3 (TIGA) sj. thx..
    2. Bro.. bisa ga di integrasikan ke wordpress page kita? sy mau hasilnya ditampilkan di PAGE nya wordpress gt. thx

  4. @yea :
    1. kalu kenapa muncul cuma 3,,itu mah urusan si JNE nya..kita programmer kalu kasus kek gini kan ibarat nyuri data yg ada di site nya JNE..kalu di situsnya cuma ada 3 ya..kita juga gk bisa nambahin jadi 4..kecuali kalu kita admin JNE nya…

    2. cek plugin di situs wordpress gan…spertinya kemarin2 sy pernah dapet..

  5. Mas…saya sudah jalankan scriptnya…saat saya cek harga knp ada printah CURL tidak ada…saya jlnkan dilocalhost…mohon bantuannya

  6. alamat JNEnya udah berubah belum ya?? kok saya jalankan di localhost tidak keluar hasilnya..
    Gagal ambil data terus,,
    konfigurasi curlnya sudah ko,,

  7. input ke db adalah cara paling bagus dan tidak bergantung dengan website jne yg sering down itu tetapi ribet nya kalo mereka update kita juga harus update db kita 😀

  8. @Squall :
    iya mas, resiko..hehe…
    sy sempet buat analogi di artikel https://terusbelajar.wordpress.com/2011/04/29/teori-cara-ambil-harga-pengiriman-jne-ke-website-e-commerce-kita/

    kalu jasa pengiriman dengar, mereka mestinya paham kebutuhan e-commerce di indonesia lagi ramai2nya…seharusnya, masalah ini bisa disolusikan…

    saran buat jasa pengiriman..buat API lah, kaya API Facebook, ato Twitter biar bisa akses untuk keperluan e-commerce atau bidang lainnya..

    oiya,,sy ada info, http://www.ongkoskirim.com katanya sudah mulai menerapkan API untuk harga pengiriman jasa tertentu..tmn2 bisa liat di ongkoskirim.com

  9. Eh, sy ada liat orang sudah bikin module shiping di opencart
    http://www.opencart.com/index.php?route=extension/extension/info&extension_id=3224&path=4&filter_license=1&sort=rating&page=2

    dia gemana autofill captcha nya yah?
    terus keliatannya itu JNE skrg pake javascript utk fill in the city code. tidak pakai tariff.php lagi.

    Kayanya ada pakai tariff_away.php tp ga bisa pake curl keliatannya di block kalau pake curl keluar TRY ….. ROBOT… kurang gitu inget.

  10. alah,,bayar mas..medit..

    untuk dapet chapcha image, sebenarnya bisa langsung akses situs nya kek gini :
    http://jne.co.id/captcha/jnecaptcha.php. Dari link itu bisa dapet image captcha.

    setelah dapet itu image, konversi si image itu ke text, sy coba searching ada yg nama nya PHP OCR, class nya bisa diliat di link ini :
    http://www.phpclasses.org/package/2874-PHP-Recognize-text-objects-in-graphical-images.html

    setelah dapat si text captcha nya, baru kita main di curl.

    ini masih teori..belum sempet sy coba, bnyk yg dikerjain..
    moga ada yg bersedia ngulik..:D

  11. Iya bener, kita bisa access langsung dari situ tapi waktu submit tidak diterima. satu lagi kita bisa load website jne pake iframe lalu position ke captcha image nya. Dari situ diterima kalo di submit.

    nanti param nya kurang lebih jd begini

    $params = “from=JAKARTA&origin_code=Q0dLMTAwMDBK&to=BANDUNG&destination_code=QkRPMTAwMDBK&weight=1&input_captcha=$captcha&checktariff=”;
    saya sudah coba byk cara. kalau tidak pakai iframe. ditolak captcha nya. kalau pake iframe diterima.

    1. Buka website sendiri yg ada
    isi captcha lalu submit. Ditolak.

    2. Buka website sendiri lalu buka website jne di new window. lalu input captcha yg ada di website JNE lalu submit. diterima captcha.

    3. Buka website sendiri dgn iframe website JNE position ke captcha image, lalu submit. captcha diterima.

    ooo yah. satu lagi. sepertinya website jne itu detect session terus simpen itu captcha ke session tersebut. jadi pas submit harus ada

    misalkan:
    curl_setopt($chp, CURLOPT_COOKIE, “PHPSESSID=iva1r6r768u5244t0cc62erdg0”);

    pas buka website jne liat di cookie value PHPSESSID itu apa. nah ini salah satu masalahnya lagi. jd session kita tidak boleh expired. satu cara pake cronjobs.

    Setelah semua ini di rangkum, saya persilahkan mas Adiputra jadi bagaiman solusi nya. Maklum ilmu saya belum sampai disitu. 😀

  12. mas, kok scriptnya gak bisa jalan ya ??

    keterangannya seperti ini :
    Notice: Undefined variable: cookiesjar in C:\xampp\htdocs\jne\get_harga.php on line 8

    Notice: Undefined variable: cookiesjar in C:\xampp\htdocs\jne\get_harga.php on line 10

    Notice: Undefined offset: 1 in C:\xampp\htdocs\jne\get_harga.php on line 32

    Notice: Undefined offset: 1 in C:\xampp\htdocs\jne\get_harga.php on line 44
    gagal menarik data

    emg variable cookiesjar harus di daftarin dimana sebelumnya

    terima kasih mas 🙂

  13. nah ini dia yang saya pengen mas bro… thank ya.. soalnya sangat merepotkan sekali buat saya yg harus bolak balik cek harga jne capek deh…. thx banget ya mas..

  14. kalo coba saya berandai2 kembangkan lagi teori disini, menggabungkan teori satu dan kedua di postingan agan sebelum nya di blog ini;
    1. bikin parser untuk ambil daftar harga dengan teknik di postingan ini
    2. ketika value sudah di parse langsung di stream ke file, mungkin dalam xml atau cvs
    3. file xml tersebut bisa di proses ulang untuk di input k dalam database secara otomatis ke PHP

    case study awal adalah: 1 kota asal, seluruh kota tujuan, berat 1 kg statis (asumsi flat rate, sehingga tinggal akumulasi saja)

    tapi setelah saya pikir2, kalau step nomor 2 memungkinkan, maka hasil parse bisa langsung di jalanin ke DB.

    Keuntungan, proses otomatis, dan dengan scheduling maka setip update data dari JNE akan terus diperbaharui

    kekurangan. proses mungkin memakan waktu berjam2/berhari2, otomatis konsumsi listrik dan internet lumayan boros, terutama koneksi yang susah akses site JNE (berdasarkan pengalaman, buka site JNE kebanyakan TYPE, ENTER AND PRAY 😀

    kendala:
    JNE gak langsung passing seluruh JSON kota tujuan sesuai dengan kota asal, sehingga proses mungkin iteratif, masalahnya disini letak rumit nya karena berarti kita mesti ngakalin gimana supaya bisa dapet kota tujuan seluruh Indonesia.

    ps. saya bukan programmer jadi secara teknis yaaa maapkan kalo ada salah analisa :p

    ditunggu tanggapan nya 🙂

  15. @elie : tetep mas, situs JNE sering down..percuma..sy off masalah JNE..dan kasus get price JNE ini.
    orang IT di JNE gak mikir, situs mereka sering down karna banyak yang akses..banyak yg akses berarti banyak yang butuh..saat banyak yang akses tersebut, JNE harusnya memperbaiki service dari situs tersebut. Tapi kenyataannya engga, situs JNE tetep sering down.
    Dulu proses di codingan artikel saya ini berjalan dengan baik, kini tidak bisa diambil harganya dikarenakan ada fitur “capcay”..Penambahan fitur tersebut mnurut saya langkah yg aneh yg dibuat orang IT nya..Toko Online di indonesia mulai berkembang, harusnya mereka *orang IT JNE* membuat cara agar memudahkan toko online di indonesia nge-get price atau tracking order yang sangat2 dibutuhkan oleh toko online. Smoga ajaaa ada orang IT JNE yang denger..

  16. well, setelah nelpon JNE berkali2 akhirnya dari JNE ngasih list daftar harga ke saya, dalam bentuk PDF (doh) sehingga mesti diconvert dulu ke csv supaya bisa masuk ke DB hahahaha. Saya curiga nya malah si capcay tu ditarok di situ supaya request price nya gak overload yaaa salah dari teknis nya mereka sih yang gak bisa handle kasus macam ini.

  17. @elie : yaaa kan..kalo mereka mengerti dan gak pelit, kasih aja tuh table yang nyangkut soal price n tracking..(haha saya rasa gk akan dikasih). Atau yaa minimal ada usaha pemikiran *service to customer* “gmn nih orang yg buat toko online bisa mudah ngambil price n tracking”. Buat API kek, toko online bisa daftar, buat tokennya trus bisa diakses kaya APInya FB, twitter n sosmed lainnya pas ngambil data tertentu.

  18. @tasjeans :
    langkah cara pertama :
    [1] Minta pricelist JNE, biasanya dia kasih bentuk PDF

    [2] Siapin Table untuk simpen data pricelist JNE, saya saranin konsep db-nya, 1 table “perusahaan pengiriman”, 1 table “service perusahaan pengiriman”, 1 table “price pengiriman” dan 1 table “coverage/city”. Dengan asumsi, ada banyak “perusahaan pengiriman”, dengan banyak “service perusahan pengiriman” per “price pengiriman” tiap “coverage/city”

    [3] Insert data pricelist JNE ke db

    [4] saat customer mas masuk ke web, menghitung biaya pengiriman, arahkan dulu untuk memilih “perusahan pengiriman”, lalu “service”, lalu “coverage/city” dan get db dr parameter 3 itu untuk mengambil price pengirimannya

    Kalo masih bingung, coba kali-kali mas testing order di inibayiku.com, ngeliat alur pas nge-get price pengiriman. moga bisa diterapin di toko mas 🙂

  19. Untuk Cara yang pertama, bisa dibikinin tutorialnya g mas?
    Jujur kalo dibaca dari komen, saya masih kurang jelas cara bikin form dan format table untuk database nya, saya juga bingung cara pengarahan dari form php buatan sendiri ke database JNE itu tadi. Makasih banyak atas infonya yang sudah diberikan..

  20. mau tanya mas
    $url = “http://www.jne.co.id/tariff.php?q=$asal&limit=20&timestamp=”.time();

    itu dptnya dr mana ya ?

  21. dulu sih oke2 aja pas trackingnya ga pake capcay, pake jquery autocomplete sekalian grab kode kotanya udah bisa, itu dulu.. sekarang udah nyerah saya 🙂

  22. @Ahmad : bisa banget, kebanyakan system maskapai seperti lion, garuda dan lainnya tidak mau share resource atau B2B dengan pengusaha penjual tiket. Ini dimanfaatkan programmer untuk buat aplikasi one search, more result of flight dengan cara scrapping data langsung dari website maskapai 😀

  23. gan mau tanya, kalau errornya begini aku harus tambah dimananya ya?
    “Undefined variable: cookiesjar”
    tolong bantuannya ya gan, untukTA ini, mohon bantuannya. terimakasih

  24. saya udah bisa bikin script grabbing jne tp tetep pake captcha dan bisa di integrasikan di website sendiri, klo ada yg berminat berdonasi hubungi saya di 089633304678

Silahkan Komentar...

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s