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

## まえがき

Steam のフレンドと一緒に遊ぶとき、

僕 「〇〇 やろうよ」
A 「いいよー」
B 「あ、それ持ってない、×× は？」
A 「それ俺持ってないわ、△△ にしない？」
僕 「OK」
B 「りょうかい」

みたいな会話をたまにします。
いや買えばいいんじゃん？、って思うかもですが、毎回買ってたらお金なくなっちゃうので、、、
お互いが持ってるゲームを突合させて、同じゲームがあったら教えてくれる仕組みを作ってみました。

## インプットした要件

- Steam API を用いる
- 自分と、指定したフレンドが持っているアプリ (ゲーム) を取得し、同じアプリがあったら名称と ID を出力する
- フレンドリストは API で取得し、コンソール上にフレンド名を表示して選択できる
- フレンドは複数選択できるようにし、複数指定した場合は全員が持っている必要がある

## 最終的なコード

``` python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426991/0a3d162e-dff3-9a61-67ce-405c792042dc.jpeg)

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

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

とか・・・

## おわり

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

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