1. 程式人生 > >微信公眾平臺開發Python 版本

微信公眾平臺開發Python 版本

上一篇說到了Java的開發,這一篇來介紹一下Python版本的。用java是感覺自己稍微熟悉一些,後來涉及到關於爬蟲的東西,不太方便呼叫。哦對了,這裡也再介紹一下java和python之間的通訊吧。之前試過有一個叫做Jython的東西,結果它只支援到2.x,而且有很多另外匯入包,它都不識別。。。用著很不開心。然後再百度,找到了一個方法,可以用java去呼叫python的指令碼,然後在python中可以返回給java。程式碼貼一下就是如下的。就相當於是命令列,呼叫python,然後給它傳入需要的引數。唯一不爽的就是,回傳回來的值,編碼上有問題。。。百般無奈之下,只好放棄了java,改用python。

PythonInterpreter interpreter = new PythonInterpreter();  
        interpreter.execfile("F:\\Pycharm_Code\\python_web2\\claw_teacher.py");  
        PyFunction func = (PyFunction)interpreter.get("hello",PyFunction.class);  
  
        int a = 2010, b = 2 ;  
        //PyObject pyobj = func.__call__(new PyInteger(a), new PyInteger(b));  
        PyObject pyobj = func.__call__(new PyString("曲海鵬"));  
        System.out.println("anwser = " + pyobj.toString()); 

這是Jython
  try{  
            System.out.println("start");  
            Process pr = Runtime.getRuntime().exec("python F:\\Pycharm_Code\\python_web2\\claw_teacher.py 引數1");  
            BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream(),"UTF-8"));  
            String line;  
            while ((line = in.readLine()) != null) {  
            	System.out.println(line);
            }  
            in.close();  
            pr.waitFor();  
            System.out.println("end");  
	    } catch (Exception e){  
	                e.printStackTrace();  
	            }  
    }
這是用java的Runtime

一、環境搭建。

同樣ngrok外網對映。python的話不想自己寫server的響應,就用了django框架。用pip可以輕鬆下到哦~pip install django

關於django的使用,大家可以自行百度,網上也是有很多的教程。我就是照著教程,一邊學習,一邊做的。說起來也算一個小白。

二、開發者模式接入。

原理就不講解了,直接貼程式碼吧。
<pre style="font-family: 宋體; font-size: 9pt; background-color: rgb(255, 255, 255);">
from django.views.generic.base import View

class WeChat(View):
    @csrf_exempt
    def dispatch(self, *args, **kwargs):
        return super(WeChat, self).dispatch(*args, **kwargs)

    def get(self, 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是我們自己來定義的,並且這個要填寫在開發文件中的Token的位置
        token = 'imooc'
        # 把token,timestamp, nonce放在一個序列中,並且按字元排序
        hashlist = [token, timestamp, nonce]
        hashlist.sort()
        # 將上面的序列合成一個字串
        hashstr = ''.join([s for s in hashlist])
        # 通過python標準庫中的sha1加密演算法,處理上面的字串,形成新的字串。
        hashstr = hashlib.sha1(hashstr.encode('utf-8')).hexdigest()
        # 把我們生成的字串和微信伺服器傳送過來的字串比較,
        # 如果相同,就把伺服器發過來的echostr字串返回去
        if hashstr == signature:
            return HttpResponse(echostr)

    def post(self,request):
        #得到了一個實體類
        weixin = WeiXin(request,request.body)
        #經過處理請求,最後返回一個 ,str型別的
        returntxt = process(weixin)
        #print(returntxt)
        return HttpResponse(returntxt)
在views中,定義了一個python的類,然後用到了其中的get,post方法。

三、訊息的接收。

訊息的接收,在python中也非常的簡單。訊息是post格式的,所以,發給python的後臺,引數是放到body裡頭的,所以大家只要看這個body就可以了。

貼上程式碼吧。解釋一下,引數裡頭,self第一個。request,就是views的函式啊,之類的都能收到的那個request,body,就是,request.body。

<pre style="font-family: 宋體; font-size: 9pt; background-color: rgb(255, 255, 255);"><span style="color:#000080;"><strong>from </strong></span>xmltodict <span style="color:#000080;"><strong>import </strong></span>parse

class WeiXin():
    def __init__(self,request,body):
        body = body.decode('utf-8')
        print(body)
        self.data = {}
        try:
            data = parse(body, force_cdata=True)
        except Exception as e:
            self.data = {}
        data = data['xml']
        for key in data.keys():
            try:
                self.data[key] = data[key]['#text']
            except Exception as e:
                continue
        print(self.data)
        return

    def getData(self):
        return self.data
這裡用到了一個python的包,xmltodict
非常的方便,可以把xml轉換成一個dict,大家也看到了,具體使用,就是parse一下就行了。當然是把 str ---->dict啊,不是別的什麼都行啊。

好,既然訊息接收到,而且也放到了一個dict裡頭,就像上一篇,java把訊息放到了map裡頭啊,大家就盡情地使用啦,非常的方便的。

四、訊息的傳送。

訊息的傳送,在python中,也是非常簡單的。只不過呢,在django中,要發回去一個httpResponse物件
    def post(self,request):
        #得到了一個實體類
        weixin = WeiXin(request,request.body)
        #經過處理請求,最後返回一個 ,str型別的
        returntxt = process(weixin)
        #print(returntxt)
        return HttpResponse(returntxt)

 所以大家也看到了,要用HttpResponse()包裝一下。returntxt就是要返回訊息的str,具體呢,我是這樣生成的。
def TextProcess(from1,to,txt):
    if txt == '':
        txt = '暫時沒有查詢到這個老師的資訊。'
    extTpl = '''<xml>
    		<ToUserName><![CDATA[%s]]></ToUserName>
    		<FromUserName><![CDATA[%s]]></FromUserName>
    		<CreateTime>%s</CreateTime>
    		<MsgType><![CDATA[%s]]></MsgType>
    	 	<Content><![CDATA[%s]]></Content>
    	 	</xml>'''
    try:
        extTpl = extTpl % (from1, to,
                           str(int(time.time())), 'text', txt)
    except Exception as e:
        # addWeixinLog(self.request,e)
        return ''
    return extTpl
這樣用python的% 符號,就非常容易地生成了。至於,大家可以想到有什麼好的辦法,可以和我說一下。
好了,就這麼簡單。一個訊息的傳送,接收,就結束了。