web-dev-qa-db-fra.com

Simuler un postier en C # - RestSharp

Je fais des tests sur un jeu par navigateur. Cette demande de post est supposée émettre une commande pour construire un bâtiment. Tant que je suis connecté, je peux cliquer sur le bouton Envoyer du facteur et cela fonctionne très bien. Cela signifie qu'aucune des valeurs n'expire. Mais si je me déconnecte et me reconnecte, cela ne fonctionnera pas. Je devrais générer un autre postman Postman via le interceptor.

Je veux simuler cette demande de publication en utilisant C #;

Voici à quoi ressemble mon message dans Postman;

En-têtes dans Postman enter image description here

Paramètres du corps dans Postman enter image description here

Si vous avez installé postman, cliquez sur ici pour importer la demande.

Voici mon code C #. J'utilise la bibliothèque appelée 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;

Lorsque je clique sur le bouton Envoyer dans Postman, l'action fonctionne. Cependant, même si j'ai essayé plusieurs méthodes différentes, je n'ai pas pu faire fonctionner ma fonction C #.

Tout type de bibliothèque de trucs sales et ainsi de suite est autorisé à être utilisé. Il n'y a pas de règles tant que la requête fonctionne de manière programmatique en utilisant le langage C #.

Je m'attends à voir une réponse commençant par;

{"success": "Komut verildi.", "date_complete": 86, "date_complete_formated": "0:01:26", "building_orders": "

Modifier: Je peux utiliser d'autres moyens pour simuler cette demande de publication. Il ne doit pas nécessairement être dans RestSharp.

Edit 2: Je mettrai à jour mes paramètres chaque fois que je me connecte afin que vous puissiez reproduire le problème que j'ai.

Édition 3: Postman est capable de générer du code C # en utilisant RestSharp. C'est le code que Postman génère. Mais ça ne marche pas.

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

Ce que j'ai remarqué, c'est que Postman ne place pas les paramètres du corps dans le code généré.

8
0014

Grâce à CodeCaster avec ses conseils d'utilisation de Fiddler, j'ai pu faire la demande en utilisant HttpWebRequest. Il y a cet incroyable outil Fiddler qui convertit les requêtes en code C #.

C'est ainsi que j'ai résolu ce problème;

  • Fiddler installé
  • Capture de la demande de publication à l'aide du violoneux
  • Installé this extension fiddler
  • Converti la demande du violoneux en code C # qui ressemble à ceci;

    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