微信公眾平臺開發Python 版本
阿新 • • 發佈:2019-01-31
上一篇說到了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
這是用java的Runtimetry{ 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(); } }
一、環境搭建。
同樣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的% 符號,就非常容易地生成了。至於,大家可以想到有什麼好的辦法,可以和我說一下。
好了,就這麼簡單。一個訊息的傳送,接收,就結束了。