首先獲取時間戳除以30取整,得到8個數,再補成8個字節的長度。
之后要有一個密鑰,這個密鑰是steam和我們約定好的 用來計算令牌碼
安卓手機可以在/data/data/com.valvesoftware.android.steam.community/files/目錄下找到
文件中的shared_secret就是我們所需的密鑰(需要ROOT權限才可以查看)
這個密鑰是steam和我們約定好的,用來計算令牌碼
如果你的手機未被ROOT,你將無法訪問到這部分的數據,即使你安裝了根目錄文件管理器 在該文件中,你將找到如下的一個變量,其####的部分就是你所需的秘鑰
"shared_secret":"#############################"
更換驗證設備,那么原有的serect_key就將會失效.
密鑰作為key,處理過的時間戳作為信息進行哈希運算,得到一串16進制的數
取最后一位去掉高四做為偏移,在這串數中取四個字節,除26取余數5次得到5個數。從字母表中找到對應的值合起來就是我們要的令牌驗證碼
1 import hmac 2 import hashlib 3 from base64 import b64decode 4 from time import time,sleep 5 import struct 6 from tkinter import * 7 8 ########################################### 9 # # 10 # # 11 # Python本地計算steam手機令牌碼 # 12 # # 13 # by:冷溪凌寒 # 14 ########################################### 15 16 def get_steam_auth_code(secret: str, t: int = None) -> str: 17 if not t: 18 t = int(time()/30) 19 msg = struct.pack(">Q", t) 20 key = b64decode(secret) 21 mac = hmac.new(key, msg, hashlib.sha1).digest() 22 offset = mac[-1] & 0x0f 23 binary = struct.unpack('>L', mac[offset:offset+4])[0] & 0x7fffffff 24 codestr = list('23456789BCDFGHJKMNPQRTVWXY') 25 chars = [] 26 for _ in range(5): 27 chars.append(codestr[binary % 26]) 28 binary //= 26 29 code = ''.join(chars) 30 return code 31 32 #print(get_steam_auth_code('',)) 33 grad=get_steam_auth_code('',)#在此填入steam密鑰 34 r = Tk() 35 r.withdraw() 36 r.clipboard_clear() 37 r.clipboard_append(grad) 38 r.update() 39 sleep(.2)# 一直在占用,需要銷毀,添加個0.2秒延遲自動銷毀 40 r.update() 41 r.destroy()
運行程序后,自動復制到剪切板,之后只需ctrl+v即可