上一节中简单介绍了自定义回复的设置,回复的类型是文本消息,当然可以扩展开来,这里就不做介绍了。
在这一节中,我们介绍一下,基于文本回复规则的实际应用,当然例子也是比较简单的。自动翻译,就是用户发送要翻译的文本,系统会自动回复翻译结果。
首先,我们要确定翻译要使用的API,本节中我们介绍的是百度的翻译api。google的翻译api是付费的了,所以就不考虑了。这里可以看到百度翻译api的所有说明。
可以直接用curl发起请求,但我们使用的是HTTP_Request2的pear库。这样可以省去很多设置,关注于实现。
核心的代码如下,其中$text是要翻译的文本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
public function translate($text, $from = 'auto', $to= 'auto') { $url = 'http://openapi.baidu.com/public/2.0/bmt/translate' ; $post = array( 'from' => $from, 'to' => $to, 'client_id' => BAIDU_APPKEY, 'q' => $text ); try { $res = $this->_request($url, $get, $post); } catch (Exception $e) { $this-> _isGood = false; Logger:: error($e); } if (!$res) { $res = '很抱歉,没有找到翻译结果' ; } return $res; } protected function _request($url, $get = array(), $post = array()) { // 构造get请求 if ($get) { $requestMethod = HTTP_Request2::METHOD_GET; if (strpos('?' , $url) === false) { $url .= '?' . http_build_query($get); } else { $url .= http_build_query($get); } } if ($post) { $requestMethod = HTTP_Request2::METHOD_POST; } try { $httpRequest = new HTTP_Request2($url, $requestMethod); if ($post) { $httpRequest->addPostParameter($post); } // 返回的是HTTP_Request2_Response $response = $httpRequest->send(); $body = $response->getBody(); } catch (Exception $e) { Logger:: error($e); throw new Exception($e); } // getStatus:返回code, 小于400 调用成功 if ($response->getStatus() < 400) { $res = $this->_handleResult($body); } else { throw new Exception('网络错误' , $response->getStatus()); } return $res; } |
完成请求代码后,我们就可以测试一下了,直到测试成功。这样,给系统添加功能的使用,保证每一步是正确的。
下一步就要把翻译功能集成到自动回复中了。和ConfigReplyTactic类似,建立TranslateReplyTactic类,并实现主要的接口reply,matchRule,sendReplyMsg。
首先考虑matchRule接口,如何才能算是匹配到要翻译的文本呢?这里我们可以硬性规定,以‘#’开头的文本,就是要翻译的文本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/** * matchRule * 查找匹配规则 * * @param mixed $postObj * @access public */ public function matchRule($postObj) { $content = $postObj-> Content; if (strpos($content, '#' ) === 0) { $translate = new BaiDuTranslate(); return $translate->translate(substr($content, 1)); } return false ; } |
通过要翻译的文本,传入到翻译API中,返回的数据,就是翻译的结构,把结果发给用户就可以了。
最后一步就是,在RuleController中,$_rule_tactics数组中添加TranslateReplyTactic。
经过上面的步骤,我们的公众账号就实现了翻译的功能,是不是很方便呢?