2016-06-27 22 views
0

httpコンポーネントのみを使用して、「次の」リストを取得しようとしています。私はlHTTP.Get('https://www.instagram.com/Myusername/following/');を使用しようとしましたが、復号化されたhtmlにはユーザー名がありません。しかし、私はいくつかの人がinstagram apiなしでそれを使用して、VB.Netでちょうどhttp応答を見た。私は、Delphi 10にこの行でDelphi 10でhttpコンポーネントを使用してInstagram follow listを取得する方法

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

VB.NetでHTTPでできることは何でも、Delphiの 'TIdHTTP'で行うことができます。実際に動作していないコードを表示してください。これはあなたの[他のInstagramの問題](http://stackoverflow.com/questions/37951677/)と違うわけではありません。 –

+0

ええ、最初にログインしてアクセストークンを取得した後、 'lHTTP.Get( 'https://www.instagram.com/Myusername/');'を使ってアクセストークンを取得します。最後に 'lHTTP.Get( 'https://www.instagram.com/Myusername/following/');を取得します。ただし、解読されたhtmlにはユーザー名はありません。これは正しい方法だと思います@RemyLebeau – ColdZer0

+1

助けてください、あなたが試みたコードを表示する必要があります。あなたがウェブブラウザで行うことができるものは、適切なコードで 'TIdHTTP'を使って行うことができるので、あなたは何かが欠落している必要があります。 –

答えて

4

を使用しています:

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

あなたはその後、レスポンスボディ(AResponseContent=nil)を無視するGet()を伝える、とされていますReply変数に新しい応答が割り当てられていないため、earlieの古いReply値が表示されていますrログイン応答。

/followingページのHTMLを取得するには、Webブラウザが行う実際のHTTPリクエストを見れば、あなたは上の Followingリンクをクリックしていることがわかります。しかし、この代わりに

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

を使用して、あなたの

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

POST体内のクエリ文字列を含む:プロフィールページには、実際にフォロワーをリストJSON文書を受信するには、以下のURLにAJAX POST要求を送信します。あなたは、例えば、そのAJAX要求を複製する必要があります。今すぐ

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

Replyはあなたのリストの最初の10人のフォロワーを含むJSONを受けるべきです。

+0

私はそれを忘れることができました!、私は、次のリストを表示する前にネットワークを監視する必要があります、多くのありがとう。 – ColdZer0

+1

あなたは**本当に** HTTPトラフィックを毎年掻くのではなく、Instagramの[開発者API](https://www.instagram.com/developer/)を使用する必要があります。 APIは「お気に入り」、「フォロワー」などをサポートしています。あなたはAPIを使用しないことで自分自身を難しくしています。 Instagramが将来ウェブサイトに変更を加えることを決定したらどうなりますか?コードが壊れる可能性があります。 APIの安定性と信頼性が向上します。これらの権限を取得するために大企業になる必要はありません。アプリが公開され、ユーザーがそのアカウントにアクセスすることを許可すると、認証の審査の一環として許可されます。 –

+0

ありがとうございました、私は 'end_cursor'文字列を取得して' follow.after(end_cusror string、1000)で使用する必要があるすべてのフォロワーリストを取得したい場合は、Postjsonをダウンロードするたびに 'end_cursor'文字列があります。 '。プロセスは非常に遅いですが、これをスピードアップする方法はありますか? – ColdZer0

関連する問題