Skip to content

emka.web.id

menulis pengetahuan – merekam peradaban

Menu
  • Home
  • Tutorial
  • Makalah
  • Ke-NU-an
  • Kabar
  • Search
Menu

Belajar PHP: Membuat layanan Short URL

Posted on May 25, 2011

URL Shortening atau layanan pemendek URL (link) adalah layanan yang memberikan sebuah link pendek dari suatu halaman web atau aplikasi web. Pertama kali dipopulerkan pada tahun 2001, dan mulai tersedia ke publik luas pertama kali oleh TinyURL pada tahun 2002. Sekarang telah lebih dari 100 macam penyedia terekspos ke publik, dan kepopulerannya kembali terangkat dengan hadirnya bit.ly pada tahun 2009 dan segera menjadi pemain utama.

Layanan pemendek URL ini sangat populer digunakan sebagai penghemat jumlah karakter pada layanan SMS atau social networking yang membatasi jumlah karakter seperti Twitter.

Belajar Membuat URL Shortening dengan PHP

Untuk membuat URL Shortening, kita dapat memanfaatkan class PHP berikut:
[sourcecode language=”php”]
<?php

/* Abstract class ShortUrl */

abstract class ShortUrl {

protected $data;

abstract protected function api();

abstract protected function execute($url);

public function getTinyUrl() {

return $this->data;
}

protected function get($url) {

$ch = curl_init();

curl_setopt($ch,CURLOPT_URL,$url);

curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,2);

curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);

$data = curl_exec($ch);

curl_close($ch);

if(empty($data)) {return ‘Error retrieving data. Try again.’;}

else
{return $data;}
}

final protected function validUrl($longurl){

if(!preg_match(‘|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i’, $longurl)) {

throw new Exception("The url is not valid. Please try again.");
}
}
}

/* Concret class TinyUrl */

class TinyUrl extends ShortUrl {

private $url;

public function __construct($longurl) {

$this->validUrl($longurl);

$this->url = urlencode($longurl);

$apiurl = sprintf($this->api(),$this->url);

$this->execute($apiurl);
}

public function execute($url) {

$this->data = $this->get($url);
}

public function api() {

return "http://tinyurl.com/api-create.php?url=%s";
}

}

/* Concret class Bitly */

class Bitly extends ShortUrl {

private $longurl;

public function __construct($longurl,$user,$api) {

$this->validUrl($longurl);

$this->longurl = urlencode($longurl);

$apiurl = sprintf($this->api(),$this->longurl,$user,$api);

$this->execute($apiurl);
}

public function execute($url) {

$content = $this->get($url);

$xml = simplexml_load_string($content);

$shortUrl = $xml->results->nodeKeyVal->shortUrl;

$this->data = $shortUrl;
}

public function api() {

return "http://api.bit.ly/shorten?version=2.0.1&longUrl=%s&login=%s&apiKey=%s&format=xml";
}

}

/* Concret class Trim */

class Trim extends ShortUrl {

private $longurl;

public function __construct($longurl) {

$this->validUrl($longurl);

$this->longurl = urlencode($longurl);

$apiurl = sprintf($this->api(),$this->longurl);

$this->execute($apiurl);
}

public function execute($url) {

$content = $this->get($url);

$xml = new simpleXMLElement($content);

$shortUrl = $xml->url;

$this->data = $shortUrl;
}

public function api() {

return "http://api.tr.im/v1/trim_url.xml?url=%s";;
}

}

/* Concret class Isgd */

class Isgd extends ShortUrl {

private $longurl;

public function __construct($longurl) {

$this->validUrl($longurl);

$this->longurl = urlencode($longurl);

$apiurl = sprintf($this->api(),$this->longurl);

$this->execute($apiurl);
}

public function execute($url) {

$content = $this->get($url);

$this->data = $content;
}

public function api() {

return "http://is.gd/api.php?longurl=%s";
}

}

/* Concret class Unu */

class Unu extends ShortUrl {

private $longurl;

public function __construct($longurl) {

$this->validUrl($longurl);

$this->longurl = urlencode($longurl);

$apiurl = sprintf($this->api(),$this->longurl);

$this->execute($apiurl);
}

public function execute($url) {

$content = $this->get($url);

$this->data = $content;
}

public function api() {

return "http://u.nu/unu-api-simple?url=%s";
}

}

/* Concret class Digg */

