打卡

Posted Hugo-Martin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了打卡相关的知识,希望对你有一定的参考价值。

1.问题:将5元的人民币兑换成1元、5角和1角的硬币,共有多少种不同的兑换方法。

2.思路:列举3元1次方程 10x+5y+z=50 的所有解

3.程序设计图:

 

4.代码实现:

#include <stdio.h>

int main()

int one_yuan = 0, five_jiao = 0, one_jiao = 0;
int cnt = 0; //兑换方法个数
for(one_yuan = 0; one_yuan <= 5; one_yuan++)
for(five_jiao = 0; five_jiao <= 10; five_jiao++)
for(one_jiao = 0; one_jiao <= 50; one_jiao++)
if(one_yuan * 10 + five_jiao * 5 + one_jiao == 50)

cnt++;
printf("%2d枚1元 %2d枚5角 %2d枚1角 \\t ", one_yuan, five_jiao, one_jiao);
if(cnt % 3 == 0)
printf("\\n");

printf("\\n总共%d种兑换方法\\n", cnt);
return 0;

员工考勤打卡时,如何避免非本人代替打卡?

摘要:使用APP进行打卡时,为避免非本人及非真人现场打卡的情况出现,想结合华为云的人脸识别能力,通过调用API,达成可检测是否本人且真人现场打卡的效果。

本文分享自华为云社区《​​员工考勤打卡时,如何避免非本人代替打卡?​​》,作者: HuaweiCloudDeveloper 。

1、背景

使用APP进行打卡时,为避免非本人及非真人现场打卡的情况出现,想结合华为云的人脸识别能力,通过调用API,达成可检测是否本人且真人现场打卡的效果。

2、云服务介绍

华为云FRS:人脸识别服务(Face Recognition Service),能够在图像中快速检测人脸、分析人脸关键点信息、获取人脸属性、实现人脸的精确比对和检索。该服务可应用于身份验证、电子考勤、客流分析等场景。

华为云FunctionGraph:函数工作流(FunctionGraph)是一项基于事件驱动的函数托管计算服务。通过函数工作流,只需编写业务函数代码并设置运行的条件,无需配置和管理服务器等基础设施,函数以弹性、免运维、高可靠的方式运行。

华为云APIG:API网关(API Gateway)是为企业开发者及合作伙伴提供的高性能、高可用、高安全的API托管服务, 帮助企业轻松构建、管理和部署不同规模的API。简单、快速、低成本、低风险的实现内部系统集成、成熟业务能力开放及业务能力变现。

华为云OBS: 对象存储服务(Object Storage Service,OBS)是一个基于对象的海量存储服务,为客户提供海量、安全、高可靠、低成本的数据存储能力,使用时无需考虑容量限制,并且提供多种存储类型供选择,满足客户各类业务场景诉求。

华为云DNS:云解析服务(Domain Name Service)提供高可用,高扩展的权威DNS服务和DNS管理服务,把人们常用的域名或应用资源转换成用于计算机连接的IP地址,从而将最终用户路由到相应的应用资源上。此服务默认开通,免费使用。

3 、方案设计

3.1 方案简述

通过APIG调用functiongraph函数,在functiongraph上完成人脸识别-活体检测、人脸识别-人脸比对等API的调用,并将响应结果通过API返回给APP。实现APP调用一次API即可完成人脸识别的功能。

  1. 人脸识别服务的人脸比对功能,可实现检测是否其本人打卡。
  2. 人脸识别服务的活体检测功能,可实现检测是否活人打卡。
  3. 使用Functiongraph的函数,APP端只需考虑调用一个API,且只需考虑人脸识别的总体输入和返回结果。
  4. Functiongraph由APIG来调用,利用APPkey、APPsecret及HTTPS,解决了APP端调用的安全认证等问题。
  5. OBS桶用来存储人脸照片,通过约定的用户标识做文件存储路径,易于管理和使用。

3.2 方案架构图

员工考勤打卡时,如何避免非本人代替打卡?_人脸识别

0、初始化:前置准备工作,新建一个OBS桶做人脸库,将员工的人脸照片存放到人脸库,并把以user-id 或自定义字段作为路径,标识员工。

