From 7b9d05c19365dc2ebb844b643da3542fc5e031c1 Mon Sep 17 00:00:00 2001 From: Mike Crute Date: Wed, 29 Jul 2015 18:30:14 -0700 Subject: Initial import --- shortener.py | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 shortener.py diff --git a/shortener.py b/shortener.py new file mode 100644 index 0000000..7709a28 --- /dev/null +++ b/shortener.py @@ -0,0 +1,52 @@ +import bottle +import hashlib +import base64 +import MySQLdb +import urlparse +import bottle_mysql +from bottle import request + + +app = bottle.default_app() +app.config.load_config('shortener.cfg') + +bottle.install(bottle_mysql.Plugin( + dbuser=app.config['database.user'], + dbpass=app.config['database.password'], + dbname=app.config['database.name'])) + + +@bottle.route('/new') +def new_url(db): + url = request.query.url + token = base64.b64encode(hashlib.sha1(url).digest(), ['0', '1'])[:8] + + try: + db.execute('INSERT INTO urls VALUES (%s, %s)', (token, url)) + except MySQLdb.IntegrityError: + pass + + url = urlparse.urlunparse((request.urlparts[0], request.urlparts[1], token, '', '', '')) + + return url + + +@bottle.route('/all') +def remote(db): + db.execute('SELECT u.*, COUNT(s.token) AS hits FROM urls u LEFT JOIN url_access s ON s.token = u.token GROUP BY u.token') + return dict( + (i['token'], { 'url': i['url'], 'hits': i['hits'] }) + for i in db.fetchall()) + + +@bottle.route('/') +def visit_url(db, token): + db.execute('SELECT * FROM urls WHERE token = %s', (token,)) + result = db.fetchone() + + if not result: + bottle.abort(404, 'Not Found') + else: + db.execute('INSERT INTO url_access(token, ip) VALUES (%s, %s)', + (result['token'], request.remote_addr)) + bottle.redirect(result['url']) -- cgit v1.2.3