众所周知,我搞了个微信公众号,然后提供了一个功能,就是你写关键字,我回复你一个该关键字对应得内容,所以今天说一下这个功能是怎么实现的。
假设我们已经安装好了Python,版本么,不是很重要,我这次使用的是3.8.6这个版本,服务器上用的是3.6.9版本,Django么,就是最新版的,这次主要是参考Django的官方文档。
# 安装Django pip install djangoWeRoBot 是一个微信公众号开发框架,采用MIT协议发布。
开源地址:https://github.com/offu/WeRoBot文档地址:https://werobot.readthedocs.io/zh_CN/latest/
安装werobot pip install werobot终于,开始改代码了
这个文件呢,简单来说就是所有功能都是放在这里,所以根据werobot文档中与其他Web框架集成所说,更改view文件。
# 导入各种相关的模块 # 第一个是数据库模型,这个等下还有一个文件要改,再说 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这个东西,所以,我们只需要在类中将数据库描述出来就行了。
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.descdjango框架,默认使用的是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生成一些数据库创建相关的文件 # 执行完成后,在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这个文件修改比较简单,就一行,上边弄完了以后呢在管理员界面还不能显示我们添加的那个数据库信息,我们需要在这个文件里进行一个注册,将该表注册到管理员界面中,就可以显示了。
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)) ]