手机微信设备人:有道汉语翻译小小助手——D

 您如今的部位:  >> 手机微信开发设计 >> 开发设计技术性新闻资讯 开发设计技术性新闻资讯
手机微信设备人:有道汉语翻译小小助手——Django + SAE + 手机微信公众账号全自动回应对外开放插口 海口市保持中立高新科技 | :14 | 阅读文章:7098
SinaAppEngine最先做为一个吊丝开发设计者要处理网络服务器的难题。去SAE的官方网站上放新浪网新浪微博的账号申请注册一个账号,取得成功之后赠送给你500芸豆,能够一个开发设计者使用大约五天。SAE十分出色,假如之后大家想在上边写点运用甚么的,能够去申请办理实名认证验证和开发设计者验证,那般每一个月都是让你一定总数的芸豆,应当能考虑平时要求。因为如今SAE上布署Python还处在公测环节,因而大家要去申请办理启用能够在上边布署Python程序的管理权限,如今非常好申请办理的,不一会便会接到早已给你对外开放了布署Python运用管理权限的电子邮件,在网上找到的啥啥还必须排长队全是以往了(不清除如果你见到本文时SAE早已能够容许全部开发设计者布署Python的运用了)。OK,进行这种后,便可以到SAE的文本文档管理中心读文本文档来对着文本文档里边的样例建立一个运用了。有道API随后,去有道API申请办理一个key,申请办理的情况下网址随意填就可以了。有道API十分简易,立即以GET的方式把要汉语翻译的文字推送到特定的url,随后它会帮我们回应汉语翻译結果,大家能够挑选xml、json等回到文件格式,我选得是xml,然后,在访问器里边按着特定的文件格式键入url,便可以见到回到結果啦: ?xmlversion="1.0"encoding="UTF-8"? youdao-fanyi errorCode 0 /errorCode query ![CDATA[这儿是有道汉语翻译API]] /query !--有道汉语翻译-- translation paragraph ![CDATA[HereistheyoudaotranslationAPI]] /paragraph /translation /youdao-fanyi 拷贝编码留意,假如是对词开展汉语翻译得话有的词还会继续回到一些啥互联网释义,基本释义啥的,实际对这一xml分析的方式可以看下边的编码。手机微信公众账号然后,大家要去手机微信的公众账号服务平台去申请办理一个公众账号,不可以用目前的已关联个人手机微信账号的QQ号申请办理,我用的是一个平常无需的QQ号申请办理的,申请办理取得成功后,能够大概看一下手机微信公众账号的管理方法服务平台(如今你了解这些公众账号,例如王力宏的账号啥的是如何运行的了吧),然后去这儿细心阅读文章手机微信公众账号全自动回应对外开放插口的文本文档,你需要从这儿学一种怎样让客户验证的观念(便是假如客户干了XX,帮我回到了XX結果,那麼我也能明确,客户是“合理合法”的),或是验证的方式。大概有一个了解后,赶快免费下载他给的样例php源代码,也是唯一的能够参照的源代码,细心阅读文章,以下: ?php/***wechatphptest*///defineyourtokendefine("TOKEN","weixin");$wechatObj=newwechatCallbackapiTest();$wechatObj- valid();classwechatCallbackapiTest{publicfunctionvalid(){$echoStr=$_GET["echostr"];//validsignature,optionif($this- checkSignature()){echo$echoStr;exit;}}publicfunctionresponseMsg(){//getpostdata,Maybeduetothedifferentenvironments$postStr=$GLOBALS["HTTP_RAW_POST_DATA"];//extractpostdataif(!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="Welcometowechatworld!";$resultStr=sprintf($textTpl,$fromUsername,$toUsername,$time,$msgType,$contentStr);echo$resultStr;}else{echo"Inputsomething...";}}else{echo"";exit;}}privatefunctioncheckSignature(){$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){returntrue;}else{returnfalse;}}}? 拷贝编码非常简单吧,以致于被一些人说写的很水,可是我认为,这一份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]viewplaincopy#-*-coding:utf-8-*-fromdjango.httpimportHttpResponsefromdjango.templateimportRequestContext,Templatefromdjango.views.decorators.csrfimportcsrf_exemptfromdjango.utils.encodingimportsmart_str,smart_unicodeimportxml.etree.ElementTreeasETimporturllib,urllib2,time,hashlibTOKEN="你设定的Token"YOUDAO_KEY=你申请办理到的有道的KeyYOUDAO_KEY_FROM="有道的key-from"YOUDAO_DOC_TYPE="xml"@csrf_exemptdefhandleRequest(request):ifrequest.method=='GET':#response=HttpResponse(request.GET['echostr'],content_type="text/plain")response=HttpResponse(checkSignature(request),content_type="text/plain")returnresponseelifrequest.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")returnresponseelse:returnNonedefcheckSignature(request):globalTOKENsignature=request.GET.get("signature",None)timestamp=request.GET.get("timestamp",None)nonce=request.GET.get("nonce",None)echoStr=request.GET.get("echostr",None)token=TOKENtmpList=[token,timestamp,nonce]tmpList.sort()tmpstr="%s%s%s"%tuple(tmpList)tmpstr=hashlib.sha1(tmpstr).hexdigest()iftmpstr==signature:returnechoStrelse:returnNonedefresponseMsg(request):rawStr=smart_str(request.raw_post_data)#rawStr=smart_str(request.POST['XML'])msg=paraseMsgXml(ET.fromstring(rawStr))queryStr=msg.get('Content','Youhaveinputnothing~')raw_youdaoURL="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))returngetReplyXml(msg,replyContent)defparaseMsgXml(rootElem):msg={}ifrootElem.tag=='xml':forchildinrootElem:msg[child.tag]=smart_str(child.text)returnmsgdefparaseYouDaoXml(rootElem):replyContent=''ifrootElem.tag=='youdao-fanyi':forchildinrootElem:#不正确码ifchild.tag=='errorCode':ifchild.text=='20':return'toolongtotranslate\n'elifchild.text=='30':return'cannotbeabletotranslatewitheffect\n'elifchild.text=='40':return'cannotbeabletosupportthislanguage\n'elifchild.text=='50':return'invalidkey\n'#查寻标识符串elifchild.tag=='query':replyContent="%s%s\n"%(replyContent,child.text)#有道汉语翻译elifchild.tag=='translation':replyContent='%s%s\n%s\n'%(replyContent,'-'*3+u'有道汉语翻译'+'-'*3,child[0].text)#有道字典-基本字典elifchild.tag=='basic':replyContent="%s%s\n"%(replyContent,'-'*3+u'基本字典'+'-'*3)forcinchild:ifc.tag=='phonetic':replyContent='%s%s\n'%(replyContent,c.text)elifc.tag=='explains':forexinc.findall('ex'):replyContent='%s%s\n'%(replyContent,ex.text)#有道字典-互联网释义elifchild.tag=='web':replyContent="%s%s\n"%(replyContent,'-'*3+u'互联网释义'+'-'*3)forexplaininchild.findall('explain'):forkeyinexplain.findall('key'):replyContent='%s%s\n'%(replyContent,key.text)forvalueinexplain.findall('value'):forexinvalue.findall('ex'):replyContent='%s%s\n'%(replyContent,ex.text)replyContent='%s%s\n'%(replyContent,'--')returnreplyContentdefgetReplyXml(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)returnextTpl拷贝编码以后根据SVN把新项目布署到SAE上,就OK啦~碰到的难题如今在网上这类参照的编码还非常少,在SAE上布署调节也十分艰难,无可奈何下自己写了个脚本制作,效仿手机微信服务平台为自己布署在SAE上的服务端POST信息,看回到的結果。假如出現不正确,Django都是造成一个幽美的不正确网页页面,获得这一不正确网页页面把它提到当地的一个html里边,用访问器开启便可以了解是啥不正确了。写的全过程中還是碰到很多难题的:1.Django的CSRF不正确:我用的Django1.4,我试着了大伙儿说的许多处理方法都是出現403不正确,无可奈何下只有临时根据装饰符把Django的CSRF临时禁掉,这一也要之后学Django的深层次调查一下;2.Django的编号不正确:因为我试着了许多方式,可是也不行,关键是汉语解决上,碰到了许多不便,最后在这里里寻找了极致的处理计划方案,用讨人喜欢的Django内置的讨人喜欢的方式:smart_str、smart_unicode,就可以极致解决汉语了。