亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

知乎快捷取消我關(guān)注的問題chrome插件

PAMPANG / 541人閱讀

摘要:起因昨天上知乎一看,發(fā)現(xiàn)自己關(guān)注的問題接近個了,不能忍,希望控制在個以以內(nèi)最好是個以內(nèi)。到問題詳情頁分析取消關(guān)注的格式,使用問題拼裝。功能說明把所有關(guān)注的問題列出來。而實際上知乎顯示我關(guān)注的問題有個。知乎的列表的結(jié)構(gòu)和接口都可能會修改。

起因

昨天上知乎一看,發(fā)現(xiàn)自己關(guān)注的問題接近1000個了,不能忍,希望控制在500個以以內(nèi)最好是100個以內(nèi)。于是打開我關(guān)注的問題列表。發(fā)現(xiàn)這個列表已經(jīng)由滾動加載變成了分頁,并且不能在問題列表頁面直接點取消關(guān)注,需要進(jìn)入問題詳情頁面去取消關(guān)注。這樣一來工作量就太大了。
之前滾動加載的時候只要寫個小腳本在控制臺運(yùn)行一下就可以把所有的問題加載出來,現(xiàn)在想把所有的問題加載出來就不行了。

但是作為一個前端,對頁面上的東西,總是可以想想辦法的。那就寫個小小的chrome插件吧。

要實現(xiàn)的功能點:

一次性把所有的問題加載出來。

就在問題列表頁面取消關(guān)注。

一次性加載所有問題

思路:

從第一頁開始,依次模擬點下一頁的按鈕。每次點之前把當(dāng)前頁的問題列表的數(shù)據(jù)保存成html字符串。放進(jìn)一個數(shù)組。

沒有下一頁按鈕的時候,表示已經(jīng)到了最后一頁。拼裝所有的html字符串。替換最后一頁的列表區(qū)。

實現(xiàn)的時候要注意的是什么時候去點擊下一頁,在什么時機(jī)觸發(fā)。因為我們要確定下一頁的數(shù)據(jù)加載過來了,才能進(jìn)行下一次點擊,不然就可能出現(xiàn)漏頁的情況。 觀察頁面發(fā)現(xiàn)每一頁的數(shù)據(jù)加載好,知乎就會把滾動條移動到頂部去。所以我們可以通過監(jiān)測scroll事件來判斷當(dāng)前頁面的數(shù)據(jù)是否已經(jīng)加載完畢。監(jiān)測到scroll事件的時候就是我們發(fā)起下一次點擊的時候。并且當(dāng)下一頁加載好之后我們要再把滾動條移動到底部去。這樣加載新一頁的時候滾動條才會再次往上移,從而觸發(fā)我們綁定的scroll事件。
另外,就是scroll事件一般會一次性觸發(fā)好多個。我們要保證我們綁定的事件的邏輯代碼只執(zhí)行一次。所以我加了一個timeout定時器,稍微延遲一下。等滾動條停下來的時候才真正執(zhí)行事件邏輯。在這個timeout運(yùn)行之前的再次觸發(fā)的scroll事件都會直接return掉。并且設(shè)置一個適當(dāng)延遲,也減小了被誤認(rèn)為是爬蟲的概率。

就在問題列表頁面取消關(guān)注

思路:

給每個問題加按鈕。直接append就行了。并綁定事件。

從問題的dom結(jié)構(gòu)中拿到問題的url,并從url中解析出問題id。

到問題詳情頁分析取消關(guān)注的url格式,使用問題id拼裝。

自己發(fā)ajax請求。delete格式。

實現(xiàn)

為了方便,我就直接寫成chrome插件使用了。就不用每次手動到控制臺去運(yùn)行了。
直接拿之前寫的一個chrome插件的架子過來開干。
chrome插件的入門寫法以及使用我之前有篇文章寫過。一個簡單的chrome拓展程序開發(fā)
并且之前的chrome插件架子里集成了jQuery,代碼寫起來就更歡快了。

