Wie erhalte ich eine Liste der heruntergeladenen Apps (kostenpflichtig / kostenlos) eines Nutzers von Google Play?

121

Ich bin kürzlich auf diese App " Apps kaufen" gestoßen , mit der ich Apps abrufen kann, für die ich in Google Play bezahlt habe, nachdem ich mich mit meinem Google-Konto angemeldet habe.

Ich versuche herauszufinden, wie es gemacht wird, da ich eine ähnliche App erstellen möchte, aber für die kostenlosen Apps, die heruntergeladen wurden.

Ich kann jedoch nicht finden, welcher OAuth-API-Bereich zum Abrufen dieser Informationen verwendet wurde, selbst nachdem ich die gesamte Liste der APIs durchgesehen habe .

Google Melden Sie sich an und fragen Sie nach dem Zugriff auf den Android-Markt


BEARBEITEN: Ich lege ein neues Kopfgeld auf diese Frage, wie aus einer ähnlichen Frage hervorgeht, die ich hier gestellt habe , und weil ich hier und da keine wirkliche Antwort darauf sehe, wie es geht und was getan werden kann damit.

Ich möchte die Fragen in mehrere Teile zerlegen:

  1. Mit welcher API können Informationen zu gekauften Apps abgerufen werden? Wo kann ich darüber lesen? Bitte zeigen Sie ein vollständiges, funktionierendes Beispiel dafür.

  2. Kann es mehr? Vielleicht suchen? Vielleicht kostenlose Apps anzeigen, die installiert wurden? Vielleicht die Zeit, als sie installiert und deinstalliert wurden? Und die Kategorien dieser Apps?

  3. Gibt es spezielle Anforderungen für die Verwendung dieser API?


BEARBEITEN: Ich lege ein maximales Kopfgeld darauf, denn egal wie viel ich gelesen und versucht habe, ich habe immer noch keinen POC erstellt, der die Apps aus dem Play Store abfragen kann, die der Benutzer jemals heruntergeladen hat (Name, Paket) Name, Datum der Installation und / oder Entfernung, Symbol-URL, Preis ...), einschließlich kostenpflichtiger und kostenloser Apps.

Wenn jemand ein funktionierendes Beispiel findet, zeigen Sie, wie es gemacht wird und wie Sie es gefunden haben (Dokumentation oder alles, was Sie zur Lösung geführt hat). Ich kann es nirgendwo finden und die aktuellen Lösungen hier sind zu vage, als dass ich damit anfangen könnte.

abhiank
quelle
Versuchen Sie dieses Repository github.com/googlesamples/android-play-publisher-api/tree/master/…
Webserveis
Ich würde mir den Beispiel-App-Launcher ansehen. Es weiß, welche Apps auf das Telefon heruntergeladen werden.
danny117
@ Android Entwickler: Ich habe APK- Purchase AppsDatei durch Dekompilierung analysiert . Es wurde nie eine API verwendet, um eine Liste der gekauften Apps abzurufen. Sein Ansatz ist der gleiche wie der, der den HTML-Inhalt der Play Store-Webseite analysiert. Hier ist ein Fragment dieses Codes: hastebin.com/uceyavurij.js
Aminographie
@aminography Wie kommt es also für den Benutzer? Schließlich müssen Daten des Google-Kontos des Benutzers abgerufen werden. Es reicht nicht aus, nur auf die Play Store-Apps zuzugreifen. Was macht es mit den ihm erteilten Berechtigungen?
Android-Entwickler
@androiddeveloper: Alle Informationen, die von bereitgestellt werden, Purchased Appskönnen aus dem Playstore-Webinhalt abgerufen werden. Leider habe ich keinen Zugriff, um eine App von Google Play zu kaufen. Wenn Sie mir ein Konto mit einer gekauften App freigeben, kann ich einen Beispielcode für Sie entwickeln.
Aminographie

Antworten:

51

Problem ist behoben. Der Exploit wurde geschlossen.

Wir werden diesen Fehler schließen, da wir in einer Vorschau-Version von Android angemeldet sind. Wenn das Problem in der neuesten öffentlichen Version (Android Q) immer noch relevant und reproduzierbar ist, erfassen Sie bitte einen Fehlerbericht und protokollieren Sie den Fehler unter https://source.android.com/setup/contribute/report-bugs . Wenn innerhalb der nächsten 14 Tage keine Antwort eingeht, wird dieses Problem geschlossen. Danke für Ihr Verständnis.


