用树莓派来实现钉钉打卡

来自 yoyolife 的投稿。

可以钉钉打卡的途径很多,我没研究过。公司是用wifi连接打卡的。所以我自己做了一个。懒得去研究其他方法,也不想花钱。

刚好有闲置的树莓派,和一台闲置的安卓手机。

我只要用 adb 调起钉钉,钉钉就会自动打卡了。那么就开干吧。

安装 adb


sudo apt-get update

sudo apt-get install -y android-tools-adb android-tools-fastboot

把手机设为不用密码

然后运行下面基础代码


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

这是一篇发布于 4年 前的文章,其中的信息可能已经有所发展或是发生改变,请了解。


7 评论

  1. 哈哈,我今天刚考虑这个问题。但还好自己有一部iphonese,升级了ios14。写个自动化指令定时上下班调用钉钉,以后把手机放公司就可以了。

  2. runLoopScreenshot()函数里没有任何的间隔,会不会导致不停地截图读取,从而造成性能的下降,加个sleep()函数会不会更好?

发表评论

你的邮件地址不会公开


*