Esiste un modo per visualizzare la cronologia delle notifiche del browser Chrome?


57

Ricevo le notifiche di Chrome da diversi siti Web e funzionano quando non ho nemmeno alcuna scheda aperta per quei siti.

Ma a volte ricevo queste notifiche di Chrome quando non sono alla mia scrivania o non guardo il mio laptop.

Poiché alcune di queste notifiche sono utili per me, vorrei poter accedere a tutte quelle che mi sono perso.

C'è un modo per visualizzare la cronologia delle notifiche?


1
Non sembra. Guardando questo post ( theverge.com/2015/10/14/9531133/… ), hanno riorganizzato la loro politica di notifica e rimossa dal desktop per inserirla in singole pagine web. L'unica cosa per accedere alle nuove notifiche è fare clic sul campanello su una pagina di Google.
Terry,


L'unico posto in cui ho trovato le notifiche come elenco è se il sito Web che le attiva li ha tramite il loro sito Web. Chrome non sembra raccoglierli in qualcosa del genere chrome://notificationse non arrivano al sistema operativo.
Jason Lydon il

Accetta la risposta valida @paradroid
Satheesh,

Risposte:


31

Se hai un Mac, c'è un modo! 😄

Ecco come appare l'elenco delle notifiche:

Ecco come apparirebbe l'elenco delle notifiche.

Tutto quello che devi fare è:

1. In Chrome, vai a:

chrome://flags/

2. Cerca:

Enable native notifications. Mac

3. Abilitalo, riavvia Chrome, hai finito. Godere!

MODIFICARE:

  • Potrebbe non essere più necessario fare quanto sopra.

A partire da Chrome 59, le notifiche inviate tramite l'API di notifica o l'API delle estensioni chrome.notifications verranno visualizzate direttamente dal sistema di notifica nativo di macOS anziché dal proprio sistema di Chrome. [ fonte ]


2
Questo non risponde alla domanda di visualizzazione della cronologia delle notifiche, ma solo di vedere le notifiche.
Bjorn

6
@BjornTipling Risponde. Sta chiedendo se riesce a vedere le notifiche che ha perso mentre è via e il mio metodo fa esattamente questo.
Esdras Lopez,

1
Se metti i link come commenti, li aggiungerò al tuo post per te, @EsdrasLopez
user418150

1
@ user418150 Lo apprezzo, ma ora ho la reputazione. :) Controlla le modifiche.
Esdras Lopez,

2
Il problema principale qui è che memorizza la notifica solo se non fai clic su di essa. Diverse volte ho fatto clic su un titolo di articolo interessante, solo per non riuscire a caricarlo, tuttavia, è stato comunque rimosso dall'elenco delle notifiche. Di solito gli articoli sono troppo nuovi per essere cercati su Google e spesso il titolo della notifica non corrisponde al titolo dell'articolo, quindi si perde nelle viscere del web.
iBorg,

13

Su MacOSX avrai la directory di Chrome situata in Library / Application Support. Apri l'applicazione terminale ed esegui i seguenti comandi:

cd ~/Library/Application\ Support/Google/Chrome/Default/Platform\ Notifications/
ls -la

Ora vedrai file come questo:

drwx------@  7 visi  staff   224 Jul 13 18:16 .
drwx------  75 visi  staff  2400 Jul 15 11:05 ..
-rw-------@  1 visi  staff   759 Jul 15 10:57 000003.log
-rw-------@  1 visi  staff    16 Jul 13 18:16 CURRENT
-rw-------@  1 visi  staff     0 Jul 13 18:16 LOCK
-rw-------@  1 visi  staff   147 Jul 13 18:16 LOG
-rw-------@  1 visi  staff    41 Jul 13 18:16 MANIFEST-000001

Puoi vedere quello più recente è 000003.log, quindi controllalo con il comando successivo:

tail -n 100 000003.log

E vedrai gli ultimi 100 elementi da questo registro. Quindi puoi aprire le impostazioni di Chrome e disabilitare la notifica di quel sito web.

Nota che se hai diversi profili in Chrome, il tuo percorso può essere diverso, in questo modo (Profile1 invece di Default):

