0

このコードを使用するとエラーが発生します:

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 です。どうすればnullにできますか?ボットが自分のアカウントに送信するとすべてが機能しますが、他のアカウントに送信するとクラッシュします。

編集#2:

わかりました、バグを見つけました。応答を得ることで問題です。これを呼び出すと( 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つの応答が空で、他の応答が正常である理由はありますか?

4

1 に答える 1

1

SteamBotライブラリを使用しているようです。そのソース コードはすぐに入手できるので、ここにある GetTradeOffer メソッドのソース コードを見てください: TradeOfferWebApi ソース

このメソッドから null 以外の応答を受け取っても、有効な Offer オブジェクトが含まれているとは限らないことは明らかです。したがって、 resp.Offer のチェックでは、最初にそれが null でないことを確認する必要があります。

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

null ではない理由を判断するには、SteamBot のソース コードを取得し、デバッガー内でアプリと SteamBot プロジェクトを実行し、メソッドにステップインします。GetTradeOffer メソッドのソース コードに基づいて、例外をスローしている可能性が最も高いです。

とにかく、コード内の「todo」コメントの量を考えると、ライブラリは進行中の作業のように見えるため、SteamBot ソース コードで実行すると、デバッグの目的に役立つ場合があります (ソース コードを実際にログに記録するように簡単に変更できます)。あなたに役立つ目的地への例外)。

編集 (OP の編集 #2 に対応): ドキュメントからSteam の IEconService APIまで、アカウントはそのアカウントとの間でオファーに関する情報のみを取得できます。考えられる説明としては、無効なオファー ID を渡した (おそらく除外した) か、アプリを実行しているアカウントにこのオファーを表示する権限がないことが考えられます。

于 2015-06-16T14:46:40.220 に答える