Neuestes Update:

Dies ist ein Fehler, den Google im nächsten Update beheben wird.

Wir haben dieses Problem zur Prüfung in einer zukünftigen Version verschoben. Vielen Dank für Ihre Zeit, um Android besser zu machen


Diese Antwort hat sich zu einem Konglomerat von Ideen entwickelt und wurde bearbeitet, um Informationen aus der Diskussion in die Kommentare aufzunehmen.

Die androidmarketAPI wäre eine angepasste API, die vom Entwickler geschrieben wurde. Es ist nicht für die Öffentlichkeit zugänglich.

Um Ihre Bedenken in den Kommentaren anzusprechen. Der Entwickler hätte die aktuellen APIs verwendet, die über Android Developer und Google verfügbar sind, um ein Projekt zu erstellen, das all diese verwaltet.

Was den Zugriff betrifft Full Account Access, bin ich mir nicht sicher, wie genau diese Entwickler dies erreicht haben.

Ich würde empfehlen, den AccountManager zu verwenden , der Teil von android.accounts ist und Zugriff auf Anmeldeinformationen und eine Methode getUserData hat . Der Account Manager hat Zugriff auf Passwörter und kann Konten erstellen und löschen. Dies wird möglicherweise mit dem Inhaltsanbieter verwendet

Siehe Udinic / SyncAdapter-Authentifizierung .

Um auf Ihren Kommentar zu antworten:

Dieser Blog soll Ihnen den Einstieg erleichtern. Schreiben Sie Ihren eigenen Android Authenticator .


Wie diese Apps tatsächlich funktionieren, kann ich Ihnen nicht sagen. Sie können auch unterschiedliche Implementierungen haben (es sei denn, sie sind eine Zusammenarbeit hinter den Kulissen, sie werden mit Sicherheit unterschiedlich sein).

Eine Vermutung. Verwenden Sie zunächst GoogleSignInAccount mit com.google.android.gms.auth.api.signin .

Es gibt eine Definition für den Umfang , um den Umfang der Berechtigungen zu bestimmen, die der App erteilt werden.

Mit requestScopes () kann der

public static final String PROFILE

... / Damit kann Ihre Web-App auf drahtlose Android-App-Installationen zugreifen.

Zum Beispiel :

GoogleSignInOptions gso =
        new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail().
            .requestScopes(new Scope("https://www.googleapis.com/auth/contacts.readonly"))
            .build();

Wenn der vollständige Zugriff möglich ist, kann eine Liste aller vom Kontoinhaber verwendeten Apps gefunden und mit den Geräten auf dem Gerät verglichen werden.

Der Paketmanager ruft eine Liste aller derzeit auf dem Gerät installierten Apps ab.
PackageInfo enthält die Details zur App.
INSTALL_REASON_USER filtert auch Apps heraus, die vom Benutzer aktiv installiert wurden.

Vielleicht möchten Sie sich com.google.firebase.appindexing ansehen und Benutzeraktionen protokollieren . Verschiedene Aktionen können verfolgt werden.

Der Kontoverlauf des Benutzers finden Sie unter https://myactivity.google.com/myactivity .

Ein hilfreicher Link ist der OAuth 2.0-Spielplatz .


Dieses Github-Repo Node-Google-Play unter Verwendung von Node ist aktuell und ruft Google Play-APIs auf. Ebenso wie das Archiv, das als "inoffizielle" API, Android-Market-API , verwendet wurde, um den Marktplatz abzufragen.


App 1

Die App behauptet , die folgenden Berechtigungen zu verwenden:

Version 2.1.8 kann auf Folgendes zugreifen:
$ In-App-Käufe

Andere

  • Daten aus dem Internet empfangen
  • Netzwerkverbindungen anzeigen
  • vollständiger Netzwerkzugriff
  • Verwenden Sie Konten auf dem Gerät
  • verhindern, dass das Gerät schläft
  • Lesen Sie die Google-Dienstkonfiguration

