99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀絕了!自動(dòng)點(diǎn)贊,我用 PyAutoGUI
絕了!自動(dòng)點(diǎn)贊,我用 PyAutoGUI
2022-06-22
收藏
絕了!自動(dòng)點(diǎn)贊,我用 PyAutoGUI

作者:閑歡

來源:Python 技術(shù)

在上篇文章《Python自動(dòng)操作 GUI 神器——PyAutoGUI》中,我跟大家講解了一下 pyautogui 的一些基礎(chǔ)知識(shí)和操作,大家反饋很好,給了我好多贊,在此先跟大家說聲三克油!

在得到大家正反饋的同時(shí),我受到了很大鼓舞,感覺如果只是介紹一下基礎(chǔ)操作,有點(diǎn)不過癮,所以今天晚上加班回來,雖然很不想打開電腦,但是還是忍著疲憊給大家奉獻(xiàn)一個(gè)小實(shí)例。

為此,我跑去洗手間用涼水洗了一把臉,頓時(shí)清醒多了,下面進(jìn)入正題。

作為一個(gè) GUI 操作的神器,我們看到了它的操作都很簡(jiǎn)單,非常通俗易懂,基本上看到函數(shù)就能知道它的功效。

下面我來給大家演示一個(gè)小栗子,看了這個(gè)栗子后你就會(huì)明白它的神器由來了。

好了,不給大家繞彎子了,今天的小栗子就是批量給知乎的文章點(diǎn)贊。

思路

我們先來看看知乎的個(gè)人主頁:

絕了!自動(dòng)點(diǎn)贊,我用 PyAutoGUI

這里,我將下面的 tab 標(biāo)簽切換到文章這里,顯示的就是作者的文章列表。

我們先來想一下,如果我要給這位作者的文章點(diǎn)贊,我需要怎么做?

首先,我需要找到點(diǎn)贊的圖標(biāo);然后,我點(diǎn)擊點(diǎn)贊圖標(biāo),完成一次點(diǎn)贊;當(dāng)我將視野內(nèi)的文章點(diǎn)贊完成后,我拖動(dòng)頁面往下滑,繼續(xù)上面的步驟。

看到這里,你是不是覺得這么說有點(diǎn)二?

但是我們寫程序就必須這樣,把每一個(gè)步驟都明確,然后根據(jù)步驟去寫邏輯,不然當(dāng)你動(dòng)手寫邏輯的時(shí)候,你可能會(huì)遺漏一些細(xì)節(jié),導(dǎo)致程序無法達(dá)到預(yù)期效果,或者出現(xiàn)bug。

實(shí)現(xiàn)

有了上面的步驟,我們就可以著手開發(fā)代碼了。

首先,我要讓程序識(shí)別點(diǎn)贊的按鈕。上篇文章中我介紹過一個(gè)小栗子,就是從桌面上找到瀏覽器的圖標(biāo),我們需要將瀏覽器的圖標(biāo)截圖保存為一張圖片,然后傳給程序,讓程序用這張圖片到屏幕中去尋找。

這里也是一樣,我先將知乎的點(diǎn)贊按鈕截了圖:

絕了!自動(dòng)點(diǎn)贊,我用 PyAutoGUI

按照上面的步驟,我首先需要識(shí)別當(dāng)前桌面上的點(diǎn)贊按鈕,只需要一行代碼:

allLocation = pyautogui.locateAllOnScreen('agree.png')

這樣就可以找到桌面上所有的點(diǎn)贊按鈕了。

找到點(diǎn)贊按鈕之后,下一步就是點(diǎn)贊了:

def like(): time.sleep(1) if pyautogui.locateOnScreen('agree.png'):
        left, top, width, height = pyautogui.locateOnScreen('agree.png')
        center = pyautogui.center((left, top, width, height))   
        pyautogui.click(center)    
        print('點(diǎn)贊成功!')

這里,我首先休息了1秒鐘,防止程序運(yùn)行過快,把頁面搞崩潰或者觸發(fā)平臺(tái)的安全策略。

接著我找到點(diǎn)贊的按鈕,計(jì)算按鈕的中心點(diǎn),然后進(jìn)行點(diǎn)擊。

這樣,我們就順利地完成了一次點(diǎn)贊操作。

然后,我再來寫一個(gè)判斷,如果當(dāng)前桌面上的點(diǎn)贊按鈕都點(diǎn)過了,就滾動(dòng)屏幕,到下一屏繼續(xù)點(diǎn)贊:

while True:
    allLocation = pyautogui.locateAllOnScreen('agree.png') if len(list(allLocation)) > 0:
        like() # 調(diào)用點(diǎn)贊函數(shù) else: try:
            pyautogui.scroll(-500) print('我滾了!')
        except: print('完蛋啦')

整個(gè)代碼運(yùn)行起來是這樣的:

絕了!自動(dòng)點(diǎn)贊,我用 PyAutoGUI

注意,在程序運(yùn)行過程中,一定要將打開知乎頁面的瀏覽器切換到桌面最上層,以保證你當(dāng)前操作的是這個(gè)頁面。

這里沒有寫終止條件,所以程序會(huì)一直運(yùn)行下去,直到你手動(dòng)終止。

總結(jié)

整個(gè)栗子就是這樣的,簡(jiǎn)約而不簡(jiǎn)單,雖然只有幾行代碼,但是替我完成了一次自動(dòng)化操作??赡苓@里舉知乎的例子還不太恰當(dāng),因?yàn)橹跏怯蟹猪摰?,如果是瀑布流的頁面,那真的可以一直點(diǎn)贊下去。

數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請(qǐng)參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }