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文件都复制进去
cd ./chromium/
sudo dpkg -i *.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,免费的,有几千调用次数。欸,白嫖就很舒服了。还有个小难点,这个验证码无法直接扒取,只能通过截图保存。因此,需要在整张页面中做一个自适定位并截取的工作。
附代码:
def Analyze_code(screen_shot,chrom_driver):element = chrom_driver.find_element_by_xpath('//*[@id="app"]/div/div[3]/div[7]/div/img') #找验证码图片#print(element.location) # 打印元素坐标#print(element.size) # 打印元素大小left = element.location['x']top = element.location['y']/2 #这里要除以2,不知道为啥得到的y轴像素有问题right = element.location['x'] + element.size['width']bottom = element.location['y'] + element.size['height']image = Image.open(screen_shot)cropped = image.crop((left, top, right, bottom))cropped.save('pil_cut_thor.png')#调用tesserocr的image_to_text()方法,传入image对象完成识别# cropped = image.crop(( 720-200, 2400-300,720,2400-180)) # (left, upper, right, lower)# cropped.save("pil_cut_thor.png")time.sleep(0.2)'''#本地识别#新建Image对象#调用tesserocr的image_to_text()方法,传入image对象完成识别check = Image.open("pil_cut_thor.png")time.sleep(0.2)result = tesserocr.image_to_text(check)print(result)return result'''#在线识别# 二进制方式打开图片文件f = open("pil_cut_thor.png", 'rb')img = base64.b64encode(f.read())params = {"image":img}access_token = '自己申请’request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"request_url = request_url + "?access_token=" + access_tokenheaders = {'content-type': 'application/x-www-form-urlencoded'}response = requests.post(request_url, data=params, headers=headers)if response:print (response.json())response_json = json.dumps(response.json()) #解析jsonraw_check_num = json.loads(response_json)['words_result'][0]['words']check_num = raw_check_num.replace( " ","")print("验证码为:"+check_num)return check_num
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,网上有更详细的教程,这里只做简单记录
这里是可供参考的教程
首先编辑定时任务列表
sudo crontab -e
第一次使用会让你选择编辑器,我这里选vim,大家随意。
在文件中添加
0 9 * * * /home/orangepi/auto_test/test.py >> /home/orangepi/auto_test/test.log 2>&1
每天上午9点执行我的test.py脚本,并打印日志文件
注意自己板子上的时区。而且crontab执行脚本不会进入脚本所在路径,所以有文件操作的地方需要注意路径问题,即相对路径会操作失败,需要转换成绝对路径。:
orangepi@orangepizero2: timedatectl set-timezone Asia/Shanghai
orangepi@orangepizero2: date -R
Wed, 12 May 2021 13:47:56 +0800
absolutepath=os.path.dirname(os.path.abspath(__file__))+'/'
效果图展示
运行的界面
保存的截图
收到的邮件
Ubuntu下利用python实现自动打卡系统全过程相关推荐
- 打卡签到python代码_如何利用Python实现自动打卡签到
需求描述 我们需要登录考勤系统(网页端,非手机端)进行签到,如果不想每天都早早起来打卡签到,就可以通过写程序实现这一功能. 业务梳理 通过长时间的早起打卡签到发现规律,我每天只是不停的点击,签到,都是 ...
- python 打卡程序_如何利用Python实现自动打卡签到
需求描述 我们需要登录考勤系统(网页端,非手机端)进行签到,如果不想每天都早早起来打卡签到,就可以通过写程序实现这一功能. 业务梳理 通过长时间的早起打卡签到发现规律,我每天只是不停的点击,签到,都是 ...
- 利用python脚本自动发布服务之arcmap篇
最近在学习arcpy,参考官方帮助文档及一些博客文章练习了下利用python脚本自动发布各中server服务,顺便将把发布的流程以及遇到的问题进行记录总结.用的是Python2.x,ArcGIS Pr ...
- 利用Python实现自动批量图片格式转换
文章目录 利用Python实现自动批量图片格式转换 0.背景 1.简单思路 2.进一步改进 3.最终版本 4.总结 利用Python实现自动批量图片格式转换 0.背景 在一个漫画网站下载了一些图片,但 ...
- Python进行网页自动打卡系统
Python进行网页自动打卡系统 安装Python 下载Chromedriver 安装selenium 设置定时自动运行 Python程序 安装Python 可以直接Python官网下载,需要进行路径 ...
- Ubuntu下使用Python调用乐视三合一摄像头
Ubuntu下使用Python调用乐视三合一摄像头 前言 配置过程 参考资料 前言 上一篇文章https://blog.csdn.net/qq_44847636/article/details/1 ...
- Ubuntu下,Python版本查询、默认版本更改、终端字体背景颜色设置、Ubuntu中文语言设置、VMware中界面大小调整
Ubuntu下,Python初步配置及终端设置 1.Python 版本查询 2.如何修改Ubuntu默认Python版本 3.Ubuntu终端字体颜色调整 4.Ubuntu中文语言设置 5.VMwar ...
- Ubuntu下利用JDK的Keytool配置Tomcat7.0的SSL协议
Ubuntu下利用JDK的Keytool配置Tomcat7.0的SSL协议: 1.用JDK自带的Keytool生成服务器证书: 1)打开终端控制台,转向tomcat主目录,执行生成keystore ...
- ubuntu下使用python将ppt转成图片_Ubuntu下使用Python实现游戏制作中的切分图片功能...
本文实例讲述了Ubuntu下使用Python实现游戏制作中的切分图片功能.分享给大家供大家参考,具体如下: why 拿到一个人物行走的素材,要用TexturePacker打包.TexturePacke ...
- Ubuntu下增加Python的PATH环境变量
Ubuntu下增加Python的PATH环境变量 1. Ubuntu专有方式 编辑 /etc/ld.so.conf 文件,如果以下语句不存在,则加入: include /etc/ld.so.conf. ...
最新文章
- Java Calendar 类的时间操作
- SQL脚本:监控当前重做日志文件使用情况
- [转载]编译中的常见分析方法
- 显微镜自动聚焦原理是什么_什么是共聚焦显微镜?你了解过共聚焦显微镜吗?...
- in-place数据交换
- mysql查询只能是等式连接_mysql连接查询
- 立即修复!微软史上最严重漏洞之一 Netlogon 细节被公开,三秒接管企业网络
- 少样本文本分类 InductionNet
- 关于UIControl响应事件说明
- 2021-07-31mysql连接 基本语句
- 单容水箱液位pid控制实验报告_过程控制实验-单容水箱液位控制系统
- linux tar压缩文件命令,linux解压压缩命令tar详解
- 微信公众号中视频下载的2种方法
- 独立站谷歌付费广告关键词选词技巧实操
- 支付宝支付之“单笔转账到支付宝账户接口”的调用(生成签名、上传应用公钥、下载SDK、接口调用、报错自动排查、查看错误码)
- 微信小程序中使用Echarts(折线图)
- 解读测试能力素质模型
- 入职宇宙条之后,我知道了这些
- 北京师范大学网络教育高级c 语言作业答案,北京师范大学网络教育教育心理学离线作业及答案...
- 搜狗输入法如何java_搜狗拼音输入法LINUX版安装
热门文章
- ASCII码值转化十六进制,十进制数;十六进制字符值转十进制,ASCII码值;
- 看不懂简明python教程_简明python教程
- android 计步器acc,基于加速度的门限检测计步算法设计
- win10如何固定ip地址
- Error:Execution failed for task ‘:app:preDebugAndroidTestBuild’. Conflict with dependency ‘com.andr
- Apache-Commons-FileIOUtils工具类常用方法使用
- 仿QQ音乐(HTML+CSS)
- 7 个有趣的 Python 实战项目,超级适合练手
- Faster R-CNN算法
- Fast R-CNN算法