1

Steam でトレードオファーを受け入れるプロセスをエミュレートしようとしています。Steam サポートに問い合わせて、他のプレイヤーへのサービスを妨害しない限り、このアクションが許可されていることを確認しました.

詳細は次のとおりです。トレード オファーを受け入れるための URL はhttps://steamcommunity.com/tradeoffer/OfferID/acceptです。

これを行うための ajax コードを次に示します。

return $J.ajax(
{
    url: 'https://steamcommunity.com/tradeoffer/' + nTradeOfferID + '/accept',
    data: rgParams,
    type: 'POST',
    crossDomain: true,
    xhrFields: { withCredentials: true }
}

IE10を使用して追跡したヘッダーは次のとおりです

Request             POST /tradeoffer/xxxxxxx/accept HTTP/1.1
Accept              */*
Content-Type        application/x-www-form-urlencoded; charset=UTF-8
Referer             http://steamcommunity.com/tradeoffer/xxxxxxx/
Accept-Language     en-CA
Origin              http://steamcommunity.com
Accept-Encoding     gzip, deflate
User-Agent          Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)
Host                steamcommunity.com
Content-Length      51
DNT                 1
Connection          Keep-Alive
Cache-Control       no-cache

投稿本文:

sessionid=SESSIONID&tradeofferid=オファーID

クッキー:

Sent    sessionid                SessionID          
Sent    __utmc                   XXXXX              
Sent    steamLogin               XXXXX
Sent    webTradeEligibility      XXXXXXX
Sent    Steam_Language           XXXXXXX                    
Sent    timezoneOffset           XXXXXXXX                   
Sent    __utma                   XXXXXXXXXXXXX              
Sent    __utmz                   XXXXXXXXXXXXX              
Sent    steamMachineAuth         XXXXXXXXXXXXX                  
Sent    strInventoryLastContext  XXXXXXXXX                  
Sent    steamRememberLogin       XXXXXXXXXXXX                   
Sent    steamCC_XXXXXXXXXXXX     XXXXXXX                    
Sent    __utmb                   XXXXXXX                
Sent    tsTradeOffersLastRead    XXXXXXX

リクエストのイニシエータは XMLHttpRequest です

私のコードで私がした

public bool AcceptOffer(string offerID)
{
    string path = "tradeoffer/" + offerID + "/";
    //Simulate the browser opening the trade offer window
    _steamWeb.Get(new Uri(WebAPI.SteamCommunity + path));
    NameValueCollection data = new NameValueCollection();
    data.Add("sessionid", _steamWeb.SessionID);
    data.Add("tradeofferid", offerID);

    string result = _steamWeb.Post(new Uri("https://steamcommunity.com/" + path + "accept"), data);

    return true;
}

_steamWeb には、すべてのポスト/取得リクエストを実行するために使用される Cookie 対応の Web クライアントが含まれています。

以下は、Cookie 対応の Web クライアントのコードの一部です。

protected override WebRequest GetWebRequest(Uri address)
{
    HttpWebRequest request = base.GetWebRequest(address) as HttpWebRequest;

    if (request != null)
    request.CookieContainer = _cookieContainer;

    if (_lastPage != null)
        request.Referer = _lastPage;

        _lastPage = address.ToString();
        return request;
}

protected override WebResponse GetWebResponse(WebRequest request)
{
    WebResponse response = base.GetWebResponse(request);//403 exception here
    ReadCookies(response);
    return response;
}

ここに私が設定しているヘッダーがあります

void SetCommonHeaders(Uri uri)
{
    _webClient.Headers[HttpRequestHeader.Accept] = "text/html, application/xhtml+xml, */*";
    _webClient.Headers[HttpRequestHeader.AcceptLanguage] = "en-CA";
    _webClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded; charset=UTF-8";
    _webClient.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)";
    _webClient.Headers[HttpRequestHeader.Host] = uri.Host;
    _webClient.Headers.Add("DNT", "1");
}

ここに私が送信しているリクエストの私のクッキーヘッダーがあります

sessionid=XXXX; 
steamMachineAuthXXXXX=XXXXXX; 
steamLogin=XXXXXXX; 
steamRememberLogin=XXXXXXXX; 
Steam_Language=english; 
webTradeEligibility=XXXXXXXXX; 
steamCC_XXXXX=CA; 
tsTradeOffersLastRead=XXXXXXXXX

これらの Cookie を手動で設定したわけではありません。すべての Cookie は、steamcommunity.com への GET リクエストによって取得されます。

ブラウザとほぼ同じリクエストを送信していますが、投稿で 403 Forbidden を取得しています。X-Requested-With = XMLHttpRequest ヘッダーを設定しようとしましたが、役に立ちません。彼らが ajax 呼び出しで資格情報を処理しているように見えるので、HttpWebRequest の投稿でも何かを行うべきでしょうか? ありがとう

4

1 に答える 1