C#SteamBot - 获取交易报价状态

时间:2015-06-16 13:24:04

标签: c# steambot

使用此代码时出错:

var offer = Bot.NewTradeOffer(dbSteamId);

    offer.Items.AddMyItem(730, 2, 2611100148);

    if (offer.Items.NewVersion)
    {
        string newOfferId;
        if (offer.SendWithToken(out newOfferId, dbToken, dbMessage))
        {
            Log.Success("Trade offer sent : Offer ID " + newOfferId);
            Bot.TryGetTradeOffer(newOfferId, out offer);
        }
     }

崩溃时出错:

ERROR: System.NullReferenceException: Object reference not set to an instance of an object. 
at SteamTrade.TradeOffer.TradeOfferManager.IsOfferValid(Offer offer) in C:\Users\Robertas\Desktop\SteamBot-master\SteamTrade\TradeOffer\TradeOfferManager.cs:line 130
at SteamTrade.TradeOffer.TradeOfferManager.GetOffer(String offerId, TradeOffer& tradeOffer) in C:\Users\Robertas\Desktop\SteamBot-master\SteamTrade\TradeOffer\TradeOfferManager.cs:line 162
at SteamBot.Bot.TryGetTradeOffer(String offerId, TradeOffer& tradeOffer) in C:\Users\Robertas\Desktop\SteamBot-master\SteamBot\Bot.cs:line 331
at SteamBot.TradeOfferUserHandler.SendTradeOffer() in C:\Users\Robertas\Desktop\SteamBot-master\SteamBot\TradeOfferUserHandler.cs:line 81
at SteamBot.TradeOfferUserHandler.OnLoginCompleted() in C:\Users\Robertas\Desktop\SteamBot-master\SteamBot\TradeOfferUserHandler.cs:line 64
at SteamBot.Bot.<HandleSteamMessage>b__5(LoginKeyCallback callback) in C:\Users\Robertas\Desktop\SteamBot-master\SteamBot\Bot.cs:line 476
at SteamKit2.CallbackMsgExtensions.Handle[T](ICallbackMsg msg, Action`1 handler)
at SteamBot.Bot.HandleSteamMessage(ICallbackMsg msg) in C:\Users\Robertas\Desktop\SteamBot-master\SteamBot\Bot.cs:line 458
at SteamBot.Bot.BackgroundWorkerOnDoWork(Object sender, DoWorkEventArgs doWorkEventArgs) in C:\Users\Robertas\Desktop\SteamBot-master\SteamBot\Bot.cs:line 941

有什么想法吗?也许你知道检查交易报价状态的不同方式吗?请分享您的想法。谢谢!

编辑:

public bool GetOffer(string offerId, out TradeOffer tradeOffer)
{
    tradeOffer = null;
    var resp = webApi.GetTradeOffer(offerId);
    if (resp != null)
    {
        if (IsOfferValid(resp.Offer))
        {
            tradeOffer = new TradeOffer(session, resp.Offer);
            return true;
        }
        else
        {
            //todo: log steam api is giving us invalid offers.
            Console.WriteLine("Offer returned from steam api is not valid : " + resp.Offer.TradeOfferId);
        }
    }
    return false;
}

resp.Offer为空。怎么会是null?我可以提一下,当机器人发送到我的帐户时一切正常,但当它发送到其他帐户时,它会崩溃。

编辑#2:

好的,我发现了bug。得到回应是个问题。我打电话给这个(http://api.steampowered.com/IEconService/GetTradeOffer/v1/?key=48B9FCE3FE8A74ADDA29174BFD47441B&tradeofferid=530787948&language=en_us):

{
"response": {

}

}

当我打电话给这个(http://api.steampowered.com/IEconService/GetTradeOffer/v1/?key=48B9FCE3FE8A74ADDA29174BFD47441B&tradeofferid=530796219&language=en_us)时:

{
"response": {
    "offer": {
        "tradeofferid": "530796219",
        "accountid_other": 213128749,
        "message": "Security Code: HqaMyUDN",
        "expiration_time": 1435675048,
        "trade_offer_state": 2,
        "items_to_receive": [
            {
                "appid": "730",
                "contextid": "2",
                "assetid": "2275856684",
                "classid": "310776767",
                "instanceid": "0",
                "amount": "1",
                "missing": false
            }
        ]
        ,
        "is_our_offer": false,
        "time_created": 1434465448,
        "time_updated": 1434465448,
        "from_real_time_trade": false
    },...

任何想法为什么一个回答是空的,但其他回答是正常的?

1 个答案:

答案 0 :(得分:1)

您似乎正在使用SteamBot库。由于其源代码随时可用,请查看GetTradeOffer方法的源代码,可在此处找到:TradeOfferWebApi source

很明显,从此方法接收非null响应并不能保证它将包含有效的Offer对象。你的支票 因此,resp.Offer应首先验证它不为空:

    if (resp != null)
    {
        if (resp.Offer != null && IsOfferValid(resp.Offer))

至于确定为什么它不是null:抓住源代码到SteamBot,在调试器中运行你的app + SteamBot项目,然后进入方法。根据GetTradeOffer方法的源代码,它很可能抛出异常。

考虑到代码中“todo”注释的数量,库似乎仍在进行中,因此使用SteamBot源代码运行可能有助于调试目的(您可以轻松地将源代码修改为实际上将例外记录到对您有用的目的地)。

编辑(响应OP的编辑#2):从文档到Steam's IEconService API,帐户只能检索有关该帐户的要约信息。可能的解释是,您要么传递了无效的要约ID(您可能已经排除了),要么运行您的应用程序的帐户无权查看此要约。