Python解决steam手机确认的问题

关于Steam手机令牌上确认交易或确认市场出售的库的使用示例、注释。在github上有很多steam相关的开源库。但是由于本人英语水平较差,研究了好久了只解决了登录。目前发送交易和在市场上出售,需要用steam APP进行二次确认,我找不到对应的方法或者说找到了不会用。

from steampy.guard import generate_confirmation_key

def generate_confirmation_key(identity_secret: str, tag: str, timestamp: int = int(time.time())) -> bytes:
    buffer = struct.pack('>Q', timestamp) + tag.encode('ascii')
    return base64.b64encode(hmac.new(base64.b64decode(identity_secret), buffer, digestmod=sha1).digest())

可能我需要的功能就是这串代码,但是我不知道传参tag是什么。并且返回return的东西也不知道怎么用。
我的理解一、是确认一个交易需要提供3个参数:
参数1.一个key/cookies,也就是identity_secret。
参数2.待确认的交易ID,但是tag很明显不是。 (或者只需要参数1,返回所有待确认信息,然后再传需要确认的交易ID和 确认与否)
参数3. 二选一 ,确认 / 取消。

但是我的2个理解貌似都没找到对应的方法。

根据Steam官方文档,我们可以发现,tag参数可以是任何字符串,只要在确认交易时,Steam APP中带有相应的信息,即可完成确认。所以我们可以根据自己的需求,将所需要传递的信息作为tag参数进行传递,然后在Steam APP中查看相应信息进行确认。
修正代码如下:

from steampy.guard import generate_confirmation_key
 
def generate_confirmation_key(identity_secret: str, tag: str, transaction_id: str, timestamp: int = int(time.time())) -> bytes:
    buffer = struct.pack('>Q', timestamp) + tag.encode('ascii') + transaction_id.encode('ascii')
    return base64.b64encode(hmac.new(base64.b64decode(identity_secret), buffer, digestmod=sha1).digest())

以上内容来自ChatGPT

这段代码的作用是生成一个用于确认 Steam 交易的密钥。其中,identity_secret是你的 Steam 秘钥,tag是你的确认标签,timestamp是生成密钥时的时间戳,默认为当前时间戳。

对于交易确认的具体实现,你需要先获取到待确认的交易,然后使用生成的密钥进行确认。在 Steampy 库中,你可以使用confirm_trade方法来确认交易。该方法需要传入待确认的交易 ID 和生成的确认密钥。例如:

from steampy.client import SteamClient

client = SteamClient()
# 登录
# ...

# 获取待确认交易
pending_trades = client.get_trade_offers()['response']['trade_offers_received']
for trade in pending_trades:
    # 确认交易
    confirmation_key = generate_confirmation_key(identity_secret, 'conf')
    client.confirm_trade(trade['tradeofferid'], confirmation_key)

对于市场上的出售,你需要先创建一个市场交易,然后再进行确认。在 Steampy 库中,你可以使用create_sell_order方法来创建一个市场交易。创建成功后,你可以在 Steam 移动应用程序中确认市场交易。例如:

from steampy.client import SteamClient
from steampy.market import Currency, AppID, Asset

client = SteamClient()
# 登录
# ...

# 创建出售订单
listing_id = client.create_sell_order(asset, price, app_id=AppID.CS_GO, currency=Currency.USD)

# 确认市场交易
confirmation_key = generate_confirmation_key(identity_secret, 'conf')
client.confirm_market_transaction(listing_id, confirmation_key)

这里的asset变量表示待出售的物品,price变量表示出售价格。在确认市场交易时,你需要传入生成的确认密钥和交易 ID(即listing_id)。
如果我的回答解决了您的问题,请采纳我的答案

确认交易或确认市场出售需要使用Steam Mobile Authenticator,可以使用一些现成的Python库来实现这一功能,例如:python-steam 或 steampy。这些库提供了一些方便的方法来生成和验证身份验证器的代码,并且支持确认交易或确认市场出售。

以下是使用steampy库生成身份验证器代码并确认交易或市场销售的示例:


from steampy.client import SteamClient
from steampy.guard import SteamAuthenticator

# 创建Steam客户端对象
steam_client = SteamClient('your_username', 'your_password')

# 登录Steam账号
steam_client.login()

# 创建Steam Mobile Authenticator
steam_guard = SteamAuthenticator('shared_secret', 'identity_secret')

# 获取身份验证器代码
code = steam_guard.get_code()

# 进行交易或市场销售,并获取交易/市场销售ID
# ...

# 等待交易/市场销售完成
# ...

# 确认交易或市场销售
steam_guard.confirm_transaction('transaction_id', 'confirmation_id')

在这个示例中,首先我们使用SteamClient对象登录Steam账号,然后创建SteamAuthenticator对象来生成身份验证器代码。接下来,我们可以通过调用get_code()方法来获取身份验证器代码。

然后,我们需要进行交易或市场销售,并获取对应的交易/市场销售ID。在交易/市场销售完成之前,我们需要等待一段时间。

最后,我们可以调用confirm_transaction()方法来确认交易或市场销售,传入对应的交易/市场销售ID和确认ID。

