Influencermarketing, Versuch einer Dichteanalyse auf Basis der InstaLOC2.0 Datenbanken

Inspiriert von einigen Diskussionen befragte ich die Datenbanken

#werbung -> 4945 Orte (rot)
#anzeige -> 1324 Orte (blau)

Datenbankstand: 13.06.2019 mit Filter auf Jahr 2018 + 01.01-13.06.2019 Filter für die Darstellung: mind. 10 Postings zu den Themen je Locations.

Im Datenbestand befinden 343067 Locations, die mit Deutschland via OSM-Abgleich eindeutig in Verbindung stehen. Es fällt auf, dass sich die Tags / Themen überschneiden u. das sehe ich in den Datensätzen in der Form, dass die Tags gleichzeitig in den Beiträgen genannt werden.

Wegen der starken Überschneidung der Themenwelten fasste ich die Ergebnisse zusammen und komme auf ~800.000 Beiträge von aktuell erfassten 70 Mio Beiträge mit Status „Weltweit“.

Tiefensichtung der Zahlen
Erfasste u. cod. Accounts: 25.061 von 1.538.231 aus Land „DE“

Erfasste Themen/Tags(wolken): 64.667 von 4.463.435 aus Land „DE“

Erfasste unique Bildinhalte: 5328 von 89.113 aus Land „DE“.

Erfasste Zeitstempel(Postings): 75.373 von 5.092.791 aus Land „DE“

Interaktionen

Likes: 21.231.617 von 714.917.463 Comments: 879.852 von 25.176.657

Die Sichtung lässt mich vermuten, dass Influencermarkting zwar eine pragmatische Spielart im Marketingmix ist u. natürlich auch bleibt (viele Indikatoren sprechen dafür …), jedoch dass diese Strategie künstlicher Hype ist. Ich denke in diese Richtung, weil die Kommunikation zu den genannten Themen im Vergleich zum „Grundrauschen“ zwar da ist, aber einen relativ kleinen Teil zeigt.  Als Fazit würde ich Influencermarketing nicht verteufeln, sondern extrem punktgenau die Vor- u. Nachteile der jeweiligen Partnerschaften (Reichweite, provozierte Interaktionen, Ziele) analysieren u. hier auf gar keinen Fall schwammigen Begriffen wie „Erfahrung“, „Authentizität“ vertrauen … denn … es kommt letztendlich auch nur auf die Zahlen an.


Projekt InstaLOC, aktueller Datenbestand (Stand: 27.11.2018)

Heute wurde ein Update der InstaLOC-Systeme veranlasst. Die Hauptdatendatei umfasst nun ~40GB mit folgenden Grundzahlen:

(1) Unique Beiträge: 64.000.547
(2) Unique (codierte) Usernames: 14.980.773
(3) Unique Locations: 2.096.459 (vorher: 1.7 Mio)

Eine Besonderheit wird hier von den Tagwolken eingenommen. Diese sind mit der aktuellen Abfragelogik nicht mehr als „Distinct“ in einer annehmbaren Geschwindigkeit auslesbar. Sehr wahrscheinlich werde ich einen Berechnungsdurchlauf in der kommenden Nacht durchführen lassen.

Das Projekt wurde, nach Rückmeldung(en) der vielen Geschäftsfreund_innen und Kund_innen, umkonzeptioniert, so dass externe Datenquellen angedockt werden können. Hier wurde ein spezielles Problem (final) gelöst, welches so beschrieben werden kann:

Die konkrete Bestimmung von Städten auf Basis der Instagramlocationangaben ist teilweise fehlerhaft / nicht möglich.
Die konkrete Bestimmung von Stadtteilen und deren Vergleichbarkeiten innerhalb EINER Stadt ist auf Basis der Instagramlocationangaben nur eingeschränkt möglich.

Die Ausgangslage wurde nun so entschärft:

(a) Export der Locationdaten in Form einer Distinct-Anweisung.
(b) Extrakt der Angaben „lat“, „long“ und „name“ aus dem Datenexport via for-to-do-schleife.
(c) Übergabe von „lat“ und „long“ an die Openstreetmap-API, Extrakt der Resultate und Speichern in eine neue Datenbankdatei.

Für die nachfolgenden Beispiele gilt:
„The Database made available under the Open Database License: http://opendatacommons.org/licenses/odbl/1.0/. Any rights in individual contents of the database are licensed under the Database Contents License: http://opendatacommons.org/licenses/dbcl/1.0/

Der Datenbestand umfasst (jeweils unique):
164.222 Eintragungen / 1.7 Mio
24.185 Stadtteile
221 Länder zu 203 Ländercodes
1630 States (Bundesländer etc.)
1131 State Districts (Bezirke etc.)
9715 County (Gemeinden, Regionen etc.)

Download Beispieldaten, Überblick (PDF)
Länder+Ländercodes
Länder+Ländercode+Aufzählung-Städte/a>
Berlin+Stadtteil+PLZ
Srilanka+Stadt+Stadtteil+PLZ
China+Stadt+Stadtteil+PLZ
Indien+Stadt+Stadtteil+PLZ
BRD+Stadt+Stadtteil+PLZ
USA+Stadt+Stadtteil+PLZ

Da die Abgleichsprozedur noch aktiv geschaltet ist, werden sich die Werte mit sehr hoher Wahrscheinlichkeit verändern. Interessant ist hier die zukünftige Beobachtung der TOP-Länder aus der 2. Beispieldatei.

