林志伟,王庆九,马超虹,谢礼礼,吴森洋
(1.浙江大学 机械工程学院, 杭州 310027; 2.浙江大学 a.实验室与设备管理处, b.工程训练(金工)中心, 杭州 310058)
签到就是签到人将自己的姓名、编号或联系方式等有效信息以各种方式进行登记记录的过程,是考勤的一种重要方式。对任何签到系统,其基本需求是能够准确、公平地反映签到者的出勤时间、出勤次数等信息。对签到系统中涉及的相关媒介,它应该具有一定的普遍性和广泛性,能被群体中的大部分人接受,且签到人无需具备相关先验知识或额外学习即可完成签到。签到系统最好能够具备快速、高效、便捷、透明等特性。
高校实验教学的目的在于培养学生自主思考和动手能力,关注更多的是学生平时实验表现,平时成绩的考核是实验教学的重要组成部分[1]。而课堂签到是评定学生平时成绩的关键指标之一,是保障教学秩序良好运行的一种方式,也是教师考察学生学习态度的依据,对学生上课积极性和实验教学质量有很大的影响。目前,对大都实验课程,签到分一般占到学生期末总成绩的10%~20%,因此,无论是教师还是学生,都非常重视签到环节。
除点到外,最为传统的签到方式依赖于纸和笔。教师事先根据选课名单及上课时间准备签到单,上课时,学生逐一在签到单上签名。这种签到方式的优点是实施方便,适用于各种签到场合,缺点是签到效率低,特别是在学生人数较多的情况下,往往会出现学生排长队签到的情况,而且容易出现个别学生帮他人代签、一人多签等作弊行为[2-3]。对教师而言,这种签到方式的另一缺点是根据纸质签到单统计学生出勤率费时费力。
随着信息技术的发展,刷卡签到逐渐代替了纸质签到[4-5]。刷卡签到系统主要由卡片、读卡器、前端电脑、服务器、数据库等组成。卡片一般是学生的校园卡(一卡通),配合读卡器及后台数据库,可从中直接获取学生学号、姓名等信息。相比于纸质签到,刷卡签到提高了签到效率。学生无需埋头在签到单上寻找自己的名字,签到完成后,教师可直接从系统拉取相应的签到电子表单,无需再进行繁琐的出勤统计。但是和纸质签到一样,刷卡签到仍然属于“串行”签到方式,仍会出现学生排长队等签到的情况;而且,如果教师不注意,也会出现代人刷卡的作弊情况[6]。此外,上课之前,教师仍然需要将选课名单录入签到系统。
从实际应用来说,采用指纹签到的方式可以杜绝签到作弊行为[6-7]。指纹签到和刷卡签到的实现原理类似,只是将前端的读卡器换成了指纹传感器。因为指纹信息随身携带,无法剥离,而制造假指纹专业性强、成本高,因此针对指纹签到作弊的实际性价比不高、风险较大。指纹签到的最大缺点主要体现在指纹录入阶段。一方面,指纹录入过程需要专人陪同指导;另一方面,单个指纹录入时间较长,少则10几s,长则几分钟,当学生人数较多时,指纹录入时间就可能以小时计算。对那些课时本来就较少实验课来说,指纹签到的缺点是难以接受的。
随着移动互联技术的日益发展,智能手机已成为人们生活、工作、学习的必须品[8]。随着智能手机的普及,对于签到这一实际需求,不少公司、学者相继开发了适应于相应人群的签到管理软件产品。利用手机签到的最大优势在于容易实现“并行”签到,极大地提高签到效率。
钉钉是阿里巴巴集团出品的免费智能移动办公平台,包含审批、公告、网盘、聊天、电话、签到等功能模块。截止2019年1月,全国有超过700万家企业和组织正在使用钉钉进行移动办公。目前,国内不少学校也开始将钉钉作为自己的扁平化管理平台[9-11]。孙良斌[12]结合钉钉在重庆大学传媒类开放实验室管理中的应用和实践,部署设备预约、设备领取签到、实验室预约等模块,有效提升了沟通协同效率。徐华伟[13]在“互联网+”理念的基础上,借助钉钉开放平台,搭建了包含课程安排、考勤签到、资源共享等功能模块的实验教学管理系统,提升了实验教学管理水平。
钉钉用于高校实验课日常签到管理最大的难题在于其软件安装和学习成本较大。钉钉能在企业员工中推行依靠的是企业由上到下的政策担保。学校则不同,教师无法强制学生安装钉钉,而且相对来说,钉钉已属于大型软件,其安装包较大(目前最新版已超过100 MB),在没有WiFi的情况下下载需要消耗不少流量,这使不少学生望而却步。再者,钉钉软件功能繁杂,软件操作学习成本较大,短时间内不易上手。即便是学生硬着头皮安装了钉钉,除了实验考勤之外,其利用率也不会太高。
作为移动聊天工具,微信经过多年发展推广,已经拥有了超亿级的用户,在高校学生中也极为普及。将微信作为高校实验课签到工具,其本身已具备签到媒介的普遍性和广泛性特征。目前,大都基于微信的签到系统都在微信公众平台[14-16]或微信小程序上[17-19]开发。如陈东伟等[20]基于微信公众平台开发了一套“点到了喂”扫码签到系统,学生只需使用微信公众号扫一扫便可完成签到,技术上,他们使用动态二维码防止学生将二维码拍照发送给场外人员进行签到。郭鑫等[21]设计开发了一套微信考勤小程序,该程序将用户角色分为教师和学生,可以完成教师上课考勤、学生主动签到等功能,结合微信小程序提供的GPS接口及地图组件,可规避学生远程签到作弊行为。此外,在微信上也有不少第3方开发的免费签到小程序,如小小签到、位置签到、定位签到等。
无论是基于微信公众平台还是微信小程序的签到系统,学生首次使用都需要其页面上进行注册,输入姓名、学号、班级等信息,然后才能登录使用。这一设计范式无疑为代签作弊埋下了伏笔。学生可以在自己完成签到后登出,然后再用他人姓名登录,为他人代签。此外,上述签到系统都需数据库支持,用于保存学生信息。如果使用第3方公司或组织提供的微信公众号或小程序,后台数据库由第3方掌握,则可能存在学生个人信息泄露的风险。
3人成群,微信近年来之所以这么流行,很大一部分应归功于微信建群方便。不像QQ建群,存在账户等级限制,在微信里,任何人都可以随意拉群,用于聊天、讨论、学习等。事实上,微信群本身就是非常优质的签到媒介,广泛使用,无学习成本,且学生进群极为方便,教师学生可面对面建群进行签到。遗憾的是,目前尚无直接使用微信群进行签到的相关报道。这主要是因为:① 直接在微信界面上根据学生发送的消息手动统计出勤情况较为繁琐;② 直接在微信群里难以获取签到学生的准确位置信息。
针对上述问题,本文开发了一套基于itchat的微信群移动签到系统。该系统使用itchat实时监控目标微信群,结合微信小程序GPS定位分享功能,提取发言人GPS坐标、群昵称、以及消息时间戳等信息,并将其纳入统计,签到结束后自动将统计信息保存为Excel表格文件,并将该文件分享到签到群。基于该系统的签到过程透明可见,操作简单明了,且学生签到学习成本几乎为零,无需注册、登录等繁琐的流程,只要进相应微信群,修改群昵称,发送一条特定消息即可完成签到。
itchat是一个开源的个人微信接口,使用Python编程语言编写,原理是模拟微信网页版环境,可实现微信好友或微信群的消息获取和回复,包括文本、图片、位置、语音、表情、分享、系统等消息。如图1所示,使用itchat,只需6行Python代码,便可实现最简单的微信自动应答功能。
图1 itchat实现微信自动应答功能
图1中,第7、8行为程序入口,表示登录和运行微信。程序启动时,会自动生成一张二维码图片,用户只要使用微信手机端扫码即可登录微信;在第7行中,如果hotReload参数设置为True,则下次可直接登录而无需重新扫码。由@itchat.msg_register引导的第3行代码的作用是注册微信消息处理函数,如果参数isGroupChat为True,则仅接收群消息,列表类型参数[‘Text’, ‘Sharing’]表示函数需要处理的消息类型,其中‘Text’表示文本消息,‘Sharing’表示分享消息。itchat共定义了12种消息类型,除以上2种消息外,还包括‘Map’(地图)、‘Card’(名片)、‘Picture’(图片)、‘Voice’(声音)、‘Video’(视频)等常见消息类型。第4行watch即为消息处理函数实体,参数msg为聊天时itchat和微信服务器通信获得的消息。watch函数从msg中提取对方发过来的文本直接返回,实现了最简单的微信应答功能。
事实上,msg包含了极为丰富的内容,可从中提取诸如消息类型、内容、创建时间,消息发送者Id、昵称,消息接收者Id、昵称等信息,如果是群消息,还可提取群Id、群名称以及群内各成员信息。在Python调试器中,可发现msg为一字典(dict)对象,包含了一系列键(字段)、值对;其中,在有些值中,又嵌套了一层或多层字典或列表对象。下面以微信小程序在微信群中的分享消息为例,分析itchat消息结构及字段。其他消息类型也可通过Python调试器分析其结构及字段。
如图2所示,在msg消息字典中,MsgId字段标识了当前消息的Id号,CreateTime字段标识了当前消息的创建时间,该时间使用从1970年开始至今的秒数表示。Type字段表示消息类型,如‘Text’‘Map’‘Picture’‘Voice’等,此处消息类型为‘Sharing’,表示该消息为分享类型的消息。Text字段为消息的文本内容,如果为‘Text’类型的消息,则Text字段直接保存了文本消息的内容;如果为‘Map’类型的消息,则Text字段保存了地址位置的名称;如果为‘Sharing’类型的微信小程序分享,则Text字段保存了显示在小程序分享界面的标题。FromUserName、ToUserName字段分别指示了消息发送者、接收者的微信唯一Id号,这些Id号以‘@’字符开头,其中个人Id包含一个‘@’字符,群Id包含两个‘@’字符,以此可对个人和群唯一Id做简单区分。需要注意的是,这些唯一Id只是itchat下载到本地的微信服务器真实Id映射,每次itchat重新登录微信后这些Id都会改变,微信借此机制保护用户账户安全。ActualUserName字段指示了消息实际发送者,虽然在大部分情况下,该字段和上述FromUserName字段值一致,但仍然建议使用ActualUserName字段获取消息发送者唯一Id。
图2 itchat微信群消息解析
如图2所示,在msg的User字段的值嵌套了一层字典,这层字典主要保存了当前微信群(chatroom)的相关信息。如Chatroom下的NickName字段保存了当前微信群名称,UserName字段指示了当前微信群唯一Id。MemberList字段原则上应保存该群中的所有成员信息,但可能是由于网络流量等因素考虑,itchat并非在每次获取的消息msg中,都包含群成员的详细信息,此处该字段只保存了空值。MemberCount字段指示了当前微信群成员数量。
如图2所示,在User字段的Self字段值中,又嵌套了一层字典,这层字段主要保存当前群消息发送者的相关信息。如DisplayName字段保存了群消息发送者在当前群中的昵称,用户可在微信手机端相应群中修改自己的群昵称。UserName字段为当前群消息发送者的唯一Id,NickName为发送者的全局昵称,即在微信账号下设置的昵称,HeadImgUrl则指示了发送者头像图片的网络地址(图中省略)。
需要说明的是,图2只截取了针对微信小程序群分享消息字典的部分重要字段。 结合图1、2,如需获取某一字段值,在Python中只需对消息字典取值即可,如msg[‘Type’]即可获取消息类型,msg[‘Text’]即可获取消息文本内容,而msg[‘User’][‘NickName’]即可获取嵌套词典中的当前微信群名称。此外,值得一提的是,itchat对msg封装了更为简单的取值操作,如同样是获取消息类型或文本内容,也可直接调用msg.type或msg.text,即通过相应字段名小写即可直接获取msg相应属性值,该方法同样适用于上述嵌套词典。
根据以上分析,使用itchat可对感兴趣的微信群消息进行实时监控。结合微信小程序GPS位置分享功能,可提取群消息中发言人发言时位置、发言时间、微信唯一Id、群昵称等有用信息,并在程序中将这些信息纳入统计,最后生成报表。由此可见,基于itchat,只需对相关流程及功能进行合理设计开发,就能将微信群用于签到。
对任何签到系统,签到流程应尽量简单且容易上手。基于itchat的微信群签到流程极为简单,学习成本几乎为零。首先,相关课程责任教师在该门课首次上课时利用微信手机端和学生们面对面建群,并修改群名称为相应课程名。微信面对面建群非常快捷,所有学生可在不到半分钟内进群。随后教师要求学生按“学号+姓名”格式修改自己的群昵称。这一步关系到学生自己的切身利益,如果有学生不按要求修改群昵称,那么即便他正确执行了接下来的操作,签到系统也将无法统计到他的真实姓名,只能对他做旷课标记。因此,作为教师,不必担心学生在这点上不听话。
首次建群,在完成以上步骤后,便可正式进入签到环节。教师首先在群内发送“签到开始”指令,提醒学生准备签到。但此时学生还不能签到,必须等待教师分享微信GPS定位小程序后才能开始签到。教师分享GPS定位小程序的作用是设定签到点GPS坐标,学生签到时的GPS坐标必须和教师设定的坐标吻合(距离小于设定值),否则认定学生签到时位置作弊(如在寝室签到)。此后学生开始签到,过程十分简单,每个学生只需直接点击教师(或上一个学生)在群聊天窗口分享的GPS定位小程序,获取自己的GPS坐标,然后将带有坐标、时间及微信账号信息小程序分享到群里,完成签到。在所有学生完成签到后,教师在群里发送“签到结束”指令,签到系统将自动生成Excel格式的签到报表文件,并将该文件发送到群里公示。签到结束后,学生无法再执行签到操作。
需要提醒的是,如果不是首次建群,可直接按图3“后续签到”流程进行签到。由于学生们在微信群里发送签到消息时并发进行的,因此整个签到过程速度非常快,理论上不到几秒钟便可完成全部签到;且学生在整个签到过程中不需要执行任何注册、登录操作。
在以上微信群签到流程中,微信GPS定位小程序极为关键,它的作用就是防止学生在签到位置上作弊。事实上,微信手机端自带了位置分享功能,如图4所示。遗憾的是,由功能发送的位置不能作为签到位置的依据。这是因为该功能可以分享地图上任意点的位置,而非仅仅是用户当前位置。比如一个人在北京出差,他可以将他在杭州的公司地址分享在他的朋友。这不符合签到系统的功能需求。
图3 基于itchat的微信群签到流程设计
图4 微信手机端自带的位置分享功能
微信小程序是微信上无需安装即可运行的轻量级应用,它实现了应用“触手可及”的梦想。相比于其他网页应用,微信小程序可以调用手机本地硬件资源,如摄像头、陀螺仪、磁场传感器等。使用微信小程序,结合微信提供的GPS模块接口,可以轻松获取手机当前位置的GPS信息,并将信息显示在小程序界面。此外,微信小程序自带“转发”功能,可以方便地将小程序分享到微信群。
但是,对微信小程序的分享消息,itchat端只能从Text、Content字段提取到小程序标题(title)以及图标、源代码等的链接,无法直接获取小程序内存变量或界面上有关控件显示的任何内容。如果不能将小程序运行时获得的GPS信息附加到分享消息中,那么微信小程序也将无法用于微信签到系统。
所幸,经调研发现,在小程序的“转发”响应函数(onShareAppMessage)里,可对标题(title)以及图标链接(imgUrl)等变量进行赋值。据此,可先在小程序里获取手机当前所在位置的GPS信息,然后在“转发”响应函数里将GPS信息按一定格式格式化后赋值给title变量。在itchat端,只需提取分享消息中的Text字段(参见图2中的Text字段),便能获取小程序中title变量的全部内容,从而获得GPS信息。
根据以上思路,使用微信开发者工具开发得到的小程序界面如图5(a)所示。小程序名称为“GPS定位分享”,仅包含一个页面,该页面上仅显示用户头像、昵称、时间、经度、纬度5项信息,以及“重新获取位置”“分享到签到群”两个按钮。小程序运行或操作逻辑非常简单,描述如下:小程序启动时,会在其初始化响应函数(onLoad)里主动获取用户信息、手机当前时间以及GPS信息,并将这些信息显示在界面上;小程序启动后,点击“重新获取位置”按钮,可刷新当前时间及GPS信息;点击“分享到签到群”按钮,可将当前小程序分享给好友或微信群。图5(b)展示了小程序在群中分享的界面,小程序标题(title)为“张三,30.26489,120.119189,20190114170307”,其中“张三”为用户昵称,30.26489、120.119189分别为纬度、经度信息,20190114170307为时间戳,这些信息可被itchat端提取。如图5(b)所示,小程序标题下方的略缩图即为用户头像。
图5 GPS位置分享微信小程序及其在群内分享界面
目前,以上GPS定位分享小程序已通过微信审核,线上版也已发布,任何用户可在微信手机端搜索“GPS定位分享”小程序免费使用该程序。需要说明的是,小程序首次启动时,会提醒用户是否同意小程序获取用户信息权限,用户需点击同意按钮才能进行下一步操作。
根据图3所示的微信群签到流程,教师首先需要在签到群发送文本指令开始签到,而学生需要在群里分享小程序进行签到,因此,itchat端需同时监控文本消息(‘Text’)和小程序分享消息(‘Sharing’)。itchat端监控程序使用Python语言编写,程序框架和图1类似,核心签到功能在群消息处理函数(watch)中实现,图6给出了该函数的主要流程示例。
图6 itchat端签到监控程序运行流程
如图6所示,对消息msg,程序首先根据Type字段判断消息类型。如果msg为文本消息,则通过isOwner函数判断msg是否为当前微信群群主发送的消息。isOwner函数通过比对msg中消息发送人Id和群主Id是否吻合实现,该函数的作用是给微信群签到添加使用权限,只有群主才能开启微信群签到功能。进一步地,如果msg携带的文本内容为“签到开始”,则设置isSignInStart变量为True,表明签到已开始,同时程序向签到群发送“≫请发送签到位置”消息(符号“≫”表示该消息为系统提示消息),提示群主发送签到点地址。如果msg.text为“签到结束”,且根据isSignInStart判断签到确实已经开始,则根据实际签到情况生成签到报表,并将报表发送至当前签到群,同时向签到群发送“≫签到结束”提示信息,设置isSignInStart为False。
如图6所示,在发送“签到开始”文本消息后,程序将等待教师发送签到地址。此时教师打开图5(a)中的微信小程序,并将小程序分享到签到群。如果一切正常,程序将提取小程序标题(title)中GPS信息,作为签到点坐标(teacherGps),并标记isTeacherGpsSend为True。签到点坐标,也即签到开始后的首个坐标必须由群主发送,这一点也是通过在流程中添加isOwner函数保证的,否则程序将提示“≫请群主先发送签到坐标”。
在isTeacherGpsSend为True的情况下,学生通过点击、分享教师发在签到群的小程序(如图5(b))进行签到。对学生的小程序分享消息,签到程序首先从中提取小程序图标链接(imgUrl),并检测imgDic中是否已有该imgUrl。imgDic是用来存放签到学生的图标链接的字典对象。如果imgDic中已有当前imgUrl,表明该学生已经签到,无需重复签到。事实上,在程序中设置imgDic的目的主要是防止学生不点击运行小程序,而直接转发他人之前分享的小程序,构成签到作弊。如果imgDic没有当前imgUrl,则从msg提取学生的GPS信息(studentGps),并将当前imgUrl添加到imgDic中,同时进一步根据学生和教师的GPS坐标计算签到距离。设教师、学生的经纬度分别为(JT,WT)、(JS,WS),地球半径为R(6 371 km),则两者距离d的计算公式为[22]:
d=R·arccos[sin(WT)·sin(WS)+cos(WT)·
cos(wS)·cos(JT-JS)]
如果d小于给定值(如100 m),则认定学生签到有效,将学生群昵称(学号+姓名)、签到时间、签到坐标添加到studentDic中,并在群中提示“≫签到成功”。studentDic是用于保存学生签到信息的字典对象。如果教师和学生距离超出设定范围,则认定学生签到无效,程序在群中提示“≫位置不对,签到失败”。
如上所述,教师在输入“签到结束”后,程序将根据studentDic自动生成签到报表并将报表分享到微信群。报表中包含学生学号、姓名、签到时间、签到位置坐标信息、距离等信息。简单起见,这些信息按csv格式保存,该格式以纯文本形式存储表格数据,可被Excel软件直接打开和操作。
本节对以上设计实现的微信群签到系统进行了实际测试,设定有效签到距离为100 m,测试过程如图7所示。图中张三为测试群群主,充当教师角色,itchat端程序使用张三微信账户登录,因此系统提示消息也从张三发出;李四、王五、周九等6人为群成员,充当学生角色(为保护个人隐私,这些微信号设置了化名昵称)。
图7 微信群签到测试过程
首先,张三在群中输入“签到开始”,系统提示“请发送签到位置”;张三发送GPS定位小程序,系统提示签到点GPS坐标。随后李四点击打开张三分享在群中的小程序,并将小程序分享在群中进行签到,但是由于李四实际上距离张三4 km之远,因此李四签到失败。与此同时,王五、周九、赵六等也在群中相继分享了小程序,系统提示签到成功。签到结束后,张三在群中输入“签到结束”,系统提示签到结束,并将csv格式的签到报表分享到群中。签到报表在个人电脑上用微软Excel软件打开后显示签到数据如表1所示。
表1 微信群签到报表
由上测试结果可知,本文开发的基于itchat的微信群签到系统完全能够日常签到需求,大量人员同时签到的并发性可由微信服务器保证。
近年来,随着智能手机的发展与普及,微信已逐渐取代了短信,成为人们生活中不可或缺的即时聊天工具。微信群使用人群广、门槛低、建群方便,是用于签到的优质媒介。为此,本文开发了一套基于itchat的微信群签到系统,用于高校实验课堂签到。该系统包含两部分软件:GPS定位分享微信小程序和基于itchat的微信群监控程序,其中GPS定位分享微信小程序目前已通过微信审核上线。本文开发的微信群签到系统具有如下特点:
无需安装任何软件,直接在微信群签到,签到学习成本几乎为零,充分发挥微信群创建方便、使用范围广等优点;
签到流程简单明了,学生只需在自己手机上将GPS定位小程序分享至签到群便可完成签到;
签到速度快,所有学生可同时在各自手机上并行签到,签到成功后在微信群立即返回签到结果;
签到结果真实可信,使用GPS定位、头像Url全局唯一等机制防止签到作弊行为发生,保证签到结果可靠;
签到报表自动生成,签到结束后系统可立即将签到报表分享反馈至相应签到群,群内任何成员可查看签到结果。