search_restaurant1.py 5.62 KB
# kakao local api 컨트롤러 참고자료: https://wooiljeong.github.io/python/kakao_local_api/
# 파이썬 json 특정값 추출 참고자료: https://hashcode.co.kr/questions/8852/%ED%8C%8C%EC%9D%B4%EC%8D%AC-json-%ED%8A%B9%EC%A0%95%EA%B0%92-%EC%B6%94%EC%B6%9C
import json
import requests
from pprint import pprint
from io import StringIO #return_print 하기 위해

import telegram
from telegram.ext import Updater
from telegram.ext import MessageHandler, Filters

class KakaoLocalAPI:
    """
    Kakao Local API 컨트롤러
    """

    def __init__(self, rest_api_key):
        """
        Rest API키 초기화 및 기능 별 URL 설정
        """


        # REST API 키 설정
        self.rest_api_key = "1c74642c092d28c438467486c366c6cf"
        self.headers = {"Authorization": "KakaoAK {}".format(rest_api_key)}

        # 서비스 URL 설정


        # 05 키워드 검색
        self.URL_05 = "https://dapi.kakao.com/v2/local/search/keyword.json"

  
    def search_keyword(self,query,category_group_code=None,x=None,y=None,radius=None,rect=None,page=None,size=None,sort=None):
        """
        05 키워드 검색
        """
        #params = {'query': f"{query}",
        #          'x': f"{x}",
        #          'y': f"{y}"}

        params = {'query': f"{query}",
                  'x': f"{x}",
                  'y': f"{y}",}

        if radius != None:
            params['radius'] = f"{radius}"
        if rect != None:
            params['rect'] = f"{rect}"
        if page != None:
            params['page'] = f"{page}"
        if size != None:
            params['size'] = f"{params}"
        if sort != None:
            params['sort'] = f"{sort}"
        
        res = requests.get(self.URL_05, headers=self.headers, params=params)
        document = json.loads(res.text)  
        return document


# REST API 키
rest_api_key = "1c74642c092d28c438467486c366c6cf"
kakao = KakaoLocalAPI(rest_api_key)

## Set params
query = "인덕원 닭갈비" #검색 키워드
x = 126.98083352703802 #내 위치 위도와 경도
y = 37.39403042340368 
radius = 1           #반경 km 검색

## Request
result_5 = kakao.search_keyword(query,x,y,radius)


# + json파일 확인해보기 이후 데이터를 추출해야함
#json_string = json.dumps(result_5, indent=2)
#print(json_string)


#json파일 특정 키워드 추출
#추출할 리스트 place_name, place_url, x, y (x y는 위치임), 검색키워드, 선택 지역(위치) 
#from pprint import pprint

same_name_list = [ x_ for x_ in result_5['meta']['same_name'].values()]
keyword = "검색 키워드:  " + same_name_list[0]
selected_region= "검색 위치:  " +same_name_list[2]

total_count = {result_5['meta']['total_count']} #set은 파싱이 불가능하기 때문에 list나 튜플로 바꿔야함, list로 바꾼 후 인덱스를 활용하여 int로 바꾼 후 문자열과 더하기 위해 str로 형변환
total_count_list=list(total_count)
total_count = "총 검색 개수:  " + str(total_count_list[0])
#print(keyword)  #메제지들은 텔레그렘 봇으로 보내기!!
#print(selected_region)
#print(total_count) 

#print("----------")

place_name_list = [ x_['place_name'] for x_ in result_5['documents']]
#print(place_name_list)

#print('------')

phone_list = [ x_['phone'] for x_ in result_5['documents']]
#print(phone_list)

#print('------')

place_url_list = [ x_['place_url'] for x_ in result_5['documents']]

#print(place_url_list)

#print('------')

#print(x_list) 위치 시각화 할때 사용
x_list = [ x_['x'] for x_ in result_5['documents']]
y_list = [ x_['y'] for x_ in result_5['documents']]

#print(y_list)
#print(x_list)

#print('------')

road_address_name_list = [ x_['road_address_name'] for x_ in result_5['documents']]


#print(road_address_name_list)

#print('------')

resturant_info_list = []
total_count_num = str(total_count_list[0])
total_count_num = int(total_count_num)
resturant_info = ""
resturant_string = "관련 음식점 정보: " + '\n'

#프린트 결과를 리턴받기 위한 함수
#from io import StringIO
def return_print(*message):
    io = StringIO()
    print(*message, file=io, end="")
    return io.getvalue()

for i in range(0,10):  #total_count_num가 너무 크면 인덱스 범위가 벗어나서 실행이 안됨, 임시로 10개까지만
    resturant_info = [place_name_list[i] + " " +phone_list[i]  + " " + road_address_name_list[i] + " " + place_url_list[i]]
    resturant_string += str(resturant_info) + "\n" + "\n"

    
    
    #resturant_info_list = [place_name_list[i] + " " +phone_list[i]  + " " + road_address_name_list[i] + " " + place_url_list[i]]
    #resturant_info += return_print(resturant_info_list)
# print(resturant_string)






#################################################################3
#텔레그램 관련 코드
token = "1721885449:AAHDGMbjSJfhXxML6nfSCpfiU7SghpL_vOE"
id = "1657858421"
bot = telegram.Bot(token)


info_message = '''맛집 검색 기능: (#맛집)'''           ########기능 리스트 ##############33
bot.sendMessage(chat_id=id, text=info_message)

react_weather = '''오늘 날씨 봐봐''' 


updater = Updater(token=token, use_context=True)
dispatcher = updater.dispatcher
updater.start_polling()
 

# 챗봇 응답
def handler(update, context):
    user_text = update.message.text # 사용자가 보낸 메세지를 user_text 변수에 저장합니다.

    # 오늘 확진자 수 답장
    if ("맛집" in user_text):
        bot.sendMessage(chat_id=id, text=resturant_string)  
    elif ("고마워" in user_text):
        bot.send_message(chat_id=id, text="웅 ㅎㅎ")       
    else:
        update.message.reply_text("ㅎㅎ")
     
echo_handler = MessageHandler(Filters.text, handler)
dispatcher.add_handler(echo_handler)