포켓몬 이름을 입력하면 다양한 데이터를 반환하는 bot를 변경해 보았다 (서장)
15845 단어 경 6포켓몬파이썬PostgreSQLlinebot
개요 이런 LINEbot 있으면, 포켓몬의 대전중, 종족치나 특성을 칸닝 할 수 있어 편리하다~라고 생각해 작성하려고 생각한 것이 계기입니다.
(반년~1년 가까이 포켓몬에는 접하고 있지 않습니다만)
또, 동지 쪽이 qiita로 도입 절차를 공개해 주셨으므로, 이번은 선인의 지혜를 빌려, 기능이나 사양을 조금만 개변시켜 보았습니다. [github]
(하지만 전혀 큰 개변이 아니므로 나쁘지 않아 ...)
변경 내용
하나의 이름에서 관련 포켓몬 데이터를 여러 개 출력합니다.
포켓몬 중에는 리전 폼(아종)을 가지고 있거나, 크기별로 다른 파라미터를 가지고 있거나, 메가 싱커라고 불리는 진화 형태를 가지고 있거나, 다양한 종류가 존재합니다.
예를 들어 버킷이라고 하는 포켓몬은 다음의 4종류가 존재합니다.
no | name | type1 | type2 | ability1 | ability2 | hiddenability | hp | atk | def | spatk | spdef | speed | total
-----+----------------------------+----------+-------+------------+------------+---------------+----+-----+-----+-------+-------+-------+-------
710 | バケッチャ(ふつうのサイズ) | ゴースト | くさ | ものひろい | おみとおし | ふみん | 49 | 66 | 70 | 44 | 55 | 51 | 335
710 | バケッチャ(ちいさいサイズ) | ゴースト | くさ | ものひろい | おみとおし | ふみん | 44 | 66 | 70 | 44 | 55 | 56 | 335
710 | バケッチャ(おおきいサイズ) | ゴースト | くさ | ものひろい | おみとおし | ふみん | 54 | 66 | 70 | 44 | 55 | 46 | 335
710 | バケッチャ(とくだいサイズ) | ゴースト | くさ | ものひろい | おみとおし | ふみん | 59 | 66 | 70 | 44 | 55 | 41 | 335
(4 行)
이 포켓몬을 조사하기 위해 스마트 폰에서 バケッチャ(ふつうのサイズ)
그리고 문자를 치는 것은 조금 번거롭습니다.
가능하다면, 버킷을 입력하면 4 종류의 버킷에 관한 정보가 모두 열거 된 것이 더 편리하다고 생각했습니다.
그래서 main.py의 기존 처리를 수정했습니다.
【기존의 처리】
LINE 사용자가 포켓몬 이름을 입력
↓
main.py의 handle_message
에서 메시지 수신get_response_message
함수는 테이블에서 해당 포켓몬 이름을 가진 레코드를 가져오고 호출자에게 반환합니다. 그런 다음 레코드의 각 열을 사용자에게 반환합니다.
【수정 후의 처리】
LINE 사용자가 포켓몬 이름을 입력
↓
main.py의 handle_message
에서 메시지 수신get_response_name
함수에 의해 table로부터 해당의 포켓몬명, 또는 괄호 첨부의 포켓몬명, 또는 어두에 메가라고 이름이 붙는 포켓몬명을 복수 취득해, 호출원에게 돌려준다.
그런 다음 반환 값으로받은 포켓몬 이름을 get_response_message
함수에 인수로 전달합니다. get_response_message
함수는 where 절에 전달 된 포켓몬 이름을 지정하여 테이블에서 레코드의 각 열을 가져 와서 호출자에게 반환합니다. ... 같은 상태입니다.
주요 기능과 처리는 다음 코드입니다.
전량은 github에서 확인하실 수 있으면 다행입니다.
main.pydef get_response_name(mes_from):
with get_connection() as conn:
with conn.cursor(cursor_factory=DictCursor) as cur:
cur.execute("SELECT name FROM poke_stat \
WHERE name = '{0}' or name LIKE '{0}(%' or name LIKE 'メガ{0}%'".format(mes_from))
rows = cur.fetchall()
return rows
def get_response_message(mes_from):
with get_connection() as conn:
with conn.cursor(cursor_factory=DictCursor) as cur:
cur.execute("SELECT * FROM poke_stat WHERE name = '{}'".format(mes_from))
rows = cur.fetchall()
return rows
def handle_message(event):
# グローバル変数の初期化
reply_message = ""
# 入力された名前に完全一致・部分一致するname要素を取得する。
name_rows = get_response_name(event.message.text)
# webhook検証対策
if event.reply_token == "00000000000000000000000000000000":
return
# テキストチェック
if len(name_rows) == 0:
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text="そのようなポケモンは存在しません")
)
else:
# 取得したname要素の行を取得し、返す。
for i in range(len(name_rows)):
val_rows = get_response_message(*name_rows[i])
r = val_rows[0]
url_no = ('{0:04d}'.format(r[0]))
reply_message += f'{r[1]}🔻\n\n'\
f'全国図鑑No.{r[0]}\n'\
f'タイプ1 {r[2]}\n'\
f'タイプ2 {r[3] if r[3] else "なし"}\n'\
f'特性1 {r[4]}\n'\
f'特性2 {r[5] if r[5] else "なし"}\n'\
f'隠れ特性 {r[6] if r[6] else "なし"}\n'\
f'H {r[7]}\n'\
f'A {r[8]}\n'\
f'B {r[9]}\n'\
f'C {r[10]}\n'\
f'D {r[11]}\n'\
f'S {r[12]}\n'\
f'T {r[13]}\n\n'\
if i == (len(name_rows)-1):
reply_message += f'https://swsh.pokedb.tokyo/pokemon/show/{url_no}-00?season=15&rule=0'\
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=reply_message)
)
입력
PostgresSQL에 포켓몬 데이터베이스가 될 CSV 파일을 가져옵니다.
이번에는 이 사이트 에서 공개되고 있는 현시점에서 등장하고 있는 모든 포켓몬의 데이터를 망라한 csv 파일을 이용하였습니다.
기능
이하, 실제로 문자를 박았을 때의 거동입니다.
이름을 입력하면 DB에서 대상의 name을 참조하여 전국 도감, 타입, 그 외 각종 파라미터를 돌려줍니다.
방금 화제에 오르고 있던 양동이도,
이렇게 취득할 수 있었습니다.
추가 개선
앞으로는 bs4로 웹 스크래핑을 사용하여
그 포켓몬의 사용률이나 사용하는 기술의 랭킹 등을 출력할 수 있도록 하고 싶습니다.
이미 스크래핑 로직이 완성되었기 때문에
그리고 UX/UI 부분을 개선하고, 예를 들어 LINE의 회전 목마 버튼을 사용하여
옆으로 슬라이딩하면서 볼 수 있도록 하거나
일본어 표기로도 대응할 수 있도록 개변한다고 하는 곳입니다.
끝에
이번에는 파이썬이라기보다 postgres의 조작이 메인이었습니다.
원한다면 LINE에 추가해보십시오.
htps // t. 코/HYTztWPQ유? 아 mp=1
참고로 한 사이트
htps : // 코 m / 타카 요시 _ 마카베 / MS / 에 16947fb6 836 6 7
htps // 리카포케. 코 m/포케몬_다타 8겐/
Reference
이 문제에 관하여(포켓몬 이름을 입력하면 다양한 데이터를 반환하는 bot를 변경해 보았다 (서장)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Square_y/items/67eb2fd582c1db0964da
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
no | name | type1 | type2 | ability1 | ability2 | hiddenability | hp | atk | def | spatk | spdef | speed | total
-----+----------------------------+----------+-------+------------+------------+---------------+----+-----+-----+-------+-------+-------+-------
710 | バケッチャ(ふつうのサイズ) | ゴースト | くさ | ものひろい | おみとおし | ふみん | 49 | 66 | 70 | 44 | 55 | 51 | 335
710 | バケッチャ(ちいさいサイズ) | ゴースト | くさ | ものひろい | おみとおし | ふみん | 44 | 66 | 70 | 44 | 55 | 56 | 335
710 | バケッチャ(おおきいサイズ) | ゴースト | くさ | ものひろい | おみとおし | ふみん | 54 | 66 | 70 | 44 | 55 | 46 | 335
710 | バケッチャ(とくだいサイズ) | ゴースト | くさ | ものひろい | おみとおし | ふみん | 59 | 66 | 70 | 44 | 55 | 41 | 335
(4 行)
def get_response_name(mes_from):
with get_connection() as conn:
with conn.cursor(cursor_factory=DictCursor) as cur:
cur.execute("SELECT name FROM poke_stat \
WHERE name = '{0}' or name LIKE '{0}(%' or name LIKE 'メガ{0}%'".format(mes_from))
rows = cur.fetchall()
return rows
def get_response_message(mes_from):
with get_connection() as conn:
with conn.cursor(cursor_factory=DictCursor) as cur:
cur.execute("SELECT * FROM poke_stat WHERE name = '{}'".format(mes_from))
rows = cur.fetchall()
return rows
def handle_message(event):
# グローバル変数の初期化
reply_message = ""
# 入力された名前に完全一致・部分一致するname要素を取得する。
name_rows = get_response_name(event.message.text)
# webhook検証対策
if event.reply_token == "00000000000000000000000000000000":
return
# テキストチェック
if len(name_rows) == 0:
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text="そのようなポケモンは存在しません")
)
else:
# 取得したname要素の行を取得し、返す。
for i in range(len(name_rows)):
val_rows = get_response_message(*name_rows[i])
r = val_rows[0]
url_no = ('{0:04d}'.format(r[0]))
reply_message += f'{r[1]}🔻\n\n'\
f'全国図鑑No.{r[0]}\n'\
f'タイプ1 {r[2]}\n'\
f'タイプ2 {r[3] if r[3] else "なし"}\n'\
f'特性1 {r[4]}\n'\
f'特性2 {r[5] if r[5] else "なし"}\n'\
f'隠れ特性 {r[6] if r[6] else "なし"}\n'\
f'H {r[7]}\n'\
f'A {r[8]}\n'\
f'B {r[9]}\n'\
f'C {r[10]}\n'\
f'D {r[11]}\n'\
f'S {r[12]}\n'\
f'T {r[13]}\n\n'\
if i == (len(name_rows)-1):
reply_message += f'https://swsh.pokedb.tokyo/pokemon/show/{url_no}-00?season=15&rule=0'\
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=reply_message)
)
Reference
이 문제에 관하여(포켓몬 이름을 입력하면 다양한 데이터를 반환하는 bot를 변경해 보았다 (서장)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Square_y/items/67eb2fd582c1db0964da텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)