7
4

【ChatGPT】Steam のフレンドと同じゲームで遊びたいので作ってもらった

Posted at

まえがき

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('共通のゲームはありません。')

動かしたところ

スクリーンショット 2023-10-12 044714.jpg

ここから発展させるとしたら

  • 一人だけ持ってないものをリストアップ
  • ゲームへのリンク用意
  • Discord にルーム立てる

とか・・・

おわり

当たり前のことですが、出力そのままでは使えません。
ほぼ 100% エラーが出るため、トラシューは必須です。
例えば、外部 API を利用する場合、仕様に沿わないリクエストを投げたり、レスポンス値の構造を無視した処理になっていることが多いので、エラーが出たら公式 doc を読みながら仕様をインプットしたり、自分で修正したりして詰めていくことになります。
が、ゼロから自分で書くよりはるかに楽です。

最近は ChatGPT くんがコードを書いてくれるようになったので、作りたいもののアイデアはあるけどコード書く時間はない、みたいなときに、簡単に形にできるので便利です。

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4