Showing
1 changed file
with
338 additions
and
0 deletions
tele_chatbot_code.py
0 → 100644
1 | +#total_chatbot_code | ||
2 | +import telegram | ||
3 | +from telegram.ext import Updater | ||
4 | +from telegram.ext import MessageHandler, Filters | ||
5 | +import os | ||
6 | +import webbrowser | ||
7 | +import telegram | ||
8 | +from telegram.ext import Updater | ||
9 | +from telegram.ext import MessageHandler, Filters | ||
10 | +from bs4 import BeautifulSoup | ||
11 | +from selenium import webdriver | ||
12 | +import urllib.request as req | ||
13 | +from selenium.webdriver.support.ui import WebDriverWait | ||
14 | +from selenium.webdriver.support import expected_conditions as EC | ||
15 | +from selenium.webdriver.common.by import By | ||
16 | + | ||
17 | +from pprint import pprint | ||
18 | +import requests | ||
19 | + | ||
20 | +html = requests.get('https://search.naver.com/search.naver?query=날씨') | ||
21 | +#pprint(html.text) | ||
22 | + | ||
23 | +import json | ||
24 | +from io import StringIO #return_print 하기 위해 | ||
25 | + | ||
26 | + | ||
27 | + | ||
28 | + | ||
29 | +################ 음식점 검색 기능 ############## | ||
30 | +class KakaoLocalAPI: | ||
31 | + """ | ||
32 | + Kakao Local API 컨트롤러 | ||
33 | + """ | ||
34 | + | ||
35 | + def __init__(self, rest_api_key): | ||
36 | + """ | ||
37 | + Rest API키 초기화 및 기능 별 URL 설정 | ||
38 | + """ | ||
39 | + | ||
40 | + | ||
41 | + # REST API 키 설정 | ||
42 | + self.rest_api_key = "1c74642c092d28c438467486c366c6cf" | ||
43 | + self.headers = {"Authorization": "KakaoAK {}".format(rest_api_key)} | ||
44 | + | ||
45 | + # 서비스 URL 설정 | ||
46 | + | ||
47 | + | ||
48 | + # 05 키워드 검색 | ||
49 | + self.URL_05 = "https://dapi.kakao.com/v2/local/search/keyword.json" | ||
50 | + | ||
51 | + | ||
52 | + def search_keyword(self,query,category_group_code=None,x=None,y=None,radius=None,rect=None,page=None,size=None,sort=None): | ||
53 | + """ | ||
54 | + 05 키워드 검색 | ||
55 | + """ | ||
56 | + #params = {'query': f"{query}", | ||
57 | + # 'x': f"{x}", | ||
58 | + # 'y': f"{y}"} | ||
59 | + | ||
60 | + params = {'query': f"{query}", | ||
61 | + 'x': f"{x}", | ||
62 | + 'y': f"{y}",} | ||
63 | + | ||
64 | + if radius != None: | ||
65 | + params['radius'] = f"{radius}" | ||
66 | + if rect != None: | ||
67 | + params['rect'] = f"{rect}" | ||
68 | + if page != None: | ||
69 | + params['page'] = f"{page}" | ||
70 | + if size != None: | ||
71 | + params['size'] = f"{params}" | ||
72 | + if sort != None: | ||
73 | + params['sort'] = f"{sort}" | ||
74 | + | ||
75 | + res = requests.get(self.URL_05, headers=self.headers, params=params) | ||
76 | + document = json.loads(res.text) | ||
77 | + return document | ||
78 | + | ||
79 | +# REST API 키 | ||
80 | +rest_api_key = "1c74642c092d28c438467486c366c6cf" | ||
81 | +kakao = KakaoLocalAPI(rest_api_key) | ||
82 | + | ||
83 | +## Set params | ||
84 | +query = "인덕원 닭갈비" #검색 키워드 | ||
85 | +x = 126.98083352703802 #내 위치 위도와 경도 | ||
86 | +y = 37.39403042340368 | ||
87 | +radius = 1 #반경 km 검색 | ||
88 | + | ||
89 | +## Request | ||
90 | +result_5 = kakao.search_keyword(query,x,y,radius) | ||
91 | + | ||
92 | + | ||
93 | +# + json파일 확인해보기 이후 데이터를 추출해야함 | ||
94 | +#json_string = json.dumps(result_5, indent=2) | ||
95 | +#print(json_string) | ||
96 | + | ||
97 | + | ||
98 | +#json파일 특정 키워드 추출 | ||
99 | +#추출할 리스트 place_name, place_url, x, y (x y는 위치임), 검색키워드, 선택 지역(위치) | ||
100 | +#from pprint import pprint | ||
101 | + | ||
102 | +same_name_list = [ x_ for x_ in result_5['meta']['same_name'].values()] | ||
103 | +keyword = "검색 키워드: " + same_name_list[0] | ||
104 | +selected_region= "검색 위치: " +same_name_list[2] | ||
105 | + | ||
106 | +total_count = {result_5['meta']['total_count']} #set은 파싱이 불가능하기 때문에 list나 튜플로 바꿔야함, list로 바꾼 후 인덱스를 활용하여 int로 바꾼 후 문자열과 더하기 위해 str로 형변환 | ||
107 | +total_count_list=list(total_count) | ||
108 | +total_count = "총 검색 개수: " + str(total_count_list[0]) | ||
109 | +#print(keyword) # 밑 코드에서 메제지들은 텔레그렘 봇으로 보내기!! | ||
110 | +#print(selected_region) | ||
111 | +#print(total_count) | ||
112 | + | ||
113 | +#print("----------") | ||
114 | + | ||
115 | +place_name_list = [ x_['place_name'] for x_ in result_5['documents']] | ||
116 | +#print(place_name_list) | ||
117 | + | ||
118 | +#print('------') | ||
119 | + | ||
120 | +phone_list = [ x_['phone'] for x_ in result_5['documents']] | ||
121 | +#print(phone_list) | ||
122 | + | ||
123 | +#print('------') | ||
124 | + | ||
125 | +place_url_list = [ x_['place_url'] for x_ in result_5['documents']] | ||
126 | + | ||
127 | +#print(place_url_list) | ||
128 | + | ||
129 | +#print('------') | ||
130 | + | ||
131 | +#print(x_list) 위치 시각화 할때 사용 | ||
132 | +x_list = [ x_['x'] for x_ in result_5['documents']] | ||
133 | +y_list = [ x_['y'] for x_ in result_5['documents']] | ||
134 | + | ||
135 | + | ||
136 | + | ||
137 | +#print(y_list) | ||
138 | +#print(x_list) | ||
139 | + | ||
140 | +#print('------') | ||
141 | + | ||
142 | +road_address_name_list = [ x_['road_address_name'] for x_ in result_5['documents']] | ||
143 | + | ||
144 | + | ||
145 | +#print(road_address_name_list) | ||
146 | + | ||
147 | +#print('------') | ||
148 | + | ||
149 | +resturant_info_list = [] | ||
150 | +total_count_num = str(total_count_list[0]) | ||
151 | +total_count_num = int(total_count_num) | ||
152 | +resturant_info = "" | ||
153 | +resturant_string = "관련 음식점 정보: " + '\n' | ||
154 | +resturant_location_string = "음식점의 x y좌표" + '\n' | ||
155 | + | ||
156 | +#프린트 결과를 리턴받기 위한 함수 | ||
157 | +#from io import StringIO | ||
158 | +def return_print(*message): | ||
159 | + io = StringIO() | ||
160 | + print(*message, file=io, end="") | ||
161 | + return io.getvalue() | ||
162 | + | ||
163 | +for i in range(0,10): #total_count_num가 너무 크면 인덱스 범위가 벗어나서 실행이 안됨, 임시로 10개까지만 | ||
164 | + resturant_info = [place_name_list[i] + " " +phone_list[i] + " " + road_address_name_list[i] + " " + place_url_list[i]] | ||
165 | + resturant_string += str(resturant_info) + "\n" + "\n" | ||
166 | + | ||
167 | +for i in range(0,10): #total_count_num가 너무 크면 인덱스 범위가 벗어나서 실행이 안됨, 임시로 10개까지만 | ||
168 | + resturant_location = [x_list[i] + ", " + y_list[i]] | ||
169 | + resturant_location_string += str(resturant_location) + "\n" | ||
170 | + | ||
171 | + | ||
172 | + | ||
173 | + | ||
174 | +########################### 날씨 크롤링 기능 ######################## | ||
175 | + | ||
176 | +def weather_info_crawling(): | ||
177 | + soup = BeautifulSoup(html.text, 'html.parser') | ||
178 | + data1 = soup.find('div', {'class': 'weather_box'}) | ||
179 | + | ||
180 | + find_address = data1.find('span', {'class':'btn_select'}).text | ||
181 | + find_address_info = ('현재 위치: '+find_address + "\n") | ||
182 | + | ||
183 | + find_currenttemp = data1.find('span',{'class': 'todaytemp'}).text | ||
184 | + find_currenttemp_info=('현재 온도: '+find_currenttemp+'℃'+ "\n") | ||
185 | + | ||
186 | + data2 = data1.findAll('dd') | ||
187 | + find_dust = data2[0].find('span', {'class':'num'}).text | ||
188 | + find_dust_info=('현재 미세먼지: '+find_dust + "\n") | ||
189 | + result = find_address_info + ' ' + find_currenttemp_info + ' ' + find_dust_info | ||
190 | + return result | ||
191 | + | ||
192 | + | ||
193 | +def find_currenttemp_num(): | ||
194 | + soup = BeautifulSoup(html.text, 'html.parser') | ||
195 | + data1 = soup.find('div', {'class': 'weather_box'}) | ||
196 | + | ||
197 | + find_currenttemp = data1.find('span',{'class': 'todaytemp'}).text | ||
198 | + find_currenttemp_num = int(find_currenttemp) | ||
199 | + result = find_currenttemp_num | ||
200 | + return result | ||
201 | + | ||
202 | + | ||
203 | + | ||
204 | +######################## 코로나 확진자 수 관련 뉴스 크롤링 기능 ########### | ||
205 | + | ||
206 | +def covid_num_crawling(): | ||
207 | + code = req.urlopen("https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=%ED%99%95%EC%A7%84%EC%9E%90") | ||
208 | + soup = BeautifulSoup(code, "html.parser") | ||
209 | + info_num = soup.select("div.status_today em") | ||
210 | + result = int(info_num[0].string) + int(info_num[1].string) | ||
211 | + return result | ||
212 | + | ||
213 | +def covid_news_crawling(): | ||
214 | + code = req.urlopen("https://search.naver.com/search.naver?where=news&sm=tab_jum&query=%EC%BD%94%EB%A1%9C%EB%82%98") | ||
215 | + soup = BeautifulSoup(code, "html.parser") | ||
216 | + title_list = soup.select("a.news_tit") | ||
217 | + output_result = "" | ||
218 | + for i in title_list: | ||
219 | + title = i.text | ||
220 | + news_url = i.attrs["href"] | ||
221 | + output_result += title + "\n" + news_url + "\n\n" | ||
222 | + if title_list.index(i) == 2: | ||
223 | + break | ||
224 | + return output_result | ||
225 | + | ||
226 | + | ||
227 | + | ||
228 | + | ||
229 | + | ||
230 | +#####텔레그램 관련 코드############################################## | ||
231 | +token = "1721885449:AAHDGMbjSJfhXxML6nfSCpfiU7SghpL_vOE" | ||
232 | +id = "1657858421" | ||
233 | +bot = telegram.Bot(token) | ||
234 | + | ||
235 | +updater = Updater(token=token, use_context=True) | ||
236 | +dispatcher = updater.dispatcher | ||
237 | +updater.start_polling() | ||
238 | + | ||
239 | +url="file:///C:/Users/user/Documents/project_opensw-chatbot/telegram_Messenger_Chatbot/index.html" | ||
240 | + | ||
241 | +#가능한 응답 리스트 목록 | ||
242 | +menual_message = '''사용가능한 기능 #(모해?) #(맛집) #(오늘 날씨) #(코로나 정보) #(기능) ''' | ||
243 | +menual_message_info = "#(모해?) #(맛집) #(오늘 날씨) #(코로나 정보) #(기능)" | ||
244 | +bot.sendMessage(chat_id=id, text=menual_message) | ||
245 | + | ||
246 | + | ||
247 | + | ||
248 | +#특정 단어 시 호출되는 메세지들 | ||
249 | +mohae_message = '''나 내일 입을 옷 고민 중 #(어떤 옷?)''' | ||
250 | +react_weather = '''오늘 날씨 봐봐''' | ||
251 | +news_message = '''관련 뉴스도 엄청 많이 보도되고 있더라,,, (#뉴스)''' | ||
252 | +worried_message = '''진세도 꼭 마스크 끼고 손 씻고 주의해!! (#웅웅 너도)''' | ||
253 | +react01_message = '''오키 ㅎㅎ''' | ||
254 | + | ||
255 | + | ||
256 | +### 챗봇 답장 코드 | ||
257 | +def handler(update, context): | ||
258 | + user_text = update.message.text # 사용자가 보낸 메세지를 user_text 변수에 저장합니다. | ||
259 | + | ||
260 | + # 모해? | ||
261 | + if ( "모해?" in user_text): | ||
262 | + bot.sendMessage(chat_id=id, text=mohae_message) | ||
263 | + | ||
264 | + elif (user_text == "어떤 옷?"): | ||
265 | + bot.send_message(chat_id=id, text="잠깐만 옷 좀..") | ||
266 | + #이미지를 디렉토리에서 한장씩 보냄 | ||
267 | + bot.send_photo(chat_id=id, photo=open(r'C:\Users\user\Documents\project_opensw-chatbot\telegram_Messenger_Chatbot\img\cloth1.jpg', 'rb')) ###절대 경로니까 수정하세요!!!!!! | ||
268 | + bot.send_photo(chat_id=id, photo=open(r'C:\Users\user\Documents\project_opensw-chatbot\telegram_Messenger_Chatbot\img\cloth2.jpg', 'rb')) | ||
269 | + bot.send_photo(chat_id=id, photo=open(r'C:\Users\user\Documents\project_opensw-chatbot\telegram_Messenger_Chatbot\img\cloth3.jpg', 'rb')) | ||
270 | + bot.send_message(chat_id=id, text="1~3 번 중에서 어떤게 더 남? (#1~3번)") | ||
271 | + | ||
272 | + elif ("1번" in user_text) or ("2번" in user_text) or ("3번" in user_text): ###1~3번이 들어오면 오케이 | ||
273 | + bot.send_message(chat_id=id, text="👌") | ||
274 | + bot.send_message(chat_id=id, text="낼 이거 입고 나가야지") | ||
275 | + bot.send_message(chat_id=id, text="진세 밥 먹었어?? #(응응 먹었어, 아직 안 먹었어)") | ||
276 | + | ||
277 | + elif (user_text == "응응 먹었어"): | ||
278 | + bot.send_message(chat_id=id, text="우왕 뭐 먹었어? #(닭갈비 먹었어)") | ||
279 | + elif (user_text == "닭갈비 먹었어"): | ||
280 | + bot.send_message(chat_id=id, text="오,, 대박 이 근처에 닭갈비 맛집 있다던데 가봤어? #맛집?") #################네이버 지도 연결해서 위치 뜨게 하기!! 혹은 크롤링해서 정보 수집 ㄱ | ||
281 | + | ||
282 | + # 맛집 키워드 답장 | ||
283 | + elif ("맛집" in user_text): | ||
284 | + bot.sendMessage(chat_id=id, text=resturant_string) | ||
285 | + #bot.sendMessage(chat_id=id, text=resturant_location_string) 음식점 xy좌표 반환할 거임 | ||
286 | + bot.sendMessage(chat_id=id, text = webbrowser.open(url)) #############################webpage 내 위치 기바ㄴ | ||
287 | + | ||
288 | + | ||
289 | + elif ("고마워" in user_text): | ||
290 | + bot.send_message(chat_id=id, text="웅 ㅎㅎ") | ||
291 | + | ||
292 | + | ||
293 | + elif (user_text == "아직 안 먹었어"): | ||
294 | + bot.send_message(chat_id=id, text="헐헐 어쩌다?, 같이 뭐라도 먹을래? #(그래 같이 먹자)") | ||
295 | + elif (user_text == "그래 같이 먹자"): | ||
296 | + bot.send_message(chat_id=id, text="웅웅 집앞으로 나와") | ||
297 | + ########################################################################### 이어서 작업 ㄱㄱㄱ | ||
298 | + | ||
299 | + # 오늘 날씨 답장 | ||
300 | + elif ("오늘 날씨" in user_text): | ||
301 | + weather_info = weather_info_crawling() | ||
302 | + bot.send_message(chat_id=id, text= weather_info) | ||
303 | + bot.sendMessage(chat_id=id, text=react_weather) | ||
304 | + | ||
305 | + if (find_currenttemp_num()>=27): | ||
306 | + bot.send_message(chat_id=id, text="와 미친,, 27도가 넘는데? 낼 무조건 시원하게 얇고 통풍 잘 되는 거 입어, 쪄 죽겠다 ㅋㅋㅋㅋ") | ||
307 | + elif (find_currenttemp_num()>=23): | ||
308 | + bot.send_message(chat_id=id, text="날씨가 23도 이상이네,,, ㅜㅜ 반팔에 반바지 정도 입으면 충분할 듯!") | ||
309 | + elif (find_currenttemp_num()>=20): | ||
310 | + bot.send_message(chat_id=id, text="20도 이상이면 밤엔 많이 쌀쌀할 듯 ㅠㅠ,, 진세 감기 조심해!") | ||
311 | + elif (find_currenttemp_num()>=15): | ||
312 | + bot.send_message(chat_id=id, text="헐 15도 이상이면 가을 날씨네,,,따뜻하게 입고가!!") | ||
313 | + else: | ||
314 | + update.message.reply_text("꽁꽁 싸매고 나가") | ||
315 | + | ||
316 | + | ||
317 | + # 오늘 확진자 수 답장 | ||
318 | + elif ("코로나 정보" in user_text): | ||
319 | + bot.sendMessage(chat_id=id, text= "진세 진세, 오늘 코로나 확진자 수 몇명인지 알아?? 완전 무섭다,,, ") | ||
320 | + covid_num = covid_num_crawling() | ||
321 | + bot.send_message(chat_id=id, text="오늘 확진자 수 : {} 명이래 ㅎㄷㄷ..".format(covid_num)) | ||
322 | + bot.sendMessage(chat_id=id, text=news_message) | ||
323 | + | ||
324 | + covid_news = covid_news_crawling() | ||
325 | + bot.send_message(chat_id=id, text=covid_news) | ||
326 | + bot.sendMessage(chat_id=id, text=worried_message) | ||
327 | + elif (user_text == "웅웅 너도"): | ||
328 | + bot.sendMessage(chat_id=id, text=react01_message) | ||
329 | + | ||
330 | + elif (user_text == "기능"): | ||
331 | + bot.sendMessage(chat_id=id, text=menual_message_info) | ||
332 | + | ||
333 | + | ||
334 | + else: | ||
335 | + update.message.reply_text("ㅎㅎ") | ||
336 | + | ||
337 | +echo_handler = MessageHandler(Filters.text, handler) | ||
338 | +dispatcher.add_handler(echo_handler) | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
-
Please register or login to post a comment