web-dev-qa-db-ja.com

C#でPostman Postをシミュレート-RestSharp

ブラウザゲームのテストをしています。この投稿リクエストは、建物を建てるコマンドを発行することを想定しています。ログインしている限り、Postman Sendボタンをクリックできます。これは、値が期限切れにならないことを意味します。しかし、ログアウトして再度ログインすると、機能しません。 interceptor経由で別のPostman投稿を生成する必要があります。

C#を使用してこの投稿リクエストをシミュレートしたいと思います。

これが私の投稿がPostmanでどのように見えるかです。

Postmanのヘッダー enter image description here

Postmanの本文パラメーター enter image description here

Postmanをインストールしている場合は、 ここ をクリックしてリクエストをインポートします。

これが私のC#コードです。 RestSharp というライブラリを使用しています。

var client = new RestClient(@"https://tr42.klanlar.org");
var request = new RestRequest("game.php", Method.POST);
request.AddQueryParameter("village", "31413"); // adds to POST or URL querystring based on Method
request.AddQueryParameter("screen", "main"); // adds to POST or URL querystring based on Method
request.AddQueryParameter("ajaxaction", "upgrade_building"); // adds to POST or URL querystring based on Method
request.AddQueryParameter("type", "main"); // adds to POST or URL querystring based on Method
request.AddQueryParameter("h", "98e34aa6"); // adds to POST or URL querystring based on Method
request.AddQueryParameter("", ""); // adds to POST or URL querystring based on Method
request.AddQueryParameter("client_time", "1505659914"); // adds to POST or URL querystring based on Method

request.AddParameter("destroy", "0"); // adds to POST or URL querystring based on Method
request.AddParameter("force", "1"); // adds to POST or URL querystring based on Method
request.AddParameter("id", "wood"); // adds to POST or URL querystring based on Method
request.AddParameter("source", "31413"); // adds to POST or URL querystring based on Method

//var p1 = new Parameter
//{
//    ContentType = "application/x-www-form-urlencoded",
//    Name = "destroy",
//    Value = "0"
//};
//request.AddParameter(p1);

//var p2 = new Parameter
//{
//    ContentType = "application/x-www-form-urlencoded",
//    Name = "force",
//    Value = "1"
//};
//request.AddParameter(p2);

//var p3 = new Parameter
//{
//    ContentType = "application/x-www-form-urlencoded",
//    Name = "id",
//    Value = "wood"
//};
//request.AddParameter(p3);

//var p4 = new Parameter
//{
//    ContentType = "application/x-www-form-urlencoded",
//    Name = "source",
//    Value = "31413"
//};
//request.AddParameter(p4);


request.AddHeader("Accept-Language", "en-US,en;q=0.8,tr;q=0.6,ht;q=0.4");
request.AddHeader("Accept-Encoding", "gzip, deflate, br");
request.AddHeader("Referer", "https://tr42.klanlar.org/game.php?village=31413&screen=main");
//request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.AddHeader("Tribalwars-Ajax", "1");
request.AddHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36");
request.AddHeader("X-Requested-With", "XMLHttpRequest");
request.AddHeader("Origin", "https://tr42.klanlar.org");
request.AddHeader("Accept", "application/json, text/javascript, */*; q=0.01");


//request.AddParameter("application/x-www-form-urlencoded", "destroy=&force=&id=&source=");
//request.AddParameter("application/x-www-form-urlencoded", "destroy=0&force=1&id=31413&source=wood", ParameterType.RequestBody);
//request.AddBody("application/x-www-form-urlencoded", "destroy=0&force=1&id=31413&source=wood");
IRestResponse response = client.Execute(request);
var data = response.Content;

Postman内のSendボタンをクリックすると、アクションが機能します。しかし、さまざまな方法を試しましたが、C#関数を機能させることができませんでした。

あらゆる種類のライブラリのダーティトリックなどを使用できます。リクエストがC#言語を使用してプログラムで機能する限り、ルールはありません。

で始まる応答を期待しています。

