python 实现钉钉日报自动定时发送

该博客介绍了一个使用Python编写的程序,用于自动化完成钉钉日报的提交流程。通过截图识别按钮并模拟点击,实现了从打开应用到提交日报的全过程。程序包括截屏、寻找按钮坐标、模拟点击等步骤,并设置了定时任务在特定时间自动运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公司要求每天需要发日报,由于每天的工作内容差异并不是很大一般都是通过导入上一篇日志进行提交,为了防止经常遗忘,使用python 做了这个小程序方便日报的提交。

大概的实现逻辑是

1、对整个日报提交流程中每一个步骤需要点击的按钮进行截图,并保存到指定目录下,将保存后的按钮按日报提交步骤进行排序

2、通过win32gui.FindWindow获取钉钉句柄,全屏打开钉钉界面

3、通过循环执行步骤的list,

        a)截屏

        b)查找按钮在截屏中位置坐标

        c)根据坐标位置点击对应按键,每个动作之间需要增加适当延时

流程相对比较简单以下是源码

# -*- encoding: utf-8 -*-
# 钉钉句柄:StandardFrame_DingTalk
# @author qianjianfeng
import time, threading
import win32gui, win32con
import aircv as ac
from PIL import ImageGrab
import pyautogui as pag
import os
import datetime
import sys
import win32com.client
from apscheduler.schedulers.blocking import BlockingScheduler
import pythoncom

"""
[("dd_1.jpg", "C:/Users/Qian/Desktop/pythonexe/dingdingrubao/dd_1.jpg", "DATA"),
 ("dd_2.jpg", "C:/Users/Qian/Desktop/pythonexe/dingdingrubao/dd_2.jpg", "DATA"),
 ("dd_2_1.jpg", "C:/Users/Qian/Desktop/pythonexe/dingdingrubao/dd_2_1.jpg", "DATA"),
 ("dd_3.jpg", "C:/Users/Qian/Desktop/pythonexe/dingdingrubao/dd_3.jpg", "DATA"),
 ("dd_4.jpg", "C:/Users/Qian/Desktop/pythonexe/dingdingrubao/dd_4.jpg", "DATA"),
 ("dd_4_1.jpg", "C:/Users/Qian/Desktop/pythonexe/dingdingrubao/dd_4_1.jpg", "DATA"),
 ("dd_5.jpg", "C:/Users/Qian/Desktop/pythonexe/dingdingrubao/dd_5.jpg", "DATA"),
 ("dd_6.jpg", "C:/Users/Qian/Desktop/pythonexe/dingdingrubao/dd_6.jpg", "DATA")],
"""


# hwnd_active = win32gui.GetForegroundWindow()
# print('hwnd_active hwnd:', hwnd_active)
# print('hwnd_active text:', win32gui.GetWindowText(hwnd_active))
# print('hwnd_active class:', win32gui.GetClassName(hwnd_active))
def resource_path(relative):
    if hasattr(sys, "_MEIPASS"):
        return os.path.join(sys._MEIPASS, relative)
    return os.path.join(relative)


# 钉钉截屏临时文件
fp = os.path.join(sys._MEIPASS)
SCREENSHORT = '%s\dd_shortscreen.jpg' % fp
print("SCREENSHORT = %s" % SCREENSHORT)
# 获取按扭坐标位置
DD_1 = resource_path(os.path.join("%s.jpg" % "dd_1"))
DD_2 = resource_path(os.path.join("%s.jpg" % "dd_2"))
DD_2_1 = resource_path(os.path.join("%s.jpg" % "dd_2_1"))
DD_3 = resource_path(os.path.join("%s.jpg" % "dd_3"))
DD_4 = resource_path(os.path.join("%s.jpg" % "dd_4"))
DD_4_1 = resource_path(os.path.join("%s.jpg" % "dd_4_1"))
DD_5 = resource_path(os.path.join("%s.jpg" % "dd_5"))
DD_6 = resource_path(os.path.join("%s.jpg" % "dd_6"))
DD_6_1 = resource_path(os.path.join("%s.jpg" % "dd_6"))

"""
root = os.getcwd()
SCREENSHORT = '%s\dd_shortscreen.jpg' % root
# 获取按扭坐标位置
DD_1 = '%s\dd_1.jpg' % root
DD_2 = '%s\dd_2.jpg' % root
DD_2_1 = '%s\dd_2_1.jpg' % root
DD_3 = '%s\dd_3.jpg' % root
DD_4 = '%s\dd_4.jpg' % root
DD_4_1 = '%s\dd_4.jpg' % root
DD_5 = '%s\dd_5.jpg' % root
DD_6 = '%s\dd_6.jpg' % root
DD_6_1 = '%s\dd_6.jpg' % root
"""

# 日报提交五个步骤
step_list = [DD_1, DD_2, DD_2_1, DD_3, DD_4, DD_4_1, DD_5, DD_6, DD_6_1]
#print(step_list)

# 计划任务时间
PLAN_HOUR = 23  # 小时
PLAN_MINUTE = 0;  # 分钟


# 截屏
def screenShot(image_name):
    im = ImageGrab.grab()
    im.save(image_name)


# 模拟移动到对应坐标点,进行鼠标单击
def OnClick(pos):
    pag.moveTo(pos[0], pos[1])
    pag.click()


# 模拟移动到对应坐标点,进行键盘输入
def OnTypeInput(pos, price):
    pag.moveTo(pos[0] + 10, pos[1] + 10)
    pag.doubleClick()
    pag.press("del")
    pag.typewrite(price)


def getBtLocation(imsrc, imobj):
    screenShot(SCREENSHORT)
    imsrc = ac.imread(imsrc)
    imobj = ac.imread(imobj)
    pos = ac.find_template(imsrc, imobj)
    print(pos)
    circle_center_pos = pos['result']
    print(circle_center_pos[0])
    print(circle_center_pos[1])
    return circle_center_pos


# win32gui启动钉钉
def find_window_movetop(topOrback):
    pythoncom.CoInitialize()
    hwnd = win32gui.FindWindow("StandardFrame_DingTalk", "钉钉")
    shell = win32com.client.Dispatch("WScript.Shell")
    shell.SendKeys('%')
    win32gui.ShowWindow(hwnd, topOrback)
    # win32gui.ShowWindow(hwnd, win32con.SHOW_FULLSCREEN) #显示在最前且最大化
    # win32gui.ShowWindow(hwnd, win32con.SW_RESTORE) #重新显示在最前端
    win32gui.SetForegroundWindow(hwnd)
    rect = win32gui.GetWindowRect(hwnd)
    return rect


def main():
    today = datetime.datetime.now().weekday()
    if today == 6:
        return
    find_window_movetop(win32con.SHOW_FULLSCREEN)
    time.sleep(2)
    for x in step_list:
        try:
            OnClick(getBtLocation(SCREENSHORT, x))
        except Exception:
            print_message(Exception)
        if x == step_list[5]:
            pag.scroll(-10000)
        """
        if x == step_list[0]:
            if win32api.GetSystemMetrics(win32con.SM_CXSCREEN) == 1366 and win32api.GetSystemMetrics(win32con.SM_CYSCREEN) == 768:
                pag.scroll(-500)
        """
        if x == step_list[1]:
            time.sleep(12)
        else:
            time.sleep(10)
    if os.path.exists(SCREENSHORT):
        os.remove(SCREENSHORT)
    find_window_movetop(win32con.HIDE_WINDOW);


def print_message(message):
    print("\033[1;32m" + "#### %s ####" % message + "\033[0m")


def time_thread():
    print_times()
    sched = BlockingScheduler()
    sched.add_job(main, 'cron', hour=PLAN_HOUR, minute=PLAN_MINUTE)
    sched.start()


def print_times():
    now = datetime.datetime.now()
    sys.stdout.write(
        "\r钉钉日报将会在每天晚上{:0>2d}:{:0>2d}自动执行发送. 当前时间 : {:0>2d}:{:0>2d}:{:0>2d}".format(
            PLAN_HOUR, PLAN_MINUTE, now.hour, now.minute, now.second))
    sys.stdout.flush()
    t = threading.Timer(1.0, print_times)
    t.start()


