2016-06-27 36 views
0

Ich versuche, meine Instagram "Following" -Liste mit nur http-Komponente zu bekommen. Ich habe versucht, lHTTP.Get('https://www.instagram.com/Myusername/following/'); zu verwenden, aber es gibt keine Benutzernamen im entschlüsselten HTML. Allerdings sah ich einige Leute ohne instagram api, nur HTTP-Antwort in VB.Net. Ich verwende Delphi 10.So erhalten Sie Instagram folgende Liste mit http-Komponente in Delphi 10

UPDATE

procedure TForm1.Button4Click(Sender: TObject); 
var 
    lHTTP: TIdHTTP; 
    IdSSL: TIdSSLIOHandlerSocketOpenSSL; 
    Params, login : TStrings; 
    Reply, Token, X: string; 
    Cookie: TIdCookie; 
begin 

try 
Params := TStringList.Create; 
Params.Add('username=' + Edit1.Text); 
Params.Add('password=' + Edit2.Text); 

lHTTP := TIdHTTP.Create(nil); 
try 
    IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(lHTTP); 
    IdSSL.SSLOptions.Method := sslvTLSv1; 
    IdSSL.SSLOptions.Mode := sslmClient; 
    lHTTP.IOHandler := IdSSL; 
    lHTTP.ReadTimeout := 30000; 
    lHTTP.HandleRedirects := True; 
    lHTTP.Request.UserAgent := 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36'; 
    lHTTP.Get('https://www.instagram.com', TStream(nil)); 
    Cookie := lHTTP.CookieManager.CookieCollection.Cookie['csrftoken', 'www.instagram.com']; 
    if Cookie <> nil then 
    Token := Cookie.Value; 

    try 
    lHTTP.Request.CustomHeaders.Values['X-CSRFToken'] := Token; 
    lHTTP.Request.CustomHeaders.Values['X-Instagram-AJAX'] := '1'; 
    lHTTP.Request.CustomHeaders.Values['X-Requested-With'] := 'XMLHttpRequest'; 
    lHTTP.Request.Referer := 'https://www.instagram.com/'; 
    lHTTP.Request.ContentType := 'application/x-www-form-urlencoded'; 
    lHTTP.Request.UserAgent := 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36'; 
    Reply := lHTTP.Post('https://www.instagram.com/accounts/login/ajax/', Params); 

    finally 
    end; 

    finally 
    end; 

Finally 

    lHTTP.Request.UserAgent := 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36'; 
    lHTTP.Get('https://www.instagram.com/myusername/following/', TStream(nil)); 
    Memo1.Lines.Add(Reply); 


    Finally 
    end; 
end; 



end; 
+1

