度度度今天在Line Bot上改進抓圖功能的寫法
還有增加隨機nh本本功能(網址+rand數字而已)以後
看著功能日益完整且強大的bot
思考著還有什麼實用點的功能可以做出來
於是我就想到了還能做「翻譯功能」啊
畢竟網路上有個Google翻譯資源可以好好利用
理論上可以借助這個服務來達到翻譯的效果
雖然有的時候翻的不是這麼好
不過問題來了
以前高中我就試圖利用爬蟲去爬Google翻譯
但是翻譯的結果是利用JavaScript去動態生成
換言之就是requests套件爬不到
更何況Google現在各功能都針對爬蟲進行很多阻礙
以前的我不會處理JS 現在的我依舊不會JS
總之用爬蟲這條路看來挺不切實際
眼下我也想不到有什麼解決方法
所以我就決定上網看看還有哪條路可以走
結果就是我發現一個新的套件 叫做googletrans
它可以快速又完美的讓程式銜接Google翻譯
果然Python真的什麼功能都有別人寫好的套件呢(笑
反正二話不說先
大致上功能簡單易懂
實際上操作起來也很簡單
import googletrans
translator = googletrans.Translator() content = translator.translate('早安', dest='en').text print(content)
>>> Good morning |
但在一開始 我就碰上一個大問題
每當我要翻譯時就會跳出
attributeerror 'nonetype' object has no attribute 'group'
換言之就是translator沒有回傳給我任何東西 = =
後來去爬文才發現這是官方改動了API
所以才會發生這種情況
在官方修好之前 使用者只能先自己處理好
其中一個解決方法就是先載到alpha版 3.1.0a0
pip install googletrans==3.1.0a0 |
對 然後It finally works
接下來就沒什麼問題了
所以先上我這邊的程式碼
if get_message[:2].lower() == '!t': split = get_message.split() translator = googletrans.Translator() text = get_message[3:] if text == '?': trans = str(googletrans.LANGCODES)[1:-1].replace(', ', '\n') elif split[1] in googletrans.LANGCODES.values() and len(split) != 2: text = get_message[6:] trans = translator.translate(text, dest=split[1]).text else: trans = translator.translate(text, dest='zh-tw').text reply = TextSendMessage(text=trans) line_bot_api.reply_message(event.reply_token, reply)
|
get_message上次也說過了 就是機器人接收到的其他人之回覆
而這裡判斷訊息開頭如果是「!t」就啟動翻譯功能
變數split則是存放把整個get_message用函式split()以空格分段而形成的list
這在之後的處理上會用到
我這邊的設計野心比較大
完全不拘限翻譯出來的語言種類
只要使用「!t xx」就能翻譯成xx語言(不打xx就默認是繁體中文)
至於每個語言的縮寫代碼 可以輸入「!t ?」來讓機器人印出來
這邊用到的是googletrans.LANGCODES裡的資料
但原本googletrans.LANGCODES的資料型態是dict
直接轉成str會讓可讀性很差
下圖就是還沒特別處理的樣子
真的很難看 = =
所以我這邊用了str(googletrans.LANGCODES)[1:-1].replace(', ', '\n')這種寫法做處理
首先用slice[1:-1]去掉前後大括弧 然後再用replace()函式把所有「, 」都換成「\n」(換行字符)
然後印出來就會變成這樣
是不是美觀又易讀很多了
大家應該注意到我接下來的判斷式寫法
elif split[1] in googletrans.LANGCODES.values() and len(split) != 2:
「split[1] in googletrans.LANGCODES.values()」這邊不難理解
就是把split的第2個元素(list由0開始排序)去對是不是語言縮寫代碼(位於dict的value欄位)
但是「len(split) != 2」的意義究竟在哪?
這邊就要分享一個趣事
一開始我在測試時打了「!t hi」
結果得到這樣的回應
沒錯 因為「hi」是「hindi」(印地語)的縮寫代碼
所以被程式判斷成縮寫代碼並以印地語翻譯了
於是為了預防這種情況發生
我這邊就「len(split) != 2」來讓list如果只有2個元素(像這裡就是只有「!yt」和「hi」)就不會當作語言縮寫代碼
對 然後當然你「!t」後面直接接內容
就會是直接默認成繁體中文
接下來就是功能展示啦
當然長文也能直接翻XD
只要一次內容不要超出15000字元就好
正常使用基本上也沒這個問題就是了@@
功能的介紹就到此為止了
我主要是想推廣googletrans套件
若你的程式需要使用到翻譯功能
不妨可以來研究看看XD
這次分享差不多就到這邊
感謝觀看~