
本教程详细介绍了如何将ZKTeco考勤机(如K40、F18)的考勤数据集成到google Sheets或自定义在线服务器。通过开发中间程序获取设备数据,并在服务器端进行处理,最终利用Google apps Script的UrlFetch服务将jsON数据导入Google Sheets,有效解决了考勤设备无法直接进行http请求的集成难题。
一、理解集成挑战与核心思路
ZKTeco考勤设备,尤其是较早期的型号如K40和F18,通常不直接支持通过HTTP请求将数据推送到外部服务器。它们通常通过TCP/IP协议与PC端的SDK进行通信,或通过usb、串口导出数据。因此,要实现将考勤数据自动传输到Google Sheets或在线服务器,需要一个中间层来桥接设备与目标服务。
核心思路是:
- 数据获取层: 开发一个程序,利用ZKTeco提供的SDK或第三方库,通过TCP/IP协议连接考勤设备,定时获取考勤日志数据。
- 数据处理与暴露层: 将获取到的数据进行清洗、格式化,并存储到数据库或直接通过一个Web服务接口(API)以json格式对外提供。
- 数据消费层: Google Sheets通过Google Apps Script的UrlFetchApp服务,定时或手动调用Web服务接口,获取JSON数据并写入到电子表格中。
二、数据获取与服务器处理
这一阶段是整个集成的关键,需要一台运行稳定程序的服务器来与ZKTeco设备通信。
1. 选择合适的开发语言与库
ZKTeco通常会提供不同语言的SDK(如C++、java、.NET),或者社区中也有很多优秀的开源库可以用于与ZKTeco设备通信,例如:
- python: pyzk 是一个流行的Python库,可以用于连接ZKTeco设备,获取用户、考勤记录等信息。
- php: 虽然官方SDK较少直接支持PHP,但可以通过TCP/IP socket编程或者调用其他语言编写的中间件来实现。
以Python pyzk 为例,获取考勤数据的基础逻辑如下:
from pyzk.zk import ZK from pyzk.misc import get_connection # 替换为你的考勤机IP地址和端口 DEVICE_IP = '192.168.1.201' DEVICE_PORT = 4370 def get_attendance_logs(): conn = None try: conn = get_connection(DEVICE_IP, DEVICE_PORT) zk = ZK(conn) zk.disable_device() # 禁用设备,防止操作冲突 # 获取所有考勤记录 attendances = zk.get_attendance() attendance_list = [] for att in attendances: attendance_list.append({ 'uid': att.uid, 'user_id': att.user_id, 'timestamp': att.timestamp.strftime('%Y-%m-%d %H:%M:%S'), 'status': att.status, 'punch': att.punch }) zk.enable_device() # 重新启用设备 return attendance_list except Exception as e: print(f"Error connecting to ZKTeco device: {e}") return [] finally: if conn: conn.disconnect() if __name__ == '__main__': logs = get_attendance_logs() if logs: print(f"Fetched {len(logs)} attendance records.") # 在这里可以将logs数据存储到数据库,或通过Web框架暴露为API # 例如,使用flask或Django创建一个简单的API接口 else: print("No attendance logs fetched.")
2. 构建Web服务接口 (API)
获取到考勤数据后,你需要一个Web服务来将这些数据以JSON格式暴露出来,供Google Sheets调用。这可以通过任何Web框架实现,例如:
示例:使用PHP创建一个简单的JSON API
假设你已经有了一个机制(例如,一个定时任务)将考勤数据从设备获取并存储到了一个数据库中(例如mysql)。以下是一个简单的PHP脚本,用于从数据库读取数据并以JSON格式返回:
<?php header('Content-Type: application/json'); // 数据库连接配置 $servername = "localhost"; $username = "your_db_user"; $password = "your_db_password"; $dbname = "attendance_db"; $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die(json_encode(['error' => 'Database connection failed: ' . $conn->connect_error])); } $sql = "SELECT user_id, timestamp, status FROM attendance_logs ORDER BY timestamp DESC"; $result = $conn->query($sql); $attendance_data = []; if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { $attendance_data[] = $row; } } $conn->close(); echo json_encode($attendance_data); ?>
将此PHP文件部署到你的Web服务器上(例如 http://your-server.com/api/get_attendance.php),它将返回一个JSON数组,包含所有考勤记录。
三、Google Sheets集成:使用Apps Script获取数据
一旦你的服务器端API准备就绪,就可以在Google Sheets中使用Google Apps Script来获取并显示数据。
1. 打开Google Apps Script编辑器
在你的Google Sheets文档中,点击 扩展 > Apps Script。这将打开一个新的脚本项目。
2. 编写Apps Script代码
在脚本编辑器中,粘贴以下代码。确保将 your_api_url 替换为你实际的API地址。
/** * 从外部API获取ZKTeco考勤数据并写入Google Sheet。 */ function importZKTecoAttendance() { // 替换为你的服务器端API URL var apiUrl = 'http://your-server.com/api/get_attendance.php'; try { // 使用UrlFetchApp服务调用API var response = UrlFetchApp.fetch(apiUrl); var content = response.getContentText(); var json = JSON.parse(content); // 解析JSON字符串 // 获取当前活动的电子表格和工作表 var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // 清除旧数据(可选,根据需求决定是否清空) // sheet.clearContents(); // 设置表头 var headers = ['User ID', 'Timestamp', 'Status']; // 确保与API返回的JSON键名一致 sheet.getRange(1, 1, 1, headers.length).setValues([headers]).setFontWeight("bold"); // 准备要写入的数据 var data = []; for (var i = 0; i < json.length; i++) { var record = json[i]; data.push([ record.user_id, record.timestamp, record.status ]); } // 将数据写入工作表 if (data.length > 0) { // 从第二行开始写入数据 sheet.getRange(2, 1, data.length, headers.length).setValues(data); Logger.log('Successfully imported ' + data.length + ' records.'); } else { Logger.log('No data received from API.'); } } catch (e) { Logger.log('Error importing attendance data: ' + e.toString()); SpreadsheetApp.getUi().alert('数据导入失败', '发生错误: ' + e.toString(), SpreadsheetApp.getUi().ButtonSet.OK); } }
3. 运行与调试
在Apps Script编辑器中,选择 importZKTecoAttendance 函数,然后点击运行按钮(▶)。首次运行时,你需要授权脚本访问外部服务和你的Google Sheets。
4. 设置定时触发器(可选)
为了实现自动化,你可以设置一个定时触发器,让脚本定期运行:
- 在Apps Script编辑器的左侧导航栏中,点击 触发器 图标(时钟形状)。
- 点击右下角的 添加触发器 按钮。
- 配置触发器:
- 选择要运行的函数:importZKTecoAttendance
- 选择部署:Head
- 选择事件源:时间驱动型
- 选择时间类型:例如 小时计时器,然后选择频率(如每小时)。
- 点击 保存。
四、注意事项与总结
- 设备网络连接: 确保ZKTeco设备与你的服务器在同一个局域网内,或者服务器可以通过公网访问到设备(通常不推荐直接将考勤机暴露在公网)。
- 服务器稳定性: 运行数据获取和API服务的服务器需要保持稳定运行,并有良好的网络连接。
- 数据同步策略: 考虑是每次获取所有数据,还是只获取增量数据。对于大量数据,获取增量数据可以提高效率。这需要在你的服务器端程序中实现。
- 错误处理: 在Apps Script和服务器端代码中都应加入健壮的错误处理机制,以便在连接失败、数据解析错误等情况下能够及时发现问题。
- 安全性: 如果你的API暴露在公网,务必考虑安全性,例如使用API Key、OAuth或其他认证方式来保护你的数据接口。
- Google Apps Script配额: Google Apps Script对执行时间、UrlFetch调用次数等有每日配额限制,一般情况下足够使用,但如果数据量非常庞大或调用频率极高,需要留意。
通过上述分层的方法,即使ZKTeco考勤设备本身不具备高级网络功能,也能实现其考勤数据与Google Sheets或任何在线系统的无缝集成。这种模式不仅适用于考勤机,也适用于许多其他需要桥接传统硬件与现代云服务的场景。
以上就是ZKTeco考勤数据集成至Google Sheets或在线服务器实战教程的详细内容,更多请关注php中文网其它相关文章!