C# Instagram Post Request

11 Jun 2016
39
11
#1
Moin,

als Zeitvertreib wollte ich ein kleines Tool schreiben, welches automatisch Instagram Accounts erstellt. Mit Webbrowser und GetElementById alles gar kein Problem, allerdings wollte ich es sauberer mit Hilfe von Post Requests machen, jedoch blick ich bei den Webrequests noch nicht ganz durch.
Wie findet man z.B. heraus, welche Daten wichtig sind beim Post Request? (Cookies, Header, usw.)
Will kein spoon feeding oder source, nur kleine Denkanstösse damit ich es selber verstehe und nicht C&P muss.

Gruss,
.visual
 

Sephirot

Well-Known Member
2 Jun 2015
1,589
1,422
#2
Habe selbst noch nie mit POST Request innerhalb C# gearbeitet aber prinzipiell verschickst du eine Form bzw. Formular was mit Daten gespickt ist. Du müsstes dir den Quellcode der Seite anschauen bzw. dir die Form HTML Elemente anschauen: https://www.w3schools.com/html/html_forms.asp

Demnach sollte dir dann das hier helfen : https://stackoverflow.com/questions/4015324/how-to-make-http-post-web-request

Wegen Cookie, das sollte von der Webseite abhängig sein, ob der beim Request benötigt wird.

Edit: Falls ich irgendwas falsches gesagt habe, mich ruhig korrigieren. Hab mit Webentwicklung sehr wenig am Hut.
 
Likes: .visual
11 Apr 2016
195
123
#3
restsharp hilft weiter :smile: ziemlich hilfreiche library für sowas

um herauszufinden was für infos (header, cookies etc.) du mitsenden musst, damit der request valid ist, bleibt dir nichts anderes übrig, als den request aus dem browser aufzuzeichen und schauen, was mitgesendet werden muss
 

ZeCjy

Honorable
7 Jan 2015
3,898
3,016
#4
F12 und auf Network Tab gehen. Dann bei Chrome den Haken "Preserve Logs" aktivieren. Dann kannst du dir jede request angucke. Um die dann zu testen kann ich dir Postman empfehlen!
 
Likes: .visual

Logxn

Honorable
22 Jul 2016
1,459
1,565
#5
Hier ein Beispiel mit Hilfe von RestSharp aus meinem derzeitigen projekt

C#:
        /// <summary>    

        /// Checks if the given email address is already registered at Ada    

        /// </summary>    

        /// <param name="emailAddress">The email address to check</param>    

        /// <returns></returns>    

        private async Task<bool> emailExists(string emailAddress)    

        {    

            // var restAuthClient = new RestClient();
            restAuthClient.BaseUrl = new Uri(Constants.AUTH_BASE_URL);    

            var cancellationTokenSource = new CancellationTokenSource();    

            var request = new RestRequest(Constants.EMAIL_CHECK_ENDPOINT, Method.POST);

            request.RequestFormat = DataFormat.Json;

            request.AddBody(new { email = emailAddress });    

            IRestResponse<EmailInfo> restResponse = await restAuthClient.ExecuteTaskAsync<EmailInfo>(request, cancellationTokenSource.Token);    
            if (!restResponse.Data.exists)    

                return false;    

   

            return true;    
         }
glaube aber nicht dass account creation gehen wird aufgrund von OAuth und du deren Access Token header wahrscheinlich nicht reversen kannst
 
Likes: .visual

ZeCjy

Honorable
7 Jan 2015
3,898
3,016
#7
Falls noch jemand mal was braucht:

GET Request an 'instagram.com'
->aus den Cookies den 'csrftoken' speichern


POST Request mit Content-Type 'application/x-www-form-urlencoded' an 'instagram.com/accounts/web_create_ajax/ '

Headers
User-Agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36' (hauptsache valide)
x-csrftoken: cookie value aus csrftoken

Body
email: [email protected]
password: passwd123
username: cloudkeypw
first_name: Jens

successful response:
JSON:
{
    "account_created": true,
    "user_id": "9265597118",
    "status": "ok"
}
Cookies die weiterhin wichtig sind:
mid, csrftoken, (mcd)(?), sessionid
 

palonE

Well-Known Member
15 Aug 2017
834
1,057
#11
F12 und auf Network Tab gehen. Dann bei Chrome den Haken "Preserve Logs" aktivieren. Dann kannst du dir jede request angucke. Um die dann zu testen kann ich dir Postman empfehlen!
Zu dem hinzuzufügen:

Man kann im network tab der Chrome dev tools den request mit einem rechtsclick kopieren, und zwar in verschiedenen Formaten u.a. Curl und bash iirc.

Hab da voll den korrekten gutaussehenden freund, der hat 2 Artikel in seinem Blog darüber. Der typ ist richtig schlau und echt toll und so

https://blog.palone.top/detail/news/hacking-websites-with-javascript-part-1/

https://blog.palone.top/detail/news/hacking-websites-with-javascript-part-2/
 
11 Jun 2016
39
11
#12
bekomme den im Code zurück im js tag. kannst den ja daraus grabben

Edit: erschlagt mich nicht wenn ich falsch liege
Danke an alle Antworten, in Postman stand im Cookies tab nichts, das hatte mich verwirrt.

JSON:
{
"account_created": true,
"user_id": "9265597118",
"status": "ok"
}
Ich bekomme immer diese Fehlermeldung zurück und konnte es nach stundenlangem probieren nicht fixen, hast du eine Idee woran das liegen könnte?

