ローカルの開発環境からメッセージを送信するところまで試してみた。
Javaで呼び出したコードが全然ヒットしなかったので雑だけど公開してみる。
ちなみにHTTPS環境が用意できなかったのでGAEでメッセージを受け取ってmidを取得した。
ライブラリはJSONICとgoogle-http-clientを使った。JSONのモデルを作ってどうこうするのは面倒だったので。
google-http-clientは碌にドキュメントも読まず、動けばいいやで作ったのでかなり怪しい。
JSONICはJSONのモデルを気軽に扱えるのでお勧めです。
ハマった点
色々なところに記載されていることなのだけど、callback urlを指定してから実際に反映されるまで18時間くらいかかった。
https://で指定しているのに、ポート番号(443)まで指定しなければいけないあたりが気難しい。
callback-urlにコールバックが来ないとBot以外のアカウントのmidがわからないので送信テストする方法もなさそう。
試す前にでも早めに設定しておくほうが良いかと。
メッセージ送信コード
大体こんな感じで書けば送れた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
public static void sendMessage(String message, String mid){ HttpTransport transport = new NetHttpTransport(); HttpRequestFactory factory = transport .createRequestFactory(new HttpRequestInitializer() { public void initialize(HttpRequest request) throws IOException { request.setConnectTimeout(0); request.setReadTimeout(0); } }); try { // JSONデータを適当に作る HashMap<String,Object> bodyMap = new HashMap<String,Object>(); bodyMap.put("to", Arrays.asList(new String[]{mid})); // 相手のmid 配列で渡すので注意 bodyMap.put("toChannel", 1383378250); // LINE側で指定されている固定値 bodyMap.put("eventType", "138311608800106203"); // LINE側で固定されている固定値 HashMap<String,Object> contentMap = new HashMap<String,Object>(); contentMap.put("contentType", 1); // テキストメッセージ contentMap.put("toType", 1); // ユーザー宛て(それ以外の選択肢はなさそう) contentMap.put("text", message); // メッセージ本文,1024文字以下 bodyMap.put("content", contentMap); // JSONにエンコード String encodedJson = JSON.encode(bodyMap, false); //System.out.println(encodedJson); byte[] b = encodedJson.getBytes("UTF-8"); String url = "https://trialbot-api.line.me/v1/events"; HttpContent content = new ByteArrayContent("application/json; charset=UTF-8", b); HttpRequest request = factory.buildPostRequest(new GenericUrl(url), content); request.setHeaders(new HttpHeaders() .set("X-Line-ChannelID", /*管理画面の値を入れる*/) .set("X-Line-ChannelSecret", /*管理画面の値を入れる*/) .set("X-Line-Trusted-User-With-ACL", /*管理画面のmidの値を入れる*/)); // リクエスト HttpResponse response = request.execute(); // 結果を標準出力に流す System.out.println(response.getStatusCode()); BufferedReader br = new BufferedReader(new InputStreamReader(response.getContent())); String line; while((line = br.readLine()) != null) System.out.println(line); } catch (IOException e) { e.printStackTrace(); } } |
ピンバック: Line bot に最近公開したノビィAPIを乗せてみる。 | Line Design