2017-09-09 28 views
6

Tôi đang làm bài kiểm tra trên một trò chơi trình duyệt. Yêu cầu đăng bài này giả sử đưa ra một lệnh để xây dựng một tòa nhà. Miễn là tôi đã đăng nhập, tôi có thể nhấp vào nút Gửi Người gửi và nó hoạt động tốt. Điều này có nghĩa là không có giá trị nào hết hạn. Nhưng nếu tôi đăng xuất và đăng nhập lại thì nó sẽ không hoạt động. Tôi sẽ phải tạo một bài đăng Postman khác qua số interceptor.Mô phỏng Postman Post in C# - RestSharp

Tôi muốn mô phỏng yêu cầu bài đăng này bằng C#;

Đây là cách bài đăng của tôi trông giống như trong Người đăng bài;

Headers trong Postman enter image description here

Body Các thông số trong Postman enter image description here

Nếu bạn có người đưa thư được cài đặt, nhấp here nhập khẩu theo yêu cầu.

Đây là mã C# của tôi. Tôi đang sử dụng thư viện có tên là 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; 

Khi tôi bấm vào Gửi nút bên Postman, hành động hiệu quả. Tuy nhiên, mặc dù tôi đã cố gắng bó các phương pháp khác nhau, tôi không thể có được chức năng C# của tôi làm việc.

Bất kỳ loại thư viện thủ thuật bẩn nào và được phép sử dụng. Không có quy tắc nào miễn là yêu cầu hoạt động theo cách có lập trình bằng ngôn ngữ C#.

Tôi hy vọng sẽ thấy phản hồi bắt đầu bằng;

{ "thành công": "Komut verildi", "date_complete": 86, "date_complete_formated": "00:01:26", "building_orders":"

Edit: tôi có thể sử dụng cách khác để mô phỏng yêu cầu bài này Nó không phải là trong RestSharp

chỉnh sửa 2:.. tôi sẽ cập nhật các thông số của tôi mỗi khi tôi đăng nhập để bạn có thể tạo lại vấn đề tôi đang gặp khó.

Chỉnh sửa 3: Người đăng bài có thể tạo mã C# bằng cách sử dụng RestSharp. Đây là mã mà Postman tạo ra. Tuy nhiên, nó không hoạt động.

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

Điều tôi nhận thấy là Postman không đặt thông số cơ thể vào mã được tạo.

+0

tại sao không sử dụng 'HttpClient'? – John

+0

@ John Tôi mở để sử dụng bất cứ điều gì miễn là nó hoạt động. Nếu bạn có thể cung cấp câu trả lời bằng cách sử dụng HttpClient Ill, hãy thử. RestSharp đang được sử dụng rộng rãi và được cho là làm cho mọi thứ trở nên dễ dàng hơn. – 0014

+1

Sự cố bạn đang gặp phải là gì? có nhiều tham số "động" trong truy vấn và tôi không thể kiểm tra nó, chẳng hạn như mã thông báo người dùng bên trong cookie có thể đã hết hạn, dấu thời gian. bạn cần mô tả nó cụ thể hơn. Và bạn không cần thêm mọi tiêu đề vào yêu cầu POST của mình, có một vài tiêu đề là requird, Accept, Cookie. và tôi nghĩ bạn không cần thêm tiêu đề 'content-type', restSharp sẽ thêm cho bạn – John

Trả lời

3

Nhờ có CodeCaster với lời khuyên của anh ấy để sử dụng Fiddler, tôi có thể thực hiện yêu cầu bằng cách sử dụng HttpWebRequest. Cótuyệt vời này chuyển đổi các yêu cầu thành mã C#.

Vì vậy, đây là cách tôi giải quyết vấn đề này;

  • cài đặt Fiddler
  • chụp theo yêu cầu sử dụng bài cáy
  • cài đặt phần mở rộng this cáy
  • Chuyển Đổi yêu cầu cáy vào mã C# mà trông như thế này;

    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

Mã này sẽ phá vỡ khi cookie đó hết hạn, và tệ hơn, bây giờ bạn đã hiển thị cookie xác thực của bạn với mọi người. – CodeCaster

+0

@codecaster Có một thử nghiệm trò chơi trình duyệt của nó accir frirnd của tôi, không cần phải lo lắng. Nếu bạn đọc câu hỏi bạn sẽ thấy tôi đã nhận thức được tình hình ngay từ đầu. Tôi đã kết thúc phiên của tôi anyway, mã không làm việc của nó ở đó để đưa ra một ý tưởng. – 0014

+0

@ 0014 Bạn có thể thay đổi mã này để có 2 yêu cầu. Một yêu cầu đăng nhập để truy xuất cookie xác thực và sau đó sử dụng cookie xác thực trong các yêu cầu tiếp theo. –

Các vấn đề liên quan