class Digg extends ShortUrl {

private $longurl;

public function __construct($longurl,$apikey) {

$this->validUrl($longurl);

ini_set(‘user_agent’,’Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6′);

$this->longurl = urlencode($longurl);

$apiurl = sprintf($this->api(),$apikey,$this->longurl);

$this->execute($apiurl);
}

public function execute($url) {

$xml = file_get_contents($url);

$data = preg_match(‘/short_url="(.*)"/isU’,$xml,$matches);

$this->data = $matches[1];
}

public function api() {

return "http://services.digg.com/url/short/create?type=xml&appkey=%s&url=%s";
}

}

/* class Factory using method Factory*/

class Factory {

public static function create($name, $url, $user=”, $key=”) {

switch(strtolower($name)) {

case ‘bitly’:

$obj = new Bitly($url,$user,$key);

break;

case ‘tinyurl’:

$obj = new tinyUrl($url);

break;

case ‘trim’:

$obj = new Trim($url);

break;

case ‘isgd’:

$obj = new Isgd($url);

break;

case ‘unu’:

$obj = new Unu($url);

break;

case ‘digg’:

$obj = new Digg($url,$key);

break;

}//end switch

return $obj;
}

}

/* How to Usage */

/*
//Holds in variable ‘$longUrl’ the below address post
$longUrl = ‘http://www.wait-till-i.com/2009/11/02/getting-a-list-of-flickr-photos-by-location-andor-search-term-with-a-yql-open-table/’;

//$ob = Factory::create(‘bitly’,$longUrl,"thinkphp","R_0cf8415f0c3f9fcfd867ce7613e43fc7");
//$ob = Factory::create(‘tinyurl’,$longUrl);
//$ob = Factory::create(‘trim’,$longUrl);
//$ob = Factory::create(‘isgd’,$longUrl);
//$ob = Factory::create(‘unu’,$longUrl);
//$ob = Factory::create(‘digg’,$longUrl,"thinkphp","http://thinkphp.ro");

try {

$ob = Factory::create(‘bitly’,$longUrl,"thinkphp","R_0cf8415f0c3f9fcfd867ce7613e43fc7");

echo$ob->getTinyUrl();

}catch(Exception $e) {echo$e->getMessage();}

$output = highlight_file($_SERVER[‘SCRIPT_FILENAME’]);

echo$output;
*/

?>
[/sourcecode]

dan gunakan sebagai berikut:
[sourcecode language=”php”]
<?php