cd ~/Library/Application\ Support/Google/Chrome/Profile\ 1/Platform\ Notifications/

3
Questa dovrebbe essere la risposta accettata. :)
Cody A. Ray, il

1
Funziona ancora nel 2019 (anche se il registro necessita di una piccola interpretazione). Ottima risposta grazie
carpii

12

Se vai a %LocalAppData%\Google\Chrome\User Data\Default\Platform Notifications, c'è un file di registro delle notifiche passate.


4
buono, ma considera di specificare il percorso come "% LocalAppData% \ Google \ Chrome \ Dati utente \ Predefinito \ Notifiche piattaforma" anziché come hardcode. Funziona perfettamente su qualsiasi PC.
Dmitry Gusarov il

Nella UserData / -folder potrebbe essere necessario individuare prima la cartella del profilo, ad esempio "C: \ Users \ nomeutente \ AppData \ Local \ Google \ Chrome \ UserData \ Profile 1 \ Platform
Notify

1
Questi dati sono binari. Come leggerlo?
Gaia,

Su Chrome 71 e il file di registro è vuoto. Questo è stato disabilitato ad un certo punto?
James

3
@Gaia Mi chiedevo la stessa cosa e ho appena tirato fuori un pessimo codice Java che fa un lavoro accettabile nel decifrarlo. L'ho pubblicato di seguito: superuser.com/a/1410742/778383
Dreamspace President

3

Poiché non è possibile ottenere direttamente un registro delle notifiche, se avessi lo stesso problema, trufferei utilizzando un emulatore di telefono Android o un telefono, come l'utente che ha raccomandato Pushbullet. Ma non c'è solo Pushbullet, ci sono molte altre app, potremmo discutere i trucchi Android per ascoltare e registrare le notifiche, in un thread separato.

Se sei un programmatore, potresti forse risolvere il tuo problema attraverso un'estensione fatta in casa:

https://stackoverflow.com/questions/15949606/how-can-i-listen-to-notifications

"Puoi agganciare la funzione webkitNotifications.createNotification in modo che ogni volta che viene creata una notifica esegui un determinato codice."


2

Toccando qualcosa che è stato menzionato un po 'sopra ma con una svolta che assicura che non manchi la notifica su OSX:

  1. Sul lato destro della barra superiore principale, fai clic sull'icona di notifica.

  2. Fare clic sulla ruota dentata (in basso a destra nella schermata di notifica)

  3. Seleziona Chrome per configurare la modalità di visualizzazione delle notifiche.

  4. Per impostazione predefinita, vengono selezionati "banner" e possono scomparire automaticamente. Invece, seleziona il tipo "Alert" e rimarranno lì finché non li riconoscerai!

Prego :)


2

Puoi vedere la cronologia delle notifiche push. Nell'angolo in basso a destra dello schermo del PC sulla barra delle applicazioni c'è quello che sembra un fumetto e se ci passi sopra, vedrai che in realtà si chiama "notifiche". Se fai clic su quella bolla mostrerà le tue e-mail nuove / non lette e le eventuali notifiche push che non hai eliminato. Sono venuto qui alla ricerca di questa risposta e non l'ho trovata, ma poi sono riuscito a risolverlo. Sto usando Windows 10.


Sì, questa è una cosa recente su Win10, ma è l'eventuale risposta per Windows.
paradroid

-1

Sembra che Pushbullet possa risolvere il tuo problema. Sostengono che puoi vedere le tue notifiche perse utilizzando la loro estensione di Chrome.

https://blog.pushbullet.com/2014/10/23/easily-access-your-recent-notifications-in-chrome/


Leggi Come raccomandare il software per informazioni minime richieste e suggerimenti su come raccomandare il software su Super User. Per mantenere la risposta utile anche se i collegamenti forniti interrompono questi dettagli, è necessario modificarli nella risposta.
Dico Reinstate Monica il

Ehi, gentile. Lo proverò. In realtà già uso Pushbullet, ma non ero a conoscenza di questa estensione di Chrome.
paradroid,

Non riesco a trovare questa funzione. È spuntata una notifica e non c'è traccia di essa nella cronologia della notifica.
madprops,

