0%

奇淫巧技 | 谷歌二次验证

这里讲一下如何用 python 获得谷歌的二次验证。

谷歌的二次验证算法都是公开的,这里感兴趣的自己搜索一下,这里直接贴出方案。


自写代码


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import base64
import hashlib
import hmac
import struct
import time


class Google:

def get_hotp_token(self, secret, intervals_no):
key = base64.b32decode(secret, True)
msg = struct.pack(">Q", intervals_no)
h = hmac.new(key, msg, hashlib.sha1).digest()
# 很多网上的代码不可用,就在于这儿,没有chr字符串
o = ord(chr(h[19])) & 15
h = (struct.unpack(">I", h[o:o + 4])[0] & 0x7fffffff) % 1000000
return h

def get_totp_token(self, secret):
return self.get_hotp_token(secret, intervals_no=int(time.time()) // 30)

这里就不再贴使用方法了。


使用第三方库


1
2
3
4
5
6
7
8
9
import onetimepass as otp


class Google:

@staticmethod
def getCode(my_secret):
my_token = otp.get_hotp(my_secret, intervals_no=int(time.time()) // 30)
return my_token

都很好理解,这里说一下注意点。

有的时候,我们会获得长度少于 6 的验证码,这是因为,开头如果有 0 会被消除,比如,验证码为 007666 会显示 7666

所以,如果,长度不够,我们要在开头补零。

google_code = google_code.zfill(6)
请我喝杯咖啡吧~