Die verbleibenden 1.5 Mio Eintragungen werden „sehr wahrscheinlich“ in den nächsten 1 1/2 Wochen komplett abgearbeitet und mit Finalisierung wird das Recherchekonzept um einen weiteren Prüfpunkt erweitert. Folgende Szenarien sind dann „denkbar“

(a) Gezielte Analyse von Stadtteilen auf:
-> Zielgruppen
-> Trends via Kombination aus Tags, Tagwolken, Summe Likes + Comments, Zeitstempel
(b) Vergleich von Stadtteilen
(c) Vergleich von Städten auch auf Stadtteilebene
(d) Querprüfung auf Städte, Länder, Stadtteile etc. bzgl. der generellen Aktivitäten im Medium „Instagram“

Weitere Ideen, Anregungen oder Lust auf Austausch? Gern unter den bekannten Telefonnummern und office(at)pontipix.de

Etablierung der Zielgruppenforschung im Instagramumfeld und erste Zahlen aus der praktischen Anwendung

Mit Etablierung der InstaLOC-Datenbanken und den angedockten Zielgruppen- und Marktanalysen wurden zeitgleich diverse Tests mit bestehenden Accounts durchgeführt.
Diese Szenarien sollten klären:

(a) Followerwachstum
(b) Interaktionen auf den Medien, Videos, Stories
(c) Interaktionsqualitäten und Nachhaltigkeiten

Vor ca. 4 Wochen wurden 2 Testaccounts ausgewählt, Gespräche geführt und an das System angedockt.

Die beobachteten Effekte sind:
(a) Followerwachstum (gerundet)

Account: (A)
Thema: Kunst, Art, Fotografie
13.000 Follower -> 26.000 Follower -> 40.000 Follower

Account: (B)
Thema: Coaching/Consulting
1.500 Follower -> 17.000 Follower -> 20.000 Follower

(b) Interaktionen auf die Medien

Account: (A)
Thema: Kunst, Art, Fotografie
Interaktionsspannbreite, Bilder – Likes: 130 bis ~3.000

Interaktionsspannbreite, Videos – Likes + Views

Account: (B)
Thema: Coaching/Consulting
Interaktionsspannbreite, Bilder – Likes: ~350 – ~800

Account (A) entwickelt sich erstaunlich gut und es sind ca. 200-260 dauerhafte Besucher_innen auf die verlinkte Seite identifizierbar. Ebenfalls beobachte ich starke Kommunikation via „DM“, eMail und auch Telefon aus den Spektren der angesprochenen Zielgruppen (hier: Galerien, Fotograf_innen, Kunst allgem.).
Account (B) zeigt eine starke Etablierung der zielgruppenorientierten Kommentare und eine Einpendelung der Interaktionen auf ~800 / Medium. Erste Anfragen via DM und eMails sind ebenfalls nachvollziehbar.

Nach Zahlensichtung, Ergebnisanalysen und diverse Brainstormings wurden letzte Woche weitere Accounts aus dem Bereich „Handel“ und „Home & Living“ in die Strategie überführt. Hier sind Effekte analog zu Account (A) und Account (B) sichtbar.

Interesse an einer Partnerschaft? Fragen?
Gerne unter office(at)pontipix.de
Weitere Informationen unter: https://www.pontimania.de/

Hinweis: SQLite-Dateien in Excel öffnen und da weiter verarbeiten (InstaLOC und HashtagDB)

Irgendwer aus dem „Netzwerk“ gab mir bei einem Telefonat einen interessanten Hinweis zu den Potentialen von Excel. Wir sprachen da u.a. darüber, dass die freigegebenen SQLite-Datenbanken aus den Projekten „Hashtag-Reichweiten“ und „InstaLoc“ zu viele Auswertungs- und Analyseprobleme provozieren können.

Eine Option beschreibt
https://yourbusiness.azcentral.com/connecting-excel-sqlite-12971.html

und man benötigt für die dargestellte Funktion das Plugin http://www.ch-werner.de/sqliteodbc/.

Möchte man hierüber unsere Dateien anbinden, muss an der entsprechenden Einlesestelle (siehe verlinkter Blogbeitrag!) die Option „SQLite-3“ ausgewählt werden. Die nachgeschaltete EXCEL-Oberfläche ist relativ selbsterklärend. Mit den konkreten Auswertungsfunktionen habe ich mich nicht beschäftigt und ich kann an der Stelle auch keinerlei Support zu den Queries geben.

InstaLOC-Projekt, Freigabe der Version 0.10 Beta

Ich habe soeben die Freigabe für die Versionsnummer 0.10Beta erteilt. Die entsprechende Datei befindet sich in dem – intern geteilten – Dropboxordner und trägt den Namen „insta_loc_15082018_010Beta.zip“.

Bedienungsanleitungsvideos:
InstaLoc-Forschungsprojekt/Software (Basisfunktionen – Likes): https://youtu.be/CkZSVPC8KJY
InstaLoc-Forschungsprojekt/Software (Basisfunktionen – Accountebene): https://youtu.be/VXPzhanL-vw
InstaLoc-Forschungsprojekt/Software (Filter: Tagwolkenanalyse, Locations): https://youtu.be/qh2bowhnMbI
InstaLoc-Forschungsprojekt/Software (Tagwolkenanalyse, Locations): https://youtu.be/5aefOGaGy-o
InstaLoc-Forschungsprojekt/Software (Tagwolkenanalyse): https://youtu.be/Ey9B6Skm9Y4

Wir vergeben an 2 besondere und ausgewählte Kolleg_innen jeweils eine Kopie der Auswertungssoftware und sind offen für entsprechende Gespräche, Anfragen und Nachfragen.

