2017-09-09 21 views
6

Bir tarayıcı oyunu üzerinde test yapıyorum. Bu posta isteği, bir bina inşa etmek için bir komut yayınlamak için varsayalım. Giriş yaptığım sürece Postacı Gönder düğmesine tıklayabilirim ve iyi çalışıyor. Bu, değerlerin geçerliliğinin sona ermesi anlamına gelir. Ama eğer oturumu kapatırsam ve tekrar giriş yaparsam işe yaramaz. interceptor aracılığıyla başka bir Postacı postası oluşturmalıyım.Postacı takvimi Ben C# - RestSharp

Bu gönderi isteğini C# kullanarak simüle etmek istiyorum;

Gönderi Postman'da nasıl görünüyor; Eğer postacı yüklüyse Postman'a yılında enter image description here

Vücut Parametreleri Postman'a yılında

Başlıkları enter image description here

, isteği almak için here tıklayın.

İşte C# kodum. RestSharp isimli kütüphaneyi kullanıyorum;

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; 

Ben tıklayın

Postman içeride Gönder düğmesini, aksiyon çalışır. Ancak, farklı yöntemler bir demet denedim, C# fonksiyonumun çalışmasını alamadım.

Her türlü kitaplığın kirli hileler vb. Kullanılmasına izin verilir. İstek, C# dilini kullanarak programlı bir şekilde çalıştığı sürece kural yoktur.

Aşağıdakilerle başlayan bir yanıt görmeyi umuyorum;

{ "başarı": "Komut verildi", "date_complete": 86, "date_complete_formated": "00:01:26", "building_orders":"

Düzenleme: Bu Mesaj isteğini taklit etmeye alternatif yollar kullanabilirsiniz o RestSharp olmak zorunda değildir

Düzenleme 2:.. benim parametreleri ben her giriş güncellenir ben yaşıyorum sorunu yeniden böylece.

Düzenleme 3: Postacı, RestSharp kullanarak C# kodu üretebilir. Bu Postman'ın ürettiği koddur. Ancak işe yaramıyor.

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); 

Fark ettiğim şey Postman'ın vücut parametrelerini oluşturulan koda yerleştirmiyor olmasıdır.

+0

neden olmasın 'HttpClient' kullanılır? – John

+0

@John Çalıştığı sürece herhangi bir şeyi kullanmak için açığım. HttpClient Ill kullanarak bir cevap verebilirseniz, bir deneyin. RestSharp yaygın olarak kullanılıyor ve işleri kolaylaştırmak için varsayalım. – 0014

+1

Karşılaştığınız sorun nedir? Sorguda çok sayıda "dinamik" parametre vardır ve bunu test edemem, örneğin çerez içindeki kullanıcı belirteci zaman aşımına uğramış olabilir. daha spesifik tanımlamanız gerekiyor. Üstelik her bir başlığı POST isteğinize eklemeniz gerekmez, birkaç başlık gerekli, çerez, çerez var. ve ben 'content-type' header eklemek gerekmez sanırım, restSharp sizin için eklemeniz gerekir – John

cevap

3

Fiddler'ı kullanma önerisiyle CodeCaster'a teşekkürler, HttpWebRequest kullanarak isteği gerçekleştirebildim. İstekleri C# koduna dönüştüren bu harika Fiddler tool var.

Bu yüzden bu sorunu nasıl çözdüm; Fiddler

  • Yüklü

    • kemancı kullanarak sonrası isteği Yakalanan
    • Yüklü this
    • şöyle C# koduna kemancı isteği Dönüştürülen kemancı uzantısı;

      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

    Bu kod, bu çerezin süresi dolduğunda ve daha da kötüsü, şu anda auth çerezinizi dünyaya gösterdiğinizde kırılacaktır. – CodeCaster

    +0

    @codecaster Evet, bir tarayıcı oyun testi hesabı benim frirnd, endişelenmenize gerek yok. Gördüğünüz soruyu okursanız başından beri durumun farkındaydım. Yine de oturumumu bitirdim, kod bir fikir vermek için orada çalışmıyor. – 0014

    +0

    @ 0014 2 isteğiniz için bu kodu değiştirebilirsiniz. Kimlik doğrulama çerezini almak için giriş yapmak için bir istek ve daha sonra gelen isteklerde auth çerezini kullanın. –