林志偉,王慶九,馬超虹,謝禮禮,吳森洋
(1.浙江大學(xué) 機(jī)械工程學(xué)院, 杭州 310027; 2.浙江大學(xué) a.實(shí)驗(yàn)室與設(shè)備管理處, b.工程訓(xùn)練(金工)中心, 杭州 310058)
簽到就是簽到人將自己的姓名、編號(hào)或聯(lián)系方式等有效信息以各種方式進(jìn)行登記記錄的過(guò)程,是考勤的一種重要方式。對(duì)任何簽到系統(tǒng),其基本需求是能夠準(zhǔn)確、公平地反映簽到者的出勤時(shí)間、出勤次數(shù)等信息。對(duì)簽到系統(tǒng)中涉及的相關(guān)媒介,它應(yīng)該具有一定的普遍性和廣泛性,能被群體中的大部分人接受,且簽到人無(wú)需具備相關(guān)先驗(yàn)知識(shí)或額外學(xué)習(xí)即可完成簽到。簽到系統(tǒng)最好能夠具備快速、高效、便捷、透明等特性。
高校實(shí)驗(yàn)教學(xué)的目的在于培養(yǎng)學(xué)生自主思考和動(dòng)手能力,關(guān)注更多的是學(xué)生平時(shí)實(shí)驗(yàn)表現(xiàn),平時(shí)成績(jī)的考核是實(shí)驗(yàn)教學(xué)的重要組成部分[1]。而課堂簽到是評(píng)定學(xué)生平時(shí)成績(jī)的關(guān)鍵指標(biāo)之一,是保障教學(xué)秩序良好運(yùn)行的一種方式,也是教師考察學(xué)生學(xué)習(xí)態(tài)度的依據(jù),對(duì)學(xué)生上課積極性和實(shí)驗(yàn)教學(xué)質(zhì)量有很大的影響。目前,對(duì)大都實(shí)驗(yàn)課程,簽到分一般占到學(xué)生期末總成績(jī)的10%~20%,因此,無(wú)論是教師還是學(xué)生,都非常重視簽到環(huán)節(jié)。
除點(diǎn)到外,最為傳統(tǒng)的簽到方式依賴于紙和筆。教師事先根據(jù)選課名單及上課時(shí)間準(zhǔn)備簽到單,上課時(shí),學(xué)生逐一在簽到單上簽名。這種簽到方式的優(yōu)點(diǎn)是實(shí)施方便,適用于各種簽到場(chǎng)合,缺點(diǎn)是簽到效率低,特別是在學(xué)生人數(shù)較多的情況下,往往會(huì)出現(xiàn)學(xué)生排長(zhǎng)隊(duì)簽到的情況,而且容易出現(xiàn)個(gè)別學(xué)生幫他人代簽、一人多簽等作弊行為[2-3]。對(duì)教師而言,這種簽到方式的另一缺點(diǎn)是根據(jù)紙質(zhì)簽到單統(tǒng)計(jì)學(xué)生出勤率費(fèi)時(shí)費(fèi)力。
隨著信息技術(shù)的發(fā)展,刷卡簽到逐漸代替了紙質(zhì)簽到[4-5]。刷卡簽到系統(tǒng)主要由卡片、讀卡器、前端電腦、服務(wù)器、數(shù)據(jù)庫(kù)等組成。卡片一般是學(xué)生的校園卡(一卡通),配合讀卡器及后臺(tái)數(shù)據(jù)庫(kù),可從中直接獲取學(xué)生學(xué)號(hào)、姓名等信息。相比于紙質(zhì)簽到,刷卡簽到提高了簽到效率。學(xué)生無(wú)需埋頭在簽到單上尋找自己的名字,簽到完成后,教師可直接從系統(tǒng)拉取相應(yīng)的簽到電子表單,無(wú)需再進(jìn)行繁瑣的出勤統(tǒng)計(jì)。但是和紙質(zhì)簽到一樣,刷卡簽到仍然屬于“串行”簽到方式,仍會(huì)出現(xiàn)學(xué)生排長(zhǎng)隊(duì)等簽到的情況;而且,如果教師不注意,也會(huì)出現(xiàn)代人刷卡的作弊情況[6]。此外,上課之前,教師仍然需要將選課名單錄入簽到系統(tǒng)。
從實(shí)際應(yīng)用來(lái)說(shuō),采用指紋簽到的方式可以杜絕簽到作弊行為[6-7]。指紋簽到和刷卡簽到的實(shí)現(xiàn)原理類似,只是將前端的讀卡器換成了指紋傳感器。因?yàn)橹讣y信息隨身攜帶,無(wú)法剝離,而制造假指紋專業(yè)性強(qiáng)、成本高,因此針對(duì)指紋簽到作弊的實(shí)際性價(jià)比不高、風(fēng)險(xiǎn)較大。指紋簽到的最大缺點(diǎn)主要體現(xiàn)在指紋錄入階段。一方面,指紋錄入過(guò)程需要專人陪同指導(dǎo);另一方面,單個(gè)指紋錄入時(shí)間較長(zhǎng),少則10幾s,長(zhǎng)則幾分鐘,當(dāng)學(xué)生人數(shù)較多時(shí),指紋錄入時(shí)間就可能以小時(shí)計(jì)算。對(duì)那些課時(shí)本來(lái)就較少實(shí)驗(yàn)課來(lái)說(shuō),指紋簽到的缺點(diǎn)是難以接受的。
隨著移動(dòng)互聯(lián)技術(shù)的日益發(fā)展,智能手機(jī)已成為人們生活、工作、學(xué)習(xí)的必須品[8]。隨著智能手機(jī)的普及,對(duì)于簽到這一實(shí)際需求,不少公司、學(xué)者相繼開(kāi)發(fā)了適應(yīng)于相應(yīng)人群的簽到管理軟件產(chǎn)品。利用手機(jī)簽到的最大優(yōu)勢(shì)在于容易實(shí)現(xiàn)“并行”簽到,極大地提高簽到效率。
釘釘是阿里巴巴集團(tuán)出品的免費(fèi)智能移動(dòng)辦公平臺(tái),包含審批、公告、網(wǎng)盤(pán)、聊天、電話、簽到等功能模塊。截止2019年1月,全國(guó)有超過(guò)700萬(wàn)家企業(yè)和組織正在使用釘釘進(jìn)行移動(dòng)辦公。目前,國(guó)內(nèi)不少學(xué)校也開(kāi)始將釘釘作為自己的扁平化管理平臺(tái)[9-11]。孫良斌[12]結(jié)合釘釘在重慶大學(xué)傳媒類開(kāi)放實(shí)驗(yàn)室管理中的應(yīng)用和實(shí)踐,部署設(shè)備預(yù)約、設(shè)備領(lǐng)取簽到、實(shí)驗(yàn)室預(yù)約等模塊,有效提升了溝通協(xié)同效率。徐華偉[13]在“互聯(lián)網(wǎng)+”理念的基礎(chǔ)上,借助釘釘開(kāi)放平臺(tái),搭建了包含課程安排、考勤簽到、資源共享等功能模塊的實(shí)驗(yàn)教學(xué)管理系統(tǒng),提升了實(shí)驗(yàn)教學(xué)管理水平。
釘釘用于高校實(shí)驗(yàn)課日常簽到管理最大的難題在于其軟件安裝和學(xué)習(xí)成本較大。釘釘能在企業(yè)員工中推行依靠的是企業(yè)由上到下的政策擔(dān)保。學(xué)校則不同,教師無(wú)法強(qiáng)制學(xué)生安裝釘釘,而且相對(duì)來(lái)說(shuō),釘釘已屬于大型軟件,其安裝包較大(目前最新版已超過(guò)100 MB),在沒(méi)有WiFi的情況下下載需要消耗不少流量,這使不少學(xué)生望而卻步。再者,釘釘軟件功能繁雜,軟件操作學(xué)習(xí)成本較大,短時(shí)間內(nèi)不易上手。即便是學(xué)生硬著頭皮安裝了釘釘,除了實(shí)驗(yàn)考勤之外,其利用率也不會(huì)太高。
作為移動(dòng)聊天工具,微信經(jīng)過(guò)多年發(fā)展推廣,已經(jīng)擁有了超億級(jí)的用戶,在高校學(xué)生中也極為普及。將微信作為高校實(shí)驗(yàn)課簽到工具,其本身已具備簽到媒介的普遍性和廣泛性特征。目前,大都基于微信的簽到系統(tǒng)都在微信公眾平臺(tái)[14-16]或微信小程序上[17-19]開(kāi)發(fā)。如陳東偉等[20]基于微信公眾平臺(tái)開(kāi)發(fā)了一套“點(diǎn)到了喂”掃碼簽到系統(tǒng),學(xué)生只需使用微信公眾號(hào)掃一掃便可完成簽到,技術(shù)上,他們使用動(dòng)態(tài)二維碼防止學(xué)生將二維碼拍照發(fā)送給場(chǎng)外人員進(jìn)行簽到。郭鑫等[21]設(shè)計(jì)開(kāi)發(fā)了一套微信考勤小程序,該程序?qū)⒂脩艚巧譃榻處熀蛯W(xué)生,可以完成教師上課考勤、學(xué)生主動(dòng)簽到等功能,結(jié)合微信小程序提供的GPS接口及地圖組件,可規(guī)避學(xué)生遠(yuǎn)程簽到作弊行為。此外,在微信上也有不少第3方開(kāi)發(fā)的免費(fèi)簽到小程序,如小小簽到、位置簽到、定位簽到等。
無(wú)論是基于微信公眾平臺(tái)還是微信小程序的簽到系統(tǒng),學(xué)生首次使用都需要其頁(yè)面上進(jìn)行注冊(cè),輸入姓名、學(xué)號(hào)、班級(jí)等信息,然后才能登錄使用。這一設(shè)計(jì)范式無(wú)疑為代簽作弊埋下了伏筆。學(xué)生可以在自己完成簽到后登出,然后再用他人姓名登錄,為他人代簽。此外,上述簽到系統(tǒng)都需數(shù)據(jù)庫(kù)支持,用于保存學(xué)生信息。如果使用第3方公司或組織提供的微信公眾號(hào)或小程序,后臺(tái)數(shù)據(jù)庫(kù)由第3方掌握,則可能存在學(xué)生個(gè)人信息泄露的風(fēng)險(xiǎn)。
3人成群,微信近年來(lái)之所以這么流行,很大一部分應(yīng)歸功于微信建群方便。不像QQ建群,存在賬戶等級(jí)限制,在微信里,任何人都可以隨意拉群,用于聊天、討論、學(xué)習(xí)等。事實(shí)上,微信群本身就是非常優(yōu)質(zhì)的簽到媒介,廣泛使用,無(wú)學(xué)習(xí)成本,且學(xué)生進(jìn)群極為方便,教師學(xué)生可面對(duì)面建群進(jìn)行簽到。遺憾的是,目前尚無(wú)直接使用微信群進(jìn)行簽到的相關(guān)報(bào)道。這主要是因?yàn)椋孩?直接在微信界面上根據(jù)學(xué)生發(fā)送的消息手動(dòng)統(tǒng)計(jì)出勤情況較為繁瑣;② 直接在微信群里難以獲取簽到學(xué)生的準(zhǔn)確位置信息。
針對(duì)上述問(wèn)題,本文開(kāi)發(fā)了一套基于itchat的微信群移動(dòng)簽到系統(tǒng)。該系統(tǒng)使用itchat實(shí)時(shí)監(jiān)控目標(biāo)微信群,結(jié)合微信小程序GPS定位分享功能,提取發(fā)言人GPS坐標(biāo)、群昵稱、以及消息時(shí)間戳等信息,并將其納入統(tǒng)計(jì),簽到結(jié)束后自動(dòng)將統(tǒng)計(jì)信息保存為Excel表格文件,并將該文件分享到簽到群。基于該系統(tǒng)的簽到過(guò)程透明可見(jiàn),操作簡(jiǎn)單明了,且學(xué)生簽到學(xué)習(xí)成本幾乎為零,無(wú)需注冊(cè)、登錄等繁瑣的流程,只要進(jìn)相應(yīng)微信群,修改群昵稱,發(fā)送一條特定消息即可完成簽到。
itchat是一個(gè)開(kāi)源的個(gè)人微信接口,使用Python編程語(yǔ)言編寫(xiě),原理是模擬微信網(wǎng)頁(yè)版環(huán)境,可實(shí)現(xiàn)微信好友或微信群的消息獲取和回復(fù),包括文本、圖片、位置、語(yǔ)音、表情、分享、系統(tǒng)等消息。如圖1所示,使用itchat,只需6行Python代碼,便可實(shí)現(xiàn)最簡(jiǎn)單的微信自動(dòng)應(yīng)答功能。

