본문 바로가기
bard API

python으로 Bard API 이용해보기. with 오류?!

by 개발하는 호랑이 2024. 1. 29.

Chat GPT와 구글 바드, 뤼튼 등을 잘 애용하면서 API로 챗봇을 만들어 볼까 하는 생각에 Chat GPT 말고 다른 것은 API가 없나 찾아보다 바드가 공식은 아니지만 API를 사용할 수 있는 방법이 있어서 이를 이용해서 챗봇은 아니지만, 아주 간단하게 작동만 시켜보았다.
정말로 몇 줄 안되는 간단한 코드이다.
난 window에서 사용했으며, python 3.10 버전을 이용했다.

우선 참고해야하는 곳은 다음과 같다. 한국분이 만드셨다.
https://github.com/dsdanielpark/Bard-API

설치

vscode를 열고 bardapi가 설치되어있어야 사용할 수 있기에 다음을 입력해준다.

pip install bardapi

간단하쥬?

토큰 가져오기

이제 https://bard.google.com/으로 이동해서 로그인 한 후에 쿠키에 있는 토큰 값을 가져오도록 하자.

F12로 개발자 창을 띄운 후 → application → cookies → 'https://bard.gooogle.com' 을 눌러 있는 _Secure-1PSID의 값을 선택해주면 된다.

이제 이 토큰을 다음 코드에서 이용해줄 것이다.

사용하기

간단하게 바로 사용할 수 있는 방법은 아래와 같다.

from bardapi import Bard

token = '가져온토큰'
bard = Bard(token=token)
bard.get_answer("소주와 맥주의 차이점을 알려줘!")['content']

또는

from bardapi import Bard
import os
os.environ['_BARD_API_KEY']="가져온토큰"

Bard().get_answer("소주와 맥주의 차이점을 알려줘!")['content']

그러면 이에 대한 대답을 바로 vscode 터미널에서 받을 수 있다. 는 아니고

print(Bard().get_answer("소주와 맥주의 차이점을 알려줘!")['content'])

또는

response = Bard().get_answer("소주와 맥주의 차이점을 알려줘!")['content']
print(response)

로 해주면 된다.

응용!

from bardapi import Bard

bard = Bard(token_from_browser=True)
res = bard.get_answer("Do you like cookies?")
print(res['content'])

이 방식을 이용하면 내가 굳이 토큰을 찾아서 입력할 필요없이 가능하다.

Reusable session object 이용

우리가 Chat GPT나 바드를 이용했을 때 한 채팅창 안에서만 대화를 하는 경우가 대부분인데, 위에서 시도한 방법은 계속해서 새로운 채팅창을 만들고 대화를 한 번만하고 끝는 것이나 다름없기에 같은 채팅창안에서 대화를 하려면 이 방법을 이용해줘야한다.
공식문서의 예시는 아래와 같다.

from bardapi import Bard
import os
import requests
os.environ['_BARD_API_KEY'] = 'xxxxxxx'
# token='xxxxxxx'

session = requests.Session()
session.headers = {
            "Host": "bard.google.com",
            "X-Same-Domain": "1",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36",
            "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
            "Origin": "https://bard.google.com",
            "Referer": "https://bard.google.com/",
        }
session.cookies.set("__Secure-1PSID", os.getenv("_BARD_API_KEY")) 
# session.cookies.set("__Secure-1PSID", token) 

bard = Bard(token=token, session=session, timeout=30)
bard.get_answer("나와 내 동년배들이 좋아하는 뉴진스에 대해서 알려줘")['content']

# Continued conversation without set new session
bard.get_answer("What is my last prompt??")['content']

나만의 응용

나는 쿠키를 직접 찾아서 긁어오는 것도 귀찮았고, 계속해서 새로운 대화를 만들어내는 것도 내 방식에 맞지않았기에 둘을 합쳐 주었다. 그리고 미리 프롬프트도 만들어서 맨 처음 입력시키고 진행하기로 했다.

그래서 내가 만든 예시는 아래와 같다.

from bardapi import Bard
# import os
import requests
bard = Bard(token_from_browser=True)
print('##################')
print(bard.token)
print('##################')
# os.environ['_BARD_API_KEY'] = 'xxxxxxx'
token= bard.token

session = requests.Session()
session.headers = {
            "Host": "bard.google.com",
            "X-Same-Domain": "1",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36",
            "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
            "Origin": "https://bard.google.com",
            "Referer": "https://bard.google.com/",
        }
# session.cookies.set("__Secure-1PSID", os.getenv("_BARD_API_KEY")) 
session.cookies.set("__Secure-1PSID", token) 

bard = Bard(token=token, session=session, timeout=30)
# 프롬프트 만들기
myPrompt = '안녕 넌 이제부터 바드가 아니라 천재과학자 뉴사이언스야.'
bard.get_answer(myPrompt)['content']
print('질문이 있으신가요?')
print("대화를 종료하시려면 '종료'를 입력해주세요.")
# 세션 이탈 하지 않고 계속 대화하기
inputaData = input("질문을 입력해주세요: ")
while inputaData:
    if inputaData == '종료':
        print('대화를 종료합니다.')
        break
    print(bard.get_answer(inputaData)['content'])
    inputaData = input("질문을 입력해주세요: ")
    

여기서

