[Delphi] Instagram – Likende auf Medien identifizieren und Datensätze speichern

[Datenquellen und Erklärungen]
„mylikers“ -> Anzahl der beobachteten Medien
„mytable“ -> Stringgridobjekt für die Ergebnisse
„oritable“ -> Stringgridobjekt für die Medienrohdaten
„oritable.cols[6].text“ -> Stringreihe für die Postcodes aus Instagram

procedure TForm1.getmylikers(mylikers: integer; mytable: TStringGrid; oritable: tstringgrid);
var lauf, lauf_gl: integer;
l_clear: integer;
JSONArray: tJSONArray;
JSONValue,jvalue: tJSONValue;
JSONPair: TJSONPair;
JSON, json_sub: TJSONObject;
size: integer;
j_array: tJSONArray;
s: string;
i,j: integer;
next_id: string;
chk_br: char;
HTTP: TIdHTTP;

begin
// => hole media_daten (unique-codes!)
debug.Text:=oritable.Cols[6].Text;
debug.Lines.Delete(0);
form1.Caption:=version+‘ ‚+inttostr(debug.Lines.Count-1)+‘ IDs eingelesen‘;
debug_03.Clear;

// init tabelle
with mytable do
begin
cells[0,0]:=’Nr.‘;
cells[1,0]:=’Username‘;
cells[2,0]:=’URL‘;
cells[3,0]:=’ID‘;
cells[4,0]:=’Post-ID‘;
cells[5,0]:=’Post-URL‘;
cells[6,0]:=’Tagcloud‘;
cells[7,0]:=’Postzeit‘;
rowcount:=1;
colcount:=8;
end;
for lauf_gl := 0 to mylikers do
begin
debug_01.Clear;
debug_01.ScrollBars:=ssboth;
randomize;
token.Text:=token.Items[random(token.Items.Count-1)];
debug_03.Lines.Add(‚https://api.instagram.com/v1/media/’+debug.Lines[lauf_gl]+’/likes?access_token=’+token.text);
try
HTTP := TIdHTTP.Create(nil);
form1.Caption:=version+‘ analysiere Likende, Bild: ‚+inttostr(lauf_gl)+‘ / ‚+inttostr(mylikers);
debug_01.Text:=HTTP.Get(‚https://api.instagram.com/v1/media/’+debug.Lines[lauf_gl]+’/likes?access_token=’+token.text);
JSONValue := TJSONObject.ParseJSONValue(debug_01.text);
JSON := TJSONObject.ParseJSONValue(debug_01.Lines.Text) as TJSONObject;
JSONArray := TJSONArray(JSON.Get(‚data‘).JsonValue);
http.free;
SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
for i := 0 to JSONArray.Size – 1 do
begin
with mytable do
begin
cells[0,rowcount]:=inttostr(rowcount);
cells[1,rowcount]:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get(‚username‘)).JsonValue.Value);
cells[2,rowcount]:=’https://instagram.com/’+(TJSONPair(TJSONObject(JSONArray.Get(i)).Get(‚username‘)).JsonValue.Value);
cells[3,rowcount]:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get(‚id‘)).JsonValue.Value);
cells[4,rowcount]:=debug.Lines[lauf_gl]; // post-id
cells[5,rowcount]:=oritable.Cells[1,lauf_gl+1];
cells[6,rowcount]:=oritable.Cells[2,lauf_gl+1];
cells[7,rowcount]:=oritable.Cells[5,lauf_gl+1];
if zdb.Checked=true then
begin
save_infname:=prjlikeacc.Text;
save_likers:=useridlikeacc.Text;
with sql_befehle.Lines do
begin
clear;
add(‚INSERT INTO `interakt` (`name`, `url`, `uid`, `postid`, `posturl`, `tagcloud`, `inflid`, `inflname`, `postzeit`,`zeit`) Values (“’+cells[1,rowcount]+“‘, “’+cells[2,rowcount]+“‘, “’+cells[3,rowcount]+“‘, “’+cells[4,rowcount]+“‘, “’+cells[5,rowcount]+“‘, “’+escape(cells[6,rowcount])+“‘, “’+save_likers+“‘, “’+save_infname+“‘, “’+cells[7,rowcount]+“‘, “’+datetimetostr(now)+“‘ );‘);
fdquery2.ExecSQL(sql_befehle.text);
form1.Caption:=version+‘ in DB eingetragen …‘;
SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
end;
end;
rowcount:=rowcount+1;
end;
end;
except
form1.Caption:=version+‘ Recherche und Analyse hat nicht funktioniert …‘;
end;
delay(50);
grdColWidth(mytable, 40);
end;
SaveToCSV(mytable,verz+’data\’+save_likers+‘.csv‘);
end;

Aufruf der Prozedur
getmylikers(strtoint(anzmedia.Text), table_likers, m_rohdaten);

Update – Instagrambot, Screening der Medien auf Interaktionen

Nach einigen Überlegungen habe ich mich dazu entschieden, die ausgegliederte Instagramrechercheanwendung zu beenden und sämtliche Algorithmen in den bestehenden Bot zu überführen. Der „Bot“ kann also nicht mehr als typischer Bot begriffen werden, da diese Software nun auch über eine stabile Recherche- und Auswertungsfunktionssammlung verfügt.

[Analyse und Auswertungen der Interaktionen auf einen beliebigen (öffentlichen) Account]

Die Umsetzung der Funktionen basiert auf den Gedanken, die ich in diesem Blog unter dem Aspekt „Influencersuche“ bereits beschrieben hatte und die veröffentlichte Galerie zeigt einen Ausschnitt aus der Bedienung.
Die entwickelten Prozeduren gehen nach folgendem Muster vor:

[Datensammeln]
(a) Recherche der IDs des interessanten Accounts
(b) Download: Medienverzeichnis des interessanten Accounts
(c) Schritt-für-Schritt-Analyse der gecrawlten Medien auf die Endpoints „Likes“ und „Comments“ auf Basis der Media-ID und Erfassung der interagierenden Accounts (Username, User-ID etc.)

[Datenaufbereitung]
(a) Aufsummierung der Likes JE identifizierten Account
(b) Aufsummierung der Likesummen nach folgendem Beispielen:
– 1000 Accounts haben 1 x geliked
– 400 Accounts haben 100 x geliked
– 10 Accounts haben 300 x geliked

Datenbeispiele zu Instagramaccount aus dem Bereich „Politik“:
Hinweis:
Sämtliche sensible Daten sind in den nachfolgenden Beispieldateien selbstverständlich codiert.
Rohdaten: cl_rohdaten_codiert.xlsx
Summierte Daten: cl_sumlikeslikers_codiert.xlsx
Zusammenfassung: cl_zfg.xlsx

Die erhobenen und aufbereiteten Datensätze erlauben nun einen tieferen Blick auf die Accounts. Hierbei lassen sich Antworten auf folgende Fragen interpretieren:
(a) Existiert ein Ungleichgewicht zwischen der Followeranzahl und der Anzahl der Interagierenden?
(b) Sind die Interagierenden besonders aktiv, weniger aktiv oder selten aktiv?

Die grob beschriebene Funktion wird ab sofort in das Dienstleistungsspektrum der Wobus & Lehmann GbR eingegliedert.

Habt Ihr weitere faszinierende Ideen? Ich freue mich auf Kommentare, eMails und nette Telefonate.