มีวิธีใดบ้างในการดูประวัติการแจ้งเตือนของเบราว์เซอร์ Chrome


55

ฉันได้รับการแจ้งเตือนเกี่ยวกับ Chrome จากหลายเว็บไซต์และทำงานได้เมื่อฉันไม่ได้เปิดแท็บใด ๆ สำหรับเว็บไซต์เหล่านั้น

แต่บางครั้งฉันได้รับการแจ้งเตือน Chrome เมื่อฉันไม่ได้อยู่ที่โต๊ะทำงานหรือมองที่แล็ปท็อป

เนื่องจากการแจ้งเตือนเหล่านี้มีประโยชน์สำหรับฉันฉันจึงต้องการเข้าถึงสิ่งที่ฉันพลาดไป

มีวิธีดูประวัติการแจ้งเตือนหรือไม่?


1
ดูเหมือนจะไม่เป็นเช่นนั้น ดูที่โพสต์นี้ ( theverge.com/2015/10/14/9531133/… ) พวกเขาจัดเรียงนโยบายการแจ้งเตือนใหม่และลบออกจากเดสก์ท็อปเพื่อวางไว้บนหน้าเว็บแต่ละหน้า สิ่งเดียวที่จะเข้าถึงการแจ้งเตือนใหม่คือการคลิกที่ระฆังบนหน้าเว็บ Google
เทอร์รี่

1
ดูเหมือนว่าไม่: productforums.google.com/forum/#!msg/chrome/xs9PflHTfho/… - โชคร้ายมาก
LB--

ที่เดียวที่ฉันพบการแจ้งเตือนเป็นรายการคือถ้าเว็บไซต์ที่ยิงพวกเขามีพวกเขาผ่านเว็บไซต์ของพวกเขา Chrome ดูเหมือนจะไม่รวบรวมพวกเขาในสิ่งที่ชอบchrome://notificationsและพวกเขาไม่ได้ทำกับระบบปฏิบัติการ
Jason Lydon

ยอมรับคำตอบที่ถูกต้อง @paradroid
Satheesh

คำตอบ:


31

หากคุณมี Mac นั่นเป็นวิธีที่! 😄

รายการแจ้งเตือนมีลักษณะดังนี้:

นี่คือลักษณะของรายการแจ้งเตือน

สิ่งที่คุณต้องทำคือ:

1. ในโครเมี่ยมไปที่:

chrome://flags/

2. มองหา:

Enable native notifications. Mac

3. เปิดใช้งานรีสตาร์ท Chrome เสร็จแล้ว สนุก!

แก้ไข:

  • คุณอาจไม่จำเป็นต้องทำตามข้างต้นอีกต่อไป

เริ่มต้นใน Chrome 59 การแจ้งเตือนที่ส่งผ่าน Notifications API หรือ chrome.notifications API ส่วนขยายจะแสดงโดยตรงโดยระบบการแจ้งเตือนเนทีฟ macOS แทนระบบของ Chrome [ แหล่งที่มา ]


2
สิ่งนี้ไม่ตอบคำถามในการดูประวัติการแจ้งเตือนเพียงแค่เห็นการแจ้งเตือน
Bjorn

6
@BjornTipling มันไม่ตอบ เขากำลังถามว่าเขาจะเห็นการแจ้งเตือนที่เขาพลาดไปหรือไม่และวิธีการของฉันก็ทำเช่นนั้น
Esdras Lopez

1
หากคุณใส่ลิงก์เป็นความคิดเห็นฉันจะเพิ่มลิงก์เหล่านั้นในโพสต์ของคุณ @EsdrasLopez
user418150

1
@ user418150 ฉันขอขอบคุณ แต่ตอนนี้ฉันมีชื่อเสียง :) ตรวจสอบการแก้ไข
Esdras Lopez

2
ปัญหาหลักของที่นี่คือมันเก็บเฉพาะการแจ้งเตือนหากคุณไม่คลิก หลายครั้งที่ฉันคลิกที่ชื่อบทความที่น่าสนใจเพียงเพื่อไม่สามารถโหลดได้ แต่ก็ยังถูกลบออกจากรายการการแจ้งเตือน โดยปกติแล้วบทความใหม่เกินไปที่จะเป็น Google และบ่อยครั้งที่ชื่อการแจ้งเตือนไม่ตรงกับชื่อบทความดังนั้นจึงทำให้หลงทางในเว็บ
iBorg

11

ใน MacOSX คุณจะมีไดเรกทอรี Chrome อยู่ใน Library / Application Support เปิดแอปพลิเคชันเทอร์มินัลและเรียกใช้คำสั่งถัดไป:

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

ตอนนี้คุณจะเห็นไฟล์ดังนี้:

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

คุณสามารถดูล่าสุดได้ที่ 000003.log ดังนั้นตรวจสอบด้วยคำสั่งถัดไป:

tail -n 100 000003.log