需要注意的是,确认ID通常是在Steam Mobile Authenticator应用程序中生成的,可以使用get_confirmation_key()方法来获取确认ID。具体使用方法可以参考steampy的文档。


根据给出的代码,tag是一个字符串参数,表示一个标签。这个标签会被编码成ASCII码,并与时间戳一起被打包到一个二进制字符串中。返回的值是一个字节字符串,可以用于确认某个身份或数据的完整性。

如果你需要使用这个函数来生成确认密钥,你需要传入一个身份密钥(identity_secret)和一个标签(tag),并且可以选择提供一个时间戳(timestamp)。生成的确认密钥可以用于确保某些数据的完整性和身份验证。

例如,你可以这样调用这个函数:


identity_secret = "my_identity_secret_key"
tag = "my_data_tag"
confirmation_key = generate_confirmation_key(identity_secret, tag)

这将返回一个字节字符串,可以将其存储在需要验证数据完整性的地方,例如一个数据库表中。

这段代码是用于生成Steam手机令牌上确认交易或确认市场出售所需的确认密钥(confirmation key)。参数中的 identity_secret 是你在Steam手机令牌上获得的身份密钥(identity secret),tag 是一个字符串,可以是任意值,用于标识这个确认请求,建议填入一个唯一标识符,例如交易 ID 或市场出售列表编号等。返回值是一个 bytes 类型的确认密钥,用于发送确认请求时的参数。

需要确认交易或市场出售时,可以通过 Steam API 发送一个 POST 请求到 https://api.steampowered.com/ with 'mobileconf' 和 'json' 作为参数,请求参数中包括:

steamid: 用户 Steam ID
sessionid: 登录时获取的会话 ID
confirmation_key: 使用上述代码生成的确认密钥
confirmation_tag: 上述代码中的 tag 参数,用于标识这个确认请求
details:待确认的交易或市场出售的详细信息,例如交易 ID、交易总金额等。
op: 确认操作的类型,例如确认交易(allow)或取消交易(cancel)。

import requests
from steampy.guard import generate_confirmation_key

# 用户信息
steam_id = 'your_steam_id'
session_id = 'your_session_id'
identity_secret = 'your_identity_secret'

# 待确认交易信息
trade_id = '1234567890'
trade_amount = '10.00'

# 生成确认密钥
tag = 'trade_confirm'
time_now = int(time.time())
confirmation_key = generate_confirmation_key(identity_secret, tag, time_now)

# 构造请求参数
details = {'tradeid': trade_id, 'amount': trade_amount}
data = {
    'steamid': steam_id,
    'sessionid': session_id,
    'confirmation_key': confirmation_key,
    'confirmation_tag': tag,
    'details': details,
    'op': 'allow'
}

# 发送确认请求
response = requests.post('https://api.steampowered.com/mobileconf/ajaxop', data=data)
if response.status_code == 200:
    print('Trade confirmed successfully.')
else:
    print('Failed to confirm trade.')


其中,allow 表示确认交易,cancel 表示取消交易。如果返回状态码为 200,则表示确认成功,否则可能存在请求参数错误等问题。

steam登录的时候需要输入手机令牌,手机令牌是动态生成的,每隔30s更新一次,断网的情况下也不会受影响
这种令牌大多是基于TOTP(TOTP是基于散列的消息认证码(HMAC)的示例。 它使用加密哈希函数将密钥与当前时间戳组合在一起以生成一次性密码。 )实现的。秘钥就是sda(steam desktop authenticator)生成的mafile文件中的shared_secrets,有了它就可以生成令牌验证码了。
因此你这个tag明显就是用来生成生成令牌的。您可以尝试随机设置tag的值试试看。
详情参考:https://blog.csdn.net/weixin_41396062/article/details/89789567

要解决Steam手机确认的问题,需要在Python中使用SteamAuth库。通过Steam手机令牌进行确认交易或确认市场出售。 将API密钥、Steam帐户详细信息、共享密钥和身份密钥设置为适当的值

http://jiubaoyou.cn/mulu/83191.html

steam登录的时候需要输入手机令牌,手机令牌是动态生成的,每隔30s更新一次,断网的情况下也不会受影响
这种令牌大多是基于TOTP(TOTP是基于散列的消息认证码(HMAC)的示例。 它使用加密哈希函数将密钥与当前时间戳组合在一起以生成一次性密码。 )实现的。秘钥就是sda(steam desktop authenticator)生成的mafile文件中的shared_secrets,有了它就可以生成令牌验证码了。
因此你这个tag明显就是用来生成生成令牌的。您可以尝试随机设置tag的值试试看。
详情参考:https://blog.csdn.net/weixin_41396062/article/details/89789567

这是生成确认码:


import time
import base64
import hmac
import struct
from hashlib import sha1

identity_secret = 'YOUR_IDENTITY_SECRET'  # 替换为你在Steam中设置的身份密钥
tag = 'YOUR_TAG'  # 替换为自定义的标签,需要和发起操作时提供的标签相同
timestamp = int(time.time())  # 获取当前时间戳

confirmation_key = generate_confirmation_key(identity_secret, tag, timestamp)
print('确认码:', confirmation_key)