T-kazu1234
10/5/2019 - 8:32 PM

GoogelAppScript文字起こし君

// LINEのアクセストークン
var CHANNEL_ACCESS_TOKEN = '自身のLINEのアクセストークン';
// Google Cloud Vision API Key
var GOOGLE_CLOUD_VISION_API_KEY = '自身のGoogle Cloud Vision API Key';

//LINEからメッセージが送られたときに動作する処理
function doPost(e) {
  // LINEメッセージタイプ
  var type = JSON.parse(e.postData.contents).events[0].message.type;
  // LINE返信用トークン
  var reply_token = JSON.parse(e.postData.contents).events[0].replyToken;

  // LINE返信用トークンが正常に取得できない場合
  if (typeof reply_token === 'undefined') {
    return;
  }

  // LINEから画像以外が送られた場合、定型文をLINEに返信する
  if (type !== 'image') {
    var result = 'ぼくのこと呼んだ?\n画像を送ってくれればテキストにして返信するよ\uDBC0\uDC5E';
    message_post(reply_token, result);
    return;
  }

  var messageId = JSON.parse(e.postData.contents).events[0].message.id;
  // LINEから画像を取得する
  var blob = get_line_content(messageId);
  
  // 文字起こし結果
  var result = imageAnnotate(blob);

  // 文字起こし結果をLINEに返信する
  message_post(reply_token, result);
  
  return;
}

// LINEから画像を取得する
function get_line_content(messageId) {
  var url = 'https://api.line.me/v2/bot/message/' + messageId + '/content';

  //blobに画像を格納
  var blob = UrlFetchApp.fetch(url, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN
    },
    'method': 'get'
  }); 
  return blob;
}

// Google Cloud Visionで文字起こしを行う
function imageAnnotate(file) {
  var payload = JSON.stringify({
    'requests':[
      {
        'image': {
          'content': Utilities.base64Encode(file.getBlob().getBytes())
        },
        'features': [
          {
            'type': 'TEXT_DETECTION'
          }
        ]
      }
    ]
  });

  var url = 'https://vision.googleapis.com/v1/images:annotate?key=' + GOOGLE_CLOUD_VISION_API_KEY;
  var options = {
    method : 'post',
    contentType: 'application/json', 
    payload : payload
  };

  //Vison APIに投げて,結果をresに格納
  var res = UrlFetchApp.fetch(url, options);
  var obj = JSON.parse(res.getContentText());
  
  //結果のJSONから文字起こし結果だけ抽出する
  if ('textAnnotations' in obj.responses[0]) {
    return obj.responses[0].textAnnotations[0].description;
  }
  return '文字を読み取れなかったよ。ごめんね\uDBC0\uDC5E';
}

// 文字起こし結果をLINEに返信する
function message_post(token, message){
  var url = 'https://api.line.me/v2/bot/message/reply';

  UrlFetchApp.fetch(url, {

    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN
    },
    'method': 'post',
    'payload': JSON.stringify({
      'replyToken': token,
      'messages': [{
        'type': 'text',
        'text': message
      }]
    })
  });
}