衆所周知,我搞了個微信公衆號,而後提供了一個功能,就是你寫關鍵字,我回復你一個該關鍵字對應得內容,因此今天說一下這個功能是怎麼實現的。
html
假設咱們已經安裝好了Python,版本麼,不是很重要,我此次使用的是3.8.6這個版本,服務器上用的是3.6.9版本,Django麼,就是最新版的,此次主要是參考Django的官方文檔。python
# 安裝Django pip install django
# 建立Django項目 django-admin startproject mysite # 項目建立完成後,目錄結構以下 mysite/ manage.py mysite/ __init__.py settings.py urls.py asgi.py wsgi.py # 建立app,此app非彼app,而是一個一個具體完整的功能 # startapp後邊加上一個app名稱,這裏我主要是作微信機器人,用werobot框架 # 因此,名字起了個wrob,須要肯定的是,這裏的app名稱不能和各類關鍵詞相同 python manage.py startapp wrob # 此時,目錄結構以下 wrob/ __init__.py admin.py apps.py migrations/ __init__.py models.py tests.py urls.py views.py
WeRoBot 是一個微信公衆號開發框架,採用MIT協議發佈。
開源地址:https://github.com/offu/WeRoBot
文檔地址:https://werobot.readthedocs.io/zh_CN/latest/git
安裝werobot pip install werobot
這個文件呢,簡單來講就是全部功能都是放在這裏,因此根據werobot文檔中與其餘Web框架集成所說,更改view文件。sql
# 導入各類相關的模塊 # 第一個是數據庫模型,這個等下還有一個文件要改,再說 from django.db.models import Model # Create your views here. # 導入werobot模塊 from werobot import WeRoBot # 導入數據庫模型,這個等會再說 from .models import share # 微信模塊所須要的各類基本認證信息,能夠在公衆號開發者那塊獲取到 COMPONENT_APP_ID = 'XXXXXXXXXXXXXXX' COMPONENT_APP_SECRET = 'XXXXXXXXXXXXXXXXXXXXXX' COMPONENT_APP_TOKEN = 'XXXXXXXXXXXX' COMPONENT_ENCODINGAESKEY = 'XXXXXXXXXXXXXXXXXXX' # 建立werobot的對象,起個名叫MyRobot MyRobot = WeRoBot(token=COMPONENT_APP_TOKEN) MyRobot.config["APP_ID"] = COMPONENT_APP_ID MyRobot.config["APP_SECRET"] = COMPONENT_APP_SECRET # 消息裝飾器,若是用戶發送的是文本內容,則自動執行這裏的方法 @MyRobot.text def echo(message): # 獲取消息內容,若是須要獲取用戶的openid,也能夠在這裏獲取 content = message.content # 若是文本內容大於1個字符,少於20個字符,畢竟關鍵詞,太多了,應該就不叫詞了 if 20 > len(content) >= 1: # 大寫轉換爲小寫,也就是不區分大小寫 content = content.lower() # 根據關鍵詞到數據庫中進行查詢數據 res = share.objects.filter(key=content).values() # 因爲一個關鍵詞可能對應多個內容,因此須要對搜索結果進行處理 slist = [] for data in res: temp = [ data["desc"], data["link"], data["secret"] ] slist.extend(temp) string = "\n".join(slist) # 將結果返回就好了 return string # 這,就是一個訂閱的裝飾器,也就是誰訂閱了,則給他回覆這樣一條消息 @MyRobot.subscribe def welcome(message): return '''感謝這麼漂亮的你關注個人公衆號,我叫電池,但願可以爲你的進步略盡綿薄之力''' # 這個是取消訂閱發送的消息,又能怎樣呢。。。 # 能夠在這裏作一些功能,好比說加到黑名單,誰取消了,就不讓他再訂閱了,就行了 @MyRobot.unsubscribe def goodbye(message): return 'nothing'
django提供了一套數據庫處理框架,可使用面向對象的方式處理數據庫,也就是ORM這個東西,因此,咱們只須要在類中將數據庫描述出來就好了。shell
from django.db import models # Create your models here. # 建立類 # 這裏類名和數據庫中的表名是有關係的 # 通常來講是app名_類名就是表名 class share(models.Model): # 這裏建立了4列數據,包含了關鍵詞、描述、連接、連接對應得密鑰 key = models.CharField(max_length=50) desc = models.CharField(max_length=200) link = models.CharField(max_length=100) secret = models.CharField(max_length=100) # 這個麼,就是這個類描述信息 # 當使用print輸出對象的時候,只要本身定義了__str__(self)方法,那麼就會打印從在這個方法中return的數據 # 這裏咱們返回數據庫中的描述信息 def __str__(self): return self.desc
django框架,默認使用的是sqlite數據庫,數據庫名稱和位置能夠在mysite的settings文件中進行修改,我改爲了「werobot.db」。
按道理說呢,咱們這裏只是建立了一個類,並不會建立出真正的數據庫表,須要進行一系列的操做才能真正的建立數據庫,這裏,順便建立一個管理員帳戶,django自帶了一個管理員後天,能夠管理數據庫的數據,仍是很給力的。
首先須要修改settings文件數據庫
# 修改mysite/settings.py # 在INSTALLED_APPS中添加'wrob.apps.WrobConfig', # 這個'wrob.apps.WrobConfig',不能瞎寫,wrob是 INSTALLED_APPS = [ 'wrob.apps.WrobConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]
執行一些命令django
# 執行這個命令,讓django生成一些數據庫建立相關的文件 # 執行完成後,在wrob/migrations/這個文件夾中會生成一個文件0001_initial.py python manage.py makemigrations wrob # 執行wrob這個app的0001_initial文件,生成一些sql語句 # 到這裏仍是沒有建立數據庫 python manage.py sqlmigrate wrob 0001 # 建立數據表,這個命令執行完成之後,纔算真正的建立相應的數據表 python manage.py migrate
# 執行該命令,按照提示,挨着添加用過戶名,密碼就好了 python manage.py createsuperuser
這個文件修改比較簡單,就一行,上邊弄完了之後呢在管理員界面還不能顯示咱們添加的那個數據庫信息,咱們須要在這個文件裏進行一個註冊,將該表註冊到管理員界面中,就能夠顯示了。瀏覽器
from django.contrib import admin # Register your models here. from .models import share admin.site.register(share)
這個文件掌管着url的解析任務,就是每一個url怎麼着就對應到了不一樣的view呢,就靠它,按道理來講呢,應該是每一個app裏有一個urls.py文件,而後在總的那個urls.py文件中進行include引用一下就好了,可是這裏呢,因爲就一個路由關係,因此,不要這麼複雜了,直接修改mysite/urls.py服務器
from django.contrib import admin from django.urls import path # 導入werobot中的make_view這個東西 from werobot.contrib.django import make_view # 導入咱們建立的app中的view中建立的那個MyRobot from wrob.views import MyRobot urlpatterns = [ path('admin/', admin.site.urls), # robot:url後邊的那半截若是是url,則使用MyRobot進行解析,這個url是不能經過瀏覽器進行訪問的 # 是須要填寫到微信開發者後臺那邊的設置那塊的 path('robot/', make_view(MyRobot)) ]