Ubuntu下利用python实现自动打卡系统全过程
Ubuntu下利用python實現自動打卡系統全過程
系統版本:Debian or Ubuntu
Python版本:3.xx以上
實現功能:1.能自動打卡并定時啟動;2.截圖保存打卡信息;3.發送郵件通知。
因為學校規定要求每天打卡,博主人懶又經常忘記打卡導致輔導員經常在大群里@我,屬實尷尬。故干脆把吃灰的香橙派H616(無桌面版Ubuntu sever鏡像)拿來掛打卡腳本。欸,舒服了。
1.安裝python環境和用到的包
先安裝 pip3工具 和相應的庫
sudo apt install -y python3-pip python3-dev python3-setuptools libxml2-dev libxslt1-dev因為網頁上有中文所以需要安裝中文字庫,否則截圖里會有亂碼
sudo apt-get -y install fontconfig xfonts-utils也可以手動添加字庫
再安裝python包
pip3 install wheel selenium pillow yagmail這里是selenium和chrom_driver安裝教程鏈接
新建chrominum文件,把下載下來的.deb文件都復制進去
我在安裝時出現包依賴錯誤:dpkg: error processing package ***(–install): dependency problems - leaving unconfigured
解決方案:sudo apt install -f
在安裝pillow時會出現很多錯誤比如:The headers or library files could not be found for jpeg
解決方案: sudo apt-get install libjpeg-dev zlib1g-dev
pillow庫的依賴很多還會有其他錯誤,奇奇怪怪的錯誤挨著百度就好了
2.碼代碼
整體流程框圖
#mermaid-svg-EF7lhgUDGfRv5FNP .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-EF7lhgUDGfRv5FNP .label text{fill:#333}#mermaid-svg-EF7lhgUDGfRv5FNP .node rect,#mermaid-svg-EF7lhgUDGfRv5FNP .node circle,#mermaid-svg-EF7lhgUDGfRv5FNP .node ellipse,#mermaid-svg-EF7lhgUDGfRv5FNP .node polygon,#mermaid-svg-EF7lhgUDGfRv5FNP .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-EF7lhgUDGfRv5FNP .node .label{text-align:center;fill:#333}#mermaid-svg-EF7lhgUDGfRv5FNP .node.clickable{cursor:pointer}#mermaid-svg-EF7lhgUDGfRv5FNP .arrowheadPath{fill:#333}#mermaid-svg-EF7lhgUDGfRv5FNP .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-EF7lhgUDGfRv5FNP .flowchart-link{stroke:#333;fill:none}#mermaid-svg-EF7lhgUDGfRv5FNP .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-EF7lhgUDGfRv5FNP .edgeLabel rect{opacity:0.9}#mermaid-svg-EF7lhgUDGfRv5FNP .edgeLabel span{color:#333}#mermaid-svg-EF7lhgUDGfRv5FNP .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-EF7lhgUDGfRv5FNP .cluster text{fill:#333}#mermaid-svg-EF7lhgUDGfRv5FNP div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-EF7lhgUDGfRv5FNP .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-EF7lhgUDGfRv5FNP text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-EF7lhgUDGfRv5FNP .actor-line{stroke:grey}#mermaid-svg-EF7lhgUDGfRv5FNP .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-EF7lhgUDGfRv5FNP .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-EF7lhgUDGfRv5FNP #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-EF7lhgUDGfRv5FNP .sequenceNumber{fill:#fff}#mermaid-svg-EF7lhgUDGfRv5FNP #sequencenumber{fill:#333}#mermaid-svg-EF7lhgUDGfRv5FNP #crosshead path{fill:#333;stroke:#333}#mermaid-svg-EF7lhgUDGfRv5FNP .messageText{fill:#333;stroke:#333}#mermaid-svg-EF7lhgUDGfRv5FNP .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-EF7lhgUDGfRv5FNP .labelText,#mermaid-svg-EF7lhgUDGfRv5FNP .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-EF7lhgUDGfRv5FNP .loopText,#mermaid-svg-EF7lhgUDGfRv5FNP .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-EF7lhgUDGfRv5FNP .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-EF7lhgUDGfRv5FNP .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-EF7lhgUDGfRv5FNP .noteText,#mermaid-svg-EF7lhgUDGfRv5FNP .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-EF7lhgUDGfRv5FNP .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-EF7lhgUDGfRv5FNP .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-EF7lhgUDGfRv5FNP .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-EF7lhgUDGfRv5FNP .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-EF7lhgUDGfRv5FNP .section{stroke:none;opacity:0.2}#mermaid-svg-EF7lhgUDGfRv5FNP .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-EF7lhgUDGfRv5FNP .section2{fill:#fff400}#mermaid-svg-EF7lhgUDGfRv5FNP .section1,#mermaid-svg-EF7lhgUDGfRv5FNP .section3{fill:#fff;opacity:0.2}#mermaid-svg-EF7lhgUDGfRv5FNP .sectionTitle0{fill:#333}#mermaid-svg-EF7lhgUDGfRv5FNP .sectionTitle1{fill:#333}#mermaid-svg-EF7lhgUDGfRv5FNP .sectionTitle2{fill:#333}#mermaid-svg-EF7lhgUDGfRv5FNP .sectionTitle3{fill:#333}#mermaid-svg-EF7lhgUDGfRv5FNP .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-EF7lhgUDGfRv5FNP .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-EF7lhgUDGfRv5FNP .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-EF7lhgUDGfRv5FNP .grid path{stroke-width:0}#mermaid-svg-EF7lhgUDGfRv5FNP .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-EF7lhgUDGfRv5FNP .task{stroke-width:2}#mermaid-svg-EF7lhgUDGfRv5FNP .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-EF7lhgUDGfRv5FNP .taskText:not([font-size]){font-size:11px}#mermaid-svg-EF7lhgUDGfRv5FNP .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-EF7lhgUDGfRv5FNP .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-EF7lhgUDGfRv5FNP .task.clickable{cursor:pointer}#mermaid-svg-EF7lhgUDGfRv5FNP .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-EF7lhgUDGfRv5FNP .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-EF7lhgUDGfRv5FNP .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-EF7lhgUDGfRv5FNP .taskText0,#mermaid-svg-EF7lhgUDGfRv5FNP .taskText1,#mermaid-svg-EF7lhgUDGfRv5FNP .taskText2,#mermaid-svg-EF7lhgUDGfRv5FNP .taskText3{fill:#fff}#mermaid-svg-EF7lhgUDGfRv5FNP .task0,#mermaid-svg-EF7lhgUDGfRv5FNP .task1,#mermaid-svg-EF7lhgUDGfRv5FNP .task2,#mermaid-svg-EF7lhgUDGfRv5FNP .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-EF7lhgUDGfRv5FNP .taskTextOutside0,#mermaid-svg-EF7lhgUDGfRv5FNP .taskTextOutside2{fill:#000}#mermaid-svg-EF7lhgUDGfRv5FNP .taskTextOutside1,#mermaid-svg-EF7lhgUDGfRv5FNP .taskTextOutside3{fill:#000}#mermaid-svg-EF7lhgUDGfRv5FNP .active0,#mermaid-svg-EF7lhgUDGfRv5FNP .active1,#mermaid-svg-EF7lhgUDGfRv5FNP .active2,#mermaid-svg-EF7lhgUDGfRv5FNP .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-EF7lhgUDGfRv5FNP .activeText0,#mermaid-svg-EF7lhgUDGfRv5FNP .activeText1,#mermaid-svg-EF7lhgUDGfRv5FNP .activeText2,#mermaid-svg-EF7lhgUDGfRv5FNP .activeText3{fill:#000 !important}#mermaid-svg-EF7lhgUDGfRv5FNP .done0,#mermaid-svg-EF7lhgUDGfRv5FNP .done1,#mermaid-svg-EF7lhgUDGfRv5FNP .done2,#mermaid-svg-EF7lhgUDGfRv5FNP .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-EF7lhgUDGfRv5FNP .doneText0,#mermaid-svg-EF7lhgUDGfRv5FNP .doneText1,#mermaid-svg-EF7lhgUDGfRv5FNP .doneText2,#mermaid-svg-EF7lhgUDGfRv5FNP .doneText3{fill:#000 !important}#mermaid-svg-EF7lhgUDGfRv5FNP .crit0,#mermaid-svg-EF7lhgUDGfRv5FNP .crit1,#mermaid-svg-EF7lhgUDGfRv5FNP .crit2,#mermaid-svg-EF7lhgUDGfRv5FNP .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-EF7lhgUDGfRv5FNP .activeCrit0,#mermaid-svg-EF7lhgUDGfRv5FNP .activeCrit1,#mermaid-svg-EF7lhgUDGfRv5FNP .activeCrit2,#mermaid-svg-EF7lhgUDGfRv5FNP .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-EF7lhgUDGfRv5FNP .doneCrit0,#mermaid-svg-EF7lhgUDGfRv5FNP .doneCrit1,#mermaid-svg-EF7lhgUDGfRv5FNP .doneCrit2,#mermaid-svg-EF7lhgUDGfRv5FNP .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-EF7lhgUDGfRv5FNP .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-EF7lhgUDGfRv5FNP .milestoneText{font-style:italic}#mermaid-svg-EF7lhgUDGfRv5FNP .doneCritText0,#mermaid-svg-EF7lhgUDGfRv5FNP .doneCritText1,#mermaid-svg-EF7lhgUDGfRv5FNP .doneCritText2,#mermaid-svg-EF7lhgUDGfRv5FNP .doneCritText3{fill:#000 !important}#mermaid-svg-EF7lhgUDGfRv5FNP .activeCritText0,#mermaid-svg-EF7lhgUDGfRv5FNP .activeCritText1,#mermaid-svg-EF7lhgUDGfRv5FNP .activeCritText2,#mermaid-svg-EF7lhgUDGfRv5FNP .activeCritText3{fill:#000 !important}#mermaid-svg-EF7lhgUDGfRv5FNP .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-EF7lhgUDGfRv5FNP g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-EF7lhgUDGfRv5FNP g.classGroup text .title{font-weight:bolder}#mermaid-svg-EF7lhgUDGfRv5FNP g.clickable{cursor:pointer}#mermaid-svg-EF7lhgUDGfRv5FNP g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-EF7lhgUDGfRv5FNP g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-EF7lhgUDGfRv5FNP .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-EF7lhgUDGfRv5FNP .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-EF7lhgUDGfRv5FNP .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-EF7lhgUDGfRv5FNP .dashed-line{stroke-dasharray:3}#mermaid-svg-EF7lhgUDGfRv5FNP #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-EF7lhgUDGfRv5FNP #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-EF7lhgUDGfRv5FNP #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-EF7lhgUDGfRv5FNP #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-EF7lhgUDGfRv5FNP #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-EF7lhgUDGfRv5FNP #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-EF7lhgUDGfRv5FNP #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-EF7lhgUDGfRv5FNP #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-EF7lhgUDGfRv5FNP .commit-id,#mermaid-svg-EF7lhgUDGfRv5FNP .commit-msg,#mermaid-svg-EF7lhgUDGfRv5FNP .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-EF7lhgUDGfRv5FNP .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-EF7lhgUDGfRv5FNP .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-EF7lhgUDGfRv5FNP g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-EF7lhgUDGfRv5FNP g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-EF7lhgUDGfRv5FNP g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-EF7lhgUDGfRv5FNP g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-EF7lhgUDGfRv5FNP g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-EF7lhgUDGfRv5FNP g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-EF7lhgUDGfRv5FNP .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-EF7lhgUDGfRv5FNP .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-EF7lhgUDGfRv5FNP .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-EF7lhgUDGfRv5FNP .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-EF7lhgUDGfRv5FNP .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-EF7lhgUDGfRv5FNP .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-EF7lhgUDGfRv5FNP .edgeLabel text{fill:#333}#mermaid-svg-EF7lhgUDGfRv5FNP .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-EF7lhgUDGfRv5FNP .node circle.state-start{fill:black;stroke:black}#mermaid-svg-EF7lhgUDGfRv5FNP .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-EF7lhgUDGfRv5FNP #statediagram-barbEnd{fill:#9370db}#mermaid-svg-EF7lhgUDGfRv5FNP .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-EF7lhgUDGfRv5FNP .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-EF7lhgUDGfRv5FNP .statediagram-state .divider{stroke:#9370db}#mermaid-svg-EF7lhgUDGfRv5FNP .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-EF7lhgUDGfRv5FNP .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-EF7lhgUDGfRv5FNP .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-EF7lhgUDGfRv5FNP .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-EF7lhgUDGfRv5FNP .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-EF7lhgUDGfRv5FNP .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-EF7lhgUDGfRv5FNP .note-edge{stroke-dasharray:5}#mermaid-svg-EF7lhgUDGfRv5FNP .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-EF7lhgUDGfRv5FNP .error-icon{fill:#522}#mermaid-svg-EF7lhgUDGfRv5FNP .error-text{fill:#522;stroke:#522}#mermaid-svg-EF7lhgUDGfRv5FNP .edge-thickness-normal{stroke-width:2px}#mermaid-svg-EF7lhgUDGfRv5FNP .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-EF7lhgUDGfRv5FNP .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-EF7lhgUDGfRv5FNP .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-EF7lhgUDGfRv5FNP .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-EF7lhgUDGfRv5FNP .marker{fill:#333}#mermaid-svg-EF7lhgUDGfRv5FNP .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-EF7lhgUDGfRv5FNP {color: rgba(0, 0, 0, 0.75);font: ;}輸入賬戶密碼等讀取config.json獲取用戶信息進入網站登入打卡頁面填寫各種信息和驗證碼提交打卡結果并截圖1.打卡模塊
挑重點講講將這個驗證碼識別吧。我嘗試過本地的tessocr-OCR文本識別率感人,驗證碼純隨便。想用Opencv又感覺太浪費了。所以就去百度申請了一個ocr的api,免費的,有幾千調用次數。欸,白嫖就很舒服了。還有個小難點,這個驗證碼無法直接扒取,只能通過截圖保存。因此,需要在整張頁面中做一個自適定位并截取的工作。
附代碼:
2.郵件發送模塊
去email網站申請一個郵箱,并開通SMTP服務
import yagmail # 郵件發送模塊 import time#通過郵件將新生成的文件發送到自己的郵箱 def send_email(user_name,email,staus):yag = yagmail.SMTP(user='你的郵箱',password='密碼',host='主域名)t = time.localtime()send_time=time.strftime("%Y-%m-%d %H:%M:%S",t)contents = [user_name+'同學你好,你在'+send_time+'打卡'+staus[0]+'('+staus[1]+'),截圖已經上傳到附件,請查收']contents = contents + [staus[2]]yag.send(email, '請查看'+user_name+'的打卡結果', contents)print('------郵件發送成功啦!')3.定時啟動
這里直接百度cron 或者 crontab,網上有更詳細的教程,這里只做簡單記錄
這里是可供參考的教程
首先編輯定時任務列表
第一次使用會讓你選擇編輯器,我這里選vim,大家隨意。
在文件中添加
每天上午9點執行我的test.py腳本,并打印日志文件
注意自己板子上的時區。而且crontab執行腳本不會進入腳本所在路徑,所以有文件操作的地方需要注意路徑問題,即相對路徑會操作失敗,需要轉換成絕對路徑。:
效果圖展示
運行的界面
保存的截圖
收到的郵件
總結
以上是生活随笔為你收集整理的Ubuntu下利用python实现自动打卡系统全过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 贝叶斯网络(概率图模型)
- 下一篇: Lammps:Python上Ovito模