네이버 카페 검색용 알프레드 워크플로우 v2

이번엔 자바스크립트로 만들었습니다

작년 8월쯤 네이버 카페를 검색할 수 있는 알프레드 워크플로우를 만들어서 공개했다(링크 참고). 가끔 쓸 일이 있어서 만들어놓기는 했지만 이런저런 일로 신경을 못 쓰고 있었는데, 그러던 중 이런 댓글이 달렸다.

아직 업데이트 전이라 모르고 있었는데 보고된 대로 macOS 12.3부터는 Python2 버전을 찾아보기 어려웠다. 뿐만아니라 Python3 또한 기본 설치가 아니라 사용자가 직접 설치해주어야 한다고 한다. 어차피 해야하는 삽질이라면 뭐라도 배울 수 있게 조금 더 생산적으로 해보자 싶어서 똑같은 워크플로우를 이번엔 자바스크립트로 작성해보았다. 정확하게 말하면 macOS의 기본 기능인 오토메이션 스크립트를 사용하는 것이다.

지난 번에 워크플로우를 작성할 때는 JS에 언어 인코딩 변환 모듈이 없어서 포기했는데 쉘 스크립트와 iconv를 사용해서 약점을 극복했다. 완성된 스크립트는 다음과 같다. 이전 글에서 설명한 대로 워크플로우를 만들되 스크립트 언어를 /usr/bin/osascript (JavaScript)로 설정해주어야 한다.

function run(argv) {
	const query = argv[0];
	const app = Application.currentApplication();

	app.includeStandardAdditions = true;

	const converted = app.doShellScript(`echo "${query}" | iconv -c -t cp949 -f UTF8-MAC | hexdump`).split(/\r?\n|\r/g).map(line => line.split(/ /g).filter(Boolean).slice(1).join('')).join('');
	const encoded = converted.replace(/([a-z\d]{2})([a-z\d]{2})/g, '%$2%$1').replace(/%0[0a]/g, '');

	return JSON.stringify({
		items: [
			{
				uid: 'search-ncafe',
				type: 'default',
				title: '네이버 카페 검색',
				subtitle: `네이버 카페에서 '${query}' 검색하기`,
				arg: encoded,
				valid: true,
			},
		],
	});
}

가장 시간이 많이 걸린 부분은 역시 UTF-8의 문자열을 CP949 형식으로 변환해주는 것이었다. JS는 기본적으로 UTF-8 기반으로 동작하기 때문에 오히려 이런 오래된 한국어 인코딩 방식을 지원하기가 어렵다. 따라서 쉘 스크립트와 iconv를 이용해서 변환해주고 이를 다시 16진수로 덤프를 출력했다. 16진수로 출력하는 과정이 없으면 변환된 문자열이 제대로 저장되지 않는다.

문자열 처리의 핵심은 const converted....로 시작하는 줄과 const encoded...로 시작하는 줄이다. converted에서는 UTF-8-MAC 인코딩을 CP949로 변경한 후 hexdump가 출력하는 불필요한 정보를 제거한다. 여기서 출발 인코딩이 UTF-8이 아닌 UTF-8-MAC임에 주의하자. 이렇게 사용하는 이유는 이전 글에 달린 댓글에서 조금 더 자세히 볼 수 있다.

encoded 부분에서는 바이트 헥사코드의 순서를 올바르게 변경하고 줄바꿈, 널문자와 같은 불필요한 정보를 제거한다.그리고 헥사 코드 앞에 % 기호를 추가해 URL에 사용할 수 있는 인코딩된 텍스트로 변경한다. 이렇게 완성된 데이터를 알프레드에서 지원하는 검색 목록 JSON으로 전달하면 다시 네이버 카페 검색을 사용할 수 있게 된다.

  1. 안녕하세요. 댓글로 질문드렸던 알프레드입니다. 귀한 시간 내주셔서 정말 감사합니다. 제가 비전공자라 글쓴이님이 자세하게 써주신 내용 이해 못 하는게 정말 아쉽네요. 다시 한 번 감사합니다.

    글쓴이님이 만들어주신 코드나 '네이버 자동완성 워크플로우' 같은 코드를 만들고 싶은데 웹기술을 배우면 될까요?

    1. 먼저 시간 내어 양질의 글 적어주셔서 감사합니다.

      본문에 적어주신 코드로 워크플로우를 만들어 사용해보았는데요, 검색어의 첫 글자가 빠진 채 검색 되는 문제가 발생했습니다. 예를 들어 '테스트'로 입력하면 첫 단어가 빠진 '스트'로만 검색이 되더라고요.

      염치 없지만 확인해주시면 감사하겠습니다.

      1. 제가 비전공자라 원인은 모르겠으나..

        `echo "${query}" 이 부분과

        subtitle: 네이버 카페에서 '${query}' 검색하기,

        에서 $을 제거하니 정상 검색 되는 것 확인했습니다.

        감사합니다.

  2. 안녕하세요. 올려주신 글 덕분에 알프레드에서 네이버 카페 검색 기능을 아주 편리하고 유용하게 잘 사용중입니다.
    거듭 감사한 마음 전합니다.

    한 가지 어려운 점이 혹시 아신다면 작은 정보를 얻을 수 있을까 싶어 노크합니다.

    성경 검색을 단축어로 하고 싶은데요,
    http://www.Holybible.co.kr 이곳에서 네이버 카페처럼 검색어 위치에 쿼리{query}를 두고 (뭔지도 모르고 그냥 검색할 때 쓰는 용도라고 알고 봍붙하는 수준입니다.) 사용해보니 홀리바이블 페이지는 euc-kr 캐릭터를 사용하고, UTF-8로 바꿔줘야 하는 ? 뭐 그런 상황인 것 같습니다. 혹시 euc-kr을 알프레드에서 사용할 때 한글이 깨지지 않는 방법을 아신다면...

    작은 힌트만 주셔도 실험(?)하듯 도전해보겠습니다.

    긴 글 봐주셔서 감사합니다.

    1. 안녕하세요, 맥은 기본적으로 UTF-8을 사용하고, 해당 사이트도 UTF-8을 사용하는 것으로 보입니다.

      오히려 네이버 카페가 euc-kr을 사용하고 있어서 UTF-8을 EUC-KR로 변환해주기 위해서 본문에서 설명한 다소 복잡한 과정을 거칠 수 밖에 없었습니다. 그러니 같은 인코딩을 사용하는 홀리바이블 페이지에는 조금 더 쉽게 검색이 가능할 것 같습니다.

      다만, 주소 뒤에 검색어를 추가하면 되는 네이버 카페와 달리 해당 페이지는 POST 방식으로 검색어를 전송하고 있습니다. 아마 이 부분이 조금 번거로운 지점이 될 수도 있을 것 같은데, 일단 시도해보시고 잘 안되면 다시 질문해주시면 한 번 확인해보겠습니다.

  3. 안녕하세요. 만들어주신 알프레드 워크플로우 잘 쓰고 있습니다. 감사합니다.

    다름이 아니라 최근 만들어주신 워크플로우가 작동을 안 하는데요, 아래 링크 이슈가 있더라고요.

    혹시 이 원인 때문에 만들어주신 알프레드 워크플로우가 작동하지 않는 것 일까요?

    https://github.com/ssut/py-hanspell/issues/38

    다시 한 번 감사합니다.

댓글을 남겨주세요

This site uses Akismet to reduce spam. Learn how your comment data is processed.