圖1 itchat實(shí)現(xiàn)微信自動(dòng)應(yīng)答功能
圖1中,第7、8行為程序入口,表示登錄和運(yùn)行微信。程序啟動(dòng)時(shí),會(huì)自動(dòng)生成一張二維碼圖片,用戶只要使用微信手機(jī)端掃碼即可登錄微信;在第7行中,如果hotReload參數(shù)設(shè)置為True,則下次可直接登錄而無(wú)需重新掃碼。由@itchat.msg_register引導(dǎo)的第3行代碼的作用是注冊(cè)微信消息處理函數(shù),如果參數(shù)isGroupChat為True,則僅接收群消息,列表類型參數(shù)[‘Text’, ‘Sharing’]表示函數(shù)需要處理的消息類型,其中‘Text’表示文本消息,‘Sharing’表示分享消息。itchat共定義了12種消息類型,除以上2種消息外,還包括‘Map’(地圖)、‘Card’(名片)、‘Picture’(圖片)、‘Voice’(聲音)、‘Video’(視頻)等常見(jiàn)消息類型。第4行watch即為消息處理函數(shù)實(shí)體,參數(shù)msg為聊天時(shí)itchat和微信服務(wù)器通信獲得的消息。watch函數(shù)從msg中提取對(duì)方發(fā)過(guò)來(lái)的文本直接返回,實(shí)現(xiàn)了最簡(jiǎn)單的微信應(yīng)答功能。
事實(shí)上,msg包含了極為豐富的內(nèi)容,可從中提取諸如消息類型、內(nèi)容、創(chuàng)建時(shí)間,消息發(fā)送者Id、昵稱,消息接收者Id、昵稱等信息,如果是群消息,還可提取群Id、群名稱以及群內(nèi)各成員信息。在Python調(diào)試器中,可發(fā)現(xiàn)msg為一字典(dict)對(duì)象,包含了一系列鍵(字段)、值對(duì);其中,在有些值中,又嵌套了一層或多層字典或列表對(duì)象。下面以微信小程序在微信群中的分享消息為例,分析itchat消息結(jié)構(gòu)及字段。其他消息類型也可通過(guò)Python調(diào)試器分析其結(jié)構(gòu)及字段。
如圖2所示,在msg消息字典中,MsgId字段標(biāo)識(shí)了當(dāng)前消息的Id號(hào),CreateTime字段標(biāo)識(shí)了當(dāng)前消息的創(chuàng)建時(shí)間,該時(shí)間使用從1970年開(kāi)始至今的秒數(shù)表示。Type字段表示消息類型,如‘Text’‘Map’‘Picture’‘Voice’等,此處消息類型為‘Sharing’,表示該消息為分享類型的消息。Text字段為消息的文本內(nèi)容,如果為‘Text’類型的消息,則Text字段直接保存了文本消息的內(nèi)容;如果為‘Map’類型的消息,則Text字段保存了地址位置的名稱;如果為‘Sharing’類型的微信小程序分享,則Text字段保存了顯示在小程序分享界面的標(biāo)題。FromUserName、ToUserName字段分別指示了消息發(fā)送者、接收者的微信唯一Id號(hào),這些Id號(hào)以‘@’字符開(kāi)頭,其中個(gè)人Id包含一個(gè)‘@’字符,群Id包含兩個(gè)‘@’字符,以此可對(duì)個(gè)人和群唯一Id做簡(jiǎn)單區(qū)分。需要注意的是,這些唯一Id只是itchat下載到本地的微信服務(wù)器真實(shí)Id映射,每次itchat重新登錄微信后這些Id都會(huì)改變,微信借此機(jī)制保護(hù)用戶賬戶安全。ActualUserName字段指示了消息實(shí)際發(fā)送者,雖然在大部分情況下,該字段和上述FromUserName字段值一致,但仍然建議使用ActualUserName字段獲取消息發(fā)送者唯一Id。

