메뉴 건너뛰기

imp

[Vision API] 구글 드라이브 이미지 파일 리사이징 후 Vision API 사용

[원문보기]

라이브러리 : 1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF 로 추가(OAuth2)

고급 구글 서비스 : Drive API

행아웃 채트 API 활성화

 

CLOUD VISION API 는 이미지를 식별해 주는데, 구글 드라이브에 업로드 된 파일은 경로 참조로 가져오기가 되지 않는다.

 

 base64로 변환 후 사용 가능하다.

 

function test(){//vision api 테스트

  var fileurl="구글 드라이브 이미지 파일 경로";

  var data1 = JSON.parse(makeRequest(fileurl)); 

  //data.responses[0].webDetection.bestGuessLabels[0].label, data.responses[0].webDetection.webEntities[0].description 을 추출하여 사용

  Logger.log(data1.responses[0].webDetection);

}

function buildJSONRequestImgBase64(val) {//base64 인코딩 및 json 메시지 생성

  var file = DriveApp.getFileById(val); 

  var data1 = Utilities.base64Encode(file.getBlob().getBytes());

  return JSON.stringify({

    requests: [{

      image: {

        content:data1

      },

      features: [{

        type: "WEB_DETECTION",

        maxResults: 1

      }]

    }]

  });

}

var APIKey = 'Your key';

function makeRequest(b64) {// Make a POST request to Vision API with a JSON payload.      

  var visionApiUrl = 'https://vision.googleapis.com/v1/images:annotate?key=' + APIKey;

  var JSON_REQ = buildJSONRequestImgBase64(b64);

  var options = {

    'method': 'post',

    'contentType': 'application/json',

    'payload': JSON_REQ

  };

  var response = UrlFetchApp.fetch(visionApiUrl, options);

  return response.getContentText();

}

 

 

//행아웃 채팅으로 봇이 받은 이미지를 리사이징하여 저장한다.

function uploadAttachmentToDrive(attachment, folderId, fileName){//행아웃 채팅으로 받은 이미지 파일 처리 구글 드라이브로 업로드 및 썸네일 생성

  var resourceName = attachment[0].attachmentDataRef.resourceName;

  var blob     = "";

  var url      = "https://chat.googleapis.com/v1/media/" + resourceName + "?alt=media"

  var service  = getOAuth2Service(); 

 

 var response = UrlFetchApp.fetch(url, {

    headers: {

      'Authorization': 'Bearer ' + service.getAccessToken(),

    },

    'muteHttpExceptions': true,

  });

 

  if (response.getResponseCode() != 200) {

    return url;

  }

 

  blob = response.getBlob();

  

  var folder = DriveApp.getFolderById(folderId);

  var uploadFile = folder.createFile(blob);

 

  uploadFile.setName(fileName);

  

  var width = 800;

  

  var link = Drive.Files.get(uploadFile.getId()).thumbnailLink.replace(/\=s.+/, "=s" + width);

 

  var blob2 = UrlFetchApp.fetch(link).getBlob().setName(fileName+"_t");

  var file = folder.createFile(blob2);

  

  return file.getId();

}