1、员工登录APP后,进行人脸识别时,将通过APIG来调用functionGraph,上传关键信息:摄像头捕获的照片或视频、员工的人脸库标识(user-id)。

2、functionGraph调用活体检测API,传入照片/视频(根据需求选择动作活体检测/静默活体检测,推荐静默活体检测)。

注:本方案采用静默活体检测方式,APP端上传的照片提前转换为base64格式

3、活体检测API返回响应:有confidence、picture(base64)。

4、在functionGraph中调用OBS接口,通过user-id从OBS人脸库获取库中的员工照片。

5、通过代码将从OBS获取的照片文件,转换为base64格式。

6、将两个base64格式的照片作为输入参数调用人脸比对API 。(备注:此处可根据需求,是否需要多次调用API,使用多个照片进行验证)

7、人脸比对API返回包含了similarity的响应。

8、functionGraph将similarity、confidence传回给APP/后端。(备注:也可直接在functionGraph完成判定,返回人脸识别结果)

3.3 Functiongraph实现代码

代码附件:(附件请见文章最后)

代码时序图:

员工考勤打卡时,如何避免非本人代替打卡?_华为云FunctionGraph_02

4、方案部署

4.1 部署流程图

员工考勤打卡时,如何避免非本人代替打卡?_考勤打卡_03

4.2 前置准备

  • 拥有已实名认证的华为云账号,开通云服务functiongraph、人脸比对、活体检测、OBS
  • 注册公网域名,完成ICP备案

4.3、创建OBS人脸库

4.3.1 创建OBS桶

参考帮助文档:​https://support.huaweicloud.com/qs-obs/obs_qs_0007.html​创建私有桶

4.3.2 上传对象

参考帮助文档: ​https://support.huaweicloud.com/qs-obs/obs_qs_0008.html​,上传对象,建立OBS人脸库。

要求:文件的路径使用用户标识(如userid)命名

员工考勤打卡时,如何避免非本人代替打卡?_自定义_04

4.4 Functiongraph搭建

4.4.1 创建委托

登录IAM控制台(​https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/agencies​

1)创建委托

员工考勤打卡时,如何避免非本人代替打卡?_考勤打卡_05

委托名称:自定义

委托类型:云服务

云服务:函数工作流functiongraph

持续时间:永久

员工考勤打卡时,如何避免非本人代替打卡?_华为云FunctionGraph_06

2)选择策略

OBS:获取对象等基本操作权限

FRS:fullaccess

APIG:fullaccess

员工考勤打卡时,如何避免非本人代替打卡?_人脸识别_07

3)设置最小授权范围,此处选择所有,实际可根据项目情况分配。

员工考勤打卡时,如何避免非本人代替打卡?_考勤打卡_08

4)完成委托创建

员工考勤打卡时,如何避免非本人代替打卡?_人脸识别_09

4.4.2 上传FRS依赖包

因functiongraph公共的依赖包中,FRS-SDK不是最新的(无静默活体检测API),故我们需上传最新的FRS-SDK,作为依赖包。

1)从官网获取FRS-SDK下载路径

​https://sdkcenter.developer.huaweicloud.com/?language=python​

2)下载整个Python-v3的SDK

https://github.com/huaweicloud/huaweicloud-sdk-python-v3

下载后解压,进入内部,找到frs后缀的SDK

进入SDK目录,在setup所在的目录,全部选择进行压缩。压缩成功后,需要确保setup文件在压缩包的根目录下

员工考勤打卡时,如何避免非本人代替打卡?_自定义_10

将压缩好的文件,上传到functiongraph的依赖包管理。

员工考勤打卡时,如何避免非本人代替打卡?_华为云FRS_11

依赖包名称:自定义

运行时语言:2.7

描述:自定义

上传方式:上传ZIP文件

员工考勤打卡时,如何避免非本人代替打卡?_考勤打卡_12

4.4.3 创建函数

1)进入functiongraph控制台创建函数。

Functiongraph版本:functiongraph v2

函数类型:事件函数

函数名称:自定义

所属应用:默认

委托名称:选择创建的委托(如无,请点击右边的 创建委托 前往创建,创建步骤参考4.4.1)

