정보/Python

주변 편의점 위치를 카카오톡으로 자동 전송하는 프로그램

MinseobKim 2021. 12. 7. 23:25

학교 현장체험학습 자유주제탐구로 위와 같은 프로그램을 Python으로 만들게 되었다.
제주도로 현장체험학습을 가서 친구들이 있는 톡방에 주변 편의점 위치를 자동으로 전송해주려는 목적으로 제작하였다.

전체 프로그램 코드 : https://github.com/MinseobKimm/PythonCrawlerWithKakao

 

GitHub - MinseobKimm/PythonCrawlerWithKakao

Contribute to MinseobKimm/PythonCrawlerWithKakao development by creating an account on GitHub.

github.com


1. ip주소 이용하여 현재 위치 위도와 경도 값 받아오기

ip주소를 통해 위도 경도 값을 json 형태로 보내주는 ip-api.com/ 사이트를 이용하여 코드를 간단히 할 수 있다.

import requests
import json
url = 'http://ip-api.com/json'
data = requests.get(url)

res = data.json()

2. 카카오 맵 api로 특정 위치 주변 편의점 목록 불러오기

https://developers.kakao.com/ 에서 로그인을 통하여 카카오 맵에 접근하기 위한 고유의 Rest API 키를 받을 수 있다.

url = 'https://dapi.kakao.com/v2/local/search/keyword.json'

params = {'query' : '편의점', 'x' : res['lon'], 'y' :  res['lat'], 'radius' : 1000, 'category_group_code' : 'CS2'}


headers = {"Authorization": "KakaoAK (REST API 키 넣는 자리)"}
total = requests.get(url, params=params, headers=headers).json()['documents']

이 코드를 통하여 total 리스트에 근처 편의점의 정보를 모두 저장한다.
여기에는 지점 명, 지번 주소, 현 위치와의 거리, 지점 id, 도로명주소, 위도, 경도, 웹페이지 주소 등이 들어있다.

total을 그대로 출력한 결과이다.

그다음으로는 저장한 편의점 정보들을 가공할 것이다.
가장 먼저 저장된 값들을 거리가 가까운 순으로 정렬하였다.
값이 많지 않으므로 간단한 버블 정렬을 사용하였다.

def bubble_sort(total):
    for i in range(len(total)):
        for j in range(i,len(total)-1):
            if total[j]['distance'] > total[j+1]['distance']:
                total[j], total[j+1] = total[j+1], total[j]
    return total

그 후 카카오톡에 전송할 문자열을 만들었다.
각 편의점 별로 지점명, 거리, 주소를 줄 바꿈 하여 깔끔하게 문자열에 담았다.

    for i in range(0,len(total)-1):
        my_msg+=total[i]['place_name']+'\n'
        my_msg +='거리 :'+total[i]['distance'] +'m\n'
        n='주소 : ' + 'https://map.kakao.com/link/map/'+total[i]['id']+'\n\n'
        my_msg +=n

3. 주변 편의점 정보를 카카오톡 채팅방에 자동 전송하기

카카오톡으로 자동 전송하는 부분은 https://shine-yeolmae.tistory.com/52 이 블로그의 도움을 받았다.

코드 내용을 간단히 요약하면
1. 카카오톡 exe파일 실행

def run_kakao():
    kakao_path = get_kakao_cmd()
    print(f'Run KakaoTalk : {kakao_path}')
    try:
        subprocess.run(kakao_path)
    except Exception:
        print('[ERROR] Execute Kakaotalk')
        raise

2. opencv를 이용하여 카카오톡 채팅 이미지에 마우스 커서 위치

def enter_chatroom(chat_idx):
    chat_imgs = ['chat.png', 'chat_with_msg.png']
    for chat_png in chat_imgs:
        try:
            click_img(chat_png)
        except TypeError:
            print(f'Not match with image: {chat_png}')
            pass
        except Exception:
            print(f'[ERROR] Click image: {chat_png}')

3. 미리 설정한 방의 번호에 따라 원하는 카톡방 들어가기

pyautogui.hotkey(*home_key)
print(*home_key)
print(f"Enter the {chat_idx}th chatroom")
for i in range(1, chat_idx):
    pyautogui.press('down')
pyautogui.press('enter')

4. 저장한 문자열 붙여 넣고 전송하기

def send_msg(msg):
    pyperclip.copy(msg)
    pyautogui.hotkey(cmd_key, 'v')
    pyautogui.press('enter')

자세한 코드는 깃허브에 올려두었다.


위와 같은 세 가지 과정으로 주변 편의점 위치를 카카오톡으로 자동 전송할 수 있게 되었다.

프로그램을 통해 출력한 예시이다.

 

실행 영상


아쉬운 점
1. 현재 위도, 경도를 ip주소를 기반으로 받기 때문에 정확하지 않았다.
2. 모바일 앱으로 만들었으면 더 목적성에 부합했을 것이다.



참고 문서
https://han-py.tistory.com/235
https://haries.tistory.com/10?category=885610
https://shine-yeolmae.tistory.com/52