Skrajševalnik URL naslovov (API)


Skrajševanje URL naslovov je tehnika na spletu, kjer dolg URL (uniform resource locator) naslov nadomestimo s krajšim, ki še vedno preusmeri na cilj, na katerega kaže “stari” (daljši) URL naslov. Najbolj pogosto se to uporablja na Twitterju in podobnimi spletnimi aplikacijami, ki imajo dolžino sporočila omejeno na fiksno število znakov (oziroma na splošno tam, kjer je potrebno biti varčen s prostorom – npr. tudi v časopisnih člankih). Druge uporabe skrajševanja URL naslovov so še v “olepšavanju” URL-jev, sledenju klikov, boljši promociji itd.

Na spletu sicer obstaja veliko takih storitev (tinyurl.com, bit.ly, pa slovenski skrci.me), a implementacija svojega URL skrajševalnika je lahko še boljša izbira. Prednosti so v boljšem upravljanju povezav (ni potrebe skrbeti, ali druge storitve omogočajo spremembo URL naslova, ki ga krajšamo za že obstoječim krajšim URL naslovom), promocija svoje znamke, za konec pa tudi izgleda bolje. Slabosti implementacije pa je v tem, da stane. Največ denarja gre za zakup domene, ki predstavlja skrajšano verzijo domene, katerih URL naslovov bomo skrajševali (npr. jernejsila.com v jsi.la – v tem primeru je .la TLD domena države Laos. Domena ni generična in zato za tujce po pravilu dražja od domen, kot so .com, .org, .eu itd.).

Storitev

Skrajševalnik URL naslovov sem implementiral kot REST spletno storitev. Storitev kot argument sprejme url (URL za skrajšat) in keyword (ključna beseda v skrajšanen URL naslovu ((Če podamo ključno besedo npr. blog, bo skrajšani naslov oblike http://www.domena.com/blog.))). Prvi argument je nujen, drugi je opcijski – če ni podan, se generira naključen niz dolžine 4 iz malih črk in številk. Poleg osnovne funkcionalnosti skrajšanja URL naslovov sem dodal tudi beleženje klikov nekega naslova – vsakič, ko nekdo klikne na naslov, se za določeno ključno besedo k seznamu klikov doda datum klika (tako poleg absolutnega števila klikov povezave vem, kateri dan npr. je bila povezava največkrat aktivirana).

Skripta

Storitev sem implementiral v flasku (spletno ogrodje v pythonu), za hranjenje preslikav URL naslovov pa sem izbral podatkovno bazo Redis, ki se mi zdi za to dobra izbira, saj shranjuje zapise v obliki ključ-vrednost.

Redis vsebuje podatkovno strukturo množico, ki ne vsebuje duplikatov in je zato odlična izbira za hranjenje ključnih besed ali naključno generiranih nizov (v nadaljevanju identifikator). Če dodajamo niz v množico z operacijo SADD, nam operacija vrne True (če identifikatorja še ni v možici in ga je operacija zatorej uspešno dodala v množico) ali False (če je identifikator že v množici in ga je operacija zatorej neuspešno dodala v množico) – za razliko od operacije SISMEMBER, ki samo preveri vsebovanost identifikatorja v množici.

[python]
import string
import random
import datetime
from flask import Flask, request, Response, redirect
from redis import Redis

app = Flask(__name__)

def id_generator():
return ”.join(random.choice(string.ascii_lowercase + string.digits) for x in range(4))

@app.route(‘/’)
def make_url_short():
long_url = request.args.get(‘url’, ”)
if long_url:
keyword = request.args.get(‘keyword’, ”)
if keyword:
if not r.sadd("keywords", keyword):
return Response("Bad keyword", mimetype="text/plain")
else:
keyword = id_generator()
while not r.sadd("keywords", keyword):
keyword = id_generator()

r.set("lurl:" + keyword, long_url)
return Response(request.url_root + keyword, mimetype="text/plain")
return Response("Bad URL", mimetype="text/plain")

@app.route(‘/<keyword>’)
def on_click(keyword):
if r.sismember("keywords", keyword):
long_url = r.get(‘lurl:’ + keyword)
r.lpush(‘clicks:’ + keyword, str(datetime.datetime.now().date()))
return redirect(long_url)

if __name__ == ‘__main__’:
r = Redis()
app.run(debug=True)
[/python]

Primer uporabe (v razvojnem strežniku flaska)

[text]http://localhost:5000/?url=http://46.101.155.235&keyword=blog[/text]

Zgornji URL naslov vrne skrajšan URL naslov http://localhost:5000/blog, ki odpre stran/preusmeri na URL naslov http://46.101.155.235.

BONUS: Varnost spletne storitve

Trenutno lahko spletno storitev uporablja vsak, ki jo odkrije in ugotovi, kako se jo uporablja.  Ker smo si naredili svoj skrajševalnik URL naslovov, je velika verjetnost, da bomo storitev želeli uporabljali samo mi. Storitev zato zavarujemo z uporabniškim imenom in geslom. HTTP protokol, ki je osnova REST spletnim storitvam, ponuja osnovno zaščito dostopa oblike https://username:password@www.example.com/, ki jo bomo uporabili za varnost storitve. Kako to naredimo s pomočjo flaska (ki zadevo poenostavi), je prikazano na sledeči povezavi http://flask.pocoo.org/snippets/8/.