Python – Spinning Chinese Version use WebAPI (2)

簡介

有興趣嘗試的人不知道在上一篇前置作業有沒有設定好了,假如有了『應用ID 與 應用密鑰』,該篇進入程式執行時才會有結果。再提醒一下,請登入有道雲官網,並進入後台,選擇應用管理,點選容器就會出現詳細資訊,如下圖,那我們就開始吧。

建立Setting.py

首先我們先將你自己所新增的應用ID與應用密鑰,在Python中新增檔案名稱叫做Setting.py的檔案,並新增兩個變數,如上圖,變數名稱跟檔名都可以自己用自己喜歡的名字,在之後主程式要引用,所以可以弄自己熟悉的名稱。

新增變數與檔案後,請將ID跟密鑰複製,分別貼上,上圖的Key就是應用的ID,Secret就是應用的密鑰。

建立官方類別檔案

# -*- coding: utf-8 -*-
import sys
import uuid
import requests
import hashlib
import time
from importlib import reload
import json

reload(sys)

YOUDAO_URL = 'https://openapi.youdao.com/api'
# APP_KEY = 'ID'
# APP_SECRET = 'SECRET'

def encrypt(signStr):
    hash_algorithm = hashlib.sha256()
    hash_algorithm.update(signStr.encode('utf-8'))
    return hash_algorithm.hexdigest()

def truncate(q):
    if q is None:
        return None
    size = len(q)
    return q if size <= 20 else q[0:10] + str(size) + q[size - 10:size]

def do_request(data):
    headers = {'Content-Type': 'application/x-www-form-urlencoded'}
    return requests.post(YOUDAO_URL, data=data, headers=headers)

def connect(q,APP_KEY,APP_SECRET):
    #q = "The Story of Love, part 1"
    data = {}
    data['from'] = 'en'
    data['to'] = 'zh-CHS'
    data['signType'] = 'v3'
    curtime = str(int(time.time()))
    data['curtime'] = curtime
    salt = str(uuid.uuid1())
    signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRET
    sign = encrypt(signStr)
    data['appKey'] = APP_KEY
    data['q'] = q
    data['salt'] = salt
    data['sign'] = sign


    response = do_request(data)
    contentType = response.headers['Content-Type']
    if contentType == "audio/mp3":
        millis = int(round(time.time() * 1000))
        filePath = "合成的音频存储路径" + str(millis) + ".mp3"
        fo = open(filePath, 'wb')
        fo.write(response.content)
        fo.close()
    else:
        #print(response.content)
        #print(response.content.decode('utf-8'))
        print(json.loads(response.content.decode('utf-8'))['translation'][0])
        return json.loads(response.content.decode('utf-8'))['translation'][0]


if __name__ == '__main__':
    connect()

接著我們可以從官方的文件將主類別程式碼複製下來,如上述程式碼。其中有一個最重要的函式,『connect()』,會在主程式使用到。

保險起見,可以看到最上方的Import檔案,最好都把這些package都安裝起來,例如『requests』。

最後將該檔案儲存在你專案資料夾中,我是取做demo.py,檔案名稱也可以依照自己喜好來命名。

建立主程式檔案

接著到了主程式區塊,我們先新增主程式,這邊就要叫做『main.py』,然後看到上圖:

SnowNLP:這邊算是一個備用的套件,用意在我們可以將簡體中文透過『.hen()』來轉換成繁體中文。

Import Setting:將我們剛剛設定好的setting.py套用在主程式中,並將兩個參數可以讓主程式使用,意思就是直接調用。

Import Demo:我們這邊就是要使用官方的主程式,並將『connect』讓主程式可以使用。

Encrypt

def encrypt(signStr):
    hash_algorithm = hashlib.sha256()
    hash_algorithm.update(signStr.encode('utf-8'))
    return hash_algorithm.hexdigest()

在後面我會介紹主程式中所會應用到的『def』函式,這個函式用意是把要翻譯的文字進行編碼。

Translate

def translate(APP_KEY,APP_SECRET,text):
    url='https://openapi.youdao.com/api'
    headers={'Content-Type': 'application/x-www-form-urlencoded'}

    #主要轉換區
    size=len(text)
    if size<=20:
        q=text
    else:
        #text = urllib.parse.quote(text)
        q=f'{text[0:10]}{str(size)}{text[size-10:size]}'


    print(q)



    curtime=str(int(time.time())) #当前UTC时间戳(秒)
    salt=str(uuid.uuid1())  #UUID


    #實現簽名
    signStr = f'{APP_KEY}{q}{salt}{curtime}{APP_SECRET}'
    hash_algorithm = hashlib.sha256()
    hash_algorithm.update(signStr.encode('utf-8'))
    sign=hash_algorithm.hexdigest()

    data={
        # 'from': 'en',
        # 'to':'zh-CHS',
        'signType': 'v3', #簽名類型
        'curtime':curtime,
        'appKey': APP_KEY,
        'q':q,
        'salt':salt,
        'sign':sign,
    }


    response=requests.post(url,data=data,headers=headers)
    #print(response.content)
    result_text=json.loads(response.content.decode('utf-8'))['translation'][0]
    print(result_text)
    return result_text

該函式算是最主要把文字Post到友道雲進行偽原創的功能,要帶入的參數就是(原文, ID , SECRET),有一部分是在處理GET與POST功能,但我們直接看到標記『主要轉換區』,這邊有一個壞處就是,他一次只能轉換20個字元以內的文字,在之後我看能不能改程式讓他可以一次轉換更多文字。

Main

def main(text,APP_KEY,APP_SECRET):
    print(">>> 開始偽原創中..")
    en_text = translate(APP_KEY, APP_SECRET, text)
    result_text=connect(en_text,APP_KEY, APP_SECRET)
    print(">>> 偽原創完成!")
    return result_text

這邊就是執行的函式,他的邏輯是,先使用主程式中的『translate()』把原文透過線上API轉換成英文,接著再把轉過的英文丟到demo.py中的『connect()』轉換成中文,我個人覺得是有點偷吃步,而最後就會產出偽原創的文字。

執行

if __name__=='__main__':
    text="我家門前有小河後面有山坡"
    main(text,APP_KEY,APP_SECRET)

最後進入執行的動作,我們可以先新增一個容器,放入要進行偽原創的原文,接著互叫『main』並帶入參數,由於Key跟Secret在其他程式已經設定好,這邊就不用理他了。

小結 & 結果

我們把第三段的程式碼全部貼在『main.py』中,並執行,可以看到上圖,標示0的是原文,標示1的是translate轉換的英文結果,標示2的就是最終的偽原創,看起來還算不錯。

我們再來試試看不同的文字,看起來也還是不錯,但我自己也有遇過他翻譯出來的根源文相同,但與先前我嘗試過的本機版本的偽原創,算是比較厲害了。但是也有一些惱人的限制,例如:這是要錢的且有單次偽原創字數限制。有機會的話我會持續找找有沒有其他的工具可以使用。

上圖是你的額度,可以到官網的總覽看看,假如覺得偽原創品質不錯的話,是可以考慮除值一下。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *