まえがき
Steam のフレンドと一緒に遊ぶとき、
僕 「〇〇 やろうよ」
A 「いいよー」
B 「あ、それ持ってない、×× は?」
A 「それ俺持ってないわ、△△ にしない?」
僕 「OK」
B 「りょうかい」
みたいな会話をたまにします。
いや買えばいいんじゃん?、って思うかもですが、毎回買ってたらお金なくなっちゃうので、、、
お互いが持ってるゲームを突合させて、同じゲームがあったら教えてくれる仕組みを作ってみました。
インプットした要件
- Steam API を用いる
- 自分と、指定したフレンドが持っているアプリ (ゲーム) を取得し、同じアプリがあったら名称と ID を出力する
- フレンドリストは API で取得し、コンソール上にフレンド名を表示して選択できる
- フレンドは複数選択できるようにし、複数指定した場合は全員が持っている必要がある
最終的なコード
import requests
import inquirer
# Steam APIキー
api_key = 'YOUR_API_KEY'
# 自分のSteam ID
my_steam_id = 'YOUR_STEAM_ID'
# Steam APIリクエストを送信してデータを取得する関数
def send_steam_request(endpoint, params={}):
url = f'http://api.steampowered.com/{endpoint}/?key={api_key}&format=json'
for key, value in params.items():
url += f'&{key}={value}'
response = requests.get(url)
data = response.json()
return data
# フレンドの一覧を取得
def get_friends_list(steam_id):
params = {
'steamid': steam_id,
'relationship': 'friend'
}
data = send_steam_request('ISteamUser/GetFriendList/v0001', params)
friends = data.get('friendslist', {}).get('friends', [])
return friends
# フレンドの名前を取得
def get_friend_name(steam_id):
params = {
'steamids': steam_id
}
data = send_steam_request('ISteamUser/GetPlayerSummaries/v0002', params)
player_info = data.get('response', {}).get('players', [])[0]
return player_info.get('personaname', 'Unknown')
# アプリIDからアプリの名称を取得
def get_app_name(app_id):
params = {
'appid': app_id
}
data = send_steam_request('ISteamUserStats/GetSchemaForGame/v2', params)
game_info = data.get('game', {})
return game_info.get('gameName', 'Unknown')
# フレンドの持っているゲームを取得
def get_games_owned(steam_id):
params = {
'steamid': steam_id
}
data = send_steam_request('IPlayerService/GetOwnedGames/v0001', params)
return data.get('response', {}).get('games', [])
friends = get_friends_list(my_steam_id)
# フレンド一覧を表示し、複数選択できるUIを作成
friend_choices = [
inquirer.Checkbox('selected_friends', message='フレンドを選択してください:', choices=[(get_friend_name(friend['steamid']), friend['steamid']) for friend in friends])
]
answers = inquirer.prompt(friend_choices)
selected_friend_ids = answers['selected_friends']
# 自分の持っているゲームを取得
my_games = get_games_owned(my_steam_id)
# 選択したフレンドの持っているゲームを取得し、比較するロジックを追加
common_game_ids = set(game['appid'] for game in my_games)
for friend_id in selected_friend_ids:
friend_games = get_games_owned(friend_id)
friend_game_ids = set(game['appid'] for game in friend_games)
common_game_ids = common_game_ids.intersection(friend_game_ids)
print('--- 共通のゲーム ---')
if common_game_ids:
for app_id in common_game_ids:
app_name = get_app_name(app_id)
print(f'アプリ名称: {app_name}, アプリID: {app_id}')
else:
print('共通のゲームはありません。')
動かしたところ
ここから発展させるとしたら
- 一人だけ持ってないものをリストアップ
- ゲームへのリンク用意
- Discord にルーム立てる
とか・・・
おわり
当たり前のことですが、出力そのままでは使えません。
ほぼ 100% エラーが出るため、トラシューは必須です。
例えば、外部 API を利用する場合、仕様に沿わないリクエストを投げたり、レスポンス値の構造を無視した処理になっていることが多いので、エラーが出たら公式 doc を読みながら仕様をインプットしたり、自分で修正したりして詰めていくことになります。
が、ゼロから自分で書くよりはるかに楽です。
最近は ChatGPT くんがコードを書いてくれるようになったので、作りたいもののアイデアはあるけどコード書く時間はない、みたいなときに、簡単に形にできるので便利です。