if($_POST[‘longUrl’] && isset($_POST[‘longUrl’]) && $_POST[‘submit’]) {

require_once(‘shortUrl.factory.class.php’);

$longUrl = $_POST[‘longUrl’];

$site = $_POST[‘shorts’];

if($site === ‘bitly’) {

$user = "thinkphp";

$apikey = "R_0cf8415f0c3f9fcfd867ce7613e43fc7";

} else if($site == ‘digg’) {

$apikey = "http://thinkphp.ro";
}

try {
$ob = Factory::create($site,$longUrl,$user,$apikey);

$shortUrl = $ob->getTinyUrl();

}catch(Exception $e) {$shortUrl = $e->getMessage();}

}

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Shorten, share and track your links</title>
<link rel="stylesheet" href="http://yui.yahooapis.com/2.7.0/build/reset-fonts-grids/reset-fonts-grids.css" type="text/css">
<style type="text/css">
html,body{background:#C5C7BE;margin:0;padding:0;}

#doc{background:#fff;border:1em solid #fff;}

h1{font-family:Calibri,Arial,Sans-serif;font-size:200%;margin:0 0 .5em 0; padding:0;}

h2{font-family:Calibri,Arial,Sans-serif;font-size:150%;margin:1em 0;padding:0;font-weight: bold}

select,input{border: 1px solid #ccc;padding: 4px;margin: 4px;font-size: 40px;text-align: center}

label{margin-right: 10px}

input{margin-left: 28px}

input:focus{background: #E2FFC1}

input[id=shortUrl]{margin-left: 17px;}

form{background: #F9FFD7;padding: 30px}

#shortUrl{background: #F9FF93;padding-left: 30px;margin-top: 10px}

#shortUrl input{background: #fff}

#shortUrl label{font-weight: bold}

#ft{ color:#ccc;margin: 4px;font-size: 10px;margin-top: 20px}

#ft a { color:#ccc;}

</style>
</head>
<body>
<div id="doc" class="yui-t7">
<div id="hd" role="banner"><h1>Shorten, share and track your links</h1></div>
<div id="bd" role="main">
<div class="yui-g">

<form action="<?php echo$_SERVER[‘PHP_SELF’];?>" method="POST">

<p><label for="longUrl">Long URL</label><input type="text" name="longUrl" id="longUrl"></p><p><label for="shorts">Select service</label><select id="shorts" name="shorts"><option value="bitly">bit.ly</option><option value="tinyurl">tinyurl.com</option><option value="trim">tr.im</option><option value="isgd">is.gd</option><option value="unu">u.nu</option><option value="digg">digg.com</option></select><input type="submit" id="shortner" name="submit" value="shortUrl"></p>

</form>

<div id="shortUrl">

<label for="shortUrl">Short URL: </label><input id="shortUrl" type="text" value="<?php if(isset($shortUrl)) echo$shortUrl; ?>" >

</div>

</div>

</div>
<div id="ft" role="contentinfo"><p>Created By <a href="http://thinkphp.ro">Adrian Statescu</a></p></div>
</div>

</body>
</html>
[/sourcecode]

Install pada domain web yang singkat, misalnya test.web.id, lempar.co.cc, dll. Class PHP diatas mendukung 5 layanan pemendek URL, seperti: bitly,tinyurl,trim,is.gd,u.nu,goo.gl.

Terbaru

  • jimpl.com: Alat Online Gratis untuk Melihat Metadata dan Data EXIF Foto
  • Kenapa Chromebook Tak Populer di Indonesia?
  • 10 Cara Menambah Followers Instagram Gratis di Tahun 2025: Strategi Lengkap
  • Cara Dapat Reward Telkomsel Prestige Gold 17GB
  • 5 Fitur Premium di ASUS Gaming K16 K3605VC, Laptop Gaming dengan Harga Terjangkau!
  • Inilah 6 SMA Swasta Terbanyak Masuk PTN dan Kampus Luar Negeri
  • Cara Didik Anak agar Disiplin dan Bertanggung Jawab atas Tindakannya
  • Apa itu Badan Otorita Pengelola Pantai Utara Jawa (BOP Pantura)?
  • Contoh Makalah K3: Apa itu Sertifikasi K3?
  • Cara Cek Bansos September 2025
  • Ini Jadwal Kereta Bandara Adi Soemarmo Agustus 2025
  • Apa itu Jabatan Fungsional Penggerak Swadaya Masyarakat Ahli Pertama?
  • Cagongjok: Budaya Memalukan Korea, Ketika Kafe Jadi Kantor dan Ruang Belajar
  • Pengertian Anomali Brainrot
  • Penemuan DNA Denisovan Manusia Purba Amerika
  • SpaceX Akan Luncurkan Pesawat Rahasia X-37B Space Force Amerika
  • Biawak: Antara Hama dan Penjaga Ekosistem
  • Ini Profil Komjend Dedi Prasetyo Wakapolri Baru
  • Fraksi PKB DPRD Pati Tetap Selidiki Dugaan Pelanggaran Kasus RSUD Pati
  • Fraksi PKB Kritik Penggunaan Anggaran Prabowo, Fokus pada Fasilitas Publik
  • Inilah Syarat Nilai Minimal Raport Pendaftar SNBP 2026
  • Kemendikdasmen Sangkal Isu PPG Guru Tertentu Tidak Ada Lagi
  • Ini Struktur Kurikulum Kelas 5 SD/MI Sederajat Menurut Permendikdasmen No 13 Tahun 2025
  • Ini Struktur Kurikulum Kelas 3 dan 4 SD/MI Menurut Permendikdasmen No 13 Tahun 2025
  • Inilah Struktur Kurikulum Kelas 3 dan 4 SD/MI Menurut Permendikdasmen No 13 Tahun 2025
  • Ilmuwan Colorado University Bikin Particle Collider Mini, Bisa Atasi Kanker
  • Inilah Susunan Upacara Hari Kemerdekaan RI 17 Agustus di Istana Negara
  • FAKTA: Soeharto Masih Komandan PETA Saat Proklamasi Kemerdekaan RI 17 Agustus 1945
  • Materi Tes CPNS 2025: Fungsi dan Wewenang DPR/DPD
  • Cara Menjadi Siswa Eligible Daftar SNBP 2026 Terbaru!
  • jimpl.com: Alat Online Gratis untuk Melihat Metadata dan Data EXIF Foto
  • Kenapa Chromebook Tak Populer di Indonesia?
  • 10 Cara Menambah Followers Instagram Gratis di Tahun 2025: Strategi Lengkap

©2025 emka.web.id | Design: Newspaperly WordPress Theme