Bard APIをPythonから利用してWebサイトを参照させる(非公式API)

# はじめに
- Bard APIを使ったWebサイトの参照を含むタスクをpythonで試したので、やり方をまとめました。
- (少なくともこれを始めた当時は)ChatGPTではAPI経由でURLを指定したWebサイトの読み込みができなかったので、できそうなBardを使いました。
- 利用しているAPIは非公式のものです。
- BardでのURLへのアクセスは恐らく英語にしか対応していません。

# Bard API
以下のgithubリポジトリのライブラリを利用しました。

https://github.com/dsdanielpark/Bard-API

なお、
> Please note that the bardapi is not a free service, but rather a tool provided to assist developers with testing certain functionalities due to the delayed development and release of Google Bard's API. It has been designed with a lightweight structure that can easily adapt to the emergence of an official API. Therefore, I strongly discourage using it for any other purposes.

とあるように、このAPIはあくまでテスト用に提供されているものなので、何かのツールなどに埋め込んで使うのは本家のAPIが提供されるのを待つべきだと思われます。

# Bard API等の導入
pipを使って導入できます。
```terminal
pip install bardapi
```

この際、環境によっては以下のようなエラーが出ます。
これはUbuntu20.04のデフォルトのpython3にpython3-pipを導入して行ったときのものです。
```terminal
ERROR: grpcio-status 1.56.2 has requirement protobuf>=4.21.6, but you'll have protobuf 3.20.3 which is incompatible.
ERROR: google-cloud-core 1.7.3 has requirement google-auth<2.0dev,>=1.24.0, but you'll have google-auth 2.22.0 which is incompatible.
ERROR: deep-translator 1.11.4 has requirement requests<3.0.0,>=2.23.0, but you'll have requests 2.22.0 which is incompatible.
```

私が試した際にはエラーが出た場合でもbardapiは利用可能でしたが、気になる方はきちんと対応したほうが良いと思います。


# BardのTokenの準備
Bard APIで使うトークンはBardのWebページの`__Secure-1PSID`という名前のcookieの値なので、Chromeの機能や拡張機能などで取得できます。
が、このトークンはトリガーは不明ですが、すぐに使えなくなってしまいます。(BardへのアクセスをWebとAPIの両方から繰り返していると弾かれていると思われます。)
そのため、githubのIssueに記載されていた情報を参考に、以下の手順で準備をしました。
1. Google ChromeでBardのページにアクセスし、cookieを全消去する。(このとき、Chrome上で全てのGoogleアカウントからログアウトされてしまいます。)
1. ChromeでBardのページにアクセスし、APIに用いるGoogleアカウントでログインする。
1. Chromeのシークレットウィンドウを開き、Bardにアクセスする。
1. Bardを開いたシークレットウィンドウ以外のChromeのウィンドウを全て閉じ、これ以降Chromeに触らない。

この状態で、後述のBardインスタンスの作成時に`token_from_browser=True`を引数として渡すことで、Chromeからトークンを取得してくれます。
この方法で少なくとも４日は安定してAPIを利用できています。
(BardにさえアクセスしなければChromeを使っても大丈夫かもしれません。)

# Pythonコード
以下はWebのニュース記事を要約させた時のPythonコードです。
```python
from bardapi import Bard

url = '[要約したいURL]'
bard = Bard(token_from_browser=True)
question = '以下のURLの記事を5行程度で要約してください。'
question += '\n'
question += url 
answer = bard.get_answer(question)
```
Bardクラスの初期化時に以下のように`token_from_browser=True`とすることで、上述の通りにブラウザからトークンを取得するように指定できます。
```python
bard = Bard(token_from_browser=True)
```

# 結果
以下のCNNの記事に対して実行した結果です。json形式で返されます。
> A crucial system of ocean currents is heading for a collapse that ‘would affect every person on the planet’
> https://edition.cnn.com/2023/07/25/world/gulf-stream-atlantic-current-collapse-climate-scn-intl/index.html

