前言:虽然简单,但是稍稍还是有点可取的地方的,终于可以有一个可以作为项目放在自己的github上了T_T,一个好项目一定是可拔插好扩展的,离好项目至少60%吧,以后再进一步完善了。
说实话,有一个微信公众号还是蛮方便的,可以将一些自己常用的功能(当然了,这些功能也可以包括工作相关的,不过现在没上班ing)全部集成在公众号里面,这样输入关键字就可以让一些自己总是重复的事情交给自己的代码实现了,其实本来也是想给自己父母集成的微信公众号。
首先瞧瞧效果图。
ps:争取以后做成H5网站的只要点击就可以了,而不是关键字,因为输入关键字对于老一辈还是会太麻烦,再者这些功能也好不够贴近痛点。
好吧,进入主题。
首先简单说明一下步骤,做一个摘要。
1.注册微信公众号
2.服务器配置
3.代码内容解析
注册微信公众号
注册一个微信公众号,免费的固然好不过功能是在太少,但是就自己用也足够了。
注册地址:https://mp.weixin.qq.com/cgi-bin/readtemplate?t=register/step1_tmpl&lang=zh_CN
注册还是蛮简单的,仅需要一个邮箱以及×××正反面。具体步骤可参考:http://jingyan.baidu.com/article/6525d4b134051eac7d2e9417.html
注:如果是为了查询用,建议选择服务号,如果定期发送文章什么的,就选订阅号吧。
服务器配置
这里的服务器指两部分,一是代码所在服务器配置,二是微信公众号上的配置。
首先看代码所在服务器配置,这里选择flask框架。至于服务器,无论选择各云厂商的云主机还是公司公网映射,抑或免费的云空间都是可取的,唯一的要求就是需要一个可访问的url以及可以运行Python代码。。
参考:https://mp.weixin.qq.com/wiki
http://my.oschina.net/yangyanxing/blog/159215
安装flask
pip install flask
代码如下
#coding:utf-8
from flask import Flask,render_template,request,make_response
import time
import hashlib
import xml.etree.ElementTree as ET
@app.route("/wechat",methods = ["GET","POST"])
def wechat_auth():
if request.method == 'GET':
if len(request.args) > 3:
token = 'xxxxxxx'
query = request.args
signature = query['signature']
timestamp = query['timestamp']
nonce = query['nonce']
echostr = query['echostr']
s = [timestamp, nonce, token]
s.sort()
s = ''.join(s)
sha1str = hashlib.sha1(s).hexdigest()
if sha1str == signature:
return make_response(echostr)
else:
return make_response("认证失败")
else:
return "认证失败"
保存为myapp.py
然后在当前目录新建一个manager.py文件
from myapp import app
app.debug = True
app.run()
运行manager.py文件
python manager.py
访问127.0.0.1:5000/wechat,显示如下
注意:上面的token令牌,那是自定义的,随便什么字符,不过微信与服务器上的配置要一样。
还有就是flask的部署建议是通过nginx部署,不过你直接python manager.py 也不会有太大问题。
Flask+WSGI+Nginx部署,
参考: http://www.cnblogs.com/Ray-liang/p/4173923.html
在微信公众号注册成功后,选择开发--->基本配置---->修改配置
URL填入自己的URL,Token配置成跟代码一致,EncodingAESK点击随机生成即可,加密方式兼容。最后点击提交。提示提交成功即通过。
代码内容解析
为了省略篇幅就不把源码全部粘贴进来了,有兴趣的访问https://github.com/youerning/pywechat/
接下来我们就可以写功能部分了,主要讲解一下思路,以及现在以现在水平看来还不错的部分。
一:抽离重用的部分
将处理用户发过的文本的函数以及实现功能的类放在一个单独的模块handler,resp中。
如下:
from handler import RequestTextGet,TextHandler,Menu
from resp import TextResp
二:方法调用
通过python中非常有用的方法减少代码量
如下:
def Get(self,Action,*args):
if Action in MenuCode: Action = MenuCode[Action]
Func = getattr(self,Action,None)
if callable(Func):self.Ret = Func(*args)
通过getattr函数判断时候存在相应的类方法,没有则返回None,这样就不需要写if判断语句或者try了,如果可callable就直接调用。
三:装饰器
因为用户的输入是不可信的,所以需要将不需要的参数以及多余的内容过滤出去。
比如,笑话不需要传入参数,你输入个"笑话 xxx xxx"那么我服务端一定报错,说参数传多了,但是不是每个方法都是不需要参数的,总得来说,我需要一个函数解决参数的问题,通过配置这个函数和的参数就可以控制传入的参数个数。
如下:
def ArgsConfig(Args=1):
def deco(func):
@wraps(func)
def wrap(self,*args,**kwargs):
args = args[:Args]
ret = func(self,*args,**kwargs)
return ret
return wrap
return deco
使用如下:
@ArgsConfig(0)
def xh(self):
#XHResp = requests.get("http://www.qiushibaike.com/text/")
randp = randint(1,6)
Payload = {"page":randp}
XHResp = requests.get("http://www.walxh.com/pc/hot/",params=Payload)
#XHRet = re.findall(r"""<div class="content">(\s*.*\s*)</div>""",XHResp.content)
XHRet = re.findall("""<p>(.*?)</p>""",XHResp.content)
num = randint(0,len(XHRet))
Ret = XHRet[num]
return Ret
后记:扩展性不是很好,以及天气,翻译功能需要依赖其他API,但是做成爬虫维护成本又可能变大。虽然这个项目至多达到一个及格项目的30%,等我写完另一个项目在继续吧,话说在家百无聊赖呀,哈哈。