共闘ことばRPG コトハマン

#はじめに
皆さんはコトダマンというゲームを御存じでしょうか

コトダマンとはiOS/Android向けに配信されている共闘ことばRPGゲームのことです

ルールとしては空いた枠に文字を埋めていきコンボを組んで敵を倒す、という感じのものになっています

![cotodaman.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269896/ba3d9133-c6a9-6e2e-478a-485a5f280ecc.jpeg)

共闘ことばRPGコトダマン好評配信中！！

iOS
https://itunes.apple.com/jp/app/id1298368256
Android
https://play.google.com/store/apps/details?id=com.sega.Kotodaman

#なにをするのか
さて、媚を売り切ったところで本題に入っていこうと思います

今回やっていくのはCOTOHA APIを使ってコトダマンのようなものを作ってみようというものです

(コトダマンのようなものといっても単語ごとに分けてコンボ数を数えるだけですが)

#プログラム本体
<details><summary>コトハマン.py</summary><div>

```python:cotohaman.py
# -*- coding: utf-8 -*-
import os
import urllib.request
import json

class CotohaApi:
    def __init__(self,client_id, client_secret, developer_api_base_url, access_token_publish_url):
        self.client_id = client_id
        self.client_secret = client_secret
        self.developer_api_base_url = developer_api_base_url
        self.access_token_publish_url = access_token_publish_url
        self.getAccessToken()
        
    def getAccessToken(self):
        url = self.access_token_publish_url
        headers={
            "Content-Type": "application/json;charset=UTF-8"
        }
        data = {
            "grantType": "client_credentials",
            "clientId": self.client_id,
            "clientSecret": self.client_secret
        }
        data = json.dumps(data).encode()
        req = urllib.request.Request(url, data, headers)
        res = urllib.request.urlopen(req)
        res_body = res.read()
        res_body = json.loads(res_body)
        self.access_token = res_body["access_token"]
    def callCotohaApiCommon(self, url, data):
        headers= {
            "Authorization": "Bearer " + self.access_token,
            "Content-type":"application/json;charset=UTF-8",
        }
        data = json.dumps(data).encode()
        req = urllib.request.Request(url, data, headers)
        
        CONNECTION_RETRY_COUNT = 2
        
        for counter in range(1, CONNECTION_RETRY_COUNT + 1):
            try:

                res = urllib.request.urlopen(req)
                break
            except urllib.request.HTTPError as e:
                if e.code == 401:
                    print("Please retry.")
                    self.access_token = self.getAccessToken()
                    headers["Authorization"] = "Bearer " + self.access_token
                    req = urllib.request.Request(url, data, headers)
                else:
                    print ("<Error> " + e.reason)
                    return ""
            except Exception as e:
                print(e)
                return ""
        
        res_body = res.read()    
        res_body = json.loads(res_body)
        return res_body["result"][0]["tokens"]
    
    def cotodama(self,coto):
        url = self.developer_api_base_url + "nlp/v1/parse"
        data = {
            "sentence": coto
        }
        coto = self.callCotohaApiCommon(url, data)
        if len(coto) == 1 and coto[0]["pos"] == "名詞":
            return coto
        return ""
    
    def cut(self):
        word_lis = []
        result_lis = []
        coto = input("文字を入力してください(7文字)")
        for i in range(0,6,1):
            for j in range(7,0,-1):
                if i+1 == j: break
                word_lis.append(coto[i:j])
        for tex in word_lis:
            if tex[0] == "ん":
                continue
            result_lis.append(self.cotodama(tex))
        result_lis = list(filter(lambda a: a!="",result_lis))
        return result_lis
    
if __name__ == "__main__":
    f = open('token.txt')
    lines = f.readlines()  
    for i in range(len(lines)):
        lines[i] = lines[i].replace("\n",'')
    inst = CotohaApi(lines[0], lines[1], lines[2], lines[3])
    result = inst.cut()
    for res in result:
        print(res[0]["lemma"])
    print("{}COMBO!".format(len(result)))
```

</div><details>

#少しだけ解説
序盤のAPI設定and呼び出し部分は
↓この記事か[公式リファレンス](https://api.ce-cotoha.com/contents/reference/apireference.html#similarity)を読んでください
[「メントスと囲碁の思い出」をCOTOHAさんに要約してもらった結果。COTOHA最速チュートリアル付き](https://qiita.com/youwht/items/16e67f4ada666e679875)

このテンプレートに与えるデータを加工する部分の解説をします

七文字のひらがなを入力として受け取り、左から長い順に入力を分割してリストに格納しています

その後分割した単語ごとにAPIに投げていくのですが、"ん"が単語の最初にいるとなぜか名詞判定されてしまうので取り除いています

そして帰ってきた結果が分割されず、単語のみでかつ名詞であった場合に結果のリストに格納しています

最後に、それを順に出力して終了です

#結果
```python
入力>>さいかくあいま
才覚
さいか
際
いかくあ
威嚇
いか
くあいま
くあい
くあ
合間
あい
今
12COMBO!
```
適当に画像検索から見つけてきた単語を入れましたが、人間には理解できない単語も出てきてしまっていますね

#まとめ
今回作ったものの問題点としては
・複数回APIコールしなければいけない
・ちょっと人間には理解できない単語が出てきてしまう

修正案があればコメントいただけると助かります

#さいごに
この記事は[【Qiita x COTOHA APIプレゼント企画】](https://zine.qiita.com/event/collaboration-cotoha-api/?utm_source=qiita&utm_medium=top_banner)に参加しています

~~いいねください~~

#参考ページ
・[COTOHA API](https://api.ce-cotoha.com/)
・[公式リファレンス](https://api.ce-cotoha.com/contents/reference/apireference.html#similarity)
・[「メントスと囲碁の思い出」をCOTOHAさんに要約してもらった結果。COTOHA最速チュートリアル付き](https://qiita.com/youwht/items/16e67f4ada666e679875)
・[自然言語処理を簡単に扱えると噂のCOTOHA APIをPythonで使ってみた](https://qiita.com/gossy5454/items/83072418fb0c5f3e269f)