圖2 itchat微信群消息解析
如圖2所示,在msg的User字段的值嵌套了一層字典,這層字典主要保存了當(dāng)前微信群(chatroom)的相關(guān)信息。如Chatroom下的NickName字段保存了當(dāng)前微信群名稱,UserName字段指示了當(dāng)前微信群唯一Id。MemberList字段原則上應(yīng)保存該群中的所有成員信息,但可能是由于網(wǎng)絡(luò)流量等因素考慮,itchat并非在每次獲取的消息msg中,都包含群成員的詳細(xì)信息,此處該字段只保存了空值。MemberCount字段指示了當(dāng)前微信群成員數(shù)量。
如圖2所示,在User字段的Self字段值中,又嵌套了一層字典,這層字段主要保存當(dāng)前群消息發(fā)送者的相關(guān)信息。如DisplayName字段保存了群消息發(fā)送者在當(dāng)前群中的昵稱,用戶可在微信手機(jī)端相應(yīng)群中修改自己的群昵稱。UserName字段為當(dāng)前群消息發(fā)送者的唯一Id,NickName為發(fā)送者的全局昵稱,即在微信賬號(hào)下設(shè)置的昵稱,HeadImgUrl則指示了發(fā)送者頭像圖片的網(wǎng)絡(luò)地址(圖中省略)。
需要說(shuō)明的是,圖2只截取了針對(duì)微信小程序群分享消息字典的部分重要字段。 結(jié)合圖1、2,如需獲取某一字段值,在Python中只需對(duì)消息字典取值即可,如msg[‘Type’]即可獲取消息類型,msg[‘Text’]即可獲取消息文本內(nèi)容,而msg[‘User’][‘NickName’]即可獲取嵌套詞典中的當(dāng)前微信群名稱。此外,值得一提的是,itchat對(duì)msg封裝了更為簡(jiǎn)單的取值操作,如同樣是獲取消息類型或文本內(nèi)容,也可直接調(diào)用msg.type或msg.text,即通過(guò)相應(yīng)字段名小寫(xiě)即可直接獲取msg相應(yīng)屬性值,該方法同樣適用于上述嵌套詞典。
根據(jù)以上分析,使用itchat可對(duì)感興趣的微信群消息進(jìn)行實(shí)時(shí)監(jiān)控。結(jié)合微信小程序GPS位置分享功能,可提取群消息中發(fā)言人發(fā)言時(shí)位置、發(fā)言時(shí)間、微信唯一Id、群昵稱等有用信息,并在程序中將這些信息納入統(tǒng)計(jì),最后生成報(bào)表。由此可見(jiàn),基于itchat,只需對(duì)相關(guān)流程及功能進(jìn)行合理設(shè)計(jì)開(kāi)發(fā),就能將微信群用于簽到。
對(duì)任何簽到系統(tǒng),簽到流程應(yīng)盡量簡(jiǎn)單且容易上手。基于itchat的微信群簽到流程極為簡(jiǎn)單,學(xué)習(xí)成本幾乎為零。首先,相關(guān)課程責(zé)任教師在該門課首次上課時(shí)利用微信手機(jī)端和學(xué)生們面對(duì)面建群,并修改群名稱為相應(yīng)課程名。微信面對(duì)面建群非常快捷,所有學(xué)生可在不到半分鐘內(nèi)進(jìn)群。隨后教師要求學(xué)生按“學(xué)號(hào)+姓名”格式修改自己的群昵稱。這一步關(guān)系到學(xué)生自己的切身利益,如果有學(xué)生不按要求修改群昵稱,那么即便他正確執(zhí)行了接下來(lái)的操作,簽到系統(tǒng)也將無(wú)法統(tǒng)計(jì)到他的真實(shí)姓名,只能對(duì)他做曠課標(biāo)記。因此,作為教師,不必?fù)?dān)心學(xué)生在這點(diǎn)上不聽(tīng)話。
首次建群,在完成以上步驟后,便可正式進(jìn)入簽到環(huán)節(jié)。教師首先在群內(nèi)發(fā)送“簽到開(kāi)始”指令,提醒學(xué)生準(zhǔn)備簽到。但此時(shí)學(xué)生還不能簽到,必須等待教師分享微信GPS定位小程序后才能開(kāi)始簽到。教師分享GPS定位小程序的作用是設(shè)定簽到點(diǎn)GPS坐標(biāo),學(xué)生簽到時(shí)的GPS坐標(biāo)必須和教師設(shè)定的坐標(biāo)吻合(距離小于設(shè)定值),否則認(rèn)定學(xué)生簽到時(shí)位置作弊(如在寢室簽到)。此后學(xué)生開(kāi)始簽到,過(guò)程十分簡(jiǎn)單,每個(gè)學(xué)生只需直接點(diǎn)擊教師(或上一個(gè)學(xué)生)在群聊天窗口分享的GPS定位小程序,獲取自己的GPS坐標(biāo),然后將帶有坐標(biāo)、時(shí)間及微信賬號(hào)信息小程序分享到群里,完成簽到。在所有學(xué)生完成簽到后,教師在群里發(fā)送“簽到結(jié)束”指令,簽到系統(tǒng)將自動(dòng)生成Excel格式的簽到報(bào)表文件,并將該文件發(fā)送到群里公示。簽到結(jié)束后,學(xué)生無(wú)法再執(zhí)行簽到操作。
需要提醒的是,如果不是首次建群,可直接按圖3“后續(xù)簽到”流程進(jìn)行簽到。由于學(xué)生們?cè)谖⑿湃豪锇l(fā)送簽到消息時(shí)并發(fā)進(jìn)行的,因此整個(gè)簽到過(guò)程速度非常快,理論上不到幾秒鐘便可完成全部簽到;且學(xué)生在整個(gè)簽到過(guò)程中不需要執(zhí)行任何注冊(cè)、登錄操作。
在以上微信群簽到流程中,微信GPS定位小程序極為關(guān)鍵,它的作用就是防止學(xué)生在簽到位置上作弊。事實(shí)上,微信手機(jī)端自帶了位置分享功能,如圖4所示。遺憾的是,由功能發(fā)送的位置不能作為簽到位置的依據(jù)。這是因?yàn)樵摴δ芸梢苑窒淼貓D上任意點(diǎn)的位置,而非僅僅是用戶當(dāng)前位置。比如一個(gè)人在北京出差,他可以將他在杭州的公司地址分享在他的朋友。這不符合簽到系統(tǒng)的功能需求。