Rohdatenerfassung zu den Locations via Instagram-API (finaler Ansatz)

Im Zuge des Roland-Berger-Projektes fand ich endlich Gelegenheit, den Locationrohdatenscraper zu optimieren. Hier nun der Quellcode:

(1) Scrapingprozedur
Erklärung:
get_loc_short(mytable: TStringGrid; locid: string; rounds: integer);
mytable -> Stringgridobjekt, verlangt die Übergabe des Objektnamens
locid -> LocationID aus Instagram (siehe: Locationparser)
rounds -> maximale Anzahl der Subprüfung je Durchlauf

procedure TForm1.get_loc_short(mytable: TStringGrid; locid: string; rounds: integer);
var
JSONArray: tJSONArray;
JSONValue,jvalue: tJSONValue;
JSONPair: TJSONPair;
JSON, json_sub: TJSONObject;
size: integer;
j_array: tJSONArray;
s: string;
i,j: integer;
next_id: string;
zaehl: integer;
begin
zaehl:=0;
try
debug.text:=idhttp1.Get('https://api.instagram.com/v1/locations/'+locid+'/media/recent?access_token='+token.text);
JSONValue := TJSONObject.ParseJSONValue(debug.text);
JSON := TJSONObject.ParseJSONValue(debug.Lines.Text) as TJSONObject;
JSONArray := TJSONArray(JSON.Get('data').JsonValue);
try next_id:= JSONValue.GetValue('pagination.next_url');
except
next_id:='N/A';
end;
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('link')).JsonValue.Value);
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('tags')).ToString);
s:= StringReplace(s, '"tags":[', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, ']', '', [rfReplaceAll,rfIgnoreCase]);
cells[2,rowcount]:=s;
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('likes')).ToString);
s:= StringReplace(s, '"likes":{"count":', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '}', '', [rfReplaceAll,rfIgnoreCase]);
cells[3,rowcount]:=s;
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('comments')).ToString);
s:= StringReplace(s, '"comments":{"count":', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '}', '', [rfReplaceAll,rfIgnoreCase]);
cells[4,rowcount]:=s;
cells[5,rowcount]:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('created_time')).JsonValue.Value);
cells[5,rowcount]:=datetimetostr(UnixToDateTime(strtoint(cells[5,rowcount])));
cells[6,rowcount]:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('id')).JsonValue.Value);
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('user')).ToString);
s:= StringReplace(s, '"user":{"username":', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '}', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '"', '', [rfReplaceAll,rfIgnoreCase]);
cells[7,rowcount]:=s;
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('location')).ToString);
s:= StringReplace(s, '"location":', '', [rfReplaceAll,rfIgnoreCase]);
cells[8,rowcount]:=s;
cells[9,rowcount]:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('filter')).JsonValue.Value);
cells[10,rowcount]:=datetimetostr(now);
rowcount:=rowcount+1;
end;
grdColWidth(mytable, 40);
end;
except
end;
repeat
// -> tiefenpruefung
try
debug.text:=idhttp1.Get(next_id);
JSONValue := TJSONObject.ParseJSONValue(debug.text);
JSON := TJSONObject.ParseJSONValue(debug.Lines.Text) as TJSONObject;
JSONArray := TJSONArray(JSON.Get('data').JsonValue);
try next_id:= JSONValue.GetValue('pagination.next_url');
except
next_id:='N/A';
end;
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('link')).JsonValue.Value);
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('tags')).ToString);
s:= StringReplace(s, '"tags":[', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, ']', '', [rfReplaceAll,rfIgnoreCase]);
cells[2,rowcount]:=escape(s);
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('likes')).ToString);
s:= StringReplace(s, '"likes":{"count":', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '}', '', [rfReplaceAll,rfIgnoreCase]);
cells[3,rowcount]:=s;
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('comments')).ToString);
s:= StringReplace(s, '"comments":{"count":', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '}', '', [rfReplaceAll,rfIgnoreCase]);
cells[4,rowcount]:=s;
cells[5,rowcount]:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('created_time')).JsonValue.Value);
cells[5,rowcount]:=datetimetostr(UnixToDateTime(strtoint(cells[5,rowcount])));
cells[6,rowcount]:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('id')).JsonValue.Value);
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('user')).ToString);
s:= StringReplace(s, '"user":{"username":', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '}', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '"', '', [rfReplaceAll,rfIgnoreCase]);
cells[7,rowcount]:=s;
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('location')).ToString);
s:= StringReplace(s, '"location":', '', [rfReplaceAll,rfIgnoreCase]);
cells[8,rowcount]:=s;
cells[9,rowcount]:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('filter')).JsonValue.Value);
cells[10,rowcount]:=datetimetostr(now);
rowcount:=rowcount+1;
end;
grdColWidth(mytable, 40);
end;
except
end;
// -> tiefenpruefung, ende
zaehl:=zaehl+1;
until zaehl=rounds;
//uebertrag auf tabelle
grdColWidth(mytable, 40);
form1.Caption:=version+' alle Posts herunter geladen';
end;

(2) Aufruf der Scrapingprozedur
procedure TForm1.Button45Click(Sender: TObject);
var lauf: integer;
begin
with locmedia do
begin
cells[0,0]:='Nr.';
cells[1,0]:='URL';
cells[2,0]:='Tag';
cells[3,0]:='Likes';
cells[4,0]:='Comments';
cells[5,0]:='Erstellzeit';
cells[6,0]:='ID';
cells[7,0]:='User';
cells[8,0]:='Location';
cells[9,0]:='Filter';
colcount:=10;
rowcount:=1;
end;
for lauf := 1 to locroh.RowCount do
begin
randomize;
token.Text:=token.Items[random(token.Items.Count-1)];
get_loc_short(locmedia,locroh.Cells[1,lauf],20);
savetocsv(locmedia,verz+'\support\dummydata.csv');
form1.Caption:=version+' Locationscraper: '+inttostr(lauf)+' / '+inttostr(locroh.RowCount);
delay(1000);
end;
end;