/* 
 * 功能說明:
 * 1.把所有關(guān)注的問題列出來。
 * 2.給所有的問題添加取消關(guān)注按鈕并完成取消關(guān)注。
 * 
 * author: liusaint@gmail.com
 * date: 20180120
 */

var ZhiHu = {
    htmlArr: [], //保存每一頁的問題的html數(shù)據(jù)。
    pageItems: {}, //保存每一頁的數(shù)量。
    INTEVAL: 2000, //翻頁的時間間隔。請求下一頁的間隔??梢哉{(diào)小一些。
    timer: "", //定時器
    //初始化。
    init: function() {

        var that = this;

        //綁定滾動事件。當(dāng)頁面滾動了就可以開始請求下一頁的數(shù)據(jù)了。
        $(window).on("scroll", this.scrollFn.bind(this));
        //初始調(diào)用。
        this.scrollFn();

        //給我們添加的按鈕綁定事件。
        $("body").on("click", ".del-q", function(event) {
            that.delQ($(this));
        });
    },
    //取消關(guān)注。拼裝url,發(fā)送delete請求。
    //需要拼裝的url接口格式:https://www.zhihu.com/api/v4/questions/20008370/followers
    delQ: function(jqObj) {     

        var questionUrl, matchArr, delUrl, questionId;

        //問題頁面鏈接
        questionUrl = jqObj.siblings(".QuestionItem-title").find("a").attr("href");
        if (!questionUrl) {
            return;
        }

        //正則匹配問題id
        matchArr = questionUrl.match(/d+/);
        if (matchArr) {
            questionId = matchArr[0];
        }

        delUrl = "https://www.zhihu.com/api/v4/questions/" + questionId + "/followers";

        $.ajax({
            url: delUrl,
            type: "delete",
            success: function(data) {
                //成功的話刪除該列。
                jqObj.closest(".List-item").remove();
            }
        })

    },
    //頁面滾動時觸發(fā)的事件。
    scrollFn: function(event) {
        var that = this;
        //滾動條滾動時會多次調(diào)用此方法,攔截掉。
        if (this.timer) {
            return;
        }
        this.timer = setTimeout(function() {
            //頁面內(nèi)容提取
            that.saveData();

            //如果有下一頁,模擬點擊。
            if ($(".PaginationButton-next").length > 0) {
                $(".PaginationButton-next")[0].click();
                //移動到底部。
                that.scrollBottom();
            } else {
                //到了最后一頁了。最后的數(shù)據(jù)處理。
                that.mergeList();
                //解綁事件
                $(window).off("scroll");
            }

            clearTimeout(that.timer);
            that.timer = "";
        }, this.INTEVAL)

    },
    //從頁面中提取問題html數(shù)據(jù)與每頁的數(shù)量。
    saveData: function() {
        var html = $(".List-header+div").prop("outerHTML");
        this.htmlArr.push(html);
        //當(dāng)前頁面的問題數(shù)量
        this.pageItems[$(".PaginationButton--current").text()] = $(".List-item").length;
    },
    //數(shù)據(jù)收集完成后對列表的處理。
    mergeList: function() {
        var html = this.htmlArr.join("");
        //組裝所有頁的數(shù)據(jù)到一頁。
        $(".List-header+div").html(html);
        //移除分頁
        $(".Pagination").remove();
        //給每個問題添加取消關(guān)注按鈕
        $(".ContentItem-title").append("");
        //把每頁的數(shù)量打出來看一下,發(fā)現(xiàn)并不是每頁都是20條數(shù)據(jù)。
        top.console.log(this.pageItems);
    },
    //滾動到底部
    scrollBottom: function() {
        var h = $(document).height() - $(window).height();
        $(document).scrollTop(h);
    },

}

/* chrome插件部分。核心代碼是上面的內(nèi)容 */
chrome.extension.onRequest.addListener(
    function(request, sender, sendResponse) {
        if (request.greeting == "hello") {
            //執(zhí)行上面的內(nèi)容
            ZhiHu.init();
        }
    }
);
問題

