概要
お久しぶりです。10月は何も書かなかったんで、ブログは2016年9月を最終更新としてネットの海に彷徨い続けるのかと思うとちょっと更新しなきゃって気分になりました。近況ですが、後期になってから大学の事に専念してます。というか履修の組み方がちょっと悪かった。終わるころには夜だしどこにも行けん。帰って軽く課題をやって寝る。そんな感じです。
なので、生存報告がてら、前に思いつきで作った、現在プレイしているゲーム等をTwitterで呟いてくれる簡素なソフト「I’m playing!」を作った話をします。
例えばSteamやOrigin、コンシューマ機で言えばPS3とか4とかXboxシリーズのようなものは、自分が現在プレイしているゲームがフレンドに分かるようになっています。しかしながら、そういった類には当てはまらない(=独立したランチャーで起動するゲームとか)タイプのPCゲームは、友人に通知されることはありません。そういったシチュエーションの時でも、自分が今何を遊んでいるかを周りに通知したいときに「I’m playing!」が使えます。また、Steamゲーをやっていて、Steamのフレンド以外にも通知したいといったようなときに、わざわざ手動で呟かなくても良いです。
実装方法
上のリンク(github)のREADMEを引用します。
tasklistさんにお願いしてその結果をチェック、task.txtにあらかじめ登録してあるプロセスのイメージ名(以下プロセス名)と同じものがあれば、 それを1時間周期で呟きます。twitterのアクセストークンとかはsecret.jsonに入れておく。 使用言語はpython3で、外部のライブラリはtwitter( https://github.com/sixohsix/twitter )を使用。
task.txtに検出したいプロセス名、name.txtに呟きたい内容を入れておきます。
task.txtに入れるプロセス名は、xx.exeだったらxxの部分です。タスクマネージャからプロセスのプロパティを見て確認してください。 (ex:Grand Theft Auto Vだったら、GTA5.exeとなるので、task.txtにはGTA5と書き込む)
name.txtに入れる内容は、task.txtに入力したプロセス名と順序が対応づけられるようにしてください。 私がアップロードしたtask.txtとname.txtを見るのが手っ取り早いでしょう。 (検出したいプロセス名はplaySNOW、それに対応して呟きたいのは”I’m playing SNOW(n時間)” なので、name.txtにはSNOWと登録してあります。特にプロセス名から呟く内容を変える必要のないものでも入力しておかなければなりません。)
という感じです。ちなみに登録するプロセスは別にゲームじゃなくてもいいです。作業用のソフトを立ち上げていたら「作業中!」と呟かせるのもいいかもしれないですね。
以下がmain.py。
# coding: Shift_JIS import re import json import codecs import string from twitter import * from datetime import datetime from datetime import timedelta from subprocess import Popen, PIPE #監視周期 INTERVAL = timedelta(seconds=3600); TASKFILE = "./task.txt"; NAMEFILE = "./name.txt"; #data.txtから起動時につぶやきたいゲームのタスク名を取得 def gamelist(datapass): gamenames = []; data = open(datapass); for s in data: s = s.replace("\n", ""); gamenames.append(s); return gamenames; def main(): #jsonをロードしてtwitterに接続 with open("secret.json") as f: secretjson = json.load(f); t = Twitter(auth=OAuth(secretjson["access_token"], secretjson["access_token_secret"], secretjson["consumer_key"], secretjson["consumer_secret"])); cmd = "tasklist"; previous = datetime.now(); tasks = gamelist(TASKFILE); games = gamelist(NAMEFILE); hour = [-1] * len(tasks); first = True; #起動時に実行する用 while True: if datetime.now() - previous > INTERVAL or first: first = False; previous = datetime.now(); #print("done"); for i in range(0, len(tasks)): check = False; p1 = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE); for line in p1.stdout.readlines(): if re.search(tasks[i], line.decode("shift-jis")) and not check : hour[i] = hour[i] + 1; tweet = "I'm playing " + games[i] + " (" + str(hour[i]) + "時間目)"; #print(tweet); check = True; t.statuses.update(status=tweet); if not check : hour[i] = -1; if __name__ == "__main__": main();
INTERVALにという変数で監視周期を決定します。timedeltaは日付や時間の減算などを行うときに便利です。main内では、最初にtwitterに接続、各txtファイルをロードし、配列を生成します。tasklistの結果との照合及び呟きは、この配列を用いて行われます。
後は単純です。時間を監視し、一定周期が来たらtasklistコマンドをコマンドプロンプトに渡して結果を得て、呟いたり呟かなかったりします。ここら辺もすんなりいくかと思いましたが、そうか、開発もwin機でやったから文字コードがどうたら~で割と困った記憶があります。色々試した挙句、とりあえずゴリ押しでShift-JISに統一しました。今でも文字コードと正規表現周りはパッと脳から引き出せず、修行が足りないと感じます。頑張ります。
実演
「I’m playing!」は立ち上がるととりあえずその時点で一回プロセスをチェックします。その時に登録しておいたプロセス名が見つかると以下のような感じで呟きます。
I’m playing STEINS;GATE 0 (0時間目)
— パチ公の雑ブログ (@pachi_tec) 2016年11月20日
さらに一時間遊んでいるとこんな感じ。
I’m playing STEINS;GATE 0 (1時間目)
— パチ公の雑ブログ (@pachi_tec) 2016年11月20日
余談
記事を書くに当たってコードを見直してみて、「これtime.sleep(3600)じゃだめなん?」って思いました。あと、ツイートのサンプルを取るために1時間ほどゲームしてましたが、徹夜明けの早朝だったのでまあまあ頭が痛い。モノやコード書いたり遊んだりっていうのはやっぱり健康体の時がいいですね。あとシュタインズゲート面白いですね。