2016-06-27 1 views
0

J'essaye d'obtenir ma liste instagram "suivante" en utilisant seulement le composant http. J'ai essayé d'utiliser lHTTP.Get('https://www.instagram.com/Myusername/following/'); mais il n'y a aucun nom d'utilisateur dans le code HTML déchiffré. Cependant, j'ai vu des gars l'utiliser sans instagram API, juste une réponse http dans VB.Net. J'utilise Delphi 10.Comment faire pour obtenir Instagram suivre la liste en utilisant le composant http dans Delphi 10

MISE À JOUR

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

Tout ce que vous pouvez avec HTTP dans VB.Net, vous pouvez faire avec 'TIdHTTP' dans Delphi. S'il vous plaît montrer le code que vous avez essayé qui ne fonctionne pas pour vous. Ce n'est pas différent de votre [autre numéro Instagram] (http://stackoverflow.com/questions/37951677/). –

+0

ouais, j'ai d'abord essayé de me connecter puis j'ai reçu le jeton d'accès, puis j'ai utilisé 'lHTTP.Get ('https://www.instagram.com/Myusername/');' pour obtenir le jeton d'accès. Enfin obtenir le 'lHTTP.Get ('https://www.instagram.com/Myusername/following/');' mais il n'y a pas de noms d'utilisateur dans le HTML déchiffré, je ne pense pas que ce soit la bonne méthode @RemyLebeau – ColdZer0

+1

si vous voulez aide ici, vous devez montrer le code que vous avez essayé. Tout ce que vous pouvez faire dans un navigateur web peut être fait avec 'TIdHTTP' avec le bon code, donc il vous manque quelque chose. –

Répondre

4

Sur cette ligne:

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

Vous dites Get() d'ignorer le corps de la réponse (AResponseContent=nil), puis vous n'attribuez pas la nouvelle réponse à votre variable Reply, donc vous affichez la vieille valeur Reply de l'oreille r réponse de connexion.

Pour obtenir le code HTML de la page /following, utilisez plutôt

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

Cependant, si vous regardez les requêtes HTTP réelles qu'un navigateur Web fait, vous verrez qu'en cliquant sur le lien Following sur votre page de profil envoie en fait une requête AJAX POST à l'adresse suivante pour recevoir un document JSON énumérant les disciples:

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

contenant une chaîne de requête dans le corps POST. Vous devez répliquer cette demande AJAX, par exemple:

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 ... 

maintenant Reply doit recevoir JSON contenant les 10 premiers disciples dans votre liste.

+0

comment pourrais-je l'oublier!, J'aurais dû surveiller le réseau avant de voir la liste suivante, merci beaucoup. – ColdZer0

+1

vous ** vraiment ** devrait utiliser Instagram [développeur API] (https://www.instagram.com/developer/) au lieu de gratter le trafic HTTP chaque année. L'API prend en charge les "likes", les "followers", etc. Vous compliquez les choses en n'utilisant pas l'API. Et si Instagram décidait d'apporter des modifications à son site Web à l'avenir? Votre code pourrait casser. L'API serait plus stable et fiable. Vous n'avez pas besoin d'être une grande entreprise pour obtenir ces autorisations, elles sont accordées dans le cadre de votre vérification d'authentification lorsque votre application est mise en ligne et que les utilisateurs l'autorisent à accéder à leurs comptes. –

+0

Merci Remy, il y a une chaîne 'end_cursor' chaque fois que je télécharge le Post json, si je voulais obtenir toute la liste des followers je devais obtenir la chaîne' end_cursor' et l'utiliser dans 'follows.after (string end_cusror, 1000) '.mais le processus est très lent, y a-t-il un moyen d'accélérer cela? – ColdZer0