และคุณจะเห็น 100 รายการสุดท้ายจากบันทึกนี้ จากนั้นคุณสามารถเปิดการตั้งค่า chrome และปิดใช้งานการแจ้งเตือนเว็บไซต์นั้น

โปรดทราบว่าหากคุณมีหลายโปรไฟล์ใน chrome เส้นทางของคุณอาจแตกต่างกันเช่นนี้ (Profile1 แทนที่จะเป็นค่าเริ่มต้น):

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

3
นี่ควรเป็นคำตอบที่ยอมรับได้ :)
โคดี้เอ. เรย์

1
ยังคงใช้งานได้ในปี 2019 (แม้ว่าบันทึกจะต้องมีการตีความเล็กน้อย) ขอบคุณคำตอบที่ดี
carpii

11

หากคุณไปที่%LocalAppData%\Google\Chrome\User Data\Default\Platform Notificationsนั่นจะมีล็อกไฟล์ของการแจ้งเตือนที่ผ่านมา


4
ดี แต่ให้พิจารณากำหนดพา ธ เป็น "% LocalAppData% \ Google \ Chrome \ User Data \ Default \ แพลตฟอร์มการแจ้งเตือน" แทนที่จะเป็นฮาร์ดโค้ด มันทำงานได้อย่างสมบูรณ์บนพีซีทุกเครื่อง
Dmitry Gusarov

ใน UserData / -folder คุณอาจต้องค้นหาโฟลเดอร์โปรไฟล์ของคุณก่อนเช่น "C: \ Users \ ชื่อผู้ใช้ \ AppData \ Local \ Google \ Chrome \
User \ DataData

1
ข้อมูลนี้เป็นเลขฐานสอง อ่านอย่างไร
Gaia

ใน Chrome 71 และไฟล์บันทึกว่างเปล่า สิ่งนี้ได้รับการปิดการใช้งานในบางจุด?
James

2
@Gaia ฉันสงสัยในสิ่งเดียวกันและเพิ่งทำโค้ด Java เส็งเคร็งที่ทำหน้าที่ได้รับการยอมรับในการถอดรหัสส่วนใหญ่ ฉันโพสต์ไว้ด้านล่าง: superuser.com/a/1410742/778383
Dreamspace President

3

ดูเหมือนว่าเป็นไปไม่ได้ที่จะได้รับการแจ้งเตือนโดยตรงหากฉันมีปัญหาเดียวกันฉันจะโกงโดยใช้ตัวจำลองโทรศัพท์ Android หรือโทรศัพท์ตามผู้ใช้ที่แนะนำ Pushbullet แต่มี Pushbullet ไม่เพียง แต่มีแอพพลิเคชั่นอื่น ๆ อีกมากมายเราสามารถพูดคุยเกี่ยวกับเทคนิค Android เพื่อฟังและบันทึกการแจ้งเตือนในเธรดแยกต่างหาก

หากคุณเป็นโปรแกรมเมอร์คุณอาจแก้ไขปัญหาของคุณผ่านทางส่วนต่อขยายที่ทำที่บ้านได้:

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

"คุณสามารถขอฟังก์ชั่น webkitNotifications.createNotification เพื่อที่ว่าเมื่อใดก็ตามที่มีการสร้างการแจ้งเตือนคุณจะเรียกใช้รหัสบางรหัส"


2

คุณสามารถดูประวัติของการแจ้งเตือนแบบพุช ที่มุมล่างขวาของหน้าจอพีซีของคุณบนทาสก์บาร์สิ่งที่ดูเหมือนจะเป็นกรอบคำพูดและถ้าคุณวางเมาส์เหนือมันคุณจะเห็นมันเรียกว่า "การแจ้งเตือน" หากคุณคลิกที่ฟองนั้นจะแสดงอีเมลที่ยังไม่ได้อ่าน / ใหม่และการแจ้งเตือนแบบพุชที่คุณยังไม่ได้ยกเลิก ฉันมาที่นี่เพื่อค้นหาคำตอบนี้และหาไม่พบ แต่จัดการมันได้แล้ว ฉันใช้ Windows 10


ใช่นี่คือสิ่งล่าสุดใน Win10 แต่มันเป็นคำตอบสุดท้ายสำหรับ Windows
Paradroid

1

การสัมผัสบางสิ่งที่กล่าวถึงข้างต้นเล็กน้อย แต่ด้วยความมั่นใจว่าคุณจะไม่พลาดการแจ้งเตือนใน OSX:

  1. ที่ด้านขวาของแถบด้านบนหลักคลิกที่ไอคอนการแจ้งเตือน

  2. คลิกล้อเฟือง (มุมขวาล่างของจอแสดงผลการแจ้งเตือน)

  3. เลือก Chrome เพื่อตั้งค่าวิธีแสดงการแจ้งเตือน

  4. โดยค่าเริ่มต้น "แบนเนอร์" จะถูกเลือกและพวกเขาสามารถหายไปโดยอัตโนมัติ ให้เลือกประเภท "การแจ้งเตือน" และพวกเขาจะอยู่ที่นั่นตราบใดที่คุณไม่ยอมรับ!

