基于模型的微信開發框架:vlang
vLang 使用說明
vLang是一個基于模型的微信開發框架,遵循MIT協議發布。
安裝
開發與測試環境: Ubuntu Kylin 15.04 64bit Python 3.4 Tornado 4.1
python3 setup.py install
入門
1. Hello World!
最簡單的例程,對用戶發送的所有消息,回復“Hello World!”
from vlang.menu import Menu from vlang.server import start class MainMenu(Menu): def action(self): yield "Hello World" # token需和微信后臺填寫一致 settings = {"url" :"/weixin", "port" : 8080, "token" : "WQif56gU" } start(MainMenu(), settings)
2. 微信計算器
-
簡易乘法計算器
from vlang.menu import Menu from vlang.server import start class MainMenu(Menu): def action(self): num0 = yield "請輸入因數1:" #用戶輸入將保存在num0里. num1 = yield "請輸入因數2:" num2 = float(num0) * float(num1) yield "計算結果:\n {0} x {1} = {2}".format(num0,num1,num2) settings = {"url" :"/weixin", "port" : 8080, "token" : "WQif56gU" } start(MainMenu(), settings)
-
帶有二級級菜單的四則運算器,能計算加減法,乘法。
from vlang.menu import Menu from vlang.server import start class MainMenu(Menu): def tag(self): self.name = "計算器" def action(self): reply = yield self.makeMenu() # 根據子菜單的名字,生成菜單列表 yield self.autoJump(reply) # 根據回復,跳轉到對應菜單 class Menu_1(Menu): def tag(self): self.name = "加減法" def action(self): reply = yield self.makeMenu() yield self.autoJump(reply) class Menu_1_1(Menu): def tag(self): self.name = "加法" def action(self): num0 = yield "請輸入加數1:" num1 = yield "請輸入加數2:" num2 = float(num0) + float(num1) yield "計算結果:\n {0} + {1} = {2}".format(num0, num1, num2) class Menu_1_2(Menu): def tag(self): self.name = "減法" def action(self): num0 = yield "請輸入被減數:" num1 = yield "請輸入減數:" num2 = float(num0) - float(num1) reply = yield '''計算結果:\n {0} - {1} = {2} 回復“ 0 ”可回到主菜單'''.format(num0, num1, num2) if reply == "0" : yield MainMenu # 跳轉到指定菜單 class Menu_2(Menu): def tag(self): self.name = "乘法" def action(self): num0 = yield "請輸入因數1:" num1 = yield "請輸入因數2:" num2 = float(num0) * float(num1) yield "計算結果:\n {0} x {1} = {2}".format(num0, num1, num2) # 鏈接菜單 menuTree = MainMenu() # 新建一個菜單樹 menuTree.add(Menu_1) # 鏈接一級菜單 menuTree.add(Menu_2) menuTree.Menu_1.add(Menu_1_1) # 鏈接二級菜單 menuTree.Menu_1.add(Menu_1_2) # 設置并啟動服務器 settings = {"url" :"/weixin", "port" : 8080, "token" : "WQif56gU" } start(menuTree, settings)
Menu
在vLang中,微信項目是由一個個菜單鏈接而構成的, 本節將詳細介紹vLang中菜單的結構,鏈接,啟動。
結構
菜單是繼承自vlang.menu.Menu的類,并需重載其action()方法,用來接收,處理,回復微信消息。 在多級菜單中,還需重載tag()方法,用以保存一些設置,目前僅有self.name這一項,用以指定菜單的名字。
from vlang.menu import Menu class MainMenu(Menu): def tag(self): #用以保存本菜單的設置。 self.name = "主菜單" def action(self): #當收到用戶消息時,vLang會調用對應菜單的action(),并傳入用戶消息。 pass
鏈接
為了簡化開發,vLang支持多級菜單。菜單與其子菜單的鏈接使用add(Menu)。 在上文 四則運算器 一例中,
menuTree = MainMenu() #新建一個菜單樹,必須為Menu類的實例。 menuTree.add(Menu_1) #鏈接一級菜單 menuTree.add(Menu_2) menuTree.Menu_1.add(Menu_1_1) #鏈接二級菜單 menuTree.Menu_1.add(Menu_1_2)
啟動
vlang.server.start(menuTree, settings)
其中, menuTree是Menu類的實例,如果有多級菜單,啟動前需先鏈接菜單。 settings是一個包含許多設置的字典
settings = {"url" :"/weixin", "port" : 8080, #默認為 80 端口 "ip":"127.0.0.1", #默認為"" , 綁定所有地址, "token" : "WQif56gU",#在微信公眾號官網設置的token "work" : "WQif56gU"} #可同時服務的用戶數量,也是線程數量,默認為10
yield!
Python中 yield 關鍵字具有神奇的魔力。 vLang中,yield用于: 回復/接收消息,跳轉菜單
回復
-
給用戶發送消息:
yield "您好,歡迎光臨!"
-
給用戶發送消息,并得到回復:
reply = yield "請輸入用戶名:"
-
緩存一段話,暫不發給用戶,程序將繼續執行至下一個yield語句處。一般用于緩存一段錯誤信息:
def action(self): while(True): try: reply = yield "請輸入整數:" num = int(reply) break except ValueError: yield "您輸入的不是整數,請重試\n", self.BUFFER # 緩存一段話,后面添加個self.buffer即可。
如果用戶輸入了"haha",int(reply)將拋出ValueError異常 程序實際回復:
您輸入的不是整數,請重試 請輸入整數:
可緩存多段文本,當程序繼續執行到沒有self.buffer的yield語句時,vLang才會將緩存區文本發送給用戶。
跳轉
以 入門 小節中,四則運算器 為例。
-
跳轉到另一個菜單:
yield Menu_1_2
能夠傳入Menu,或者Menu的實例。 例如,跳轉到主菜單可以這樣寫:
yield MainMenu
也可以這樣寫:
yield menuTree
-
跳轉到現行菜單的開始點:
yield self
特別的,如果沒有顯式指定下一個菜單,當action() 執行完后,默認跳轉到現行菜單的開始點。
-
跳轉到父菜單:
yield self.baseMenu
-
當然,跳轉菜單的同時也能給用戶回復消息,也緩存一段信息:
yield "充值失敗!", MainMenu , self.buffer
不過,上面的三個參數得 按順序 寫。其原型是:(String , Menu , self.buffer)
版本
目前版本為 0.2.1 ,是開源的第一個版本。
-
下個版本中,將會有如下改進:
-
autoJump() 支持模糊匹配
-
加入日志模塊
-
加入消息加解密功能
-
支持多媒體消息,如語音,圖片,圖文,地理位置等
-
未來版本中,可能有如下改進:
-
在80端口處提供一個管理員網頁,方便設置,管理
-
提供幸運大轉盤,刮刮卡等等常見活動
-
接入 其他開源項目,以支持中文分詞和情感分析
-
……
-
非常期待您的建議!