if __name__ == "__main__":
    try:
        if (sys.argv[1] != ''):
            if sys.argv[1] == "now":
                main()
    except:
        print("argv empty! start time thread")
        time_thread()

<think>好的,用户想找关于设置定时提醒日报的方法,如何通过程序或工具实现每日定时提醒记录工作日志。我需要结合提供的引用内容来给出建议。 首先,引用1提到项目中用了一个表记录定时任务的执行情况,每天执行一次。这可能涉及到定时任务框架,比如在Java中使用@Scheduled注解或者类似的机制。引用2提到了Java动态创建定时任务的例子,需要@EnableScheduling注解,这可能是一个方向。而引用3则提到信息整理和提醒工具,比如Kimi这样的AI助手,可能用户对第三方工具也感兴趣。 用户可能需要两种解决方案:一种是编程实现,比如用Java或Python设置定时任务,另一种是使用现有工具。需要分点说明,结构清晰。 编程方面,Java可以用Spring的@Scheduled,Python可以用apscheduler库。例如,引用2中的代码示例可以引导用户如何在Java中设置定时任务,每天触发提醒。同时,引用1中的表记录执行情况,可以确保任务每天只执行一次,避免重复。 工具方面,引用3提到的Kimi AI助手可能适合用户,可以设置定时提醒。另外,常见的工具如手机提醒、日历应用、Todoist等也适用。需要列举几种工具,说明如何设置。 还要注意用户可能需要代码示例,比如Python或Java的定时任务代码,以及如何集成到日报记录中。同时,提醒用户测试定时任务,确保触发正确。 最后,生成相关问题,帮助用户进一步探索,比如优化定时任务、处理时区问题等。</think>### 如何通过程序或工具实现每日定时提醒记录工作日志 #### 一、编程实现定时提醒(以Java和Python为例) 1. **Java Spring Boot定时任务** 引用[2]中提到的动态创建定时任务方法,结合`@Scheduled`注解可实现每日固定时间触发提醒: ```java @Component public class DailyReminder { @Scheduled(cron = "0 0 18 * * ?") // 每天18:00触发 public void remindLog() { System.out.println("请及时填工作日报!"); // 可扩展:发送邮件、企业微信消息等 } } ``` 需在启动类添加`@EnableScheduling`注解,并确保任务执行时间与服务器时区一致[^2]。 2. **Python APScheduler库** 使用轻量级定时任务库实现跨平台提醒: ```python from apscheduler.schedulers.blocking import BlockingScheduler def daily_reminder(): print("请记录今日工作日志!") # 可扩展:调用通知API或弹窗 scheduler = BlockingScheduler() scheduler.add_job(daily_reminder, 'cron', hour=18, minute=0) scheduler.start() ``` #### 二、使用现有工具实现 1. **办公软件集成** - **企业微信/钉钉机器人**:通过后台配置定时提醒消息,自动推送到指定群组或个人。 - **Microsoft Outlook日历**:创建重复事件并设置每日提醒弹窗。 2. **效率工具推荐** 引用[3]提到的信息整理场景,可结合AI工具增强体验: - **Kimi助手**:自定义每日固定时间触发信息整理提示,支持语音或文字交互。 - **Todoist/TickTick**:设置每日重复任务,绑定多平台通知(手机/电脑)。 - **iOS快捷指令/安卓Tasker**:编自动脚本,触发特定时间的声音或弹窗提醒。 #### 三、结合数据库记录状态(进阶) 引用[1]中提到的“表记录定时任务执行情况”,可扩展为日志记录系统: ```sql CREATE TABLE task_log ( id INT AUTO_INCREMENT PRIMARY KEY, task_name VARCHAR(50), last_exec_time DATETIME ); ``` 程序启动时检查`last_exec_time`是否为当天,若非当天则触发提醒并更新记录[^1]。 #### 四、注意事项 1. 测试时区配置,避免因服务器时区差异导致提醒不准 2. 多端同步建议采用云服务(如Firebase、阿里云函数) 3. 重要日志提醒建议叠加多种通知方式(邮件+APP推送)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冇罪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值