2018年7月記錄了一篇《調用Google Translate API生成Drupal翻譯.po文件》,當時是按照Translation API Documentation Quickstart 快速入門(基本版) 的指導來做的,需要下載私鑰json文件、設置環境變量、安裝Github上的php docs samples等,用起來比較麻煩。
而這種運行辦法最近總是遇到與Google API服務器之間的訪問報錯,不是SSL報錯就是host無法連接,上周耽誤了2天時間來進行各種排查,還找阿裡雲客服咨詢,多個交流來回後也沒有找到根本原因,那套php docs samples太複雜了,不好準确定位到底是哪段程序訪問哪個網址的時候出的問題。
這個谷歌翻譯API的調用對我們的項目來說還是很重要的,不能下周繼續耽誤了,昨天繼續在網上查資料,找到這篇“Google Translate API Tutorial for PHP / Javascript / Java”,2013年的老文章就有介紹用PHP CURL庫或者更簡單的file_get_contents()來調用Google Translate API的代碼例子。
于是我就用簡單的代碼片段進行測試,訪問這個網址:
https://www.googleapis.com/language/translate/v2?key={$api_key}&q=" . rawurlencode($text) . "&target={$target}&source={$source}"
很順暢就獲取到了翻譯結果,再去把以前的翻譯程序進行了修改,裡面添加了一個函數:
/** * 函數:調用Google Translate API進行翻譯 * 輸入1: $source_text 需要翻譯的文本 * 輸入2: $source_language_code 源語言代碼 * 輸入3: $target_language_code 目标語言代碼 * 輸出: $target_text 翻譯出來的文本,如果報錯則返回FALSE */ function translate($source_text, $source_language_code, $target_language_code) { //如果長度大于5000則返回失敗 if (strlen($source_text) >= 5000) { echo "source_text too long\n"; return FALSE; } $api_key = 'AI................k8';//從google cloud console中設置、獲取的API Key $url = "https://www.googleapis.com/language/translate/v2?key={$api_key}&q="; $url .= rawurlencode($source_text); $url .= "&target={$target_language_code}&source={$source_language_code}"; $response = file_get_contents($url); $obj = json_decode($response, true); //true converts stdClass to associative array. if($obj != NULL) { if(isset($obj['error'])) { echo "Error is : ".$obj['error']['message']."\n"; return FALSE; } else { $target_text = $obj['data']['translations'][0]['translatedText']; } } else { echo "UNKNOW ERROR\n"; return FALSE; } return $target_text; }
再就可以從其它地方調用這個函數,很簡單方便,不需要php docs samples中的各種組件了。
我把這個程序放在國外服務器上運行沒有問題,但放在國内服務器上運行的時候報錯:
PHP Warning: file_get_contents(): SSL: Connection reset by peer in test.php on line 15 PHP Warning: file_get_contents(): Failed to enable crypto in test.php on line 15 PHP Warning: file_get_contents(https://www.googleapis.com/language/translate/v2?key=xxx&q=%E5%A5%BD&target=en&source=zh-CN): failed to open stream: operation failed in test.php on line 15
從報錯看應該是被牆阻止了連接,貌似國内就無法使用了,但我更換連接的域名後就解決了,從www.googleapis.com改為translation.googleapis.com,後面URI路徑、參數都不需要改變,可以從國内順利連接、獲取正确的翻譯内容。
需要留意的是,這種調用辦法簡單,隻要訪問一個帶有API Key的網址就可以,不需要在服務器上放置json私鑰文件、不需要設置服務器環境變量,但也需要考慮安全問題,如果API Key被别人使用,會導緻産生大量的費用,可以參考《使用 API 密鑰》這篇文章中的内容,對API Key進行安全設置,對于網站來說一般可以設置“HTTP 引薦來源網址”(密鑰會公開,改用服務帳号)或者“IP 地址”來進行限制。
评论