ยินดี :)


-1

ดูเหมือนว่า Pushbullet อาจแก้ปัญหาของคุณได้ พวกเขาอ้างว่าคุณสามารถดูการแจ้งเตือนที่ไม่ได้รับโดยใช้ส่วนขยาย Chrome

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


โปรดอ่านวิธีการแนะนำซอฟต์แวร์สำหรับข้อมูลขั้นต่ำที่จำเป็นและคำแนะนำเกี่ยวกับวิธีการแนะนำซอฟต์แวร์ใน Super User เพื่อให้คำตอบของคุณมีประโยชน์แม้ว่าลิงก์ที่ให้ไว้จะมีการแบ่งรายละเอียดเหล่านี้ควรได้รับการแก้ไขในคำตอบของคุณ
ฉันพูดว่า Reinstate Monica

เฮ้ ฉันจะลองดู ที่จริงแล้วฉันใช้ Pushbullet แต่ไม่รู้ว่ามีการขยาย Chrome นี้
Paradroid

ดูเหมือนจะไม่พบคุณลักษณะนี้ การแจ้งเตือนเริ่มต้นขึ้นและไม่มีการติดตามในประวัติของการแจ้งเตือน
madprops

ฉันคิดใหม่คำถามและการจับเป็นแบบนี้ หากโทรศัพท์ของคุณได้รับการแจ้งเตือน pushbullet จะส่งไปยังเดสก์ท็อปของคุณและแจ้งให้คุณทราบว่าอาจมีการแจ้งเตือนที่ยังไม่ได้อ่าน (คุณอาจเห็นมันบนโทรศัพท์ของคุณหรือมีอะไร) ไซต์ใดที่คุณได้รับการแจ้งเตือนเกี่ยวกับโครม หากมีแอพสำหรับมันคุณสามารถติดตั้งได้ตลอดเวลาจากนั้นคุณจะได้รับการแจ้งเตือนจาก pushbullet ไปยังเดสก์ท็อป / แล็ปท็อป / อะไรก็ตาม
Socialorganix Contentbrandmgmt

1
คุณลักษณะ "การแจ้งเตือน" ใน Pushbullet ใช้สำหรับการดูการแจ้งเตือนจากโทรศัพท์ Android ของคุณบนเดสก์ท็อปและเหมือนกับ iPhone หากคุณมีเดสก์ท็อป Mac มันไม่มีส่วนเกี่ยวข้องกับการแจ้งเตือนของ Chrome
โบอาซ

-1

ต้องขอบคุณคำตอบของคอเรย์ด้านบนและวันเสาร์ที่ขี้เกียจซึ่งมีเวลามากเกินไปทำให้ฉันสามารถดูรายการการแจ้งเตือนล่าสุดของ Chromeในคอนโซลของ IDE ที่ฉันสามารถคลิก URL ได้

รหัสนี้เป็นเส็งเคร็งและใช้ฮิวริสติกแบบหยาบเนื่องจากฉันไม่รู้วิธีที่ถูกต้องในการตีความข้อมูลไบนารี

แต่มันตันดีกว่าไม่มีอะไร ตัวอย่างเอาต์พุต (ส่วนที่ตัดตอน):

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

โค้ด Java การตรึงกางเขนที่คุ้มค่า:

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
ในการเรียกใช้การทำงานนี้ฉันใช้คำสั่งต่อไปนี้javac "C:\Users\MLM\Downloads\CrappyChromeNotificationHistoryReader.java"(เพื่อคอมไพล์), java -cp C:\Users\MLM\Downloads CrappyChromeNotificationHistoryReader(รัน) สคริปต์ล้มเหลวif (scoreViaRemainingLines_this < 0 || scoreViaRemainingLines_that < 0) {ดังนั้นฉันจึงคอมเม้นท์การแจงทั้งหมดdoTheInsaneParsingThingและพิมพ์ออกมาทุกอย่างSystem.out.println(sb.toString());เมื่อโทเค็นถูกเพิ่มเข้าไปในรายการ ดูเหมือนว่า "การแจ้งเตือนแพลตฟอร์ม" จะจัดการกับการแจ้งเตือนแบบพุชของผู้ปฏิบัติงานเซิร์ฟเวอร์เท่านั้น
MLM

@MLM: ขอบคุณสำหรับข้อมูล javac สำหรับปัญหา: ใช้งานได้สำหรับฉันถ้าฉันวางซอร์สลงในโครงการ Java 8 IntelliJ แบบเปิดให้ใส่ชื่อผู้ใช้ของฉัน ("ไฟล์" ตัวแปร) และเรียกใช้รหัส
ประธานาธิบดี Dreamspace
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.