ページ 11

javaでGoogleのSAPI

Posted: 2015年7月22日(水) 18:08
by Aozora0630
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;
	}

Re: javaでGoogleのSAPI

Posted: 2015年7月22日(水) 18:34
by みけCAT
まだ原因はわかっていませんが、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"));
    }
}

Re: javaでGoogleのSAPI

Posted: 2015年7月22日(水) 22:11
by みけCAT
さらに実験をしたところ、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を変える - 気紛 - きまぐれ -

Re: javaでGoogleのSAPI

Posted: 2015年7月23日(木) 09:22
by Aozora0630
おお、みけCATさんありがとうございます。

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

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