企业项目:自行选择

自定义函数:关闭

运行时语言:Python2.7

函数执行入口:Index.handler

代码上传方式:静默代码

员工考勤打卡时,如何避免非本人代替打卡?_自定义_13员工考勤打卡时,如何避免非本人代替打卡?_考勤打卡_14

4.4.4 编辑函数代码

将示例代码复制进来,编辑相关默认变量的值

1)粘贴3.3节的代码至index.py中

员工考勤打卡时,如何避免非本人代替打卡?_人脸识别_15

2)根据自己项目情况,设置默认Region、endpoint、buketname的值,若4.4.6节不设置环境变量的值,将默认取此处的默认值。如下默认是北京四

员工考勤打卡时,如何避免非本人代替打卡?_人脸识别_16

3)编辑完成后,点击保存

员工考勤打卡时,如何避免非本人代替打卡?_华为云FunctionGraph_17

4.4.5 添加依赖包

1)在函数菜单-代码页,点击添加-依赖代码包

员工考勤打卡时,如何避免非本人代替打卡?_华为云FRS_18

2)在公共依赖包,搜索obs,勾选OBS-sdk

员工考勤打卡时,如何避免非本人代替打卡?_华为云FunctionGraph_19

3)在私有依赖包,勾选前面步骤上传的frs-sdk,然后确定保存

员工考勤打卡时,如何避免非本人代替打卡?_考勤打卡_20

4.4.6 编辑环境变量

在函数菜单-配置页,添加环境变量:region、bucketname(OBS桶名)、endpoint

若此处不设置环境变量,则函数会使用4.4.4节代码设置的默认值。

员工考勤打卡时,如何避免非本人代替打卡?_华为云FRS_21

4.4.7 调试函数

1)点击配置测试事件

员工考勤打卡时,如何避免非本人代替打卡?_华为云FRS_22

2)选择apig的事件模板,添加body的内容和queryStringParameters的userid,进行保存。

员工考勤打卡时,如何避免非本人代替打卡?_自定义_23

3)点击测试,运行完毕可查看执行结果。

员工考勤打卡时,如何避免非本人代替打卡?_华为云FunctionGraph_24

4.5 添加APIG

4.5.1 添加APIG触发器

1)在函数菜单-触发器页,点击创建触发器

员工考勤打卡时,如何避免非本人代替打卡?_华为云FRS_25

触发器类型:API网关服务(APIG)

API名称:自定义

分组:选择API分组(如无点击右边 创建分组 进行创建)

发布环境:RELEASE(如无点击右边 创建发布环境 进行创建)

安全认证:测试环境可选择None(后面可编辑进行更改)

请求协议:测试环境可选择HTTP(后面可编辑进行更改)

后端超时(毫秒):5000

员工考勤打卡时,如何避免非本人代替打卡?_考勤打卡_26

2)创建完成后,在触发器页面会添加一个APIG触发器,提供访问URL

员工考勤打卡时,如何避免非本人代替打卡?_自定义_27

4.5.2 编辑APIG

1)点击APIG触发器名称,前往APIG控制台,点击编辑

员工考勤打卡时,如何避免非本人代替打卡?_自定义_28

2)编辑基本信息

此处可更改安全认证,为方便调试,此处保持无认证

员工考勤打卡时,如何避免非本人代替打卡?_人脸识别_29

3)定义API请求

此处需添加API的请求参数-用户标识,用于functiongraph中,取在OBS人脸照片库中的员工照片。

员工考勤打卡时,如何避免非本人代替打卡?_考勤打卡_30

4)定义后端服务

添加后端服务参数,跟前面的入参做一个映射。

因为是在functiongraph创建的APIG,故此处已自动绑定functiongraph的函数为后端服务,故基础定义保持默认即可。

员工考勤打卡时,如何避免非本人代替打卡?_自定义_31

5)返回结果基础定义

返回结果的响应示例,暂设置为空即可,点击完成。

员工考勤打卡时,如何避免非本人代替打卡?_自定义_32

4.5.3 调试API

1)API详情页,点击调试,跳转到API调试页面

员工考勤打卡时,如何避免非本人代替打卡?_人脸识别_33