{"成功": "Komut verildi。"、 "date_complete":86、 "date_complete_formated": "0:01:26"、 "building_orders": "

編集:このPostリクエストをシミュレートする別の方法を使用できます。 RestSharpにある必要はありません。

編集2:私が抱えている問題を再現できるように、ログインするたびにパラメータを更新します。

編集3:PostmanはRestSharpを使用してC#コードを生成できます。これはPostmanが生成するコードです。ただし、機能しません。

var client = new RestClient("https://tr42.klanlar.org/game.php?village=31413&screen=main&ajaxaction=upgrade_building&type=main&h=8951b405&=&client_time=1505062595");
var request = new RestRequest(Method.POST);
request.AddHeader("postman-token", "dab31db4-b243-c317-e585-19da84c11e62");
request.AddHeader("cache-control", "no-cache");
request.AddHeader("accept-language", "en-US,en;q=0.8,tr;q=0.6,ht;q=0.4");
request.AddHeader("accept-encoding", "gzip, deflate, br");
request.AddHeader("referer", "https://tr42.klanlar.org/game.php?village=31413&screen=main");
request.AddHeader("content-type", "application/x-www-form-urlencoded");
request.AddHeader("tribalwars-ajax", "1");
request.AddHeader("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36");
request.AddHeader("x-requested-with", "XMLHttpRequest");
request.AddHeader("Origin", "https://tr42.klanlar.org");
request.AddHeader("accept", "application/json, text/javascript, */*; q=0.01");
IRestResponse response = client.Execute(request);

私が気付いたことは、Postmanが生成されたコードに本文パラメーターを配置していないことです。

8
0014

Fiddlerを使用するようにアドバイスしてくれた CodeCaster のおかげで、HttpWebRequestを使用して要求を出すことができました。この驚くべき Fiddlerツール があり、リクエストをC#コードに変換します。

これが私がこの問題を解決した方法です。

  • インストールされたFiddler
  • Fiddlerを使用して投稿リクエストをキャプチャしました
  • インストール this フィドラー拡張
  • フィドラーリクエストを次のようなC#コードに変換しました。

    private void MakeRequests()
    {
        HttpWebResponse response;
    
        if (Request_tr42_klanlar_org(out response))
        {
            response.Close();
        }
    }
    
    private bool Request_tr42_klanlar_org(out HttpWebResponse response)
    {
        response = null;
    
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://tr42.klanlar.org/game.php?village=31413&screen=main&ajaxaction=upgrade_building&type=main&h=561d76fe&&client_time=1505677450");
    
            request.KeepAlive = true;
            request.Accept = "application/json, text/javascript, */*; q=0.01";
            request.Headers.Add("Origin", @"https://tr42.klanlar.org");
            request.Headers.Add("X-Requested-With", @"XMLHttpRequest");
            request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36";
            request.Headers.Add("TribalWars-Ajax", @"1");
            request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
            request.Referer = "https://tr42.klanlar.org/game.php?village=31413&screen=main";
            request.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip, deflate, br");
            request.Headers.Set(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.8,tr;q=0.6,ht;q=0.4");
            request.Headers.Set(HttpRequestHeader.Cookie, @"cid=1584941605; tr_auth=e341b46da1e7:13bc09020be8c378853c70baaa54ed9849c029468a62a143d10868e4238fa1af; cid=1584941605; tr_auth=e341b46da1e7:13bc09020be8c378853c70baaa54ed9849c029468a62a143d10868e4238fa1af; ref4852238=start; _ga=GA1.2.766176105.1499529449; _gid=GA1.2.1638517063.1505659564; __utmt=1; __utma=37229925.766176105.1499529449.1505094554.1505659568.8; __utmb=37229925.10.10.1505659568; __utmc=37229925; __utmz=37229925.1505659568.8.3.utmcsr=klanlar.org|utmccn=(referral)|utmcmd=referral|utmcct=/; sid=0%3A12986160bd90; _ga=GA1.2.766176105.1499529449; _gid=GA1.2.1638517063.1505659564; __utma=37229925.766176105.1499529449.1505094554.1505659568.8; __utmb=37229925.11.10.1505659568; __utmc=37229925; __utmz=37229925.1505659568.8.3.utmcsr=klanlar.org|utmccn=(referral)|utmcmd=referral|utmcct=/; websocket_available=true; global_village_id=31413; mobile=0");
    
            request.Method = "POST";
            request.ServicePoint.Expect100Continue = false;
    
            string body = @"id=stone&force=1&destroy=0&source=31413";
            byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(body);
            request.ContentLength = postBytes.Length;
            Stream stream = request.GetRequestStream();
            stream.Write(postBytes, 0, postBytes.Length);
            stream.Close();
    
            response = (HttpWebResponse)request.GetResponse();
        }
        catch (WebException e)
        {
            if (e.Status == WebExceptionStatus.ProtocolError) response = (HttpWebResponse)e.Response;
            else return false;
        }
        catch (Exception)
        {
            if (response != null) response.Close();
            return false;
        }
        return true;
    }
    
6
0014