Bemerkenswerterweise legt die App bei einer einfachen Installation keine Berechtigungen fest. Ich konnte keine der Funktionen nutzen, da ich keine kostenpflichtigen Apps habe. Für die erste Suche waren also keine Berechtigungen erforderlich, was darauf hindeuten würde, dass die App keinen Zugriff auf mein Konto hatte.

Ich habe die Berechtigungen überprüft - es wurden keine festgelegt. Das einzige, was erforderlich war, war das Akzeptieren des Popups, wie in Ihrer Frage angezeigt.


App 2

Die andere App, auf die Sie sich beziehen und die dasselbe tut, ist offener darüber, auf was zugegriffen wird.

Meine bezahlten Apps

SICHERHEITS- / DATENSCHUTZHINWEIS Wenn
Sie diese App zum ersten Mal ausführen, werden Sie um die vollständige Erlaubnis für Ihr Google-Konto gebeten . Dies ist leider die einzige Möglichkeit, auf die erforderlichen Informationen zuzugreifen. Es werden keine persönlichen Informationen gespeichert, keine Informationen über Ihre Apps werden an den Entwickler dieser App weitergegeben oder an Dritte weitergegeben. Alles wird nur auf Ihrem Telefon gespeichert.


Ich habe diese Apps in diesem Blog-Beitrag , der für ein Universitäts-Schlusssteinprojekt war (kein Geldgewinn), ausführlich beschrieben . Ich bin geneigt zu glauben, dass dies ein Exploit in der API und kein Status von Google ist, da es keine API-Aufrufe gibt, um Käufe von anderen Apps als der eigenen App des Entwicklers abzurufen. Ich gehe davon aus, dass es sich um einen Zero-Day-Exploit handelt. In diesem Fall gibt es keine legitime Möglichkeit, auf diese Informationen zuzugreifen.


quelle
10

Bei einer dieser Anwendungen (My Paid Apps) ist es nach Überprüfung des Netzwerkverkehrs ziemlich offensichtlich, dass die Kontoseite des Stores zum Abrufen der Liste der bezahlten Anwendungen verwendet wird. Der verwendete Mechanismus ist derselbe, der derzeit von Google Chrome und Pokemon GO verwendet wird, angeblich zu einem bestimmten Zeitpunkt.

Kurz gesagt, gehen Sie dazu wie folgt vor:

  1. Anmelden : Das erwähnte Programm meldet den Benutzer im ersten Schritt an und erhält Zugriff auf das Zugriffstoken des Benutzers. Dazu wird die android.accounts.AccountManager.getAuthToken()Methode verwendet. (Weitere Informationen : AccountManager ) Der Token-Bereich wird oauth2:https://www.google.com/accounts/OAuthLoginjedoch angefordert. Es kann wichtig sein zu beachten, dass dieser Bereich basierend auf der OAth2-Dokumentation von Google nicht gültig ist. Es scheint jedoch ein gültiger Bereich für Google OAuth v1 zu sein.

  2. Konvertieren des neu abgerufenen Zugriffstokens in einubertoken : Nun, was eigentlich ubertokenzu tun ist, ist unbekannt und es gibt keine offizielle Dokumentation darüber. Es wurde jedoch in freier Wildbahn gesehen, dass es vom Chrome-Browser zum Anmelden von Benutzern verwendet wird. Dies erfolgt durch Anfordern der https://accounts.google.com/OAuthLogin?source=ChromiumBrowser&issueuberauth=1Seite.

  3. Konvertieren ubertokenin eine Website-Sitzung : Später können Sie mithilfe des neu erstellten ubertokeneine Website-Sitzung über den https://accounts.google.com/MergeSessionAPI-Endpunkt abrufen. Nach diesem Schritt kann die Anwendung im Wesentlichen alle persönlichen Seiten laden, die Sie mit Ihrem Browser öffnen können, während Sie angemeldet sind. mit Ausnahme einiger spezieller Seiten, einschließlich Zahlungseinstellungen.

  4. Abrufen der Liste der kostenpflichtigen Anwendungen: Anfordern und Analysieren der https://play.google.com/store/accountSeite.

Es folgt der Datenverkehr der Anwendung, der von ' Packet Capture ' erfasst wird :

Erfasster Verkehr

Da es auf dem Bild deutlich zu sehen ist, ist das Endergebnis identisch mit dem, was ich erhalte, wenn ich normalerweise die Kontoseite des Geschäfts auf meinem PC mit Chrome Desktop öffne: Chrome-Ansichtsquelle

