Instagram: Download der Follower- und Abodatensätze (JSON)

Durch die API-Änderungen von Instagram wurde – wie bekannt – das Herunterladen dieser Datensätze etwas komplizierter. Die folgende Prozedure kann hier Abhilfe schaffen.

procedure TForm1.get_accounts(userid: string; uname: string; abfragetyp: string; maxerg: string; ziel: tmemo);
var
lHTTP: TIdHTTP;
IdSSL: TIdSSLIOHandlerSocketOpenSSL;
Params, login : TStrings;
Reply, _Token, X, lf: string;
Cookie: TIdCookie;
begin
// login - anfang
try
Params := TStringList.Create;
Params.Add('username='+igaccounts.Text);
Params.Add('password='+token_w.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
// login => ende
// fans usw. erfassen
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';
cookie := lHTTP.CookieManager.CookieCollection.Cookie['csrftoken', 'www.instagram.com'];
if cookie <> nil then
_token := cookie.Value
else
_token := '';
Params.Clear;
Params.Add('q=ig_user(' + userid + ') {'+LF+
' '+abfragetyp+'('+maxerg+') {'+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/'+uname+'/';
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);
ziel.Text:=reply;
end;
end;

Verwenden der Prozedur
Die Prozedur verlangt die Übergabe der Account-ID, des Account-Names, der maximalen Datensätze und die „Memo“, welche das Ergebnis der Abfrage für die weitere Verarbeitung erfassen soll.

Sie wird wiefolgt aufgerufen:
1) Fans holen
get_accounts(account_id,account_name, ‚followed_by.first‘,’9999′, ziel_memo);

2) Abos holen

get_accounts(account_id,account_name, ‚follows.first‘,’9999′, ziel_memo);

Die Zahl „9999“ lässt sich beliebig austauschen und sie beschreibt hier den Maximalwert, unter dem die Prozedur fehlerfrei funktioniert. Bei höheren Zahlen muss der Automatismus um eine geeignete Schleife erweitert werden.

Welche konkreten Funktionen lassen sich nun aus den Ergebnissen dieser Prozedur ableiten?
– Datenabgleich der Account-IDs mit den Likenden
– Datenabgleich der Account-IDs mit den Kommentierenden
– Erfassen und Auswerten des Fanengagements
– Erfassen von Likenden / Kommentierenden, welche weder Fans noch Abos sind
– Aktivitätsanalysen konkreter Zielgruppen
– Aufdecken und Analysen von Fakes
– Aktivitätsanalysen der Accounts aus den IDs via Postanalysen

Inspirationsquelle für den Code
How to get Instagram following list using http component in Delphi 10
Find my Instagram-ID