2019-12-15 / @syui

gscript

Google Apps Scriptで翻訳してみた

今回使用するのは、Google Apps Scriptというものです。Google Translate APIが有料しか無かったのでこちらを使うことにしました。

ハマりどころが多かったので、ポイントだけ。

まず、公開時(リリース時)は、必ずNewでバージョンをつけないと、更新されないみたいです。空にした場合、2,3,4と自動で番号が付きます。同じバージョンを選ぶと、内容は保存されているみたいですが、デプロイされていない状態だと思われます。

次に、curlで、-X POSTが機能しないので、書き方が悪いのかなあと思っていたら、本当に機能しないみたいです。機能するポストは以下。

$ curl -L -d ""
function doPost(e) {
  var contents = e.postData.contents;
  var d = JSON.parse(contents);
  var spanish = LanguageApp.translate(d.txt,
                                      'en', 'ja', {contentType: 'html'});
  Logger.log(spanish);
  return ContentService.createTextOutput(spanish);
}

//function doGet(e) {
//  return ContentService.createTextOutput("doGet!!");
//}

これで、以下のようなコマンドを実行すると、englishがjapaneseに翻訳されます。

# post req
$ curl -L -d "{\"txt\":\"hello\"}" https://script.google.com/macros/s/${APP_ID}/exec
こんにちは

# get req
$ curl -L https://script.google.com/macros/s/${APP_ID}/exec
doGet!!

LanguageApp.translateのパラメーターは、text, sourceLanguage, targetLanguageとなっています。言語を変えたい場合は変えられるようにしておくほうがいいかもしれません。

LanguageApp.translate(d.txt, d.src, d.targ);
curl -L "{\"txt\":\"こんにちは\",\"src\":\"ja\",\"targ\":\"en\"}"

ということで、実際に、archlinux.orgの最新ニュースを翻訳してみました。

#!/bin/bash

if [ ! -f ./xq ];then
	curl -sL https://github.com/syui/xq/releases/download/0.1/linux_amd64_xq -o xq
	chmod +x xq
fi

url=$1
date_now=`date +"%Y%m%d"`
url_arch="https://www.archlinux.org/feeds/news/"
xml=index.xml
curl -sL $url_arch -o $xml

date_xml=$date_now
if [ "$2" != "t" ];then
	date_xml=`date --date="$(./xq l $xml)" +"%Y%m%d"`
fi

if [ "$date_now" != "$date_xml" ];then
    exit
fi

title=`./xq $xml|jq -r ".[0]|.title"`
body=`./xq $xml|jq -r ".[0]|.description"|tr -d '\n'`
echo $title, $body
curl -L -d "{\"txt\":\"$title\"}" $url
curl -L -d "{\"txt\":\"$body\"}" $url
$ chmod +x run.sh
$ ./run.sh https://script.google.com/macros/s/${APP_ID}/exec t

github.com/syui/xqがおかしいと思ったら、github.com/urfave/cliが壊れてるぽい。あと、最新のバイナリをreleasesに置いてなかったので、ずっとオプション間違えてて、ローカルでは動いてたので、ハマりまくった。やっぱり、golangで書いたものは、releasesするCIを回しておけばよかった…。