PythonでMicrosoft Copilot(Bing AI Chat)への質問を自動化する

# 1.概要
質問したいことをファイルに書いておくと、 **Microsoft Copilot (Bing AI Chat)** に自動で問合せしてくれるPythonスクリプトを書きました。
[Microsoft Copilot (Bing AI Chat)](https://copilot.microsoft.com/)
 **ChatGPT** でのやり方は、APIも用意されているため色々情報はありますが、 **Copilot** でのやり方は情報が少なかったため書いてみました。 **Copilot** を使用される方のお役に立てれば幸いです。
# 2.前提環境
**Selenium** を使用し、スクレイピングを行うことで **Cpilot** の操作を実現します。
以下に記載する内容で動作することを確認できております。
|名前|バージョン| 
|:-----------|------------:|
|OS|Windows11| 
|Python|3.11.9|
|Selenium|4.21.0|
# 3.コード
具体的な動きは、以下のような動きです。
* 質問ファイル (data/input/input.txt) に質問したいことを書きます。
* スクリプト (RequestCopilot.py) を実行すると質問ファイルの質問を読み取り、1行ずつ Copilot に送信していきます。
* Copilotからの返答は結果ファイル(data/output/output_yyyymmddss.txt)に記録されます。(yyyymmddssはRequestCopilot.pyが実行された時間が入ります。)
```python:RequestCopilot.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import datetime
import os
import time

def request_copilot(input_text):
    # ウェブドライバ設定
    driver=webdriver.Chrome()

    # 起動したいサイトのURLを入力
    driver.get('https://copilot.microsoft.com/')
    
    # 質問を入力するテキストボックスを取得
    time.sleep(10)
    shadowroot1=driver.find_element(By.CLASS_NAME, 'cib-serp-main').shadow_root
    shadowroot2=shadowroot1.find_element(By.ID, 'cib-action-bar-main').shadow_root
    shadowroot3=shadowroot2.find_element(By.CSS_SELECTOR, 'div > div.main-container > div > div.input-row > cib-text-input').shadow_root
    input=shadowroot3.find_element(By.ID, 'searchbox')
    # テキストボックスに質問入力
    input.send_keys(input_text)
    
    # 質問の送信ボタンを取得
    time.sleep(10)
    sendbutton=shadowroot2.find_element(By.CSS_SELECTOR, 'div > div.main-container > div > div.bottom-controls > div > div.bottom-right-controls > div.control.submit > button')
    # 質問の送信ボタンをクリック
    sendbutton.click()
    
    # copilotからの返答を取得
    time.sleep(30)
    shadowroot4=driver.find_element(By.CLASS_NAME, 'cib-serp-main').shadow_root
    shadowroot5=shadowroot4.find_element(By.ID, 'cib-conversation-main').shadow_root
    shadowroot6=shadowroot5.find_element(By.CSS_SELECTOR, '#cib-chat-main > cib-chat-turn').shadow_root
    shadowroot7=shadowroot6.find_element(By.CSS_SELECTOR, 'cib-message-group.response-message-group').shadow_root
    shadowroot8=shadowroot7.find_element(By.CSS_SELECTOR, 'cib-message[type=text]').shadow_root
    output=shadowroot8.find_element(By.CSS_SELECTOR, 'cib-shared > div').get_attribute('aria-label')
    return(output)


# デスクトップのパスを取得
desktop_path=os.path.expanduser('~/Desktop')
# 質問一覧ファイルの場所を指定
input_text_path=desktop_path+R"\copilot\data\input\input.txt"
# 出力用ファイルの末尾に付ける現在時刻を取得 
dt=datetime.datetime.now()
# copilotからの返答を出力するファイルの場所を指定
output_text_path=desktop_path+R"\copilot\data\output\output_"+dt.strftime('%Y%m%d%H%M%S')+".txt"

with open(input_text_path,encoding="utf-8") as f1:
    for input_text in f1:
        output_text=request_copilot(input_text)
        with open(output_text_path,'a',encoding="utf-8") as f2:
            f2.write('##########\n')
            f2.write('■質問\n')
            f2.write(input_text)
            f2.write('##########\n')
            f2.write('■返答\n')
            f2.write(output_text+'\n')
            f2.write('##########\n')
            f2.write('\n')
```
:::note info
GoogleChrome及びChromeDriverについて
インストールされていない場合は、実行時に自動でインストールされます。(Selenium 4.21.0 では確認済み)
インストールされる場所は C:\Users<ユーザー名>.cache\selenium です。
:::
例として質問ファイルの内容を以下のようにして、スクリプトを実行します。
```input.txt
東京都中央区で住みやすい駅を教えてください。治安が良くて、緑が豊かな場所がいいです。
東京都港区で住みやすい駅を教えてください。治安が良くて、緑が豊かな場所がいいです。
```
すると結果ファイルは以下のようになります。
```output_yyyymmddss.txt
##########
■質問
東京都中央区で住みやすい駅を教えてください。治安が良くて、緑が豊かな場所がいいです。
##########
■返答
Copilot が送信しました: もちろんです！東京都中央区で住みやすい駅をご紹介しますね。以下は、東京都内で住みやすい駅のランキングです。[^1^]

1. **吉祥寺駅**: JR中央・総武線と京王井の頭線が乗り入れており、商業施設や飲食店が充実しています。アクセスも良く、緑豊かなエリアです。
2. **中野駅**: JR中央・総武線と東京メトロ東西線が利用でき、アニメやポップカルチャーの発信地としても知られています。
3. **新宿駅**: JR山手線や湘南新宿ラインなどが乗り入れており、多彩なショッピングやグルメスポットがあります。

また、中央区内でも築地駅や日本橋駅などが治安が良く、アクセスも便利なエリアです。[^4^] どの駅も緑が多く、おだやかな雰囲気を楽しめることでしょう。ぜひ参考にしてくださいね！🌿
##########

##########
■質問
東京都港区で住みやすい駅を教えてください。治安が良くて、緑が豊かな場所がいいです。
##########
■返答
Copilot が送信しました: もちろん、お手伝いします！東京都港区は多くの魅力的なエリアがありますよ。以下は、一人暮らし、二人暮らし、家族向けの住みやすい駅をご紹介します。

1. **一人暮らし向けの駅**:
    - **都営大江戸線大門駅**: 都心へのアクセスが良く、治安も良好です[^1^]。
    - **都営三田線白金高輪駅**: 利便性が高く、緑豊かなエリアです[^1^]。
    - **東京メトロ南北線麻生十番駅**: 交通アクセスが良く、食料品の価格も手頃です[^1^]。

2. **二人暮らし向けの駅**:
    - **都営三田線三田駅**: 学生が多く、治安も良好です[^1^]。
    - **東京メトロ銀座線虎ノ門駅**: 都心へのアクセスが良好で、飲食店も豊富です[^1^]。

3. **家族向けの駅**:
    - **東京メトロ銀座線青山一丁目駅**: 静かで住みやすいエリアで、子育てに適しています[^1^]。
    - **東京メトロ銀座線表参道駅**: おしゃれな雰囲気で、周辺にはスーパーや病院も多くあります[^1^]。

港区は治安が良く、緑豊かな住環境が整っているため、快適な生活ができることでしょう。[^1^] 🌿
##########
```
(吉祥寺駅、中野駅、新宿駅は中央区ではない気がする…。多分質問の仕方が悪かったです…。)
# 4.準備方法及び使い方
* Python をインストールしていない場合は、インストールしてください。
* PowerShell 又はコマンドプロンプトを開き、以下のコマンドを実行して Selenium をインストールしてください。
```
pip install selenium==4.21.0
```
* 以下のリポジトリを ZIP でダウンロードしてください。
[リポジトリ](https://github.com/nekotokage335/UseCopilot)
ダウンロードした ZIP はデスクトップ配下に「copilot」というフォルダ名で解凍/展開してください。
*  <デスクトップのパス>\copilot\data\input\input.txt を開き、Copilot に質問したいことを書いてください。質問したいことが複数個ある場合は改行して書きます。(1行につき1個の質問を書く形です。)
* PowerShell 又はコマンドプロンプトを開き、以下のコマンドを実行して RequestCopilot.py を実行してください。
```
python <デスクトップのパス>/copilot/RequestCopilot.py
```
* 実行が完了するのを待ってください。1つの質問につき約1分ほどかかります。
* <デスクトップのパス>\copilot\data/output/output_yyyymmddss.txt を確認し、Copilot からの返答を確認してください。(yyyymmddss は RequestCopilot.py が実行された時間が入ります。)
# 5.改善したいこと、次やりたいこと
* Web ページが表示されるまでの待機処理を改善し、実行時間を短縮したい。現在は余裕を持たせた秒数で time.sleep している。
* Copilot のチャットが1ラリーで終わってしまう仕様なので、複数回続けられるコードも書きたい。