JSON:
{ account_created: false,
  errors:
   { email: [ [Object] ],
     username: [ [Object] ],
     password: [ [Object] ] },
  status: 'ok',
  error_type: 'form_validation_error' }
 

Sephirot

Well-Known Member
2 Jun 2015
1,589
1,422
#13
Danke an alle Antworten, in Postman stand im Cookies tab nichts, das hatte mich verwirrt.



Ich bekomme immer diese Fehlermeldung zurück und konnte es nach stundenlangem probieren nicht fixen, hast du eine Idee woran das liegen könnte?

JSON:
{ account_created: false,
  errors:
   { email: [ [Object] ],
     username: [ [Object] ],
     password: [ [Object] ] },
  status: 'ok',
  error_type: 'form_validation_error' }
Dein Request scheint falsch zu sein. Zeig doch mal, was genau du schickst.
 
11 Jun 2016
39
11
#14
Dein Request scheint falsch zu sein. Zeig doch mal, was genau du schickst.
Data:
JavaScript:
var data = {
    email: '[email protected]',
    password: 'Testpw12356.',
    username: 'dingr3u3xsucht33',
    first_name: 'Lal3alalachflash'
};
Headers (Hatte es auch nur mit user-agent, x-csrftoken und content-type versucht):
JavaScript:
var headers = {
    'Accept': '*/*',
    'Accept-Language': 'de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7',
    'Accept-Encoding': 'gzip, deflate, br',
    'Connection': 'keep-alive',
    'Host': 'www.instagram.com',
    'Origin': 'https://www.instagram.com',
    'Content-Type': 'application/x-www-form-urlencoded',
    'x-requested-with': "XMLHttpRequest",
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
    'x-csrftoken': csrf_Token
}
Post request:
JavaScript:
    axios.post('https://www.instagram.com/accounts/web_create_ajax/', { data: data }, { headers: headers })
 

Logxn

Honorable
22 Jul 2016
1,459
1,565
#15
.visual .visual

Du schickst dein body höchst wahrscheinlich als JSON/XML.
Müsstest schauen wie axios das handled.

Hier meine C# Variante c:

C#:
using System;
using System.Text.RegularExpressions;

using RestSharp;
using Newtonsoft.Json;

namespace InstagramHighMinded
{
    internal class Program
    {
        private static string _csrf_token;
        private static string instagram_ajax;

        static void Main(string[] args)
        {
            _csrf_token = GetCsrfToken();
            instagram_ajax = GetRolloutHash();


            CreateAccount(_csrf_token, instagram_ajax);

            while (true) ;
        }

        private static void CreateAccount(string csrfToken, string instagramAjax)
        {
            var client = new RestClient(new Uri("https://instagram.com"));
            var request = new RestRequest("accounts/web_create_ajax/", Method.POST);
            request.AddHeader("X-CSRFToken", csrfToken);
            request.AddHeader("X-Instagram-AJAX", instagramAjax);
            request.AddHeader("X-Requested-With", "XMLHttpRequest");
            request.AddHeader("Host", "www.instagram.com");

            request.AddCookie("csrftoken", csrfToken);

            // This is urlencoded data => https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST
            var data =
                "[email protected]&username=THIS_IS_FOR_HIGH_MINDED&password=LogxnBesterMann187&first_name=Trickert";

            // Make sure you tell the WebClient & Receiving Server its sending urlencoded data as body
            request.AddParameter("application/x-www-form-urlencoded", data, ParameterType.RequestBody);

            var response = client.ExecuteAsPost(request, "POST");
            if (response.ResponseStatus == ResponseStatus.Error)
            {
                Console.WriteLine("Error Response Status");
                return;
            }

            var obj = JsonConvert.DeserializeObject<AccountResponseObj>(response.Content);
            Console.WriteLine($"Account Created?: {obj.account_created}");
            Console.WriteLine($"User ID: {obj.user_id}");
            Console.WriteLine($"Status: {obj.status}");
        }

        /// <summary>
        /// Get the csrf_token required for X-CSRFToken
        /// </summary>
        /// <returns></returns>
        private static string GetCsrfToken()
        {
            var client = new RestClient(new Uri("https://instagram.com"));
            var request = new RestRequest(Method.GET);

            var response = client.ExecuteAsGet(request, "GET");
            if (response.ResponseStatus == ResponseStatus.Error) return null;

            // Matching pattern
            const string pattern = "\"csrf_token\":(.)\\w+\"";
            var match = Regex.Match(response.Content, pattern);
            if (!match.Success) throw new Exception("csrf_token not found!");

            // "csrf_token":"TOKEN_HERE"
            return match.Value.Replace("\"", "").Split(':')[1];
        }

        /// <summary>
        /// RolloutHash is the AJAX Hash. Unsure if needed.
        /// </summary>
        /// <returns></returns>
        private static string GetRolloutHash()
        {
            var client = new RestClient(new Uri("https://instagram.com"));
            var request = new RestRequest(Method.GET);

            var response = client.ExecuteAsGet(request, "GET");
            if (response.ResponseStatus == ResponseStatus.Error) return null;

            const string pattern = "\"rollout_hash\":(.)\\w+\"";
            var match = Regex.Match(response.Content, pattern);
            if (!match.Success) throw new Exception("rollout_hash not found!");


            return match.Value.Replace("\"", "").Split(':')[1];
        }


    }

    public class AccountResponseObj
    {
        public bool account_created { get; set; }
        public string user_id { get; set; }
        public string status { get; set; }
    }
}




/Edit:
Du setzt zwar den Header schon, aber nützt dir nix wenn die body trotzdem in json format kommt.