清阳 - 苹果
type: channel
link: https://www.qingpc.com/tag/%E8%8B%B9%E6%9E%9C/
items: 苹果笔记本实现用户登录钉钉通知功能

苹果笔记本实现用户登录钉钉通知功能
type: item
date: 2024-07-29T13:53:00+00:00
description: 苹果笔记本实现用户登录钉钉通知功能需求描述公司有台苹果电脑会有多个用户使用。经常出现相互争抢的情况。所以计划实现以下功能：有用户登陆或者退出的时候发送通知消息到钉钉群。这样大家需要用电脑的时候先查询一下当前是否有用户在用，避免争抢。思路：添加系统的后台开机自启动任务，系统启动的时候，执行一个常驻后台任务，监控系统用户状态。有用户登陆的时候，发送消息到钉钉群。系统环境：MacOS 13.5系统账号：wiyigg创建mac守护进程配置以root权限在创建并编辑/Library/LaunchDaemons/com.test.loginevent.plist 文件，内容如下:<?xml version="1.0" encoding="UTF-8"?> Label com.test.loginevent ProgramArguments /usr/bin/python3 /usr/local/bin/logout.py RunAtLoad <true/> KeepAlive <false/> StandardOutPath /var/log/logout.stdout.log StandardErrorPath /var/log/logout.stderr.log 其中一下三行需要注意：com.test.loginevent //此程序功能注册后的名称，稍后用到/Users/wiyigg/myvenv/bin/python3.12 //python3程序路径，由于系统版本问题，所以另行安装了python3.12需要使用更高版本的python3.12虚拟环境，创建路径如上/usr/local/bin/logout.py //真正后台运行的python程序sudo mkdir /usr/local/bin编写后台程序Python脚本cat /usr/local/bin/logout.py#coding: utf-8 #代码中的 dingtalk_webhook_url 改成自己的钉钉群机器人webhook #"senderNick": "Hostname" Hostname是自己的电脑名字，用来标识的，对应修改 import subprocess import time import requests import json import socket from datetime import datetime # 钉钉Webhook URL 这里配置了运维业务报警群的机器人用于测试，后面根据需求进行修改 dingtalk_webhook_url = 'https//:xxxxxx' # 获取当前登录的用户列表 def get_logged_in_users(): try: # 使用 'who' 命令获取当前登录的用户 users_output = subprocess.check_output(['who'], text=True) users = set(line.split()[0] for line in users_output.strip().split('\n') if line) return users except subprocess.CalledProcessError as e: print(f"Error retrieving logged in users: {e}") return set() # 发送钉钉消息 def send_dingtalk_message(message): headers = {'Content-Type': 'application/json'} data = { "msgtype": "text", "text": { "content": message }, "senderNick": "Hostname" #这里是固定值，需要修改与当前主机一致 } try: response = requests.post(dingtalk_webhook_url, headers=headers, data=json.dumps(data)) except: return 0 #if response.status_code == 200: # print("Message sent to DingTalk successfully.") #else: # print(f"Failed to send message to DingTalk: {response.text}") # 存储上次登录的用户列表 last_logged_in_users = get_logged_in_users() # 主循环 while True: # 获取当前登录的用户列表 current_logged_…