2018年12月13日木曜日

【C#+Unity+Python】ストリーミング放送上で行う多人数参加型チャットボット

  
【言語】C#(Visual Studio2017)、C#(Unity)、Python3.6(VisualStudioCode)

【開発期間】2017年10月頃と2018年9月~10月頃

【作ろうと思ったきっかけ】
  ストリーミング配信サイトとチャットボットを組み合わせれば、コンテンツを24時間365日自動生成することが可能なんじゃないかと思った!

【制作が途切れた理由】
 製作中に「ビットコインのbot作らない?」と誘われ、そっちの方も面白そうだと思ったので中断。


【製作過程】(長いので分割。↓をクリックで続きが表示されます)


【Python】パチンコ台データのスクレイピングアプリ

・言語 python3.6

・開発環境  Visual Studio Code

・製作期間 2018/11/20頃~  (現在進捗率70%)

・概要 全国のパチンコ店がWeb上に公開しているパチンコ台の出玉データの収集を自動的に行うGUIアプリ。

・作ろうと思ったきっかけ

 スクレイピングはHTML/CSS/javascriptを読解することが必要となるため、企業の書いたソースコードを読むことでフロントエンドプログラミングの勉強にも役立つと考えました。

 何をスクレイピングするかについては、パチンコ屋さんがWeb上にパチンコ台のデータを公開しているため、それを取得して曜日ごとや日付ごとの統計を取れるアプリを作ろうと思いました。また、パチンコ屋さんは天気によっても出玉を調整しているのではないかと考え、天気情報取得サービスのAPIを叩いて毎日の天気情報を保存し、天気別の統計を取得できるようにしました。


↓コードの一部(なので動かないです)トップURLから各パチンコ台のURLを取得してるだけ。
  

from urllib.request import urlopen
from bs4 import BeautifulSoup

class Goluck_getMachineUrlList:
    """
    各台のURLリストを返すだけのクラス。
    pachinko_url_list,slot_url_list = Goluck_getMachineUrlList(hall.url).run() というように関数的に実行して下さい。
    メソッドは上から順に実行されるような順番で書いています。
    """

    def __init__(self,url):
        self.url = url

    def run(self):
        pachinko_url_list = self._get_pachinko_url_list()
        slot_url_list = self._get_slot_url_list()

        return pachinko_url_list,slot_url_list
    
    def _get_pachinko_url_list(self):
        pachinko_url = self.url + "all_list?ps=P"
        soup = self._openURL(pachinko_url)
        machine_num_list = self._get_machineUrlList(soup)
        return machine_num_list

    def _get_slot_url_list(self):
        slot_url = self.url + "all_list?ps=S"
        soup = self._openURL(slot_url)
        machine_num_list = self._get_machineUrlList(soup)
        return machine_num_list

    def _openURL(self,url):
        html = urlopen(url).read()
        soup = BeautifulSoup(html, 'html.parser')
        return soup

    def _get_machineUrlList(self,soup:BeautifulSoup):
        url_list = []
        #find_allだとリスト型だから一個の時はfindで。
        hlefs = soup.find(class_="sorter tablesorter").find_all("a")
        for hlef in hlefs:
            url_list.append(hlef.get("href"))
        return url_list


if __name__ == "__main__":

    from hallList import Hall
    hall = Hall()
    pachinko_url_list,slot_url_list = Goluck_getMachineUrlList(hall.url).run()
    print(len(pachinko_url_list))
    print(len(slot_url_list))


・苦労したこと

  このアプリに限らず、作っている最中に「もっと良い機能をつけるべきじゃないか? もっと別のコードの書き方があるんじゃないか?」と思う度にコードに大きな修正が必要になることがありました。そういう時のために読み直しやすく書き直しやすいコードを書くべきだと改めて実感しました。

  同じサイトであっても店によって表示しているデータが違っていたため、また、店休している場合もあるため、例外処理を複数書くことにしました。
  店によって取得できるデータが違うので、保存時に画一の形式にできないため、JSON形式を用いて取得できるデータ全てを保存することにしました。このため、JSON形式のデータを読み込んで、結果を表示するためのcsv形式で必要なデータを纏め直すプログラムも書く必要が出てきました。
  出玉グラフは初めは画像を保存して画像を開いて線の位置を取得して現在の出玉を確認しようと思っていましたが、javascriptでグラフを生成していたため、難しくなく取得することができました。