[分享] Google URL Shortener - goo.gl
參考了 http://www.kix.in/blog/2009/12/goo-gl/ 這裡面的作法
寫了一個 Python 版本 - http://gist.github.com/347719
另外有個問題想請教一下...
Javascript 作位元運算的時候會轉換成 Signed 32-bit integers 還有二的補數問題...
可是在 Python(我用2.6) 裡面超出 32-bit 他就會自己把 int 轉成 long...
所以我才自己寫了 function __b() 去強制把超出 32-bit 的去掉 和判斷補數...
我想問的是 有沒有更好的寫法 ??
=============== 順便貼上 code 的分隔線 =============
import urllib
import re
# decimal to binary
__a = lambda s: str(s) if s<=1 else __a(s>>1) + str(s&1)
# Bitwise Operators : Signed 32-bit integers
# https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Operators/Bitwise_Operators#Signed_32-bit_integers
def __b(d):
foo, bar = (d < 0) and (__a(2**32 - d), -1) or (__a(d), 1)
return bar * (foo[-32:-31] == '1' and [-(2 ** 31 - int(foo[-31:], 2))] or [int(foo[-32:], 2)])[0]
# stolen from toolbar.js in the Google Toolbar extension for Firefox
def __c(*args):
l = 0
for arg in args:
l += __b(arg & 4294967295)
return __b(l)
def __d(l):
m = l = str(l > 0 and l or l + 4294967296)
o = 0
n = False
for p in m[::-1]:
q = int(p)
if n:
q *= 2
o += q / 10 + q % 10
else:
o += q
n = not n
m = int(o) % 10
o = 0
if m != 0:
o = 10 -m
if len(l) % 2 == 1:
if o % 2 == 1: o += 9
o /= 2
m = str(o)
m += l
return m
def __e(l):
m = 5381
for o in l:
m = __c(__b(m << 5), m, ord(o))
return m
def __f(l):
m = 0
for o in l:
m = __c(ord(o), __b(m << 6), __b(m << 16), -m);
return m
def __g(b):
i = __e(b)
i = i >> 2 & 1073741823;
i = i >> 4 & 67108800 | i & 63;
i = i >> 4 & 4193280 | i & 1023;
i = i >> 4 & 245760 | i & 16383;
j = '7'
h = __f(b)
k = __b((i >> 2 & 15) << 4) | h & 15
k |= __b((i >> 6 & 15) << 12) | __b((h >> 8 & 15) << 8)
k |= __b((i >> 10 & 15) << 20) | __b((h >> 16 & 15) << 16)
k |= __b((i >> 14 & 15) << 28) | __b((h >> 24 & 15) << 24)
j += __d(k)
return 'user=toolbar@google.com&url=%s&auth_token=%s' % (urllib.quote_plus(b), j)
def googl(url):
api_url = 'http://goo.gl/api/url'
res = urllib.urlopen(api_url, __g(url)).read()
return re.search(r'http:/\/goo.gl/\w+', res).group(0)
# for test
print googl('http://www.google.com/') # http://goo.gl/fbsS
print googl('http://www.youtube.com/') # http://goo.gl/NlKL
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.137.27.2