Randnotiz :

Es scheint, dass keiner dieser Endpunkte dokumentiert ist, da sie hauptsächlich von Googles eigenen Programmen verwendet werden und als intern betrachtet werden sollten. Daher empfehle ich dringend, sie nicht in Programmen oder Codes zu verwenden, von denen Sie erwarten, dass sie längere Zeit oder in einer Produktionsumgebung ausgeführt werden. Auch hier gibt es schlechte Nachrichten für Sie. Es scheint, dass auf der Kontoseite von Google Play nur kostenpflichtige Anwendungen oder spezielle kostenlose Apps (insbesondere OEM-Apps) aufgeführt sind. Ich werde versuchen, etwas Zeit zu finden und tiefer in die andere Anwendung einzutauchen.

Interessante Artikel :

Pokemon-Token

Ausnutzen der OAuth2-Token von Google Chrome

Soroush Falahati
quelle
1
Können Sie bitte ein vollständiges Beispiel zeigen, um zu sehen, wie es funktioniert, und die Fragen beantworten, die ich gestellt habe? Während ich schrieb, möchte ich verschiedene Informationen zu jeder App erhalten: Preis, beim Kauf usw. Ist es auch möglich, die Liste der kostenlosen Apps abzurufen?
Android-Entwickler
3

Wenn Sie Root-Zugriff haben, können Sie darauf zugreifen /data/data/com.android.vending/databases/library.db

OnePlus3T:/data/data/com.android.vending/databases
-rw-rw---- 1 u0_a2 u0_a2 229376 2018-12-26 18:01 library.db

Diese Datenbank enthält alle Informationen, welche App Sie heruntergeladen haben, welche Apps Sie gekauft haben und sogar in welcher App Sie sie erstellt haben IAP.

Überprüfen Sie die Besitzertabelle. Sie enthält alle Informationen.

ownership (account STRING, library_id STRING, backend INTEGER, doc_id STRING, doc_type INTEGER, offer_type INTEGER, document_hash INTEGER, subs_valid_until_time INTEGER, app_certificate_hash STRING, app_refund_pre_delivery_endtime_ms INTEGER, app_refund_post_delivery_window_ms INTEGER, subs_auto_renewing INTEGER, subs_initiation_time INTEGER, subs_trial_until_time INTEGER, inapp_purchase_data STRING, inapp_signature STRING, preordered INTEGER, owned_via_license INTEGER, shared_by_me INTEGER, sharer_gaia_id TEXT, shareability INTEGER, purchase_time INTEGER, PRIMARY KEY (account, library_id, backend, doc_id, doc_type, offer_type))
nkalra0123
quelle
1

Der Umgang mit inoffiziellen Google-APIs ist unglaublich kompliziert. Es wird möglich sein, dies zum Laufen zu bringen, aber das ist alles, was ich sagen werde. Fahren Sie auf eigenes Risiko fort.

Als erstes müssen Sie ein Google Play-Authentifizierungstoken erwerben . Dies kann auf verschiedene Arten erfolgen. In gekauften Apps wird jedoch folgendermaßen vorgegangen:

public static String getAuthToken(Activity activity, String userEmail) {

    AccountManager accountManager = AccountManager.get(activity);
    Account userAccount = new Account(userEmail, "com.google");

    Bundle options = new Bundle();
    options.putBoolean("suppressProgressScreen", true);

    String token;

    try {
      Bundle result = accountManager
        .getAuthToken(userAccount, "androidmarket", options, activity, null, null)
        .getResult();
      token = result.getString("authtoken");
    } catch (OperationCanceledException e) {
      Log.d(TAG, "Login canceled by user");
      return null;
    } catch (IOException | AuthenticatorException e) {
      Log.e(TAG, "Login failed", e);
      return null;
    }

    return token;
}

Ein paar Dinge, die Sie hier beachten sollten:

  • Der obige Code muss asynchron ausgeführt werden . Ich empfehle RxJava, aber eine AsyncTask wird funktionieren.
  • Sie müssen eine E-Mail für das Konto angeben, das Sie verwenden möchten. Ich überlasse die Details Ihnen, aber dies ist ziemlich einfach zu bedienen AccountManager.