圖3 基于itchat的微信群簽到流程設(shè)計(jì)

圖4 微信手機(jī)端自帶的位置分享功能
微信小程序是微信上無(wú)需安裝即可運(yùn)行的輕量級(jí)應(yīng)用,它實(shí)現(xiàn)了應(yīng)用“觸手可及”的夢(mèng)想。相比于其他網(wǎng)頁(yè)應(yīng)用,微信小程序可以調(diào)用手機(jī)本地硬件資源,如攝像頭、陀螺儀、磁場(chǎng)傳感器等。使用微信小程序,結(jié)合微信提供的GPS模塊接口,可以輕松獲取手機(jī)當(dāng)前位置的GPS信息,并將信息顯示在小程序界面。此外,微信小程序自帶“轉(zhuǎn)發(fā)”功能,可以方便地將小程序分享到微信群。
但是,對(duì)微信小程序的分享消息,itchat端只能從Text、Content字段提取到小程序標(biāo)題(title)以及圖標(biāo)、源代碼等的鏈接,無(wú)法直接獲取小程序內(nèi)存變量或界面上有關(guān)控件顯示的任何內(nèi)容。如果不能將小程序運(yùn)行時(shí)獲得的GPS信息附加到分享消息中,那么微信小程序也將無(wú)法用于微信簽到系統(tǒng)。
所幸,經(jīng)調(diào)研發(fā)現(xiàn),在小程序的“轉(zhuǎn)發(fā)”響應(yīng)函數(shù)(onShareAppMessage)里,可對(duì)標(biāo)題(title)以及圖標(biāo)鏈接(imgUrl)等變量進(jìn)行賦值。據(jù)此,可先在小程序里獲取手機(jī)當(dāng)前所在位置的GPS信息,然后在“轉(zhuǎn)發(fā)”響應(yīng)函數(shù)里將GPS信息按一定格式格式化后賦值給title變量。在itchat端,只需提取分享消息中的Text字段(參見(jiàn)圖2中的Text字段),便能獲取小程序中title變量的全部?jī)?nèi)容,從而獲得GPS信息。
根據(jù)以上思路,使用微信開(kāi)發(fā)者工具開(kāi)發(fā)得到的小程序界面如圖5(a)所示。小程序名稱為“GPS定位分享”,僅包含一個(gè)頁(yè)面,該頁(yè)面上僅顯示用戶頭像、昵稱、時(shí)間、經(jīng)度、緯度5項(xiàng)信息,以及“重新獲取位置”“分享到簽到群”兩個(gè)按鈕。小程序運(yùn)行或操作邏輯非常簡(jiǎn)單,描述如下:小程序啟動(dòng)時(shí),會(huì)在其初始化響應(yīng)函數(shù)(onLoad)里主動(dòng)獲取用戶信息、手機(jī)當(dāng)前時(shí)間以及GPS信息,并將這些信息顯示在界面上;小程序啟動(dòng)后,點(diǎn)擊“重新獲取位置”按鈕,可刷新當(dāng)前時(shí)間及GPS信息;點(diǎn)擊“分享到簽到群”按鈕,可將當(dāng)前小程序分享給好友或微信群。圖5(b)展示了小程序在群中分享的界面,小程序標(biāo)題(title)為“張三,30.26489,120.119189,20190114170307”,其中“張三”為用戶昵稱,30.26489、120.119189分別為緯度、經(jīng)度信息,20190114170307為時(shí)間戳,這些信息可被itchat端提取。如圖5(b)所示,小程序標(biāo)題下方的略縮圖即為用戶頭像。

圖5 GPS位置分享微信小程序及其在群內(nèi)分享界面
目前,以上GPS定位分享小程序已通過(guò)微信審核,線上版也已發(fā)布,任何用戶可在微信手機(jī)端搜索“GPS定位分享”小程序免費(fèi)使用該程序。需要說(shuō)明的是,小程序首次啟動(dòng)時(shí),會(huì)提醒用戶是否同意小程序獲取用戶信息權(quán)限,用戶需點(diǎn)擊同意按鈕才能進(jìn)行下一步操作。
根據(jù)圖3所示的微信群簽到流程,教師首先需要在簽到群發(fā)送文本指令開(kāi)始簽到,而學(xué)生需要在群里分享小程序進(jìn)行簽到,因此,itchat端需同時(shí)監(jiān)控文本消息(‘Text’)和小程序分享消息(‘Sharing’)。itchat端監(jiān)控程序使用Python語(yǔ)言編寫(xiě),程序框架和圖1類似,核心簽到功能在群消息處理函數(shù)(watch)中實(shí)現(xiàn),圖6給出了該函數(shù)的主要流程示例。

圖6 itchat端簽到監(jiān)控程序運(yùn)行流程
如圖6所示,對(duì)消息msg,程序首先根據(jù)Type字段判斷消息類型。如果msg為文本消息,則通過(guò)isOwner函數(shù)判斷msg是否為當(dāng)前微信群群主發(fā)送的消息。isOwner函數(shù)通過(guò)比對(duì)msg中消息發(fā)送人Id和群主Id是否吻合實(shí)現(xiàn),該函數(shù)的作用是給微信群簽到添加使用權(quán)限,只有群主才能開(kāi)啟微信群簽到功能。進(jìn)一步地,如果msg攜帶的文本內(nèi)容為“簽到開(kāi)始”,則設(shè)置isSignInStart變量為True,表明簽到已開(kāi)始,同時(shí)程序向簽到群發(fā)送“?請(qǐng)發(fā)送簽到位置”消息(符號(hào)“?”表示該消息為系統(tǒng)提示消息),提示群主發(fā)送簽到點(diǎn)地址。如果msg.text為“簽到結(jié)束”,且根據(jù)isSignInStart判斷簽到確實(shí)已經(jīng)開(kāi)始,則根據(jù)實(shí)際簽到情況生成簽到報(bào)表,并將報(bào)表發(fā)送至當(dāng)前簽到群,同時(shí)向簽到群發(fā)送“?簽到結(jié)束”提示信息,設(shè)置isSignInStart為False。
如圖6所示,在發(fā)送“簽到開(kāi)始”文本消息后,程序?qū)⒌却處煱l(fā)送簽到地址。此時(shí)教師打開(kāi)圖5(a)中的微信小程序,并將小程序分享到簽到群。如果一切正常,程序?qū)⑻崛⌒〕绦驑?biāo)題(title)中GPS信息,作為簽到點(diǎn)坐標(biāo)(teacherGps),并標(biāo)記isTeacherGpsSend為True。簽到點(diǎn)坐標(biāo),也即簽到開(kāi)始后的首個(gè)坐標(biāo)必須由群主發(fā)送,這一點(diǎn)也是通過(guò)在流程中添加isOwner函數(shù)保證的,否則程序?qū)⑻崾尽?請(qǐng)群主先發(fā)送簽到坐標(biāo)”。
在isTeacherGpsSend為True的情況下,學(xué)生通過(guò)點(diǎn)擊、分享教師發(fā)在簽到群的小程序(如圖5(b))進(jìn)行簽到。對(duì)學(xué)生的小程序分享消息,簽到程序首先從中提取小程序圖標(biāo)鏈接(imgUrl),并檢測(cè)imgDic中是否已有該imgUrl。imgDic是用來(lái)存放簽到學(xué)生的圖標(biāo)鏈接的字典對(duì)象。如果imgDic中已有當(dāng)前imgUrl,表明該學(xué)生已經(jīng)簽到,無(wú)需重復(fù)簽到。事實(shí)上,在程序中設(shè)置imgDic的目的主要是防止學(xué)生不點(diǎn)擊運(yùn)行小程序,而直接轉(zhuǎn)發(fā)他人之前分享的小程序,構(gòu)成簽到作弊。如果imgDic沒(méi)有當(dāng)前imgUrl,則從msg提取學(xué)生的GPS信息(studentGps),并將當(dāng)前imgUrl添加到imgDic中,同時(shí)進(jìn)一步根據(jù)學(xué)生和教師的GPS坐標(biāo)計(jì)算簽到距離。設(shè)教師、學(xué)生的經(jīng)緯度分別為(JT,WT)、(JS,WS),地球半徑為R(6 371 km),則兩者距離d的計(jì)算公式為[22]:
d=R·arccos[sin(WT)·sin(WS)+cos(WT)·
cos(wS)·cos(JT-JS)]
如果d小于給定值(如100 m),則認(rèn)定學(xué)生簽到有效,將學(xué)生群昵稱(學(xué)號(hào)+姓名)、簽到時(shí)間、簽到坐標(biāo)添加到studentDic中,并在群中提示“?簽到成功”。studentDic是用于保存學(xué)生簽到信息的字典對(duì)象。如果教師和學(xué)生距離超出設(shè)定范圍,則認(rèn)定學(xué)生簽到無(wú)效,程序在群中提示“?位置不對(duì),簽到失敗”。
如上所述,教師在輸入“簽到結(jié)束”后,程序?qū)⒏鶕?jù)studentDic自動(dòng)生成簽到報(bào)表并將報(bào)表分享到微信群。報(bào)表中包含學(xué)生學(xué)號(hào)、姓名、簽到時(shí)間、簽到位置坐標(biāo)信息、距離等信息。簡(jiǎn)單起見(jiàn),這些信息按csv格式保存,該格式以純文本形式存儲(chǔ)表格數(shù)據(jù),可被Excel軟件直接打開(kāi)和操作。
本節(jié)對(duì)以上設(shè)計(jì)實(shí)現(xiàn)的微信群簽到系統(tǒng)進(jìn)行了實(shí)際測(cè)試,設(shè)定有效簽到距離為100 m,測(cè)試過(guò)程如圖7所示。圖中張三為測(cè)試群群主,充當(dāng)教師角色,itchat端程序使用張三微信賬戶登錄,因此系統(tǒng)提示消息也從張三發(fā)出;李四、王五、周九等6人為群成員,充當(dāng)學(xué)生角色(為保護(hù)個(gè)人隱私,這些微信號(hào)設(shè)置了化名昵稱)。