Alles, was Sie mit HTTP in VB.Net können, können Sie mit 'TIdHTTP' in Delphi tun. Bitte zeigen Sie den Code, den Sie ausprobiert haben, der nicht für Sie funktioniert. Dies ist nicht anders als bei Ihrer [anderen Instagram-Ausgabe] (http://stackoverflow.com/questions/37951677/). –

+0

Ja, ich habe zuerst versucht, mich anzumelden, dann bekomme ich das Access-Token, dann benutze ich 'LHTTP.Get ('https://www.instagram.com/Myusername/');', um das Access-Token zu bekommen. Schließlich bekommen Sie die 'LHTTP.Get ('https://www.instagram.com/Myusername/following/');' Aber es gibt keine Benutzernamen in der entschlüsselten HTML, ich glaube nicht, dass dies die richtige Methode @RemyLebeau – ColdZer0

+1

, wenn Sie möchten Hilfe hier, müssen Sie den Code zeigen, den Sie versucht haben. Alles, was Sie in einem Webbrowser tun können, kann mit 'TIdHTTP' mit dem richtigen Code gemacht werden, so dass Sie etwas verpassen müssen. –

Antwort

4

Auf dieser Linie:

lHTTP.Get('https://www.instagram.com/myusername/following/', TStream(nil)); 

Du Get() erzählt die Antworttext (AResponseContent=nil) zu ignorieren, und dann Sie Ordnen Sie die neue Antwort nicht Ihrer Reply Variablen zu, so dass Sie den alten Reply Wert aus dem Ohr anzeigen r Login-Antwort.

Um den HTML-Code der /following Seite zu bekommen, diese stattdessen

Reply := lHTTP.Get('https://www.instagram.com/myusername/following/'); 

jedoch verwenden, wenn man sich den aktuellen HTTP-Anfragen suchen, die einen Web-Browser macht, sehen Sie, dass auf auf dem Following Link Ihre Profilseite sendet tatsächlich eine AJAX POST Anfrage an die folgende URL ein JSON-Dokuments enthält die Anhänger zu erhalten:

https://www.instagram.com/query/

enthaltend eine Abfragezeichenfolge in der POST Körper. Sie müssen replizieren, dass AJAX-Request, zB:

var 
    //... 
    userid: string; // <-- add this 
begin 
    // after your AJAX login... 

    lHTTP.Request.UserAgent := 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36'; 
    lHTTP.Request.Connection := 'keep-alive'; 
    lHTTP.Get('https://www.instagram.com/myusername/', TStream(nil)); 

    cookie := lHTTP.CookieManager.CookieCollection.Cookie['csrftoken', 'www.instagram.com']; 
    if cookie <> nil then 
    token := cookie.Value 
    else 
    token := ''; 

    cookie := lHTTP.CookieManager.CookieCollection.Cookie['ds_user_id', 'www.instagram.com']; 
    if cookie <> nil then 
    userid := cookie.Value; // <-- add this 

    Params.Clear; 
    Params.Add('q=ig_user(' + userid + ') {'+LF+ 
      ' follows.first(10) {'+LF+ 
      ' count,'+LF+ 
      ' page_info {'+LF+ 
      '  end_cursor,'+LF+ 
      '  has_next_page'+LF+ 
      ' },'+LF+ 
      ' nodes {'+LF+ 
      '  id,'+LF+ 
      '  is_verified,'+LF+ 
      '  followed_by_viewer,'+LF+ 
      '  requested_by_viewer,'+LF+ 
      '  full_name,'+LF+ 
      '  profile_pic_url,'+LF+ 
      '  username'+LF+ 
      ' }'+LF+ 
      ' }'+LF+ 
      '}'+LF); 
Params.Add('ref=relationships::follow_list'); 

lHTTP.Request.CustomHeaders.Values['X-CSRFToken'] := token; 
lHTTP.Request.CustomHeaders.Values['X-Instagram-AJAX'] := '1'; 
lHTTP.Request.CustomHeaders.Values['X-Requested-With'] := 'XMLHttpRequest'; 
lHTTP.Request.Referer := 'https://www.instagram.com/myusername/'; 
lHTTP.Request.ContentType := 'application/x-www-form-urlencoded'; 
lHTTP.Request.UserAgent := 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36'; 
Reply := lHTTP.Post('https://www.instagram.com/query/', Params); 

// process Reply as needed ... 

Jetzt Reply JSON mit den ersten 10 Anhänger in Ihrer Liste erhalten soll.

+0

Wie könnte ich das vergessen!, Ich sollte das Netzwerk überwacht haben, bevor Sie die folgende Liste, Vielen Dank. – ColdZer0

+1

Sie ** wirklich ** sollten Instagram's [Entwickler-API] (https://www.instagram.com/developer/) verwenden, anstatt HTTP-Traffic jährlich zu scrapen. Die API unterstützt "Likes", "Follower" usw. Sie machen es sich selbst schwerer, indem Sie die API nicht verwenden. Was ist, wenn Instagram beschließt, in Zukunft Änderungen an seiner Website vorzunehmen? Dein Code könnte kaputt gehen. Die API wäre stabiler und zuverlässiger. Sie müssen keine große Firma sein, um diese Berechtigungen zu erhalten. Sie werden als Teil Ihrer Authentifizierungsüberprüfung gewährt, wenn Ihre App online geht und Benutzer sie autorisieren, auf ihre Konten zuzugreifen. –

+0

Danke Remy, es gibt 'end_cursor' Zeichenkette jedes Mal, wenn ich die Post json herunterladen, wenn ich alle Follower Liste bekommen wollte, muss ich die' end_cursor' Zeichenkette bekommen und benutze sie in 'follows.after (end_cusror Zeichenkette, 1000) '.aber der Prozess ist sehr langsam, gibt es eine Möglichkeit, dies zu beschleunigen? – ColdZer0