Instagram: Gibt es die perfekte Uhrzeit zum Posten von Beiträgen?

Björn Tantau betrieb heute Aufklärungsarbeit(en) für die interessierten Laien in Form eines Artikels. Dieser ist soweit okay, bezieht viele externe Erkenntnisse ein und er demonstriert einige Zahlen auf Basis seines Accounts. Leider lassen die schriftlichen Gedankengänge auch viele Fragen offen und ich bemängele da u.a. die primäre Einbindung von Studienergebniszusammenfassungen in Form der typischen Infografiken und die relativ kritiklose Wiedergabe der allgemeingültigen Erkenntnisse. Vielleicht bin ich auch zu kritisch, erkenne aber auch an, dass der Tantau-Artikel halt dessen Zielgruppe(n) nahezu perfekt abholt.

Genug der Textkritik und hin zur Tiefenanalyse.

Die Frage nach DEM perfekten Zeitpunkt einer Publikation kann natürlich Gegenstand extremster Grundsatzdiskussionen sein. Privat ist mir die Suche, die immerwährende und tiefergehende Suche nach DEM einen Zeitpunkt zwar wichtig, jedoch prägen entsprechende und extrem zeitraubende Aktivitäten nicht das tägliche Management der Accounts. Teilweise neige ich auch dazu, „bei Lust“ oder „bei Laune“ zu posten, weil eben abholbare Zielgruppen und deren Aktivitäten extrem schlecht kalkulierbar sind. Mal im Ernst: natürlich existieren Gedankenspiele zu Zeitfenster im Bereich der Mittagspause, der Frühstückspause, der sonstigen Pausen oder eben dem Feierabend. Das ist alles soweit logisch, nur sagt die Logik auch, dass man eben auch „nur“ im Nebel stochert, weil das Interaktionsverhalten auf Basis der „Erfahrungswerte“ oder „Beobachtungen“ schlichtweg unkalkulierbar bleibt.

Hausintern haben wir folgende Arbeitshypothesen aufgestellt bezüglich der Feststellbarkeit möglicher ‚idealer‘ Postzeitpunkte:

(a) Der ideale Postzeitraum ist ablesbar durch die Interaktionen NACH dem Posten.
(b) Der ideale Postzeitraum ist ablesbar durch aufkommende Trends und/oder Gesprächsthemen.
(c) Der ideale Postzeitraum ist ablesbar durch das Erfassen und Auswerten von Kommunikationen innerhalb von Filterblasen.

Die Rechercheansätze wurden hier
https://www.pontipix.de/instagram-tagsuche-tagbewertungen-und-tagbegutachtungen/
– Artikel zur Tagrecherche
– allgemeine Interpretationshinweise

und dort

https://www.pontipix.de/postzeitpunkte-bei-instagram/
– Grobskizzierung eines Auswertungsalgorithmus

beschrieben.

Fragen, Anregungen, Bemerkungen oder Anfragen? Gern per Kommentar, eMail oder Telefon.

Wie kann ich Trafficvolumina von völlig fremden Projekten analysieren? (Bit.ly-Variante)

Bei einem dieser szenetypischen Verkaufsvorträge aus dem Bereich „Influencer-Marketing“/“Social-Media-Marketing“ tauchte die Frage der Überprüfbarkeit(en) diverser Werthaltigkeitsprognosen auf. Während meiner Nachfragen und Gesprächsangebote wurde signalisiert, dass die Abgabe solcher Prognosen schwer sei und die Prognosen eher auf subjektiven Begriffen wie „zwischenmenschliche Kontakte zum Influencer“ und „Erfahrungen“ beruhen. Nun gebe ich mich mit Subjektivitäten nur ungern zufrieden und mache mich selbst auf die Suche nach Antworten.

Eine bei uns etablierte Prüfvariante basiert auf dem URL-Shortener „Bit.ly“ und dessen Analysevarianten, die offensichtlich vielen Dienstleister_innen / Analysebetreibenden gar nicht so bekannt sind.

Kurzer Zwischenabsatz: Was ist eigentlich ein URL-Shortener? Wikipedia schreibt dazu:

„Unter einem Kurz-URL-Dienst, engl. URL Shortener, versteht man einen Dienst, der für beliebige URLs existierender Webseiten eine zweite, alternative URL zur Verfügung stellt. Diese Alias-URL führt über eine HTTP-Weiterleitung zum Aufruf der ursprünglichen Webseite. Der auch short URL, URL alias oder Kurzlink genannte Alias besteht meist aus wenigen (ASCII-)Buchstaben oder Zahlen. Dies dient dazu, für unhandliche, große sowie problematische Sonderzeichen enthaltende URLs, kurze und unproblematische Aliase (besser zu merken, schneller einzugeben, …) bereitzustellen. Solche URLs finden sich vor allem bei Websites, die mit Datenbankvariablen operieren. Weit verbreitet ist die Nutzung von Kurz-URLs auch in Mikroblogging-Diensten und Status-Meldungen in sozialen Netzwerken, die beide nur eine begrenzte Anzahl von Zeichen pro Nachricht erlauben. Um die Weiterleitung von Kurzlinks anzuzeigen, ohne sie zu besuchen, können „Redirect Checker“ verwendet werden.“