Ho ripensato alla domanda e il problema è questo. Se il tuo telefono riceve una notifica, pushbullet la recapiterà sul desktop e ti farà sapere che potresti avere delle notifiche non lette (potresti averlo visto sul tuo telefono o cosa hai). Per quali siti ricevi le notifiche di Chrome? Se esiste un'app, puoi sempre installarla e riceverai le notifiche dal pushbullet sul tuo desktop / laptop / qualunque cosa.
Socialorganix Contentbrandmgmt,

1
La funzione "Notifiche" in Pushbullet è solo per visualizzare le notifiche dal tuo telefono Android sul desktop e lo stesso con iPhone se hai un desktop Mac. Non ha nulla a che fare con le notifiche di Chrome.
Boaz,

-1

Grazie a Corey 's risposta sopra, e un pigro Sabato con troppo tempo sulle mie mani, posso ora vedere un elenco di recenti notifiche di Chrome nella console del mio IDE, dove posso anche fare clic su URL.

Il codice è scadente e utilizza l'euristica grezza poiché non ho idea del modo corretto di interpretare i dati binari.

Ma è molto meglio di niente. Esempio di output (estratto):

https://www.finanzen.net/nachricht/aktien/kw-9-tops-und-flops-der-tecdax-aktien-in-der-vergangenen-woche-7195100
https://images.finanzen.net/mediacenter/unsortiert/TecDAX_boerse_frankfurt0016_kl.jpg
So bewegten sich die Einzelwerte des TecDAX in der zurückliegenden Handelswoche.*
KW 9: Tops und Flops der TecDAX-Aktien in der vergangenen Woche
So bewegten sich die Einzelwerte des TecDAX in der zurückliegenden Handelswoche.
HideOnTheseRoutes
Home/Index;Article/News/Index
tag-7195100
NotificationIdentifier
1061622960{


https://www.youtube.com/watch?v=W-mlD_bYKdU&feature=push-u-sub&attr_tag=0SL8UpnrTOnTECxr%3A6
https://lh5.googleusercontent.com/-raJM5SITO34/AAAAAAAAAAI/AAAAAAAAAAA/UtLljlL4Wpc/s96-c-mo/photo.jpg
New from Market Moves
Trade Recap: $1,500 in PROFITS*˜
COuAyJGY4uACEAY=
attributionTag
0SL8UpnrTOnTECxr:6{
 from Market MovesTrade Recap: $1,500 in PROFITS

Codice Java valido per la crocifissione:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;




/**
 * v[1, 2019-03-02 13:00 UTC]
 *
 * by dreamspace-president.com
 */
final public class CrappyChromeNotificationHistoryReader {


    public static void main(final String[] args) {

        final File file = new File(
                "C:\\Users\\[YOUR_NAME_HERE]\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Platform Notifications\\000003.log");

        final List<ChromeNotificationStuff> notifications = obtainChromeNotificationStuff(file);
        for (ChromeNotificationStuff notification : notifications) {
            System.err.println();
            System.err.println(notification);
        }
        System.exit(0);
    }


    public static List<ChromeNotificationStuff> obtainChromeNotificationStuff(final File file) {

        final List<ChromeNotificationStuff> ret = new ArrayList<>();

        final List<DumbTokenList> listOfDumbTokenLists = doTheInsaneParsingThing(file);
        int instanceCounter = 0;
        for (DumbTokenList dtl : listOfDumbTokenLists) {

            final List<String> urls = new ArrayList<>();
            final List<String> texts = new ArrayList<>();

            for (String token : dtl.tokens) {
                if (token.startsWith("https://") || token.startsWith("http://")) {
                    urls.add(token);
                } else {
                    texts.add(token);
                }
            }


            // Remove unimportant URLs.
            for (int i = urls.size() - 1; i > 0; i--) {
                final String urlThis = urls.get(i);
                final int lenThis = urlThis.length();
                for (int ii = i - 1; ii >= 0; ii--) {
                    final String urlThat = urls.get(ii);
                    final int lenThat = urlThat.length();

                    if (lenThis > lenThat) {
                        if (urlThis.startsWith(urlThat)) {
                            final String removed = urls.remove(ii);
                            //                            System.err.println("\nREMOVED: " + removed + "\nKEPT   : " + urlThis); // because was better or equal
                            break;
                        }
                    } else {
                        if (urlThat.startsWith(urlThis)) {
                            final String removed = urls.remove(i);
                            //                            System.err.println("\nREMOVED: " + removed + "\nKEPT   : " + urlThat); // because was better or equal
                            break;
                        }
                    }

                }
            }

            ret.add(new ChromeNotificationStuff(instanceCounter, urls, texts));
            instanceCounter++;
        }

        ret.sort(null);

        return ret;
    }


    final public static class ChromeNotificationStuff implements Comparable<ChromeNotificationStuff> {


        private final int instanceCounter;
        final public List<String> urls;
        final public List<String> texts;


        private ChromeNotificationStuff(final int instanceCounter,
                                        final List<String> urls,
                                        final List<String> texts) {

            this.instanceCounter = instanceCounter;

            this.urls = Collections.unmodifiableList(urls);
            this.texts = Collections.unmodifiableList(texts);
        }


        public String toString() {

            final StringBuilder sb = new StringBuilder();
            for (String url : urls) {
                sb.append(url).append('\n');
            }
            for (String text : texts) {
                sb.append(text).append('\n');
            }
            return sb.toString();
        }


        @Override
        public int compareTo(final ChromeNotificationStuff o) { // Newest (= last) notifications first, please.

            return Integer.compare(o.instanceCounter, instanceCounter);
        }
    }




    final private static double MIN_LENGTH_DIFFERENCE_RATIO = 0.7;//0.9;
    final private static double MIN_REMAININGLINES_PERCENTAGEOF_ALLLINES = 0.2;




    final private static class DumbTokenList {


        final private static int MIN_LENGTH = 10; //6;
        final private static String[] EXTENSIONS = new String[] { ".jpg", ".jpeg", ".png", ".gif", ".html", ".htm", ".php" };
        final private static int MAX_EXTRA_CRAP_AFTER_EXTENSIONS = 3;
        final private static String SAFE_URL_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;="; // https://stackoverflow.com/a/1547940/3500521

        final private String originalText;
        final private List<String> tokens;


        private DumbTokenList(final String textWithBinaryCrap) {

            originalText = textWithBinaryCrap;

            final List<String> tokens = new ArrayList<>();

            final Consumer<String> addTokenButTryToDecrappifyExtensionsFirstAnTing = token -> {


                if (token.startsWith("ttps://") || token.startsWith("ttp://")) {
                    token = "h" + token;
                }


                final List<String> newTokens = new ArrayList<>();

                if (token.startsWith("http")) {
                    final int tokenLength = token.length();
                    boolean found = false;
                    for (int i = 0; i < tokenLength; i++) {
                        final char c = token.charAt(i);
                        if (SAFE_URL_CHARACTERS.indexOf(c) < 0) {
                            newTokens.add(token.substring(0, i));
                            newTokens.add(token.substring(i));
                            found = true;
                            break;
                        }
                    }
                    if (!found) {
                        newTokens.add(token);
                    }
                } else {
                    newTokens.add(token);
                }

                for (String newToken : newTokens) {


                    String foundExt = null;
                    int foundExtLen = 0;
                    int foundExtAt = -1;
                    for (String extension : EXTENSIONS) {
                        final int idx = newToken.indexOf(extension);
                        if (idx >= 0) {
                            final int extLen = extension.length();
                            if (idx > foundExtAt || (idx == foundExtAt && extLen > foundExtLen)) {
                                foundExt = extension;
                                foundExtLen = extLen;
                                foundExtAt = idx;
                            }
                        }
                    }
                    if (foundExt != null) {
                        final int amountOfCharactersAfterThisFind = newToken.length() - foundExtAt - foundExtLen;
                        if (amountOfCharactersAfterThisFind <= MAX_EXTRA_CRAP_AFTER_EXTENSIONS) {
                            // OK. Shorten this bitch.
                            newToken = newToken.substring(0, foundExtAt + foundExtLen);
                        }
                    }


                    if (newToken.startsWith("http")) {
                        if (!newToken.startsWith("http://") && !newToken.startsWith("https://")) {
                            continue;
                        }
                    }


                    if (newToken.startsWith("/watch?v=")) {
                        newToken = "https://www.youtube.com" + newToken;
                    }


                    if (newToken.length() >= MIN_LENGTH) {
                        tokens.add(newToken);
                    }


                }

            };

            final StringBuilder sb = new StringBuilder();

            final int len = textWithBinaryCrap.length();
            for (int i = 0; i <= len + 1; i++) {

                final char c = i < len ? textWithBinaryCrap.charAt(i) : 0;

                if (c < ' ' || c == '"') {

                    String potentialText = sb.toString();
                    while (true) {
                        final int httpIDX = potentialText.indexOf("http", 1);
                        if (httpIDX < 0) {
                            addTokenButTryToDecrappifyExtensionsFirstAnTing.accept(potentialText);
                            break;
                        } else {
                            final String snippet = potentialText.substring(0, httpIDX);
                            potentialText = potentialText.substring(httpIDX);
                            addTokenButTryToDecrappifyExtensionsFirstAnTing.accept(snippet);
                        }
                    }

                    sb.setLength(0);

                    if (c == '"') {
                        // Skip this and the next. (thus "i < len +1")
                        i++;
                    }
                } else {
                    sb.append(c);
                }
            }


            // Remove quasi-duplicates. Sue me.
            //            System.err.println("\n*** STARTING DEDUPLICATION ***");
            final int lSize = tokens.size();
            for (int i = lSize - 1; i > 0; i--) { // (not 0 itself, wouldn't make sense)

                if (i < tokens.size()) {

                    final String entry = tokens.get(i);

                    for (int ii = i - 1; ii >= 0; ii--) { // (incl. 0)

                        final String otherEntry = tokens.get(ii);

                        final Boolean removeNoneOrFirstOrSecond = areLinesTooSimilar(entry, otherEntry);
                        if (removeNoneOrFirstOrSecond != null) {

                            if (!removeNoneOrFirstOrSecond) {
                                final String removed = tokens.remove(i);
                                //                                System.err.println("\nREMOVED: " + removed + "\nKEPT   : " + otherEntry); // because was better or equal
                            } else {
                                final String removed = tokens.remove(ii);
                                //                                System.err.println("\nREMOVED: " + removed + "\nKEPT   : " + entry); // because was better or equal
                            }
                            break; // IMPORTANT!
                        }

                    }
                }
            }


            this.tokens = Collections.unmodifiableList(tokens);

        }


        public String toString() {

            final StringBuilder sb = new StringBuilder();
            for (String token : tokens) {
                sb.append(token).append('\n');
            }
            return sb.toString();
        }


    }


    /**
     * Do NOT call with NULL/EMPTY arguments.
     *
     * @return NULL if not too similar. False if the FIRST seems superfluous. True if the SECOND seems superfluous.
     */
    private static Boolean areLinesTooSimilar(final String line1,
                                              final String line2) {

        final int l1 = line1.length();
        final int l2 = line2.length();

        final double lenDiffRatio = Math.min(l1, l2) / (double) Math.max(l1, l2); // Results in 1 or less.

        if (lenDiffRatio >= MIN_LENGTH_DIFFERENCE_RATIO) {

            if (l2 < l1) {
                // Compare the other way round.
                if (line1.contains(line2)) {
                    return false;
                }
            } else {
                if (line2.contains(line1)) {
                    return true;
                }
            }

        }

        return null;
    }


    private static List<DumbTokenList> doTheInsaneParsingThing(final File file) {

        final List<DumbTokenList> ret = new ArrayList<>();

        final StringBuilder sb = new StringBuilder();
        try (final InputStream is = new BufferedInputStream(new FileInputStream(file))) {

            final int bufMinus1 = 4;
            final Charset charset = Charset.forName("Cp1252"); // =ansi

            final int[] buf = new int[bufMinus1 + 1]; // "DATA"
            //            while ((buf[buf.length - 1] = is.read()) >= 0) {
            while (true) {

                buf[bufMinus1] = is.read();

                if (buf[bufMinus1] < 0 || (
                        buf[0] == 'D' &&
                                buf[1] == 'A' &&
                                buf[2] == 'T' &&
                                buf[3] == 'A' &&
                                buf[4] == ':')) {

                    if (sb.length() > 0) {
                        ret.add(new DumbTokenList(sb.toString()));
                        sb.setLength(0);
                    }

                    if (buf[bufMinus1] < 0) {
                        break;
                    }

                } else {

                    sb.append(new String(new byte[] { (byte) buf[bufMinus1] }, charset));
                    //                    sb.append((char) buf[bufMinus1]);
                }


                // Shift minibuffer to front.
                for (int i = 0; i < bufMinus1; i++) {
                    buf[i] = buf[i + 1];
                }
            }


        } catch (IOException e) {
            e.printStackTrace();
        }


        // DEDUPLICATE DTLs
        for (int i = ret.size() - 1; i > 0; i--) {

            if (i < ret.size()) {
                final DumbTokenList dtlThis = ret.get(i);
                final int dtlThisTokenCount = dtlThis.tokens.size();

                for (int ii = i - 1; ii >= 0; ii--) {
                    final DumbTokenList dtlThat = ret.get(ii);
                    final int dtlThatTokenCount = dtlThat.tokens.size();


                    int scoreViaRemainingLines_this = dtlThisTokenCount;
                    int scoreViaRemainingLines_that = dtlThatTokenCount;


                    for (int o = 0; o < dtlThisTokenCount; o++) {
                        final String tokenThis = dtlThis.tokens.get(o);
                        for (int oo = 0; oo < dtlThatTokenCount; oo++) {
                            final String tokenThat = dtlThat.tokens.get(oo);

                            final Boolean tooSimilar = areLinesTooSimilar(tokenThis, tokenThat);
                            if (tooSimilar != null) {
                                scoreViaRemainingLines_this--;
                                scoreViaRemainingLines_that--;
                                break;
                            }

                        }
                    }

                    if (scoreViaRemainingLines_this < 0 || scoreViaRemainingLines_that < 0) {
                        throw new Error();
                    }

                    final double scoreActual_this = scoreViaRemainingLines_this / (double) dtlThisTokenCount;
                    final double scoreActual_that = scoreViaRemainingLines_that / (double) dtlThatTokenCount;


                    if (scoreViaRemainingLines_this < scoreViaRemainingLines_that) {
                        if (scoreActual_this < MIN_REMAININGLINES_PERCENTAGEOF_ALLLINES) {
                            final DumbTokenList removed = ret.remove(i);
                            //                            System.err.println("\nREMOVED:\n" + removed + "\nKEPT   :\n" + dtlThat);
                            break; // IMPORTANT.
                        }
                    } else {
                        if (scoreActual_that < MIN_REMAININGLINES_PERCENTAGEOF_ALLLINES) {
                            final DumbTokenList removed = ret.remove(ii);
                            //                            System.err.println("\nREMOVED:\n" + removed + "\nKEPT   :\n" + dtlThis);
                            break; // IMPORTANT.
                        }
                    }


                }

            }
        }

        return ret;
    }


}

1
Per farlo funzionare, ho usato i seguenti comandi, javac "C:\Users\MLM\Downloads\CrappyChromeNotificationHistoryReader.java"(per compilare), java -cp C:\Users\MLM\Downloads CrappyChromeNotificationHistoryReader(per eseguire) Lo script non funzionava, if (scoreViaRemainingLines_this < 0 || scoreViaRemainingLines_that < 0) {così ho commentato tutto sull'analisi doTheInsaneParsingThinge ho stampato tutto System.out.println(sb.toString());quando il token è stato aggiunto all'elenco. Sembra che "Notifiche piattaforma" gestisca solo le notifiche push dei server worker.
MLM

@MLM: grazie per le informazioni javac. Per quanto riguarda il problema: funziona per me se incollo l'origine in un progetto IntelliJ Java 8 aperto, inserisco il mio nome utente (variabile "file") ed eseguo il codice.
Presidente Dreamspace il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.