zoukankan      html  css  js  c++  java
  • 用django实现一个微信图灵机器人

    微信的post请求格式是xml,所以django需要做的就是将xml请求解析出来,把content发送到图灵机器人接口, 接口返回的json数据把主要内容给解析出来,然后重新封装成xml返回给微信客户端。如果只做文本处理,可以直接修改views.py的responseMsg函数即可,其他代码可以固定不变。

    urls.py

    from django.conf.urls import patterns, include, url
    from littesnail.views import handleRequest
    
    urlpatterns = patterns('',
        # Examples:
        url(r'^$', handleRequest),
    )

    views.py

    # -*- coding: utf-8 -*-
    from django.http import HttpResponse
    from django.template import RequestContext, Template
    from django.views.decorators.csrf import csrf_exempt
    from django.utils.encoding import smart_str, smart_unicode
    import xml.etree.ElementTree as ET
    import urllib,urllib2,time,hashlib
    import json
    
    TOKEN = "******"
    API_KEY = 'bc192acc72******11c19342f5f0274'
    USER_ID=4**73
    
    
    @csrf_exempt
    def handleRequest(request):
        if request.method == 'GET':
            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:
            return None
    
    def checkSignature(request):
        global TOKEN
        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 = 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):
        rawStr = smart_str(request.raw_post_data)
        #rawStr = smart_str(request.POST['XML'])
        msg = paraseMsgXml(ET.fromstring(rawStr))
        queryStr = msg.get('Content','You have input nothing~')
        raw_tulingURL = "http://www.tuling123.com/openapi/api?key=%s&%s&info=" % (API_KEY,USER_ID)    
        tulingURL = "%s%s" % (raw_tulingURL,urllib2.quote(queryStr))
        req=urllib2.Request(tulingURL)
        raw_json=urllib2.urlopen(req).read()
        hjson=json.loads(raw_json)
        length=len(hjson.keys())
        content=hjson['text'].encode('utf-8')
        if length==3:
            replyContent= "%s%s"%(content,hjson['url'].encode('utf-8'))
        elif length==2:
            replyContent= content
        else:
            return "please input again."
        replyContent = content
        return getReplyXml(msg,replyContent)
    
    def paraseMsgXml(rootElem):
        msg = {}
        if rootElem.tag == 'xml':
            for child in rootElem:
                msg[child.tag] = smart_str(child.text)
        return msg
    
    
    def getReplyXml(msg,replyContent):
        for i in range(1,1000):
            extTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content><FuncFlag>0</FuncFlag></xml>";
            extTpl = extTpl % (msg['FromUserName'],msg['ToUserName'],str(int(time.time())),'text',replyContent)
            return extTpl

    结果演示:

    GITHUB地址: https://github.com/alexknight/dajngowithwechat

  • 相关阅读:
    通信错误:(-1)[描述:无法解析路由器DDNS地址,请检查DDNS状态.] 解析办法
    小数量宽带用户的福音,Panabit 云计费easyradius 接口隆重发布,PA宽带计费系统
    送给那些经常问我如何设置360测速结果为电信的朋友,360测速模块原理简单分析
    Universal-Image-Loader(UIL)使用方法&流程图&源码分析 ----- 未完
    Android开发框架
    Android线程池的使用(未完)
    Android LruCache究竟是什么
    Java finally语句到底是在return之前还是之后执行?
    Android自定义图片加载框架
    Android 自定义View实现单击和双击事件
  • 原文地址:https://www.cnblogs.com/alexkn/p/4275108.html
Copyright © 2011-2022 走看看