반복적으로 같은 요청을 하는 (도배)를 막는 기능을 추가하겠습니다.
kakao auto_reply에서 제공하는 user_key를 이용하겠습니다.
user_key는 옐로우 아이디 마다 부여되는 고유 키값입니다.
처음에는 user_key값을 이용하여 반복적으로 동일한 요청을 해올 경우 딜레이를 주는 방법을 사용하려고 했지만
구현할 방법을 모르겠어서...
직전에 요청한 유저와 다음 요청해온 유저가 같을 경우 함수를 실행하지 않고 리턴하는 방법을 사용하겠습니다.
이 경우 다른 유저가 요청해오지 않는 이상 한 유저가 연속으로 요청을 할 수가 없게 되죠.
도배로 고통받는 개발자...
모든 요청(버튼)에 대해서 적용하는 방법과 각각의 요청(버튼)에 적용하는 방법이 있습니다.
모든 요청(버튼)에 적용하게 되면 한 요청을 했을 때 바로 다른 요청을 할 수가 없으므로
각각에 요청에 적용하는 방법을 사용하겠습니다.
그러기 위해서 class 를 사용하겠습니다.
코드 작성하기
적용된 전체 코드 : https://github.com/M4ndU/inhun_kakao_chat_bot_2/blob/master/views.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class user_chk(): def __init__(self): self.pre_key = "" #이전 user_key값 self.now_key = "" #현재 user_key값 def check(self, key): self.now_key = key # now_key값에 현재 user_key값 대입 if self.pre_key == self.now_key : # 비교 하여 같으면 1을 반환 passcode = 1 else : self.pre_key = self.now_key # 다를 경우 pre_key값에 now_key값을 덮어쓰고 0 반환 passcode = 0 return passcode | cs |
바로 다음 코드들을 작성하여 값 초기화 설정을 해 둡니다.
필요한 개수 만큼 작성합니다.
1 2 3 4 | u0 = user_chk() u1 = user_chk() | cs |
이렇게 하면, u0.check(user_key)를 실행하게 될 경우
이전 user_key값(=pre_key)과 비교하여 같으면 1 반환, 다르면 pre_key에 저장하고 0을 반환합니다.
u0, u1각각 독립적으로 사용되기 때문에 u0.check("dd")를 했다고 해서 u1.pre_key에 dd가 드러가지 않는 것이죠.
이를 통해 각각 요청(버튼)에 적용하여 사용할 수 있습니다.
이제 user_key값을 가져와 봅시다.
1 2 3 4 | ... datacontent = received_json_data['content'] user_key = received_json_data['user_key'] | cs |
기존 작성했던 datacontent = received_json_data['content'] 바로 밑에 작성해 줍니다.
user_key값도 불러왔으니 이제 각 분기마다 적용해줍니다.
https://github.com/M4ndU/inhun_kakao_chat_bot_2/blob/master/views.py
92~104
92 93 94 95 96 97 98 99 100 101 102 103 104 | if datacontent == '오늘 급식': if u0.check(user_key): return ret_proc(PlzStopIt) dt = datetime.datetime.today() diet = get_meal(dt) return ret_proc(diet) elif datacontent == '내일 급식': if u1.check(user_key): return ret_proc(PlzStopIt) dt = datetime.datetime.today() + datetime.timedelta(days=1) diet = get_meal(dt) return ret_proc(diet) | cs |
if u0.check(user_key):
return ret_proc(PlzStopIt)
를 통해서 u0.pre_key = u0.now_key가 되어 1을 반환하게 되면
조건이 True가 되어 밑에 작업을 진행하지 않고 바로 문자열을 바로 반환합니다.
그럴려면 PlzStopIt에 문자열을 저장해주어야 겠죠?
'Project > Programming' 카테고리의 다른 글
NYPC 2019 예선 문제 풀이 (2) | 2019.08.16 |
---|---|
[HTML/PHP] reCAPTCHA v3 적용하기 (0) | 2018.12.28 |
[Python] Python으로 디스코드 봇 만들기 (4) - 맴버 관련 기능 추가하기 (5) | 2018.03.30 |
[Python] Python으로 카카오톡 봇 만들기 (2) - 급식 파서 활용하기 (14) | 2018.02.22 |
[Python] Python으로 카카오톡 봇 만들기 (1) - 봇 생성부터 테스트까지 (25) | 2018.02.21 |