作者wxyy (装笑帏)
看板Python
标题[分享] Google URL Shortener - goo.gl
时间Mon Mar 29 18:49:40 2010
参考了
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 '
[email protected]&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('
https://www.youtube.com/') #
http://goo.gl/NlKL
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 124.137.27.2