(Quelle: https://de.wikipedia.org/wiki/Kurz-URL-Dienst)

Hier gibt es zwei Verfahren:

[Manuell]

Möchte man sich die Daten in einem schönen und logisch aufbereiteten Überblick anschauen, geht man so vor:
-> Schauen, ob ein Objekt mit einer Bit.ly-URL hinterlegt ist
-> Ergänzung der Bit.ly-URL mit einem „+“ und Übertrag in den Browser (Beispiel: https://bitly.com/2JJBUJC+)
Für erweiterte Daten (Ref, Land etc.) benötigt man einen Account auf Bit.ly, wo man nach Einloggen und Bestätigen an die gewünschten Informationen kommt.

[Technisch/Maschinell]

An der Stelle kommt der etwas kompliziertere Technikteil. Zur Erklärung: Nachfolgend zeige ich die interessanten Endpoints mit einer Durchnummerierung, welche wichtig für die Darstellung eines groben Algorithmuskonzeptes sein wird.

Um alle Funktionen nutzen zu können, benötigt die Anwenderin diesen Token. Den Code bekommt man, indem folgende Anleitung durchgeführt wird: „How do I find my OAuth access token?„. Nach der Tokenorganisation sollte man sich selbstverständlich mit den Abfragevolumina beschäftigen. Hier meine ich, dass 100 Abfragen je Minute ganz okay sind, jedoch definitiv nicht ausreichen, um bspw. gewaltige Systeme im Umfang von Zalando auch nur im Ansatz analysieren zu können. Das Problem löst man entspannt, indem man sich die gewünschte Menge an Accounts und Tokens besorgt. Die Tokens werden in einem solchen Fall in einer entsprechenden Liste gespeichert (Text, DB) und der Abfragealgorithmus „kann“ sich dort auch per Zufallsgenerator „bedienen“.

(1) [Basisfunktionen]
Ich nutze diese Endpoints gern für Gegenproben und allgemeine Recherchearbeiten.
https://api-ssl.bitly.com/v3/link/info?access_token=deintoken&link=bitlyurl
Die auslesbaren Informationen zeigen einen Fehlercode (bspw. Crawlingprobleme, „N/A“ usw.) und die Metriken „original_url“, „canonical_url“.

(2) [Auslesen der generierenden Accounts, „Encoders“]
https://api-ssl.bitly.com/v3/link/encoders?access_token=deintoken&link=bitlyurl
Die auslesbaren Informationen zeigen die Accounts, welche die analysierte URL bearbeitet/eingestellt hatten.

(3) [Auslesen der Querverweise inkl. Traffic]
Habe ich nun eine eindeutig identifizierbare URL vorliegen, interessiere ich mich selbstverständlich für die Beantwortung folgender Fragen:
(a) Wo befindet sich die aktive URL?
(b) Wieviel Traffic generiert die aktive URL über DEN identifizierten Linkspender?

Diese Informationen lassen sich über den folgenden „Endpoint“ Abrufen:
https://api-ssl.bitly.com/v3/link/referrers?access_token=deintoken&link=bitlyurl

Datenstruktur:
data->referrers[nr.]->referrer // -> Linkplatz
data->referrers[nr.]->click // -> Click über den Linkplatz

Eine alternative Variante ist über das Auslesen der verweisenden Domain machbar und logisch, sofern man sich nicht für den Deeplink innerhalb eines Projektes/einer Domain interessiert. Ich habe diesen Endpoint nie angebunden, weil primär die Unterseite der verweisenden Domain spannend ist
https://api-ssl.bitly.com/v3/link/referring_domains?access_token=deintoken&link=bitlyurl

(4)[Clickstatistiken, allgem.]
https://api-ssl.bitly.com/v3/link/clicks?access_token=deintoken&link=bitlyurl
Dieser Endpoint wirft nur die Clickanzahl zurück, die über den Link kommt.

(5)[Clickstatistiken, nach Ländern.]
https://api-ssl.bitly.com/v3/link/countries?access_token=deintoken&link=bitlyurl
Dieser Endpoint wirft nur die Clickanzahl zzgl. der Länder der Clickenden zurück. Hierbei handelt es sich um die Ländercodes. Diese müssten natürlich bei einer Softwareumsetzung in leicht verständliche Zeichenketten + Flaggen etc. umgewandelt werden.

Ein mögliches Umsetzungskonzept sieht so aus:
[1] Token besorgen
[2] Sitemap der Analyseprojekte besorgen UND zusammengefasste URLs extrahieren
[2.1] extrahierte URLs in geeignete Liste/Datenbank speichern
[2.2] Sitemapdownload/URLextract in eine Prozedure fassen
[3] Scraper
[3.1] Lade URL-Liste
[3.2]
for lfnr=0 to ende(URL_Liste) do
begin
//-> extrahiere Querverweise zzgl. Clicks
httpget+extract(3)
//-> extrahiere Clicks nach Ländern
httpget+extract(5)
end

Ich besprach u.a. dieses Konzept und eine konkrete Umsetzung 2015 beim Affiliatestammtisch (Leipzig) und ich bin mit der „hauseigenen“ Lösung soweit zufrieden.

Einige Performancedaten sind:

URL-Liste mit 100-5000 Einträgen
– Datenerfassungsdauer: ca. 1 Stunde

URL-Liste mit 5000-10.000 Einträgen
– Datenerfassungsdauer: ca. 1-2 Stunden

Die W&L-GbR-Lösung basiert derzeit (noch) auf die Datenspeicherung via CSV. Das liegt u.a. daran, dass ich erst sehr spät den Wert von „richtigen“ Datenbanken wie SQL & SQLite erkannt habe. Wie auch immer: Die Erfassung der o.g. Daten verlangt natürlich auch die Etablierung diverser Auswertungsansätze, weil man nicht aus purem „Selbstzweck“ diese Daten erfasst. Ich sehe folgende Szenarien, bei der die Bit.ly-Variante zum Einsatz kommen kann:

[Konkurrenzscreening]

Die typische „SEO-Denke“ geht (leider) immer davon aus, dass das Sichten via Datendienstleister (XOVI, Sistrix) und Backlinks/Backlinkstrukturen für die Marktbegutachtungsaktivitäten ausreicht. Das stimmt leider so nicht, denn diese Ansätze liefern keinerlei transparente Einblicke in mögliche Traffic- und Traffic-via-Zielgruppeninformationen. Hier rate ich schon seit 2011 zu einer projektbezogenen Einbindung einer „Nutzwertanalyse“. Die Analyse via Bit.ly-API kann bei dauerhaftem Monitoren komplexer Sitemaps eben genau aussagen, wann welche Trafficqualität über welche Social Media/Backlinks zum beobachteten Objekt kam und kommt.

[Influencermarketingbeurteilungen]
Bei dieser Variante kann man auf das umfangreiche Scrapen diverser Sitemaps verzichten und manuell die typischen Promotionslinks in den Scraper eintragen.
Ist die Erfassungsprozedure entsprechend konfiguriert, lassen sich VOR der Inanspruchname einer Influencermarketingagentur/Influenceraccounts Prognosen zu:
(a) Länderspezifische Trafficströme
(b) Clickstatistik/Zeiteinheit (Tag, Woche etc.)
(c) Weiterempfehlung des [Werbe]links, gezeigt durch „Streueffekt“
anstellen. Ich empfehle analog zu den allgemeinen Verkaufsargumenten der Sparte „Influencermarketing“ genau diese Gegenprüfvariante.

[Backlinkrecherchen und Backlinkaquise]

Diesen Ansatz hatte ich – zusammen mit Anne – bereits während den Arbeiten an den Projekten der Empora Fashion Group aufgestellt. Wenn man also bei schwierigen Projektlagen (damals: Mode, viele Produkte etc.) sich bewusst die Konkurrenz via Bit.ly-Analysen anschaut, lassen sich eben über den Ref-Endpoint plötzlich Linkspender identifizieren, welche durch die Zusammenführung mit den Clickzahlen Trafficvolumina versprechen können. Verlinkungen machen nur dann Sinn, wenn eben der gesetzte Link nicht primär im Sinne der „SEO-Denke“ wirkt, sondern Zielgruppen anspricht und via Gegenprobe auf Konkurrenzprojekte auch saubere Clickgestaltungen (Historie, Land etc.) quasi „verspricht“.

Weitere Gedanken, Ideen oder Austauschwunsch? Gerne via Kommentar, e-Mail oder Anfragen.

Wie kann ich interagierende Accounts mit Hilfe eines Instagrambugs auslesen?

In einer der letzten Vertriebs- und Verkaufsveranstaltung (Subthema: Erkennen und Bewerten von Accounts, Interaktionen usw.) wurde ich inspiriert, eine geeignete technische Lösung zu recherchieren, welche die Titelfrage beantwortet. Der Grund ist einfach: Durch die Beschneidung der Instagram-API ist die technische Erfassung o.g. Metriken schlichtweg nicht mehr möglich. Einen Ausweg bietet folgende Vorgehensweise:

[AbfrageURL]
https://www.instagram.com/[Accountname]/?__a=1

[Codekonzept]
lade_account_liste(datei,DB)
//-> Erfassen der Likenden
for l=0 to liste_ende do
begin
httpget(https://www.instagram.com/liste[l]/?__a=1
(1) extract(graphql->user->edge_owner_to_timeline_media->edges->[NrX]->node[X]->edge_media_preview_like->count)
(2) extract(graphql->user->edge_owner_to_timeline_media->edges->[NrX]->node[X]->edge_media_preview_like->edges->[NrY]->node[Y]->id)
(3) extract(graphql->user->edge_owner_to_timeline_media->edges->[NrX]->node[X]->edge_media_preview_like->edges->[NrY]->node[Y]->profile_pic_url)
(4) extract(graphql->user->edge_owner_to_timeline_media->edges->[NrX]->node[X]->edge_media_preview_like->edges->[NrY]->node[Y]->username)
end

[Erklärung]
„httpget“ = Ergebnis der Abfrage wird herunter geladen
„extract“ = Das Ergebnis der Abfrage wird nach der Variable durchsucht und die Inhalte werden im gewählten Format gespeichert.
„lade_account_liste“ = Die zu begutachtenden Accounts werden in Listenform (Textdatei, SQLTab etc.) in die Prozedur eingespielt.

Die Manuelle Sichtung der Ergebnisse kann man mit https://jsoneditoronline.org/ erledigen. Hier einfach die Abfrageurl https://www.instagram.com/[Accountname]/?__a=1 mit dem Accountnamen im Browser eintragen und das Resultat in den jsoneditor kopieren.

[Erklärung: Datensätze]
(1) Auslesen der aktuellen Likes als Zahl
(2) Auslesen des likenden Accounts in Form der InstagramID
(3) Auslesen der Profilbildurl des likenden Accounts
(4) Auslesen des likenden Accountnamens

[Fazit]
Ich bezeichne den begutachteten Erhebungsweg bewusst als „Bug“, da Instagram offziell das Erfassen dieser Datensätze im letzten API-Entwicklungsturnus geschlossen hatte. Nun mag man davon halten, was man möchte und ich sehe u.a. hier für mich den Beleg dafür, dass die geschlossenen Endpoints selbstverständlich nach wie vor aktiv sind. Vielleicht beschäftig sich Instagram mit der Bug-Bereinigung, vielleicht bleibt aber auch diese Abfragevariante „ewig“ offen. Die Sichtung des JSON-Codes zeigte mir, dass „leider“ nur eine begrenzte Anzahl an interagierenden Accounts auslesbar ist, aber auch dieses Problem lässt sich elegant über eine geeignete Timer-Variante lösen. Diese aktiviert im Prinzip im Sekundentakt den Scrapingvorgang und holt sich die gewünschten Datensätze ab, speichert und verarbeitet die Eintragungen. Hochfaszinierend ist in diesem Gedankenspiel die Metrik „Username“: Die Inhalte aus der Variable lassen sich in geeignete Listen übertragen und in das o.g. Grobkonzept einspielen. Über diesen Weg erfährt der wissensdurstige Dataminer alles aus dem Medienstream des Influenceraccounts / Accounts UND den Accounts, welche eben mit dem Hauptanalyseobjekt interagieren.

Hier setzt bei mir das kritische und hinterfragende Nachdenken an:
Welchen Wert haben umfangreiche Datenschutzerklärungen, wenn bspw. Social Media problemlos recherchierbare Lücken für die Datenerhebungen offen lassen?
Welchen Wert haben offzielle Ankündigungen und Umsetzungen zu API-Änderungen, gerade aus dem FB-Haus in Verbindung mit Cambridge Analytica?
Welchen Wert haben Äußerungen aus dem Hause Facebook bzgl. der Kontrolle der Datenzugriffe von Externen, wenn (a) dieser „Bug“ identifizierbar und (b) nutzbar ist?

Ich muss gestehen, dass ich einen gewaltigen Nutzen in diesen Datenerhebungsvarianten sehe. Natürlich habe ich über die Nutzbarmachung im Interesse der Wobus & Lehmann GbR nachgedacht, bin aber letztendlich davon abgekommen, weil mir derzeit kein sauberes Anonymisierungsverfahren bekannt ist. Ich finde es schade, dass die Influencer-Marketing-Agenturszene schweigt und keinerlei Analysen, Statements oder generell Worte zu dieser Datenproblematik veröffentlicht.

Influencermarketing, Instagram und das (lästige) Problem der suboptimalen Followerzahlen?

Ich glaube, dass die Leser_innen des Arbeitsblogs mit extrem hoher Wahrscheinlichkeit meine enorme Skepsis gegenüber der „offziellen“ Strategie des Influencermarketings verstanden haben und ich denke, dass ich etwas mehr Erklärung schuldig bin. Es ist eigentlich einfach und bei Sichtung der Kritiken (also … nicht nur meine) tauchen immer wieder Argumente rund um die einkaufbaren Follower auf und hier vertrete ich nun einmal den Ansatz, dass man die Strategie „Influencermarketing“ eben wegen der massiven Kritiken nicht auf Basis der Subjektivitäten „Erfahrung“ oder „Zwischenmenschlichkeit“ beurteilen muss, sondern man MUSS diesen Ansatz eben auch mit Hintergrundwissen zu den Einflussfaktoren / „alternativen“ Strategien jedes Mal neu bewerten (also: je Szenarium, je Projekt, je Kund_in usw.).

Nun ist eine spannende Problemquelle beim Instagrambasierten Influencermarketing eben die Frage, ob die einkaufbare Reichweite (hier: Follower) auch tatsächlich „real“ ist. Ich wundere mich immer wieder, wie selten eben diese unfassbar spannende Problematik so selten und so unbefriedigend diskutiert wird, obwohl gefühlt einige 1000 Anbieter mit entsprechenden Kaufangeboten auf dem Markt völlig problemlos recherchierbar sind. Es gehört für mich zum Tagesgeschäft dazu, die Konkurrenz zu beobachten, welche eben diese spezielle Marketingform anbietet und natürlich entdecke ich da viele Blogbeiträge und Erfahrungsberichte zu wahnsinnig emotional ausgeschmückten Worstcase-Szenarien und ich mache mir da immer einen Spaß und frage nach konkreten Erfahrungen. Sprich: man kann in der hochintellektuellen Sparte „Marketing“ ja schlichtweg nur zu Dingen Formulierungen tätigen, von denen man schlichtweg auch etwas versteht und hierzu gehört auch das Durchspielen von Experimenten und NICHT (!) das kritiklose Wiederholen von nicht nachprüfbaren Experimenten der Werbeszene. Man sollte schon im Interesse der Sichtung dieser einkaufbaren Follower sich um das Erwirtschaften eigener (!) Erfahrungen bemühen.

Eines davon erledigte ich vor geraumer Zeit mit einem extra aufgesetzten Instagramaccount und hier ging ich so vor:
[1] Recherche bei Google
https://www.google.de/search?q=buy+instagram+followers+cheap
(„cheap“ deswegen, weil ich kein Interesse am Verspielen von Geld hatte.)
Im Rahmen des ersten Grobchecks entdeckte ich, dass die vielen Anbieter sich „beweisen“ wollen und man bietet potentiellen Kund_innen eben auch Testpakete – natürlich – kostenfrei an.

[2] Recherche bei Google, nach kostenlosen Followertestpaketen
https://www.google.de/search?q=buy+instagram+followers+free+trial
https://www.google.de/search?q=10+free+instagram+followers+trial
https://www.google.de/search?q=50+free+instagram+followers+trial
https://www.google.de/search?q=20+free+instagram+likes

Ich sehe nun einen bunten und wunderschön ausgeschmückten Laden mit sehr vielen interessanten Angeboten und weil mir hier der moralische Zeigefinger (oder besser: der basislose moralische Zeigefinger) keine Freude bereitet, experimentierte ich mit den folgenden Angeboten ein wenig herum:

[Pro Forma – Hinweis]
Ich übernehme keine Verantwortung, wenn die Benutzung der nachfolgenden Angebote nicht die gewünschten Effekte produziert.

http://www.buzzdayz.com/free-instagram-follower-trial/
https://www.quickfansandlikes.com/
http://www.gramozo.com/free-trial/
https://www.getmassfollowers.co.uk/
http://buyhugefollowers.co.uk/
http://www.thebestfollowers.co.uk/
https://instalegendary.com/
https://soclikes.com/
https://getmoreinsta.com/index.php?page=addfreefollowers

Eine besonders interessanter Anbieter ist:
https://plusmein.com/index.php?page=addfreefollowers
Dieser erlaubt das Einbuchen von jeweils 20 Follower je 24 Stunden und damit kann der Experimentalaccount über einen schönen Zeitraum hinweg „wachsen“. Eine „Runde“ des Testaccounts durch diese Liste „erntete“ zwischen 250 und 300 relativ stabile Follower.

Ein paar Worte zur Bewertung der zusammengeschnorrten Follower.
Ich habe hier eher „gemischte“ Gefühle zur Qualität: ich sehe klischeehafte Fakeaccounts (also: junge Frau, extrem viele Abos, wenig Follows, keine|wenig Medien) und ich sehe natürlich auch sehr natürlich wirkende Accounts und das lässt mich fragen, woher diese Anbieter denn die vermittelbaren Accounts überhaupt nehmen und ein wenig Recherche ergab, dass die meisten Quellen sich auf das Interaktionen – gegen Coin – System beziehen. Interessant ist der Anbieter „plusmein.com“, denn hier entdeckte ich in den ersten Testläufen durchaus auch neue Follower, deren Daten und Medien dem typischen Bild des einkaufbaren Influencers entsprechen.
Ganz ehrlich: ich habe keine Ahnung, wie dieser Anbieter arbeitet und woher die Accounts stammen und im Moment theoretisiere ich in Richtung „Engagement Gruppe“, wobei das natürlich nicht final verifizierbar sein dürfte. Obwohl die Qualitäten wechselhafter Natur sein können, sehe ich auch, dass der Schwundfaktor im – sagen wir mal – „natürlichen“ Rahmen bleibt, wobei ich auch sehe, dass die Interaktionen da, wenn auch äußerst gering sind.
Komme ich nun zur moralischen Einordnung und hier vertrete ich – wie erwähnt – eine eher pragmatische Sichtweise, gerade deswegen, weil die Einordnung der Followerlisten in Fake / Non-Fake sehr schwierig ist. Natürlich existieren sehr viele Indikatoren für eben „schwierige“ Ansätze innerhalb einer Accountstruktur und diese sind Ungleichgewichte in den Zahlen, komische Kommentare, aber mal ganz ehrlich: es gibt durchaus Menschen, die wie die Irren unfassbar vielen anderen Menschen folgen, dann gibt es Accounts, die ohne Verantwortung oder „Zutun“ eben Ziel von Spamcommentattacken werden. Mir passiert sowas ständig, den Kund_innen ebenfalls und ich sehe da immer wieder automatisch generierte Comments aus eben auch der Feder deutscher Accounts aus der Berater_innenszene, der Socialmediaberater_innen und selbstverständlich auch völlig normale Firmen. Das hängt auch damit zusammen, dass viele eben diese Werkzeuge wie „Ninjagram“ verwenden und die Hoffnung hegen, dass abgesetzte Kommentare Aufmerksamkeit erzeugen.
Also: „Fakes“ sind definitiv nicht sauber und extrem eindeutig identifizierbar und das gilt auch für den Kauf oder das oben beschriebene Zusammenschnorren. Also quält mich eine Frage: Wieso existieren stark moralisierende Argumente rund um ein nicht nachprüfbares Thema? Ich erkenne keinerlei Logik in der eigenen Geschäfts- und Dienstleistungsaufwertung, wenn nicht überprüfbare Followerlisten als pauschal „sauber“ deklariert werden und das via Behauptung schlichtweg „nur“ in den Raum gestellt wird.

Ob nun diese Positionierungsvariante edel, gut, moralisch einwandfrei oder sogar „praktikabel“ ist, muss und soll jeder Mensch für sich selbst entscheiden. Mir steht das Erheben des moralischen Zeigefingers nicht zu, würde aber das eventuelle Einsatzszenarium immer wieder neu bewerten und während eines eventuellen Schnorrens / Einkaufens unbedingt auf folgende Dinge achten:

(1) Absolut saubere Contentqualität.
(2) Klare, deutliche und zielgruppengenaue Kommunikation.
(3) Natürliche Marketingmaßnahmen

Fragen, Gedanken, Hinweise? Gern über Kommentar oder via Telefonat. Ich suche übrigens tatsächlich händeringend nach einem sauberen Followerlistenauswertungsalgorithmus.