創作內容

25 GP

Line Bot研究 - 運用googletrans套件實現翻譯功能

作者:熾炎之翼│2021-07-28 02:05:32│巴幣:50│人氣:1098
度度度
今天在Line Bot上改進抓圖功能的寫法
還有增加隨機nh本本功能(網址+rand數字而已)以後

看著功能日益完整且強大的bot
思考著還有什麼實用點的功能可以做出來
於是我就想到了還能做「翻譯功能」啊

畢竟網路上有個Google翻譯資源可以好好利用
理論上可以借助這個服務來達到翻譯的效果
雖然有的時候翻的不是這麼好

不過問題來了
以前高中我就試圖利用爬蟲去爬Google翻譯
但是翻譯的結果是利用JavaScript去動態生成
換言之就是requests套件爬不到
更何況Google現在各功能都針對爬蟲進行很多阻礙

以前的我不會處理JS 現在的我依舊不會JS

總之用爬蟲這條路看來挺不切實際
眼下我也想不到有什麼解決方法
所以我就決定上網看看還有哪條路可以走

結果就是我發現一個新的套件 叫做googletrans
它可以快速又完美的讓程式銜接Google翻譯
果然Python真的什麼功能都有別人寫好的套件呢(笑

反正二話不說先
pip install googletrans

大致上功能簡單易懂
實際上操作起來也很簡單
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

這次分享差不多就到這邊
感謝觀看~

引用網址:https://home.gamer.com.tw/TrackBack.php?sn=5221221
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 6 篇留言

YukiYANG
真的太酷了

07-28 02:07

熾炎之翼
可以用來搞複製文了07-28 08:35
凜夢櫻奈
你遇到的那個語言縮寫問題,感覺可以做一個選單切選語言或其他功能,跟現在很多官方帳號一樣那種的

07-28 02:14

熾炎之翼
大概懂你的意思 不過這部分我還要研究一下XD07-28 08:36
kasumi_ MyGo單推人
我需要這個酷東西 太神啦

07-28 04:49

熾炎之翼
等功能再齊全一點 或許可以開放給大家玩玩(?07-28 08:38
ゆきの
神 這東西好強

07-28 08:36

熾炎之翼
感覺也是用一定程度的實用性07-28 08:39
Leviathan
太強了吧

07-28 08:38

熾炎之翼
還好 主要是還是插件跟估狗翻譯的功勞07-28 08:41
CRosSinGuTかかか
太神啦

07-28 08:52

熾炎之翼
07-28 09:15
我要留言提醒:您尚未登入,請先登入再留言

25喜歡★h32902227 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:【歌詞翻譯】「La Be... 後一篇:【歌詞翻譯】「めっちゃG...

追蹤私訊切換新版閱覽

作品資料夾

asld12347🔉🐷🤓😁
紅燒翅膀 我喜歡吃~看更多我要大聲說15小時前


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】