2)输入相关请求参数,发起请求,进行调试。

员工考勤打卡时,如何避免非本人代替打卡?_考勤打卡_34

4.5.4 发布API

编辑完成后的API,需要进行发布,公网才可访问

员工考勤打卡时,如何避免非本人代替打卡?_人脸识别_35员工考勤打卡时,如何避免非本人代替打卡?_华为云FunctionGraph_36

4.6 绑定独立域名

子域名仅供开发测试使用,每天最多访问1000次。如需开发服务,则需为API所在分组绑定独立域名。

4.6.1 添加记录集

1、登录云解析控制台(也可使用其他平台,已完成ICP备案的域名),选择域名解析》公网域名,点击需要创建记录集的域名名称。

员工考勤打卡时,如何避免非本人代替打卡?_华为云FRS_37

2、添加记录集

员工考勤打卡时,如何避免非本人代替打卡?_考勤打卡_38

填写以下信息

主机记录:域名前缀,如face-test

类型:选择CNAME – 将域名指向另外一个域名

别名:默认即可

线路类型:默认即可

TTL(秒):默认即可

值:填写要指向的别名(此处为APIG上的子域名)

员工考勤打卡时,如何避免非本人代替打卡?_华为云FunctionGraph_39

添加成功

员工考勤打卡时,如何避免非本人代替打卡?_考勤打卡_40

4.6.2 添加自定义域名

1、在API详情页-总览,点击添加增加自定义域名。

员工考勤打卡时,如何避免非本人代替打卡?_人脸识别_41

2、跳转到API所在分组的域名管理控制台,点击绑定独立域名

员工考勤打卡时,如何避免非本人代替打卡?_考勤打卡_42

3、输入前面创建的记录集,点击确定。(如果是刚添加的记录集需刷新,约等5分钟)

员工考勤打卡时,如何避免非本人代替打卡?_人脸识别_43

添加完后,即可在公网通过自定义域名,访问APIG。

员工考勤打卡时,如何避免非本人代替打卡?_华为云FunctionGraph_44

4.7 问题记录

1、并发测试API时,发现偶现以下错误

错误1:人脸比对传入的base64字符串无法识别

员工考勤打卡时,如何避免非本人代替打卡?_人脸识别_45

错误2:数据传输被提前终止了

员工考勤打卡时,如何避免非本人代替打卡?_考勤打卡_46

问题定位:因函数中的存储到本地的文件用的是同一个路径,并发操作时出现异步的同时占用一个路径,从而导致文件有丢失或文件转码有误

解决方案:给函数中的文件路径配置上时间戳,避免并发操作时,交叉操作同一个文件。

2、APIG错误码请参考:​​https://support.huaweicloud.com/usermanual-apig/apig-ug-180530090.html​

3、使用APIG触发functiongraph时,发现第一个api请求响应时间较长(2s多),后面的请求就较短了(约500ms)。

问题定位:超过一分钟无调用函数时,函数会销毁。再次进行函数调用时,需要重新启动实例,所以第一次调用时间会比较长。

解决方案:设置预留实例,来消除冷启动效果。预留实例是为指定函数版本单独预留的函数运行实例,不同于普通的函数实例,预留实例长期存活,可以达到消除函数冷启动的效果。

预留实例需要提交工单开通,​详情请参考:https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0306.html306.html

5、后期思考

本方案的人脸比对,只比对一次。若人脸库中,用户的库照片有多个,是否需要遍历对比,取总体对比的结果。如对比多次,需要考虑从OBS获取照片、人脸比对的API要多次调用,性能下降、费用提升等。

员工考勤打卡时,如何避免非本人代替打卡?_考勤打卡_47附件:​index.zip​2.62KB


点击关注,第一时间了解华为云新鲜技术~

以上是关于打卡的主要内容,如果未能解决你的问题,请参考以下文章

从 SQL Server 中的多个打卡或多个打卡中获取打卡和打卡时间

打卡无效此记录已被更新会罚款吗

学习打卡功能上线,告别懒惰,坚持学习!

员工考勤打卡时,如何避免非本人代替打卡?

指纹的打卡机是否插电就可以?用连接电脑么?

企业微信上下班打卡怎么改定位