포켓몬 이름을 입력하면 다양한 데이터를 반환하는 bot를 변경해 보았다 (서장)

개요

이런 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.py
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)
        )


입력

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겐/

좋은 웹페이지 즐겨찾기