javaでGoogleのSAPI

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Aozora0630
記事: 85
登録日時: 9年前
住所: 日本
連絡を取る:

javaでGoogleのSAPI

#1

投稿記事 by Aozora0630 » 8年前

Javaについての質問させていただきます。

今、Javaでデスクトップマスコットを作っているのですが、喋らせようと思い、スピーチAPIを探した所非公式ですがGoogle Speech APIが見つかりました。
(例:くりっく

早速これを使用しようとしてコードを組んだのですが、ファイルのダウンロードの所で403エラーが返されてしまいます。
なぜエラーが返されるのでしょうか?

解決策も教えていただければ幸です。
よろしくお願いします。

ファイルダウンロード関数↓

コード:

	public static Boolean FileDownload(String url,String out){
		try{
		URL file = new URL(url);
		
		HttpURLConnection conn =(HttpURLConnection) file.openConnection();
		conn.setAllowUserInteraction(false);
		conn.setInstanceFollowRedirects(true);
		conn.setRequestMethod("GET");
		conn.connect();
		
		int httpStatusCode = conn.getResponseCode();
		
		if(httpStatusCode != HttpURLConnection.HTTP_OK){
			System.out.println("ダウンロードの失敗:StatusCode"+httpStatusCode);
			return false;
		}
		
		DataInputStream dataInStream = new DataInputStream(conn.getInputStream());
		
		DataOutputStream dataOutStream = new DataOutputStream(new BufferedOutputStream(
			new FileOutputStream(out)));
		
		 byte[] b = new byte[4096];
		int readByte = 0;
		
		while(-1 != (readByte = dataInStream.read(b))){
			dataOutStream.write(b, 0, readByte);
		}
		
		dataInStream.close();
		dataOutStream.close();
		
		}catch(Exception e){
			System.out.println(e.toString());
			return false;
		}
		
		return true;
	}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: javaでGoogleのSAPI

#2

投稿記事 by みけCAT » 8年前

まだ原因はわかっていませんが、paiza.ioで実験したところ、
HttpURLConnectionだと確かに403が返ってきましたが、
Socketで叩いてみると200が返ってきました。
何かの手がかりになれば幸いです。

コード:

import java.net.*;
import java.io.*;
 
public class Main {
    public static Boolean FileDownload(String url,String out){
        try{
        //URL file = new URL(url);
        
        //HttpURLConnection conn =(HttpURLConnection) file.openConnection();
        //conn.setAllowUserInteraction(false);
        //conn.setInstanceFollowRedirects(true);
        //conn.setRequestMethod("GET");
        //conn.connect();
        Socket conn = new Socket("translate.google.com", 80);
        PrintStream a = new PrintStream(new BufferedOutputStream(conn.getOutputStream()));
        a.print("GET /translate_tts?tl=ja-jp&q=konnnichiwa HTTP/1.0\r\n");
        a.print("Host: translate.google.com\r\n");
        a.print("Connection: close\r\n");
        a.print("\r\n");
        a.flush();
        
        //int httpStatusCode = conn.getResponseCode();
        
        //if(httpStatusCode != HttpURLConnection.HTTP_OK){
        //  System.out.println("ダウンロードの失敗:StatusCode"+httpStatusCode);
            //return false;
        //}
        
        DataInputStream dataInStream = new DataInputStream(conn.getInputStream());
        
        //DataOutputStream dataOutStream = new DataOutputStream(new BufferedOutputStream(
        //  new FileOutputStream(out)));
        
         byte[] b = new byte[4096];
        int readByte = 0;
        
        while(-1 != (readByte = dataInStream.read(b))){
        //  dataOutStream.write(b, 0, readByte);
            System.out.write(b, 0, readByte);
        }
        
        //dataInStream.close();
        //dataOutStream.close();
        conn.close();
        
        }catch(Exception e){
            System.out.println(e.toString());
            return false;
        }
        
        return true;
    }
    public static void main(String[] args) throws Exception {
        System.out.println(FileDownload("http://translate.google.com/translate_tts?tl=ja-jp&q=konnnichiwa", "hoge.bin"));
    }
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: javaでGoogleのSAPI

#3

投稿記事 by みけCAT » 8年前

さらに実験をしたところ、User-Agentが"java" (大文字/小文字が違うものも含む)で始まる場合に403が返ってくるようなので、
User-Agentを指定した所、HttpURLConnectionでも403が返ってこなくなったようです。

コード:

import java.net.*;
import java.io.*;
 
public class Main {
    public static Boolean FileDownload(String url,String out){
        try{
        URL file = new URL(url);
        
        HttpURLConnection conn =(HttpURLConnection) file.openConnection();
        conn.setRequestProperty("User-Agent", "desukutoppumasukotto");
        conn.setAllowUserInteraction(false);
        conn.setInstanceFollowRedirects(true);
        conn.setRequestMethod("GET");
        conn.connect();
        
        int httpStatusCode = conn.getResponseCode();
        
        if(httpStatusCode != HttpURLConnection.HTTP_OK){
          System.out.println("ダウンロードの失敗:StatusCode"+httpStatusCode);
            return false;
        }
        
        DataInputStream dataInStream = new DataInputStream(conn.getInputStream());
        
        DataOutputStream dataOutStream = new DataOutputStream(new BufferedOutputStream(
          new FileOutputStream(out)));
        
         byte[] b = new byte[4096];
        int readByte = 0;
        
        while(-1 != (readByte = dataInStream.read(b))){
          dataOutStream.write(b, 0, readByte);
            //System.out.write(b, 0, readByte);
        }
        
        dataInStream.close();
        dataOutStream.close();
        
        }catch(Exception e){
            System.out.println(e.toString());
            return false;
        }
        
        return true;
    }
    public static void main(String[] args) throws Exception {
        System.out.println(FileDownload("http://translate.google.com/translate_tts?tl=ja-jp&q=konnnichiwa", "hoge.bin"));
    }
}
参考
JavaでUserAgentを変える - 気紛 - きまぐれ -
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Aozora0630
記事: 85
登録日時: 9年前
住所: 日本
連絡を取る:

Re: javaでGoogleのSAPI

#4

投稿記事 by Aozora0630 » 8年前

おお、みけCATさんありがとうございます。

本当にUserAgentがjava以外だと成功しますね。
Socketの方もこちらで成功しました。

本当にJavaって何なんでしょうね。
解決方法を教えてくださって有難うございました。

閉鎖

“C言語何でも質問掲示板” へ戻る