Nachdem Sie über ein Authentifizierungstoken verfügen, können Sie jetzt auf jeden Google Play Store-Endpunkt zugreifen . Die wichtigste, die von gekauften Apps verwendet wird, ist https://android.clients.google.com/fdfe/purchaseHistory. Eine andere, die Sie interessieren könnte, ist https://android.clients.google.com/fdfe/details?doc=(package name)(aus APKfetch-Code ). Hier ist eine Seite mit mehr und mehr Analysen. Wenn Sie eine Anfrage an diese APIs stellen, müssen Sie mehrere Header angeben:

  • Authorization - - "GoogleLogin auth=(your auth token)"
  • User-Agent - - "Android-Finsky/6.4.12.C-all%20%5B0%5D%202744941 (api=3,versionCode=80641200,sdk=" + VERSION.SDK_INT + ",isWideScreen=0)";
  • X-DFE-Device-Id- die Google Services Framework-ID Ihres Geräts, die Sie von AdvertisingIdClient erhalten haben .
  • X-DFE-Client-Id - - "am-android-google"
  • Accept-Language- Der Sprachcode des Geräts, z "en".

Jetzt müssen Sie die Antwort analysieren . Hier wird es schwierig. Diese APIs geben eine Nachricht zurück, die als Protobuf codiert ist. Es handelt sich also im Wesentlichen nur um Binärdaten, es sei denn, Sie haben ein Schema (das natürlich nur Google hat). Eine Möglichkeit, dies theoretisch zu erreichen, besteht darin, die Google Play Store-App zu dekompilieren und die generierten Protobuf-Modelle mit einem Tool wie JADX wiederzuverwenden .

Leider habe ich das versucht und es funktioniert nicht wirklich. Protobuf-Modellklassen sind für einen Standarddekompilierer einfach zu komplex. Was Sie verwenden können, ist ein Tool namens PBTK . Idealerweise sollten Sie dies im Google Play Store 6.1.12 APK ausführen, da dies die letzte Version ist, bevor ProGuard verwendet wird. Beachten Sie, dass dieses Programm zwei Fehler in seinem Skript enthält, die vor dem Ausführen behoben werden müssen: Ändern 'extracto'in 'extractor'in gui.py und Entfernen der Assertion-Anweisung in Zeile 500 von jar_extract.py .

Das sollte nun alle Antwortklassen als .proto-Dateien ausgeben. Erstellen Sie einen Ordner unter src / main mit dem Namen protound ziehen Sie das gesamte generierte 'com'-Verzeichnis dorthin. Sie können alles löschen, was nicht unter ist com/google/android/finsky/protos. Befolgen Sie die Anweisungen online, um Gradle mit dem Protobuf Lite-Plugin einzurichten.

Wenn Sie eine Antwort analysieren möchten, können Sie die ResponseWrapper-Klasse verwenden, da sie alle darunter enthalten zu sein scheinen.

Das ist ungefähr so ​​weit ich dich bringen kann. Es besteht eine gute Chance, dass ich einen Teil davon falsch verstanden habe. JADX ist hier Ihr bester Freund, denn der beste Weg, um herauszufinden, was eine App tut, besteht darin, sich den Code anzusehen. Hoffe das hilft und viel Spaß beim Entwickeln!

