来自 yoyolife 的投稿。
可以钉钉打卡的途径很多,我没研究过。公司是用wifi连接打卡的。所以我自己做了一个。懒得去研究其他方法,也不想花钱。
刚好有闲置的树莓派,和一台闲置的安卓手机。
我只要用 adb 调起钉钉,钉钉就会自动打卡了。那么就开干吧。
安装 adb
1 2 | sudo apt-get update sudo apt-get install -y android-tools-adb android-tools-fastboot |
把手机设为不用密码
然后运行下面基础代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | import time import threading import os,subprocess import base64 import random PATH = lambda p: os.path.abspath(p) isScreenshoting = False #打卡 def onWork(): # 开个线程截图 ts = threading.Thread(target = runLoopScreenshot, args = ()) ts.setDaemon( True ) global isScreenshoting isScreenshoting = True ts.start() os.system( 'adb shell input keyevent 26' ) os.system( 'adb shell input keyevent 3' ) os.system( 'adb shell am start -n com.alibaba.android.rimet/com.alibaba.android.rimet.biz.SplashActivity' ) # 等15秒后关闭 time.sleep( 15 ) os.system( 'adb shell input keyevent 3' ) os.system( 'adb shell input keyevent 6' ) isScreenshoting = False # 打卡完毕 tend = threading.Thread(target = enddk, args = ()) tend.start() def enddk(): # 通知你想通知的地方 print ( "end" ) time.sleep( 10 ) def runLoopScreenshot(): global isScreenshoting while isScreenshoting: # os.popen("adb wait-for-device") s = os.popen( "adb shell screencap -p | base64" ).read() print (s) os.popen( "adb shell screencap -p /data/local/tmp/tmp.png" ) path = '/home/pi' os.popen( "adb pull /data/local/tmp/tmp.png " + PATH(path + "/s.png" )) # os.popen("adb shell rm /data/local/tmp/tmp.png") # 图片转了base64 可以发到你想发的地方 with open (path + "/s.png" , "rb" ) as f: base64_data = base64.b64encode(f.read()) print ( 'success' ) if __name__ = = '__main__' : # 设置多几个打卡时间 dakaTime = [ '08:49:40' , '08:47:32' , '08:53:25' ] nextDakaTime = None while True : try : # 看有没有设备连接 device = os.popen( 'adb devices -l' ).read() out = device.split( ' ' ) print ( '{"action":"device","data":"%s,%s,%s"}' % (out[ 11 ], out[ 12 ], out[ 13 ])) currentTime = time.strftime( "%H:%M:%S" , time.localtime()) if nextDakaTime = = None : r = random.randint( 0 , len (dakaTime) - 1 ) nextDakaTime = dakaTime[r] print (currentTime,nextDakaTime) if currentTime = = nextDakaTime: # 开个线程打卡 t = threading.Thread(target = onWork, args = ()) t.setDaemon( True ) t.start() except Exception as e: print ( "something wrong:" , e) time.sleep( 1 ) |
上面的代码我修改了但没测试过
因为我之前是通过mqtt发到我的手机上
现在我把mqtt去了。自行修改代码发到邮件通知也行,用 wxpy 发到微信也行。
新年要到了,最后祝大家以后迟到不用扣钱。
来自 yoyolife 的投稿,出处:http://www.yoyolife.fun:9000/blog/post/5e0f00a29b8672003000015d
哈哈,我今天刚考虑这个问题。但还好自己有一部iphonese,升级了ios14。写个自动化指令定时上下班调用钉钉,以后把手机放公司就可以了。
锁屏后自动化指令也无法执行啊,老兄,怎么解决的?
runLoopScreenshot()函数里没有任何的间隔,会不会导致不停地截图读取,从而造成性能的下降,加个sleep()函数会不会更好?
会的 改一下
如果是极速打卡的,这个方法可以实现。如果是拍照打卡呢
拍照打卡呢?
用不着树莓派来打卡,用免root自动化助手这个app就好了,而且adb是会自动断开连接的