您的位置:首页 > 编程语言 > Python开发

论如何使用Python进行微信公众号的开发

2016-07-21 13:58 716 查看
说到微信公众号的开发,不外乎两种,一种是使用官方提供的接口开发,一种就是通过模拟登录来实现接口(这种方式有被封的风险,这里不论述)

Python发展至今,已经有多种完善的服务器框架可以使用,Django,Tornado,Flask等,可以使用这些框架打造一个服务器,在其之上实现微信公众号的功能就好。

至于怎么申请微信公众号、设置开发模式和指定开发token的url这类问题,这里也不一一论述,毕竟这在网上一搜就能找到了。

在我看来,微信公众号的开发在接口上说来也只有两种,一种就是验证,另一种就是回应,可以根据请求方法来区分
@csrf_exempt
def handleWechatRequest(request):
if request.method == "GET":
# createMenu()
response = HttpResponse(checkSignature(request),content_type="text/plain")
return response
elif request.method == "POST":
response = HttpResponse(responseMsg(request),content_type="application/xml")
return response
else:
response = None
return response


第一种,验证:简单点说来,就是验证请求的内容是否正确,这一点是个大前提,也就是说这一点决定了在公众号上设置URL和token时是否能通过。关于这一点,就是关于微信公众好的验证算法了,简单点说来就是,根据设定的token值、请求的timestamp值、请求的nonce值进行排序后组成字符串,再经过哈希的sha1加密后和请求的signature相比较。如下实例:

def checkSignature(request):
signature = request.GET.get("signature", None)
timestamp = request.GET.get("timestamp", None)
nonce = request.GET.get("nonce", None)
echostr = request.GET.get("echostr", None)
token = Wechat_Token
tmpList = [token, timestamp, nonce]
tmpList.sort()
tmpstr = "%s%s%s" % tuple(tmpList)
tmpstr = hashlib.sha1(tmpstr).hexdigest()
if tmpstr == signature:
return echostr
else:
return None

第二种,回应:这里的功能就需要根据自己需求了,你可以实现一些自动回复的功能或是一些有趣的功能,这里无非就是对基础接口的运用,根据指定的格式来回应,来来去去也就是文本、图像、声音、事件等等单一或集合的形式,这里的接口众多(官方都有详细的介绍,什么类型的请求有什么样的字段信息,回应什么类型的信息使用什么格式等都有很详细的介绍),就不一一列举,只举个实例来形容一下(如下实例是发送位置返回经纬度和位置信息):

def responseMsg(request):
rawData = smart_str(request.body)
xml = ET.fromstring(rawData)
msg = paraseMsgXml(xml)
MsgType = msg.get("MsgType")
if MsgType == "text":
return textMsg(msg)
elif MsgType == "location":
return locationMsg(msg)
def paraseMsgXml(rootElem):
msg = {}
if rootElem.tag == "xml":
for child in rootElem:
msg[child.tag] = smart_str(child.text)
return msg


def locationMsg(msg):
ToUserName = msg.get("ToUserName")
FromUserName = msg.get("FromUserName")
j = msg.get("Location_X")
w = msg.get("Location_Y")
Label = msg.get("Label")

replyContent = "纬度:"+j+"\n经度:"+w+"\n位置信息:"+Label
locationXML = """<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>""" %(FromUserName,ToUserName,str(int(time.time())),replyContent)
return locationXML


微信公众号开发不难,按照官方的接口来开发,更是不是什么技术点,看起来就像是格式的组装以及HTTP请求而已,真正难的是你的创意,实现什么功能,在你没什么好创意时,而又想尝试一下微信公众号的开发,我建议先使用官方的接口来尝试一下,之后可以使用一些现成的接口(例如google提供的API,百度提供的API等等)来为公众号添加一些功能,例如百度的导航,这些都是可以实现的,只要会使用这类API就可以,使用接口不难,难的都让实现接口的人做好了。
另外,例如使用Django开发出来服务器运行在本机上是无法使用的,因为默认是无法出外网的,需要一些手段才可以,这里不作介绍。推荐使用SAE、BAE这类,可以把代码放在上面运行得到一个链接,关键有免费的额度,至于怎么使用,可以找搜一下,这不是什么秘密。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息