qualverse
quelle
Sind AccountManagerSie sicher, dass es noch verfügbar ist? Ich denke, heutzutage bietet Google nur die Option zur Verwendung AccountPicker(wie hier: stackoverflow.com/a/26888259/878126 ). Aber wie mache ich den Rest? Hast du es getestet? Hat es bei dir funktioniert? Bitte teilen Sie den Code dafür. Deshalb habe ich ein Kopfgeld festgelegt, damit es in Aktion funktioniert ...
Android-Entwickler
Ja, AccountPicker ist eigentlich eine bessere Idee. Und ja, ich habe den Code zum Abrufen eines Tokens ausprobiert und er funktioniert hervorragend. Ich habe den Rest nicht ausprobiert, weil das mindestens 5 Stunden Arbeit sind, wenn alles reibungslos läuft. Selbst ein Kopfgeld von 500 ist das nicht wert.
Qualverse
1
Hier ist der vollständige Code, um ein Authentifizierungstoken zu erhalten (es funktioniert genau wie in Ihrem Screenshot gekaufte Apps): github.com/ethanblake4/PlayStoreDemo
qualverse
Das Erhalten des Auth-Tokens scheint gut zu funktionieren. Aber der schwierige Teil, den ich denke, ist das Abrufen der Apps selbst :(
Android-Entwickler
Ja, das ist der Teil, der leider viel Arbeit kostet. Ich habe jedoch den Code für gekaufte Apps dekompiliert und so wird es dort gemacht. Bitte lassen Sie mich wissen, wenn Sie Hilfe bei den oben genannten Schritten benötigen.
Qualverse
-2

Sie können den Paketnamen aller auf dem Gerät installierten Apps abrufen und dann die Informationen zu jedem installierten Paket, das Sie auf dem Gerät finden, von Google Play abrufen, ohne das Benutzerkonto aufrufen zu müssen. Es gibt einige Drittanbieter oder inoffizielle APIs, die Google Play Apps-Details als json abrufen, indem sie den Namen des App-Pakets abrufen. Beispiel: https://42matters.com/ Verwenden Sie dann die empfangenen Informationen für jedes Paket, um kostenlose zu finden.

Bahman
quelle
Nein, die Frage, die ich gestellt habe, betrifft Apps, die der Benutzer jemals installiert hat, und nicht nur die, die jetzt installiert sind. Auch warum inoffiziell verwenden, wenn es einen offiziellen Weg gibt ...
Android-Entwickler
@androiddeveloper Ich denke, es gibt keine offizielle API, um App-Details zu erhalten, indem der Paketname in Google Play abgerufen wird. Gibt es eine offizielle API?
Bahman
@androiddeveloper behält Google den Namen der deinstallierten kostenlosen Apps für jeden Nutzer?
Bahman
Ja. Wenn Sie die Play Store-App öffnen, gehen Sie zur Navigationsleiste und dann zu "Meine Apps und Spiele". Dort sehen Sie alle Apps, die Sie jemals von dort installiert haben, und nicht nur die derzeit installierten. Und laut Google ist es erlaubt (oder zumindest scheint es so zu sein), diese API zu verwenden: issuetracker.google.com/issues/79195087 . Oder wer auch immer mit mir gesprochen hat, weiß nicht, was dort vor sich geht ...
Android-Entwickler
-2

Ich habe zwei Ressourcen für Sie zu berücksichtigen, aber zuerst, mit einem Wort, nein. Es gibt keine API von GOOGLE, mit der Sie tun können, was Sie möchten, da diese Metriken nicht im Telefon gespeichert sind, sich auf den Google Play Store-Servern befinden und Google keine OFFIZIELLE API für den Play Store hat. Sie können jedoch einige Informationen von diesen beiden Websites abrufen:

https://www.quora.com/Is-there-an-API-for-the-Google-Play-Store Geben Sie hier die Linkbeschreibung ein

/android/162146/how-to-see-all-the-apps-i-have-downloaded-from-google-play-store

und dies ist genug, um zu sehen, wie dies erreicht werden kann.

Erstens kann eine Liste der Apps, die von einem Konto heruntergeladen wurden, nur vom Konto abgerufen werden. und dies kann über den Play Store erfolgen. Da Ihre App auf dem Telefon des Benutzers installiert wird, spielt dies keine Rolle ... Sie sind dabei.

Zweitens benötigen Sie eine Drittanbieter-API, die für den GOOGLE PLAY STORE erstellt wurde. Es gibt einige, überprüfen Sie den ersten Link.

Mit der API Ihrer Wahl senden Sie eine Get-Anfrage an den Play Store. Im Gegenzug sollten Sie in den meisten Fällen ein JSON-Objekt zum Deserialisieren erhalten.

Deserialisieren Sie das Objekt, und Sie haben Ihre Liste. Welche Liste Sie erhalten, hängt vom verwendeten Endpunkt ab. Dies sollte jedoch durch / in der API selbst erklärt werden.

Viel Glück!

PrinceOfRavens
quelle
In allen Links dort sehe ich keinen, der eine Liste der Apps abruft, die vom aktuellen Benutzer installiert wurden. Sie haben nicht einmal eine Anmeldephase. Alle sammeln allgemeine Informationen zu Apps, unabhängig davon, ob der Benutzer sie installiert hat oder nicht.
Android-Entwickler