```
{'content': 'ゴルフストリームは、北大西洋を流れる暖流です。ヨーロッパの冬の温暖化と農業に不可欠な要素です。しかし、最近の研究によると、ゴルフストリームが弱まり、将来的には崩壊する可能性があることが示唆されています。これは、ヨーロッパの冬が寒くなり、農業生産が低下するなど、深刻な影響を与える可能性があります。ゴルフストリームの弱化は、気候変動による海面上昇や氷河の融解が原因と考えられています。',
 'conversation_id': 'c_bXXXXXXXXXXXXXX',
 'response_id': 'r_bXXXXXXXXXXXXXX',
 'factualityQueries': None,
 'textQuery': ['ゴルフストリームの崩壊', 1],
 'choices': [{'id': 'rc_bXXXXXXXXXXXXXX',
   'content': ['ゴルフストリームは、北大西洋を流れる暖流です。ヨーロッパの冬の温暖化と農業に不可欠な要素です。しかし、最近の研究によると、ゴルフストリームが弱まり、将来的には崩壊する可能性があることが示唆されています。これは、ヨーロッパの冬が寒くなり、農業生産が低下するなど、深刻な影響を与える可能性があります。ゴルフストリームの弱化は、気候変動による海面上昇や氷河の融解が原因と考えられています。']},
  {'id': 'rc_bXXXXXXXXXXXXXX',
   'content': ['はい、こちらはCNNの記事の要約です。\n\n  ゴルフストリームは、北大西洋を流れる暖流です。ヨーロッパの天候に大きな影響を与えており、冬は寒さから、夏は暑さから守っています。しかし、近年、ゴルフストリームが弱まっていることが懸念されています。\n\n  ゴルフストリームの弱化は、地球温暖化が原因と考えられています。地球温暖化により、北極海の氷が融解し、塩分濃度が低下しています。この塩分濃度の低下が、ゴルフストリームの流れを弱めると考えられています。\n\n  ゴルフストリームの弱化は、ヨーロッパの天候に大きな影響を与える可能性があります。冬は寒さが強まり、夏は暑さが増す可能性があります。また、農作物への影響や、洪水や干ばつなどの自然災害の発生リスクが高まる可能性があります。\n\n  ゴルフストリームの弱化は、地球温暖化による深刻な問題の一つです。私たちは、地球温暖化を抑制するために、早急に行動する必要があります。\n\n  ご参考になれば幸いです。']},
  {'id': 'rc_bXXXXXXXXXXXXXX',
   'content': ['はい、わかりました。次の URL の記事を要約します。\n\nhttps://edition.cnn.com/2023/07/25/world/gulf-stream-atlantic-current-collapse-climate-scn-intl/index.html\n\n* ゴルフストリームは、北大西洋を流れる暖流です。\n* ゴルフストリームは、北ヨーロッパの温暖な気候を支えています。\n* ゴルフストリームが弱まると、北ヨーロッパは寒くなる可能性があります。\n* ゴルフストリームの弱化は、気候変動の影響と考えられています。\n* 気候変動対策を講じなければ、ゴルフストリームの弱化はさらに進む可能性があります。\n\nゴルフストリームは、北大西洋を流れる暖流です。この暖流は、北ヨーロッパの温暖な気候を支えています。しかし、ゴルフストリームが弱まると、北ヨーロッパは寒くなる可能性があります。ゴルフストリームの弱化は、気候変動の影響と考えられています。気候変動対策を講じなければ、ゴルフストリームの弱化はさらに進む可能性があります。']}],
 'links': [],
 'images': set(),
 'langCode': None,
 'code': None}
```

基本的に見る必要があるのは`content`の項目だけで、ここにWeb経由で使用した場合の返答文が入っていると思われます。
また、`choices`には他の回答候補が格納されているようです。

なお、この記事を書くために試していて気づきましたが、BardのURL参照は現時点(2023/07/25)では恐らく英語にしか対応していないようです。
少なくとも日本語の記事を要約させようとすると全く関係ない要約文が返ってくるか、「日本語がわかりません」と返ってきます。