function onMessage(event) {

  if(event.message.attachment != null){

    var fileurl = uploadAttachmentToDrive(event.message.attachment,"폴더명",Utilities.formatDate(dt, "GMT+9", "YYYY.MM.dd HH:mm:ss"));

}

function getOAuth2Service() {

  var serviceAccountPriveKey = '-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----\n';

  var serviceAccountClientEmail = '~gserviceaccount.com'; 

  var scope = 'https://www.googleapis.com/auth/chat.bot';

  var service = OAuth2.createService('Vote bot')

      .setTokenUrl('https://accounts.google.com/o/oauth2/token')

      .setPrivateKey(serviceAccountPriveKey)

      .setClientId(serviceAccountClientEmail)

      .setScope(scope);

 

  if (!service.hasAccess()) {

    console.log('Authentication error: %s', service.getLastError());

    return;

  }

 

  return service;

}

gzip request and non-gzip request

[원문보기]

// HTTP POST request

public String sendPost(String targetUrl, String parameters) throws Exception {

 

URL url = new URL(targetUrl);

disableSslVerification();

//HttpURLConnection con = (HttpURLConnection) url.openConnection();

HttpsURLConnection con = (HttpsURLConnection) url.openConnection();

con.setRequestMethod("POST");

con.setRequestProperty("charset", "UTF-8");

con.setRequestProperty("Content-Encoding", "gzip");//when gzip 

con.setRequestProperty("Accept-Encoding", "gzip");//when gzip 

con.setRequestProperty("content-type", "application/x-www-form-urlencoded");

con.setDoOutput(true);

 

DataOutputStream wr = new DataOutputStream(con.getOutputStream());

wr.write(compress(parameters));

wr.flush();

wr.close();

 

//non-gzip request

        /*OutputStreamWriter outStream = new OutputStreamWriter(con.getOutputStream(), "UTF-8");

        PrintWriter writer = new PrintWriter(outStream);

        writer.write(parameters.toString());

        writer.flush();*/

 

BufferedReader in = new BufferedReader(new InputStreamReader(new GZIPInputStream(con.getInputStream()), "UTF-8"));

String inputLine;

StringBuffer response = new StringBuffer();

 

while ((inputLine = in.readLine()) != null) {

response.append(inputLine);

}

in.close();

return response.toString();

}

[notion] API를 사용하여 데이터베이스의 목록 출력

[원문보기]

여러 설명페이지에 데이터베이스 기본 정보를 출력하는 예제는 많으나, 목록을 출력하는 예제는 부족하다.

 

query라는 api를 이용하여 POST 방식으로 호출해야 한다.

 

데이터의 내용이 있을 경우 results의 배열로 리턴되며, 속성 중 column(여기서는 column)를 추가하여 존재하는 목록을 출력해 보았다.

 

/**
* Example someHost is set up to take in a JSON request
* Replace url with the host you wish to send requests to
* @param {string} someHost the host to send the request to
* @param {string} url the URL to send the request to
*/
const someHost = 'https://api.notion.com/v1/';
const url = someHost + 'databases/[키]/query';
 
/**
* gatherResponse awaits and returns a response body as a string.
* Use await gatherResponse(..) in an async function to get the response body
* @param {Response} response
*/
async function gatherResponse(response) {
const { headers } = response;
const contentType = headers.get('content-type') || '';
if (contentType.includes('application/json')) {
return JSON.stringify(await response.json());
} else if (contentType.includes('application/text')) {
return response.text();
} else if (contentType.includes('text/html')) {
return response.text();
} else {
return response.text();
}
}
 
async function handleRequest() {
const init = {
method: 'POST',
headers: {
'content-type': 'text/html;charset=UTF-8',
'Notion-Version': '2022-02-22',
'Authorization': 'Bearer secret_키',
},
};
const response = await fetch(url, init);
const results = await gatherResponse(response);
let jsons = JSON.parse(results);
let json = jsons.results[0];
let res = "<table>";
let res1="";
for (i=0;i<jsons.results.length;i++){
json = jsons.results[i];
res1=res1+"<tr><td>"+json.properties.column.rich_text[0].plain_text+"</td><td>"+json.id+"</td><td>"+json.url+"</td></tr>";
}
res = res + res1 + "</table>";
return new Response(res, init);
}
 
addEventListener('fetch', event => {
return event.respondWith(handleRequest());
});

[R] googleAuthR 을 이용한 oAuth 인증 및 로그인 아이디 얻기

[원문보기]

https://code.markedmondson.me/googleAuthR/articles/google-authentication-types.html

상기 경로로 구현해 보았다.

 

아래 코드로 이용 가능하며, 클라이언트 id 부분은 개발자 콘솔에서 사용자 인증 정보를 웹애플리케이션에 사용하는 것으로 만들어 활용하면 된다.

 

localhost는 잘 되지 않아, shinyapps.io 를 사용 경로로 등록해서 잘 동작하였다.

 

library(shiny)
library(googleAuthR)

options(googleAuthR.webapp.client_id = "###")

ui <- fluidPage(

    titlePanel("Sample Google Sign-In"),

    sidebarLayout(
      sidebarPanel(
        googleSignInUI("demo")
      ),

      mainPanel(
        with(tags, dl(dt("Name"), dd(textOutput("g_name")),
                      dt("Email"), dd(textOutput("g_email")),
                      dt("Image"), dd(uiOutput("g_image")) ))
      )
    )
  )

server <- function(input, output, session) {

  sign_ins <- shiny::callModule(googleSignIn, "demo")

  output$g_name = renderText({ sign_ins()$name })
  output$g_email = renderText({ sign_ins()$email })
  output$g_image = renderUI({ img(src=sign_ins()$image) })

}

# Run the application 
shinyApp(ui = ui, server = server)

[Workers] Cloudflare Workers로 서버리스 코딩

[원문보기]

Cloudflare 는 https를 쉽게 제공해주는 서비스로 출발하였다.

 

해당 기능은 라우팅이나 호스팅과 관련이 있는데, 마이크로 서비스를 사용할 수 있는 Workers를 제공한다.

 

현재는 nodejs 밖에 사용하지 못한다고 하나, aws에서 nodejs를 lambda로 사용해 봤기 때문에 조금은 수월하게 접근할 수 있었다.

 

간단한 예제들을 통해 실행, json 다루기, json을 html로 표현하기 등을 해보았다.

 

json 샘플에서는 header를 json으로 클라이언트에 전달하므로 html이 text로 나온다.

 

그래서 해당 부분만 수정하여 html 표가 그려질 수 있도록 수정했다.

 

추후에는 실제 API와 연결하여 활용해 보도록 해야겠다.

 

'content-type': 'application/json;charset=UTF-8',
==>

'content-type': 'text/html;charset=UTF-8',

 

/**
 * Example someHost is set up to take in a JSON request
 * Replace url with the host you wish to send requests to
 * @param {string} someHost the host to send the request to
 * @param {string} url the URL to send the request to
 */
const someHost = 'https://jsonplaceholder.typicode.com/';
const url = someHost + 'todos/1';
 
/**
 * gatherResponse awaits and returns a response body as a string.
 * Use await gatherResponse(..) in an async function to get the response body
 * @param {Response} response
 */
async function gatherResponse(response) {
  const { headers } = response;
  const contentType = headers.get('content-type') || '';
  if (contentType.includes('application/json')) {
    return JSON.stringify(await response.json());
  } else if (contentType.includes('application/text')) {
    return response.text();
  } else if (contentType.includes('text/html')) {
    return response.text();
  } else {
    return response.text();
  }
}
 
async function handleRequest() {
  const init = {
    headers: {
      'content-type': 'text/html;charset=UTF-8',
    },
  };
  const response = await fetch(url, init);
  const results = await gatherResponse(response);
  let json = JSON.parse(results);
  let res = "<table><tr><td>"+json.userId+"</td><td>"+json.title+"</td><td>"+json.completed+"</td></tr></table>";
  console.log(json.userId);
  console.log(json.id);
  console.log(json.title);
  console.log(json.completed);
  return new Response(res, init);
}
 
addEventListener('fetch', event => {
  return event.respondWith(handleRequest());
});

[nodejs] aws lambda 에서 httprequest with get param

[원문보기]

http api 형태로 하여 api gateway를 생성하였을 때,

 

https://api경로.execute-api.ap-northeast-2.amazonaws.com/default/api명?파라미터명=데이터

 

 

[index.js]

const http = require('https')

exports.handler = async (event) => {

    return httprequest(event).then((data) => {

        const response = {

            param: event,

            statusCode: 200,

            body: JSON.stringify(data),

        };

    return response;

    });

};

function httprequest(event) {

     return new Promise((resolve, reject) => {

        const options = {

            host: '호스트명(url경로)',

            path: encodeURI('/[중간경로]?파라미터명='+event.queryStringParameters.파라미터명),

            port: 443,

            method: 'GET'

        };

        const req = http.request(options, (res) => {

          if (res.statusCode < 200 || res.statusCode >= 300) {

                return reject(new Error('statusCode=' + res.statusCode));

            }

            var body = [];

            res.on('data', function(chunk) {

                body.push(chunk);

            });

            res.on('end', function() {

                try {

                    body = JSON.parse(Buffer.concat(body).toString());

                } catch(e) {

                    reject(e);

                }

                resolve(body);

            });

        });

        req.on('error', (e) => {

          reject(e.message);

        });

        // send the request

       req.end();

    });

}

이전 1 ... 4 5 6 7 8 9 다음
첨부 (0)
위로