print('##################')
print(bard.token)
print('##################')

이 코드를 이용해 제대로 token을 받아오는지 확인을 해보았다.

그리고 프롬프트를 넣어서 내 입맛에 맞는 대화를 이끌어내기위해 실행할때 맨처음 프롬프트를 입력시킨 뒤, 이제 질문에 대한 입력을 하도록 했다.

# 프롬프트 만들기
myPrompt = '안녕 넌 이제부터 바드가 아니라 천재과학자 뉴사이언스야.'
bard.get_answer(myPrompt)['content']

입력은 한 채팅창안에서 계속 진행이 되도록 하려했기에 while문을 이용해보았다.

# 세션 이탈 하지 않고 계속 대화하기
inputaData = input("질문을 입력해주세요: ")
while inputaData:
    if inputaData == '종료':
        print('대화를 종료합니다.')
        break
    print(bard.get_answer(inputaData)['content'])
    inputaData = input("질문을 입력해주세요: ")

입력한 값이 '종료' 라면 대화가 종료될 수 있게 만들었다.

토큰 자동 생성을 이용하면 터미널에 아래와 같은 내용들이 떠있을텐데, 실제 개발할 때는 이런 내용을 클라이언트에 보내거나, 이용하진 않을거니 터미널에 뜬다고 귀찮아하거나 신경쓰진 않아도 된다.

OSID
__Secure-OSID
1P_JAR
AEC
APISID
HSID
NID
SAPISID
SID
SIDCC
SSID
__Secure-1PAPISID
__Secure-1PSID
__Secure-1PSIDCC
__Secure-1PSIDTS
__Secure-3PAPISID
__Secure-3PSID
__Secure-3PSIDCC
__Secure-3PSIDTS
AID
SNID
ACCOUNT_CHOOSER
LSID
OTZ
SMSV
__Host-1PLSID
__Host-3PLSID
__Host-GAPS
OTZ

실행결과를 사진과 같이 보여주면 아래와 같다.

Bard API 실행 오류 발생?

python으로 bardapi를 이용하다가 오류가 났다.
본인의 경우는 2가지가 있었다.

첫번째는 첫 시작인 pip install bardapi를 하다가.
두번째는 간단 사용법처럼 내 토큰을 넣었는데도 작동이 안됨.
이 2가지이다.

해결 방법은 의외로 간단했다. 이게 완벽한 해결 방법인진 모르겠지만, 해결했다.

pip install bardapi 오류

나의 경우는 아래와 같이 터미널에서 문제를 출력하고 있었다.

Building wheels for collected packages: lz4
  Building wheel for lz4 (pyproject.toml) ... error
  error: subprocess-exited-with-error

  × Building wheel for lz4 (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [15 lines of output]
      running bdist_wheel
      running build
      running build_py
      creating build
      creating build\lib.win-amd64-cpython-312
      creating build\lib.win-amd64-cpython-312\lz4
      copying lz4\version.py -> build\lib.win-amd64-cpython-312\lz4
      copying lz4\__init__.py -> build\lib.win-amd64-cpython-312\lz4
      creating build\lib.win-amd64-cpython-312\lz4\block
      copying lz4\block\__init__.py -> build\lib.win-amd64-cpython-312\lz4\block
      creating build\lib.win-amd64-cpython-312\lz4\frame
      copying lz4\frame\__init__.py -> build\lib.win-amd64-cpython-312\lz4\frame
      running build_ext
      building 'lz4._version' extension
      error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for lz4
Failed to build lz4
ERROR: Could not build wheels for lz4, which is required to install pyproject.toml-based projects

이때 나는 python 버전을 3.12로 사용하고 있었는데 아직 3.12버전을 지원해주지 않아서 그렇다.
3.10으로 낮춰서 하니 작동이 잘 되주었다.
난 현재 3.10.8로 했다.

토큰을 넣어도 작동안됨?

Exception: SNlM0e value not found. Double-check __Secure-1PSID value or pass it as token='xxxxx'.

이건 아무래도 쿠키에 저장하고 있다보니 삭제되거나 만료되어서 사용 못하는 것으로 보인다.
그래서 검색해보니 다른 사람의 경우는 시크릿모드로 작동을 시켜서 그곳에서 토큰을 빼서 사용하니 잘 작동이 되었다하였고, 나 또한 그러했다.
시크릿 모드는 크롬과 웨일은 CTRL+SHIFT+N을 이용하면 생성가능하다.
이 방법도 안된다면 Auto Cookie Bard방법을 이용하도록 하자.

마무리

나만의 챗봇을 만들어볼까하는 생각으로 검색하다가 간단해서 사용해봤다. 이것만 이용해서 사용하려는 사람은 아무래도 없을테니 프로젝트 개발할 때 API로 잘 이용해먹으면 현재 돈내고 사용하는 Chat GPT API보다 더 쏠쏠하게 이용해 먹을 수 있지 않을까 하는 생각도 든다.
Django는 할 줄 아니까, 서버 배포도 배워서 혼자서 React Native로 모바일 챗봇을 제대로 만들어봐야겠다.

그리고 이미 알고있겠지만, 이 방법은 정식 API를 이용한 방법이 아니니까, 추후 구글 바드 정식 API가 나온다면 정식 API를 이용하도록 하자.