- ベストアンサー
IEでGoogle翻訳を開くとソースが変化する
- IEでGoogle翻訳を開くとソースコードが変化し、問題が発生しています。調査の結果、クッキーを削除するとソースのclass名やIDが変化することが分かりました。
- 問題の再現手順は、IEでGoogle翻訳のページを開き、クッキーとWebサイトデータを削除し、再度開くことです。この操作を繰り返すとソースコードが変化する現象が発生します。
- なぜクッキーを削除するとソースコードが変化するのか、またソースが常に「<body class="displaying-homepage">」になるように設定する方法はあるのか、これらの疑問を解決したいと思っています。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>漢字や韓国語などをURLにそのまま使用すると文字化けを起してしまいます。 はい、漢字や韓国語も、URLエンコードしなければならないのです 自分でちょっと頑張ってましたが、検索したらこちらにあっさり出ていました。 >文字列をUTF-8でエンコードするユーザー定義関数 >https://stabucky.com/wp/archives/4237 上記ページにあるように、VBEウインドウの ツール(T) - 参照設定(R) から、「Microsoft ActiveX Data Objects 2.8 Library」を選択しないとエラーが出ます。 で、encodeUTF8() したものを単純にURLにくっつけてブラウザを呼ぶことで、翻訳にかけられました。 Sub translate() Dim objIE As Object Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "https://translate.google.co.jp/?q=" + URLEncode(ActiveCell.Value) End Sub 自分でほとんどプログラミングしていないというお恥ずかしいことに(汗 >なぜソースがランダムで書き変わるのかを知りたいです。 こちらはまだ確認できてないので、時間のある時に…。
その他の回答 (4)
- asciiz
- ベストアンサー率70% (6826/9706)
実にいい加減ですが、「最初のtextareaタグに挿入する」という方法でもできました。 Debug.Print で実際の<textarea> タグを表示し、たまにclassやidが変わるのが確認できましたが、変わったままでも挿入できました。 ●通常時 <textarea class="orig tlid-source-text-input goog-textarea" id="source" style="height: 53px; padding-bottom: 1px; -ms-overflow-x: auto; -ms-overflow-y: hidden; box-sizing: border-box;" spellcheck="false" rows="1" autocorrect="off" autocomplete="off" autocapitalize="off"></textarea> ●異常時 <textarea class="er8xn" role="combobox" aria-expanded="false" aria-controls="kvLWu" spellcheck="false" aria-autocomplete="list" aria-label="原文" placeholder="" rows="1" jsaction="blur:TP1Wfd; focus:dFlNRb,HCeAxb; input:r9XDpf,Gyn8rd; mouseup:BR6jm; keydown:O0Dsab; keyup:pHu1gc; paste:puy29d;" jsname="BJE2fc" autocorrect="off" autocomplete="off" autocapitalize="off"></textarea> しかし原文挿入はできたのですが、「異常時」の時のテキスト挿入では翻訳が動いてくれないことがあります。 手動で入力エリアをクリックし、スペースなりEnterなりを打つと、翻訳が表示されるのですが。 原因はよくわかりませんね…。 私の試した範囲では、上記の2パターンしか無いようでしたが…。 ieCheck(objIE) はこちらからの引用でページ表示を待っているだけです。 >https://www.vba-ie.net/code/iecheck.php Sub translate2() Dim objIE As InternetExplorer Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "https://translate.google.co.jp/?tl=ja" Call ieCheck(objIE) Dim htmlDoc As HTMLDocument Set htmlDoc = objIE.document '---チェック用 タグはどうなってる? Dim elements As IHTMLElementCollection Set elements = htmlDoc.getElementsByTagName("textarea") Dim element As IHTMLElement For Each element In elements Debug.Print element.outerHTML Next element 'チェックここまで Dim objTextarea As HTMLInputElement Set objTextarea = objIE.document.getElementsByTagName("textarea")(0) objTextarea.Value = ActiveCell.Value 'objTextarea.Focus 'たまに翻訳されない時にトリガーにならないか…? End Sub
補足
>>実にいい加減ですが、「最初のtextareaタグに挿入する」という方法でもできました。 >>しかし原文挿入はできたのですが、「異常時」の時のテキスト挿入では翻訳が動いてくれないことがあります。 この現象は回答No.1の補足で答えている 「実際にID「source」に相当すると思われるclass「er8xn」やclass「D5aOJc」に対して操作を試みてみましたが、外国語の文章を入力するところに文章自体は入りますが、翻訳自体は実行されずまったく反応しません。」 と同じことを言っていると思います。 「翻訳が動いてくれないことがあります。」とおっしゃっていますが、翻訳が動いた時があったのでしょうか・・? 少なくともこの方法で自動で翻訳するのは難しそう打と考えています。 >>私の試した範囲では、上記の2パターンしか無いようでしたが…。 私も複数のパソコンで確認しましたが そちらが示した正常時と異常時の2パターンのみ確認できました。 なぜ、IDとClassが変わるのか不思議でなりません。 ここの理由が分かれば、なんとかなりそうなのですが。
- asciiz
- ベストアンサー率70% (6826/9706)
回答No.3で 「URLEncode(ActiveCell.Value)」と書いてしまってますが、当然回答No.3の参考ページの関数「encodeUTF8(ActiveCell.Value)」にしといてください 他のページのURLエンコード関数をいくつか試していて、最終結果のコピペを間違えました。
- asciiz
- ベストアンサー率70% (6826/9706)
>(ID「source」に対して文章を入力するとちゃんと翻訳されます) うーん、ログインしていてもしていなくても、「<textarea class="orig tlid-source-text-input goog-textarea" id="source" ~ 」は変わってなさそうでしたが…。 なので、クラス名「tlid-source-text-input」またはクラス名「goog-textarea」に対してテキスト送信してみるとどうでしょう。 ---- ところで全く別のGoogle翻訳利用法があるのですが。 https://translate.google.co.jp/?q=(翻訳したい文章) と言うURLを開くと、翻訳されます。 https://translate.google.co.jp/?q=(翻訳したい文章)&sl=en&tl=ja と言うようにパラメータをつけると、自動判別では無く英語から日本語と指定して翻訳をかけたり出来ます。 ただURL渡しですから、元文はURLエンコードして渡してやらなければならないでしょう。 でもこちらならログイン状態も関係ないと思います。
お礼
韓国語と%組み合わせについては、%を全角の%に変換することで解決しました。 正確にはそちらが提示してくださった https://translate.google.co.jp/?q=(翻訳したい文章)&sl=en&tl=ja というのはそちらがおっしゃるようにURLエンコードする必要があり、漢字や韓国語などをURLにそのまま使用すると文字化けを起してしまいます。 ただ、自分が使っていた方法は以下のやり方で翻訳した文字列を渡していました。 https://translate.google.co.jp/?hl=ja#ko/ja/표시비율(%)/ この方法だとURLエンコードを行わくても翻訳ができるみたいです(理由は分かりません) ただ、半角%が含まれると翻訳ができなくなり、 URLエンコードしなくても翻訳できる代わりに %25などURLエンコードした文字は使えないようです。 そこで%を全角の%に変換することでURLでも使用できるようにしました。 ただ、これで確かに翻訳はできますが、やはり翻訳する処理速度がID「source」のテキストエリア方法に比べて圧倒的に遅いうえに、たくさんのセルを一括で翻訳しようとすると一定の確率で「翻訳エラーが発生しました」という画面がでて翻訳が止まってしまいます。 やはり、まずはなぜクッキーを削除した状態ではソースがランダムで書き変わるのかの原因を知りたいです。 誰かわかる方がいらっしゃたら教えてください。お願いします
補足
>>うーん、ログインしていてもしていなくても、変わってなさそうでしたが…。 いえ、ログインの有無で変わるのではなく、 「Ctrl+Shift+Delete」で「閲覧の履歴と削除」ダイアログを表示し、 一番上の「お気に入りWebサイトデータを保持する」のチェックを外し、 一番上から3番目の「クッキーとWebサイトデータ」のチェックを入れて削除を行い、再度IEを開きなおしてGoogle翻訳を表示しなおすということを何回か繰り返すと、ランダムでソースが書き変わるのです。 (できればそちらでもその現象が発生するかご確認してみてください。私は会社のパソコンと自宅のパソコンで発生することを確認しているので多分発生すると思います。環境はどちらもWindows 10 64bitです) 私はIEでGoogle翻訳にログインをしたことは一度もありません。 >>クラス名「tlid-source-text-input」またはクラス名「goog-textarea」に対してテキスト送信するとどうでしょう ソースが変換していない状態ならID「source」と同じく正常に動きますが、変化した後はクラス名もID名もすべて書き変わってるので動きません。 >>ところで全く別のGoogle翻訳利用法があるのですが。 実はURLに翻訳する文章を入力するというのはすでに試していていてそれ自体はある程度成功しています。 ただ、韓国語と%の組み合わせとか、例えば「표시 비율 (%)」という単語をURLに突っ込むと上手く翻訳ができません。 (%を%25に変換したりとかいろいろ試してはいるのですが・・・) ID「source」で突っ込む場合はそのような問題は発生していません。 あと、1セルごとにURLにアクセスするためか、ID「source」のテキストエリアに突っ込む方法に比べて処理速度が低下してしまいます。 プログラムでの対応ももちろん考えているのですが、まずはなぜソースがランダムで書き変わるのかを知りたいです。 ソースが書き変わる原因が分かり、設定を固定できるかどうかも知りたいです。
- asciiz
- ベストアンサー率70% (6826/9706)
IEでGoogle翻訳にアクセスすると、「ログインしてないと翻訳履歴は使えなくなります」とか「Chromeブラウザの方がいいですよ、使いませんか?」なんてダイアログを出してくるせいでしょうかね。 でも、クラス名がどのように変化しようとも、Bodyタグはただ一つです。タグ名を目標に処理すれば行けないでしょうか。
補足
HTMLが変化するということ分かりやすく説明するためにbodyタグを例に出しましたが正確には <body class="displaying-homepage">が必要なのではなく、ID「source」のテキストエリアに対して操作しています。 もちろん変化した後のIDやclass名に書き換えることも可能ですが、 実際にID「source」に相当すると思われるclass「er8xn」やclass「D5aOJc」に対して操作を試みてみましたが、外国語の文章を入力するところに文章自体は入りますが、翻訳自体は実行されずまったく反応しません。 (ID「source」に対して文章を入力するとちゃんと翻訳されます)
お礼
>>文字列をUTF-8でエンコードするユーザー定義関数 非常に有用な情報をありがとうございます。 この方法が分からなかったので今まで、以下のような方法でURLに文章を渡していました。 https://translate.google.co.jp/?hl=ja#ko/ja/(翻訳する文章)/ https://translate.google.co.jp/?hl=ja#view=home&op=translate&sl=ko&tl=ja&text=(翻訳する文章) この方法だと、URLエンコードしなくても翻訳される一方で、速度が遅く、 「翻訳エラーが発生しました」というメッセージが数回に1回ぐらいの頻度で発生していました。 (さらに「%」や「/」など特殊な記号を全角に変換しないと正常に翻訳ができません) 教えてもらったencodeUTF8関数を使用することで下記の方法でも翻訳ができるようになりました。 https://translate.google.co.jp/?sl=ko&tl=ja&q=(翻訳する文章) https://translate.google.co.jp/?sl=ko&tl=ja&text=(翻訳する文章) これにより、URLエンコードしないでURLに渡す方法に比べて、速度が向上し、 「翻訳エラーが発生しました」の頻度が数百回回に1回ぐらいの頻度に下がりました。 (翻訳エラーが発生した場合も2秒間翻訳結果が取得できなかったら再度URLに再接続するようにしたので、2秒間ロスする程度で済むようになりました) また、「%」や「/」など特殊な記号を含む場合でも、いちいち全角に変換しなくても正常に翻訳できるようになりました。 それでも、ID「source」のテキストエリアに直接文字を渡した方が速いですし、 エラーも発生もしないですが、以前よりはだいぶ使いやすくなりました。 一応補足になりますが、 セル内の文字がALT+Enterで改行されている場合、 改行コードであるvblf(コード表の10進数で「10」)が含まれています。 この場合、vblfは16進数だと「A」と1桁で表されるため、 encodeUTF8(vbLf) を実行すると「%A」が返ってきます。 ただ、グーグル翻訳でURLで渡すときは 「%0A」と2桁目を0で埋めないと正常に翻訳できないので encodeUTF8関数内の 「Hex(mynumber)」 は 「Right("0" & Hex(mynumber), 2)」 などで2桁目を0で埋めた方がいいです。 こうすると encodeUTF8(vbLf) を実行したときに「%0A」を返すようになり、 改行を含むセルでも正常に翻訳ができるようになります。 それ以外では特に問題はありませんでした。