2017-09-09 3 views
6

私はブラウザゲームでテストを行っています。この投稿要求は、建物をビルドするコマンドを発行することを前提としています。私がログインしている間は、郵便受けの送信ボタンをクリックしても問題ありません。これは、値のうちのどれも失効しないことを意味します。しかし、もし私がログアウトしてログインしてしまえば、それはうまく動作しません。私はinterceptorで別の郵便配達のポストを生成しなければならないでしょう。ポストマンをシミュレートするC# - RestSharp

私はC#を使用してこの投稿要求をシミュレートしたいと思います。

私の投稿は郵便配達でどのように見えますか?ポストマン で

ヘッダenter image description here

ポストマン における身体パラメータenter image description here

あなたが郵便配達がインストールされている場合は、リクエストをインポートするhereをクリックします。

ここは私の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; 

。しかし、私はさまざまな方法を試しましたが、私はC#関数を働かせることができませんでした。

任意の種類のライブラリ汚れたトリックなどを使用することができます。要求がC#言語を使用するプログラム的な方法で動作する限り、規則はありません。

私は、で始まる応答を期待しています。 、 "date_complete_formated" 86:

{ "成功": "Komut verildi"、 "date_complete" "0時01分26秒"、 "building_orders":」

編集:私は、このPOSTリクエストをシミュレートする別の方法を使用することができますそれはRestSharpである必要はありません

編集2:。。私は私のパラメータあなたは私が午前問題を再現できるように、私がログインするたびに更新されます。

編集3:郵便配達員は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が生成されたコードにボディパラメータを配置していないことです。

+0

? – John

+0

@John私はそれが動作する限り、何かを使用するために開いています。 HttpClientを使用して回答を提供できる場合は、試してみてください。 RestSharpは広く使用されており、物事をより簡単にすると考えられていました。 – 0014

+1

あなたが直面している問題は何ですか?クエリには多くの「動的」パラメータがあり、Cookie内のユーザートークンが期限切れになるなど、タイムスタンプなどのようにテストできません。より具体的に記述する必要があります。そしてあなたのPOST要求にすべてのヘッダーを追加する必要はありません、いくつかのヘッダーは、歓迎、受け入れ、クッキーです。あなたは 'content-type'ヘッダを追加する必要はないと思います。restSharpはあなたのために追加する必要があります – John

答えて

3

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

このように私はこの問題を解決しました。フィドラー

  • インストール

    • はシオマネキを使用してPOSTリクエストをキャプチャ
    • インストールthis
    • このようになりますC#コードにシオマネキ要求を変換さシオマネキ拡張; `HttpClient`を使用しない理由

      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; 
      } 
      
  • +1

    このコードは、そのクッキーが期限切れになったときに中断し、悪化すると、今はあなたの認証クッキーを世界に示しました。 – CodeCaster

    +0

    @codecasterはいブラウザのゲームのテストで私のフライランドを心配する必要はありません。あなたが質問を読むと、私は最初から状況を知っていたことがわかります。私はとにかく私のセッションを終了し、コードはアイデアを与えるためにそこで動作しません。 – 0014

    +0

    @ 0014このコードを変更すると、2つの要求を持つことができます。 auth cookieを取得するためにログインする1つの要求を行い、その後の要求でauth cookieを使用します。 –

    関連する問題