黄色草逼视频_久久夜夜视频_亚洲国产成人久久午夜_三级在线播放
網站改版
|
WAP網站制作
|
域名注冊
|
虛擬主機
|
服務器
|
海微商
|
海微信
|
海微通
|
無障礙
| 24小時服務電話:13807590485
海南網站建設
海南網站制作
海口網站建設
三亞網站建設
儋州網站建設
五指山網站建設
文昌網站建設
瓊海網站建設
萬寧網站建設
東方網站建設
定安網站建設
網站首頁
網站首頁
網站建設
網站建設
微信開發
微信開發
網站推廣
網站推廣
海南世紀華聯
網站超市
網站超市
客戶案例
客戶案例
網站模板
網站模板
關于我們
關于我們
無障礙
微信開發
微信系統開發
微信開發功能
公眾號基礎教程
開發技術資訊
公眾號推廣營銷
客戶案例
聯系我們
QQ服務群:
28519571
工作時間:
86-0898-31568080
傳真號碼:
86-0898-31568085
24小時服務:
0138-07590485
您現在的位置: 首頁 >> 微信開發 >> 開發技術資訊
開發技術資訊
微信機器人:有道翻譯小助手——Django + SAE + 微信公眾帳號自動回復開放接口
世紀華聯 | 2018-01-26 23:32:14 | 閱讀:13647
Sina App Engine
首先作為一個屌絲開發者要解決服務器的問題。去SAE的官網上用新浪微博的帳號注冊一個帳號,成功后會贈給你500云豆,可供一個開發者試用大概5天。SAE非常優秀,如果以后我們想在上面寫點應用什么的,可以去申請實名認證和開發者認證,那樣每個月都會給你一定數量的云豆,應該能滿足日常需求。由于現在SAE上部署Python還處于公測階段,因此我們要去申請開通可以在上面部署Python程序的權限,現在很好申請的,不一會就會收到已經為你開放了部署Python應用權限的郵件,網上搜到的啥啥還需要排隊都是過去了(不排除當你看到這篇文章時SAE已經可以允許所有開發者部署Python的應用了)。
OK,完成這些后,就可以到SAE的文檔中心讀文檔來照著文檔里面的樣例創建一個應用了。
有道API
然后,去有道API申請一個key,申請的時候網站地址隨便填就行。有道API非常簡單,直接以GET的形式把要翻譯的文本發送到指定的url,然后它會給我們回復翻譯結果,我們可以選擇xml、json等返回格式,我選得是xml,接著,在瀏覽器里面按著指定的格式輸入url,就可以看到返回結果啦:
<?xml version="1.0" encoding="UTF-8"?>
<youdao-fanyi>
<errorCode>0</errorCode>
<query><![CDATA[這里是有道翻譯API]]></query>
<!-- 有道翻譯 -->
<translation>
<paragraph><![CDATA[Here is the youdao translation API]]></paragraph>
</translation>
</youdao-fanyi>
復制代碼
注意,如果是對詞進行翻譯的話有的詞還會返回一些啥網絡釋義,基本釋義啥的,具體對這個xml解析的方法請看下面的代碼。
微信公眾帳號
接著,我們要去微信的公眾帳號平臺去申請一個公眾帳號,不能用現有的已綁定私人微信帳號的QQ號申請,我用的是一個平時不用的QQ號申請的,申請成功后,可以大致看看微信公眾帳號的管理平臺(現在你知道那些公眾帳號,比如王力宏的帳號啥的是怎么運作的了吧),接著去這里仔細閱讀微信公眾帳號自動回復開放接口的文檔,你要從這里學一種如何讓用戶認證的思想(就是如果用戶做了XX,給我返回了XX結果,那么我就能確定,用戶是“合法”的),或者認證的方法。大致有一個認識后,趕緊下載他給的樣例php源碼,也是唯一的可以參考的源碼,仔細閱讀,如下:
<?php
/**
* wechat php test
*/
//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
//valid signature , option
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
public function responseMsg()
{
//get post data, May be due to the different environments
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
//extract post data
if (!empty($postStr)){
echoStr
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$time = time();
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
if(!empty( $keyword ))
{
$msgType = "text";
$contentStr = "Welcome to wechat world!";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
}
}else {
echo "";
exit;
}
}
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}
?>
復制代碼
很簡單吧,以至于被一些人說寫的很水,但是我覺得,這份php源碼還是很有含金量的;網上一些哥們還抱怨啥啥的直接部署樣例php不能運行啥的,拜托,有點職業精神好不好,連我這個之前完全不會php的人都能看出來要調用里面的responseMsg( )方法才能實現自動回復,樣例里面的只是調用了微信接入的認證功能的函數。
上面的代碼寫的很好,不需要我多解釋,相信大家能看出來它是怎么工作的。
設計與實現
接著就可以實現我們自己的應用了,首先把我們在SAE上創建的應用通過SVN檢出到本地,然后切換到檢出的目錄,用Django的命令創建一個應用,目錄結構如下:
其中,index.wsgi和config.yaml是SAE規定的文件,具體請仔細閱讀SAE的文檔。
之后就可以編寫我們自己的服務端代碼了,大致思想就是:用戶A向公眾帳號發送一條消息,微信平臺會按著公眾帳號預先的設置,把用戶A的消息內容和一些其他信息(如創建時間等)以xml的形式post到我們預先設置好的url上(這個url的服務端就是我們要寫的在SAE上的應用),我們要做的就是每當接受到微信post請求,我們解析微信平臺post過來的xml,得到用戶A的消息內容,把消息內容以get的形式發送到有道API,獲取有道API返回的xml(或json等),解析,之后按微信平臺規定的格式構造成一個xml,作為微信平臺post請求的結果給其返回,微信平臺收到結果后,會把消息自動回復給用戶,用戶就能收到翻譯結果了。
用一個圖表示上述過程如下:
源碼
下面貼出邏輯處理部分代碼如下(Views.py),各函數功能不言而喻:
[python] view plaincopy
# -*- 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
TOKEN = "你設置的Token"
YOUDAO_KEY = 你申請到的有道的Key
YOUDAO_KEY_FROM = "有道的key-from"
YOUDAO_DOC_TYPE = "xml"
@csrf_exempt
def handleRequest(request):
if request.method == 'GET':
#response = HttpResponse(request.GET['echostr'],content_type="text/plain")
response = HttpResponse(checkSignature(request),content_type="text/plain")
return response
elif request.method == 'POST':
#c = RequestContext(request,{'result':responseMsg(request)})
#t = Template('{{result}}')
#response = HttpResponse(t.render(c),content_type="application/xml")
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_youdaoURL = "http://fanyi.youdao.com/openapi.do?keyfrom=%s&key=%s&type=data&doctype=%s&version=1.1&q=" % (YOUDAO_KEY_FROM,YOUDAO_KEY,YOUDAO_DOC_TYPE)
youdaoURL = "%s%s" % (raw_youdaoURL,urllib2.quote(queryStr))
req = urllib2.Request(url=youdaoURL)
result = urllib2.urlopen(req).read()
replyContent = paraseYouDaoXml(ET.fromstring(result))
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 paraseYouDaoXml(rootElem):
replyContent = ''
if rootElem.tag == 'youdao-fanyi':
for child in rootElem:
# 錯誤碼
if child.tag == 'errorCode':
if child.text == '20':
return 'too long to translate\n'
elif child.text == '30':
return 'can not be able to translate with effect\n'
elif child.text == '40':
return 'can not be able to support this language\n'
elif child.text == '50':
return 'invalid key\n'
# 查詢字符串
elif child.tag == 'query':
replyContent = "%s%s\n" % (replyContent, child.text)
# 有道翻譯
elif child.tag == 'translation':
replyContent = '%s%s\n%s\n' % (replyContent, '-' * 3 + u'有道翻譯' + '-' * 3, child[0].text)
# 有道詞典-基本詞典
elif child.tag == 'basic':
replyContent = "%s%s\n" % (replyContent, '-' * 3 + u'基本詞典' + '-' * 3)
for c in child:
if c.tag == 'phonetic':
replyContent = '%s%s\n' % (replyContent, c.text)
elif c.tag == 'explains':
for ex in c.findall('ex'):
replyContent = '%s%s\n' % (replyContent, ex.text)
# 有道詞典-網絡釋義
elif child.tag == 'web':
replyContent = "%s%s\n" % (replyContent, '-' * 3 + u'網絡釋義' + '-' * 3)
for explain in child.findall('explain'):
for key in explain.findall('key'):
replyContent = '%s%s\n' % (replyContent, key.text)
for value in explain.findall('value'):
for ex in value.findall('ex'):
replyContent = '%s%s\n' % (replyContent, ex.text)
replyContent = '%s%s\n' % (replyContent,'--')
return replyContent
def getReplyXml(msg,replyContent):
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
復制代碼
之后通過SVN把項目部署到SAE上,就OK啦~
遇到的問題
現在網上這種參考的代碼還很少,在SAE上部署調試也非常困難,無奈下我自己寫了個腳本,模仿微信平臺給自己部署在SAE上的服務端POST消息,看返回的結果。如果出現錯誤,Django都會產生一個優美的錯誤頁面,獲取這個錯誤頁面把它寫到本地的一個html里面,用瀏覽器打開就可以知道是什么錯誤了。
寫的過程中還是遇到不少問題的:
1.Django的CSRF錯誤:
我用的Django 1.4,我嘗試了大家說的很多解決辦法都會出現403錯誤,無奈下只能暫時通過修飾符把Django的CSRF暫時禁掉,這個還要以后學Django的深入調研一下;
2.Django的編碼錯誤:
我也嘗試了很多方法,但是都不行,主要是中文處理上,遇到了很多麻煩,最終在這里找到了完美的解決方案,用可愛的Django自帶的可愛的方法:smart_str、smart_unicode,就能完美處理中文了。
海南網站建設
|
海南網站制作
|
海口網站建設
|
三亞網站建設
|
儋州網站建設
|
五指山網站建設
|
文昌網站建設
|
瓊海網站建設
|
萬寧網站建設
|
東方網站建設
|
定安網站建設
|
屯昌網站建設
|
澄邁網站建設
|
臨高網站建設
|
白沙網站建設
|
昌江網站建設
|
樂東網站建設
|
陵水網站建設
|
保亭網站建設
|
瓊中網站建設
|
海口精英網
|
三亞精英網
|
文昌精英網
|
瓊海精英網
|
陵水精英網
|
儋州精英網
|
萬寧精英網
|
澄邁精英網
|
海微通
合作伙伴
企業發展
企業文化
聯系我們
在線訂購
網站地圖
返回首頁
手機版
海口世紀華聯科技有限公司2025版權所有 24小時服務熱線:13807590485 歡迎來電咨詢
地址:海南省.海口市.海甸二東路環惠大廈6樓(南寶路明都大廈107#) 公司電話:0898-31568080 31568060 QQ:85398489
全國合作聯盟分布:海南海口 四川成都 湖北武漢 湖南長沙 安徽合肥 廣東深圳 山西太原 西藏拉薩
技術服務: E_mail:server@www.0118yy.com 服務訂購:E_mail:server@www.0118yy.com 在線客服邀請
瓊ICP備10201086號-15
推廣關鍵字:
海南網站建設公司
,
海南網站制作公司
,
海南網站開發公司
,
海南微信開發公司
,
海南微信公眾號開發公司
,
海南微信公眾號代運營公司
,
海南模板網站制作公司
,
海南網頁設計公司
,
海南網絡公司