基于模型的微信開發框架:vlang

jopen 9年前發布 | 12K 次閱讀 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端口處提供一個管理員網頁,方便設置,管理

    • 提供幸運大轉盤,刮刮卡等等常見活動

    • 接入 其他開源項目,以支持中文分詞和情感分析

    • ……

    • 非常期待您的建議!

項目主頁:http://www.baiduhome.net/lib/view/home/1432433844699

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!