圖7 微信群簽到測(cè)試過(guò)程
首先,張三在群中輸入“簽到開(kāi)始”,系統(tǒng)提示“請(qǐng)發(fā)送簽到位置”;張三發(fā)送GPS定位小程序,系統(tǒng)提示簽到點(diǎn)GPS坐標(biāo)。隨后李四點(diǎn)擊打開(kāi)張三分享在群中的小程序,并將小程序分享在群中進(jìn)行簽到,但是由于李四實(shí)際上距離張三4 km之遠(yuǎn),因此李四簽到失敗。與此同時(shí),王五、周九、趙六等也在群中相繼分享了小程序,系統(tǒng)提示簽到成功。簽到結(jié)束后,張三在群中輸入“簽到結(jié)束”,系統(tǒng)提示簽到結(jié)束,并將csv格式的簽到報(bào)表分享到群中。簽到報(bào)表在個(gè)人電腦上用微軟Excel軟件打開(kāi)后顯示簽到數(shù)據(jù)如表1所示。

表1 微信群簽到報(bào)表
由上測(cè)試結(jié)果可知,本文開(kāi)發(fā)的基于itchat的微信群簽到系統(tǒng)完全能夠日常簽到需求,大量人員同時(shí)簽到的并發(fā)性可由微信服務(wù)器保證。
近年來(lái),隨著智能手機(jī)的發(fā)展與普及,微信已逐漸取代了短信,成為人們生活中不可或缺的即時(shí)聊天工具。微信群使用人群廣、門檻低、建群方便,是用于簽到的優(yōu)質(zhì)媒介。為此,本文開(kāi)發(fā)了一套基于itchat的微信群簽到系統(tǒng),用于高校實(shí)驗(yàn)課堂簽到。該系統(tǒng)包含兩部分軟件:GPS定位分享微信小程序和基于itchat的微信群監(jiān)控程序,其中GPS定位分享微信小程序目前已通過(guò)微信審核上線。本文開(kāi)發(fā)的微信群簽到系統(tǒng)具有如下特點(diǎn):
無(wú)需安裝任何軟件,直接在微信群簽到,簽到學(xué)習(xí)成本幾乎為零,充分發(fā)揮微信群創(chuàng)建方便、使用范圍廣等優(yōu)點(diǎn);
簽到流程簡(jiǎn)單明了,學(xué)生只需在自己手機(jī)上將GPS定位小程序分享至簽到群便可完成簽到;
簽到速度快,所有學(xué)生可同時(shí)在各自手機(jī)上并行簽到,簽到成功后在微信群立即返回簽到結(jié)果;
簽到結(jié)果真實(shí)可信,使用GPS定位、頭像Url全局唯一等機(jī)制防止簽到作弊行為發(fā)生,保證簽到結(jié)果可靠;
簽到報(bào)表自動(dòng)生成,簽到結(jié)束后系統(tǒng)可立即將簽到報(bào)表分享反饋至相應(yīng)簽到群,群內(nèi)任何成員可查看簽到結(jié)果。