以下はYahooの記事に対して実行した結果です。
> まだ午前10時なのに超暑い　東京都心は早くも35℃に　7月の猛暑日最多を更新
> https://news.yahoo.co.jp/articles/5960b06d4a81fe603ee6e62af7f228a4b342a462
```
{'content': '申し訳ありませんが、その記事は日本語で書かれているので、日本語がわかりません。',
 'conversation_id': 'c_bXXXXXXXXXXXXXX',
 'response_id': 'r_bXXXXXXXXXXXXXX',
 'factualityQueries': None,
 'textQuery': ['yahooニュース', 1],
 'choices': [{'id': 'rc_bXXXXXXXXXXXXXX',
   'content': ['申し訳ありませんが、その記事は日本語で書かれているので、日本語がわかりません。']},
  {'id': 'rc_bXXXXXXXXXXXXXX',
   'content': ['はい、喜んで。以下のURLの記事の要約は、次のとおりです。\n\n**タイトル:** 「ロシアのウクライナ侵攻」\u3000日本に与える影響は？\n\n**要約:**\n\n* ロシアのウクライナ侵攻は、日本にも大きな影響を与えています。\n* エネルギー価格の上昇や、サプライチェーンの混乱などが懸念されています。\n* 日本政府は、ウクライナへの支援や、国内経済への対策を講じています。\n* 今後の情勢次第では、日本経済にさらに大きな影響が出る可能性があります。\n\n**詳細:**\n\nロシアのウクライナ侵攻は、日本にも大きな影響を与えています。エネルギー価格の上昇や、サプライチェーンの混乱などが懸念されています。日本政府は、ウクライナへの支援や、国内経済への対策を講じています。今後の情勢次第では、日本経済にさらに大きな影響が出る可能性があります。\n\n以下、具体的な影響についてです。\n\n* エネルギー価格の上昇：ロシアは、原油や天然ガスの主要な輸出国です。ウクライナ侵攻を受けて、エネルギー価格が上昇しています。これは、日本経済に大きな影響を与える可能性があります。\n* サプライチェーンの混乱：ロシアは、鉄鋼やアルミニウムなどの主要な輸出国です。ウクライナ侵攻を受けて、サプライチェーンが混乱しています。これは、日本経済に大きな影響を与える可能性があります。\n* 円安：ロシアのウクライナ侵攻を受けて、円安が進んでいます。これは、輸入品の価格が上昇し、日本経済に大きな影響を与える可能性があります。\n* インフレ：エネルギー価格の上昇や、円安が進んでいることを受けて、インフレが加速する可能性があります。これは、日本経済に大きな影響を与える可能性があります。\n\n日本政府は、ウクライナへの支援や、国内経済への対策を講じています。しかし、今後の情勢次第では、日本経済にさらに大きな影響が出る可能性があります。']},
  {'id': 'rc_bXXXXXXXXXXXXXX',
   'content': ['はい、喜んで。以下のURLの記事の要約は、次のとおりです。\n\n**タイトル:** 日本、台湾に防疫物資を支援\u3000新型コロナの影響に対処\n\n**要約:**\n\n* 日本政府は18日、台湾に防疫物資を支援すると発表した。\n* 支援物資は、マスク100万枚、防護服1万着、手袋1万組、消毒液1万本など。\n* 支援は、台湾が新型コロナの影響で防疫物資を不足させている状況を踏まえたものだ。\n* 日本は、台湾との友好関係を重視しており、今後も支援を継続していくとしている。\n\n**詳細:**\n\n日本政府は18日、台湾に防疫物資を支援すると発表した。支援物資は、マスク100万枚、防護服1万着、手袋1万組、消毒液1万本など。支援は、台湾が新型コロナの影響で防疫物資を不足させている状況を踏まえたものだ。日本は、台湾との友好関係を重視しており、今後も支援を継続していくとしている。\n\nこの支援は、日本と台湾の友好関係を示すものだ。日本は、台湾を大切なパートナーとみており、今後も支援を継続していく方針だ。台湾は、この支援に感謝の意を表し、日本との友好関係をさらに強化していくとしている。']}],
 'links': [],
 'images': set(),
 'langCode': None,
 'code': None}
```

# 余談
要約した文章をslackに投稿したりできたらいいなと考えていたため、「分かりました。」や「承知しました。」、「以下が要約です。」のような文字を含まないようにしようとしたのですが、色々試しても言うことを聞いてくれませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3099/019fbb0f-f6b1-549b-a7c0-b1f72ea0ba2e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3099/8ee076e9-6ec8-5a01-d247-53e49348ef9a.png)

ChatGPTの場合だとわりと言うことを聞いてくれるので、やはりまだChatGPTに一日の長があるように感じています。