插件完成,加載到chrome瀏覽器,點擊運(yùn)行。功能正常。大功告成。

不過當(dāng)所有問題都加載出來之后發(fā)現(xiàn)了比較奇怪的事情,就是一共加載出來911個問題。而實際上知乎顯示我關(guān)注的問題有950個。所以我一度懷疑是不是哪個邏輯有錯誤少加載了一兩頁的數(shù)據(jù)。就在代碼里加入了一個對象保存每一個問題頁面的問題數(shù)據(jù)。
得出的結(jié)果是并不是每一頁都有20個問題的。有些頁面只有19個,最少的甚至只有16個。于是我點開某一頁最少的,挨個數(shù)一下,發(fā)現(xiàn)真是只有16個。然后把這些數(shù)據(jù)加起來,確實是911個。
另外39個問題真是消失在搜索結(jié)果中了。

補(bǔ)充

本代碼具有時效性,僅供參考。知乎的列表的dom結(jié)構(gòu)和接口都可能會修改。如果發(fā)現(xiàn)代碼不能運(yùn)行,可以酌情修改代碼再運(yùn)行。

效果圖:

插件github地址

文章github地址

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/92636.html

相關(guān)文章

  • 可以提高程序員效率工具!

    摘要:首先去裝個替代原生的終端,多種主題配色,這里我的主題用的是隨后,去下一個替代原生的,可以看一下我弄好以后的配色關(guān)鍵字高亮自動提示命令最后本文涉及的所有軟件和下載地址破解碼,安裝教程在公眾號下回復(fù)工具即可全部獲取樂于輸出干貨的技術(shù)公眾號。 前言 只有光頭才能變強(qiáng)。文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y 本...

    lemon 評論0 收藏0
  • 前端資源系列(4)-前端學(xué)習(xí)資源分享&前端面試資源匯總

    摘要:特意對前端學(xué)習(xí)資源做一個匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 特意對前端學(xué)習(xí)資源做一個匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 本以為自己收藏的站點多,可以很快搞定,沒想到一入?yún)R總深似海。還有很多不足&遺漏的地方,歡迎補(bǔ)充。有錯誤的地方,還請斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應(yīng)和斧正,會及時更新,平時業(yè)務(wù)工作時也會不定期更...

    princekin 評論0 收藏0
  • ZhihuVAPI:用Python優(yōu)雅地玩知乎

    摘要:優(yōu)雅地玩知乎簡介是什么是一個可以讓你以一種優(yōu)雅的形式調(diào)用知乎數(shù)據(jù)的包怎么安裝或者更新使用引用后面的是別稱的意思便于輸入配置用戶配置腳本使用的一共有兩種方法什么都不管腳本會默認(rèn)讀取或者的如果你是其他類的瀏覽器你可以在的自定義文件的路徑在禁用 ZhihuVAPI:優(yōu)雅地玩知乎 簡介 ZhihuVAPI是什么? ZhihuVAPI 是一個可以讓你以一種優(yōu)雅的形式調(diào)用知乎數(shù)據(jù)的 Python ...

    ccj659 評論0 收藏0
  • 被「李笑來老師」拉黑之「JavaScript微博自動轉(zhuǎn)發(fā)腳本」

    摘要:本以為花一兩個小時就能搞定這個微博自動轉(zhuǎn)發(fā)的腳本,結(jié)果中途不停的踩坑折騰了大半天。還好早早的被李笑來老師拉黑。填坑過程打開瀏覽器中,先登錄自己的微博,再進(jìn)入李笑來老師的微博首頁。然后手動轉(zhuǎn)發(fā)一次微博,獲取到轉(zhuǎn)發(fā)時所產(chǎn)生的請求。 故事的背景如下圖,李笑來 老師于10月19日在 知乎Live 開設(shè) 一小時建立終生受用的閱讀操作系統(tǒng) 的講座,他老人家看到大家伙報名踴躍,便在微博上發(fā)起了一個 ...

    BaronZhang 評論0 收藏0

發(fā)表評論

0條評論

PAMPANG

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<