太強(qiáng)了!基于公眾號(hào)用 Python 開(kāi)發(fā)一個(gè)抽獎(jiǎng)程序
大家好
上周在公眾號(hào)做了個(gè)抽象的活動(dòng),程序是自己臨時(shí)寫(xiě)的,就是下面這種效果?;貜?fù)指定關(guān)鍵字系統(tǒng)會(huì)自動(dòng)給你分配一個(gè)抽獎(jiǎng)號(hào)碼
回復(fù)另一個(gè)關(guān)鍵字可以查看當(dāng)前有沒(méi)有中獎(jiǎng),功能可以說(shuō)非常簡(jiǎn)單。

有些小伙伴拿到代碼之后,問(wèn)有沒(méi)有詳細(xì)的教程,光是看代碼不知道怎么運(yùn)行。
于是就有了這篇文章。
本文假設(shè)你已經(jīng)有一個(gè)自己的公眾號(hào),還沒(méi)有公眾號(hào)的可以在平臺(tái)注冊(cè)一個(gè),地址是:http://mp.weixin.qq.com 。
首先登錄公眾號(hào)平臺(tái),填寫(xiě)服務(wù)器配置

URL 不能亂填,這個(gè)是你的服務(wù)器地址, 比如:http://123.33.44.55/wx ,IP 地址是服務(wù)器的公網(wǎng)IP,所以前提你還得有一臺(tái)服務(wù)器。
你可以選擇國(guó)內(nèi)的虛擬主機(jī)服務(wù)商,比如阿里云、騰訊云或者Ucloud(三位廠商記得給我廣告費(fèi)啊)都可以
填寫(xiě)完直接提交會(huì)驗(yàn)證失敗的,因?yàn)榉?wù)器還沒(méi)接入進(jìn)來(lái)。
所以要先驗(yàn)證服務(wù)器地址的有效性。
驗(yàn)證服務(wù)器地址的有效性就是下面的處理邏輯,我這里是用的flask框架。

微信服務(wù)器請(qǐng)求URL的時(shí)候,會(huì)傳4個(gè)參數(shù)給你,分別是

所謂驗(yàn)證服務(wù)器地址的有效性,就是要確認(rèn)請(qǐng)求是否來(lái)自微信服務(wù)器,因?yàn)榘l(fā)起請(qǐng)求的也有可能是某個(gè)黑客。我們可以通過(guò)檢驗(yàn)signature對(duì)請(qǐng)求進(jìn)行校驗(yàn),若確認(rèn)此次GET請(qǐng)求來(lái)自微信服務(wù)器,原樣返回echostr參數(shù)內(nèi)容,則接入生效,成為開(kāi)發(fā)者成功,否則接入失敗。
加密/校驗(yàn)流程如下:
1)將token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序
2)將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密
3)開(kāi)發(fā)者獲得加密后的字符串可與signature對(duì)比,標(biāo)識(shí)該請(qǐng)求來(lái)源于微信。
將代碼部署到自己服務(wù)器之后,這時(shí)候再去提交,會(huì)提示你提交成功。驗(yàn)證成功后,就可以開(kāi)始實(shí)現(xiàn)業(yè)務(wù)邏輯了。
實(shí)現(xiàn)抽獎(jiǎng)邏輯
當(dāng)用戶(hù)在公眾號(hào)發(fā)送消息時(shí),微信會(huì)以POST請(qǐng)求的方式將消息轉(zhuǎn)發(fā)給業(yè)務(wù)服務(wù)器(就是我們自己處理業(yè)務(wù)邏輯的程序),然后我們根據(jù)用戶(hù)發(fā)送的內(nèi)容進(jìn)行相應(yīng)的邏輯處理。

微信會(huì)通過(guò)POST請(qǐng)求,以xml的格式發(fā)送給我們業(yè)務(wù)服務(wù)器,里面的內(nèi)容包括發(fā)送的消息內(nèi)容、時(shí)間、還有open_id, open_id 唯一對(duì)應(yīng)用戶(hù)。雖然你不知道用戶(hù)的昵稱(chēng),但是只要知道open_id 就可以唯一確定是哪個(gè)用戶(hù)。
定義數(shù)據(jù)模型
實(shí)現(xiàn)抽獎(jiǎng)系統(tǒng),我們首先定義了數(shù)據(jù)模型

只要三個(gè)字段就夠了,number 是抽獎(jiǎng)號(hào)碼,open_id 表示誰(shuí)獲得了該抽獎(jiǎng)號(hào)碼, 初始為空, valid 表示該號(hào)碼是否為中獎(jiǎng)號(hào)碼。初始化系統(tǒng)時(shí),我們會(huì)隨機(jī)給一些數(shù)據(jù)設(shè)置valid有True, 比如你想抽3個(gè)獎(jiǎng)品,就隨機(jī)弄3條數(shù)據(jù)為T(mén)rue。
模型建立完成后,接下來(lái)就可以處理具體的業(yè)務(wù)邏輯了。當(dāng)用戶(hù)發(fā)送抽獎(jiǎng)關(guān)鍵字時(shí),我們要做3件事。
1、判斷當(dāng)前用戶(hù)是否還有抽獎(jiǎng)資格
2、生成抽獎(jiǎng)號(hào)碼
3、查詢(xún)剩余抽獎(jiǎng)次數(shù)
回復(fù)另一個(gè)關(guān)鍵字查詢(xún)是否中獎(jiǎng)時(shí),我們只需要判斷它的抽獎(jiǎng)號(hào)碼里面有沒(méi)有匹配的valid為T(mén)rue的數(shù)據(jù)即可。我都這些邏輯都封裝在models里面,所以看起來(lái)也沒(méi)幾行代碼。

以上就是整個(gè)抽獎(jiǎng)小程序的全部思路。剩下的事情就是把代碼部署到服務(wù)器,就能實(shí)現(xiàn)文章開(kāi)頭的效果了。
是不是超級(jí)簡(jiǎn)單。源代碼獲取請(qǐng)回復(fù)“公眾號(hào)”
如果你正想實(shí)現(xiàn)一個(gè)類(lèi)似的小程序,例如做個(gè)天氣預(yù)報(bào)查詢(xún)等有趣味的程序,如果編程過(guò)程中總是遇到各種問(wèn)題卡殼,可以加我微信 "yueryounali",好的問(wèn)題勝過(guò)無(wú)數(shù)個(gè)好答案。我們的python交流群也有很多高手。
學(xué)編程關(guān)鍵在于動(dòng)手,提高在于實(shí)踐。
推薦:
