Python+Gemini APIを使って簡単なBlueskyのbotのようなものを作ってみた
はじめに
Python と Google の Gemini の API を使ってチョー簡単な bot のようなものを作ってみたという話です
プログラミング初心者がプログラミング初心者に向けて記事を書いてみたという感じなので、そこはご了承いただければ
また、Gemini の API が無料で使えるのは 2024 年初頭までという記事を見ました。今現在は使えますが、おそらく夏までには有料になるのではないかと思います
その時は Claude3 を使ってみようかな…
概要
今回作ったプログラムでは Gemini API(GCP 的には Generative Language API??)を使って Gemini に返信内容を考えてもらい、それを Bluesky に投稿するという流れになっています
API を使うにあたって、以下の記事を大いに参考にさせていただきました。ありがとうございます
プログラムを作る
Bluesky に投稿できるようにしてみる
まずは Bluesky に投稿できるようにしてみます
Bluesky で使われている AT Protocol のPython 向け SDKがあるので、今回はそれを使って進めていきます
ということで、atproto を pip を使ってインストール
pip install atproro
これで投稿のための準備は整いました
Bluesky に投稿するためにプログラムを組んでみます
from atproto import Client
def main():
client = Client()
# Blueskyにログインする
client.login("Your ID or Email", "Your App Password")
# Blueskyに「こんにちは」と投稿する
client.send_post(text="こんにちは")
if __name__ == "__main__":
main()
これを、コマンドラインから実行してみると自分のアカウントに「こんにちは」と投稿されるはずです
ただ、ここで atproto_client.exceptions.UnauthorizedError
というエラーを返されることがあります
そういうときは、だいたい入力すべきパスワードが間違っています
ここでいう App Password というのは、アカウントのパスワードではなく「アプリパスワード」になります
詳しくはほりべあさんの書いたこちらのページを読むと良いかと思います
Gemini API を使ってみる
さて、次は Gemini API を使って文章を作成するプログラムを作っていきます
Gemini を使うにも便利な SDK が用意されているのでありがたく使います
コマンドラインにて
pip install google-generativeai
と実行して必要な SDK をインストールします
この SDK を使って、Gemini Pro を呼び出し、テキストを送ってみます
import google.generativeai as genai
def main():
# APIキーを使って認証する
genai.configure(api_key="Your API Key")
# Gemini Proのモデルを読み込む
ai = genai.GenerativeModel("gemini-pro")
# 新たなチャットを始める
chat = ai.start_chat(history=[])
# Geminiにメッセージを送る
response = chat.send_message("調子はどうですか?")
# 返ってきたレスポンスのテキストを出力する
print(response.text)
if __name__ == "__main__":
main()
これを実行してみると、以下のように表示されました
調子が良いです。ありがとうございます。
シンプルですね。Web で使える普通の Gemini(中身は Bard と一緒でしたっけ?)に聞いてみたら 3 行くらいの長文で返ってきたんですが
ちなみに 500 エラーが返ってくることが何度もありました
原因はよくわかってません…もう一度実行するとちゃんと返答が返ってくるので、向こうのサーバーの問題なのかなと思ったりはしています
2 つのプログラムを繋げてみる
先程作った Bluesky に投稿するプログラムと組み合わせて、ランダムな寿司のネタを投稿するプログラムを作ってみます
from atproto import Client
import google.generativeai as genai
def main():
client = Client()
client.login("Your ID or Email", "Your App Password")
genai.configure(api_key="Your API Key")
ai = genai.GenerativeModel("gemini-pro")
chat = ai.start_chat(history=[])
response = chat.send_message("ランダムな寿司ネタを1つだけ生成してください")
client.send_post(text=response.text)
if __name__ == "__main__":
main()
これを実行してみると、ランダムな寿司ネタが Bluesky に投稿されます
良いですね
でも bot というくらいですから、定期的に投稿してほしいものですよね
というわけで、schedule というモジュールを使って 1 時間おきに投稿できるようにしてみましょう
まずはインストール
pip install schedule
そしてコードを書き換えていきます
from atproto import Client
import google.generativeai as genai
+ import schedule
+ from time import sleep
+ def post(chat: genai.generative_models.ChatSession, client: Client):
+ response = chat.send_message("ランダムな寿司ネタを1つだけ生成してください")
+
+ client.send_post(text=response.text)
def main():
client = Client()
client.login("Your ID or Email", "Your App Password")
genai.configure(api_key="Your API Key")
ai = genai.GenerativeModel("gemini-pro")
chat = ai.start_chat(history=[])
- response = chat.send_message("ランダムな寿司ネタを1つだけ生成してください")
-
- client.send_post(text=response.text)
+ # 1時間おきに投稿するようにスケジュールに登録
+ schedule.every(1).hours.do(post, chat, client)
+
+ while True:
+ # 指定時間になっていたら登録されたスケジュールのジョブを実行
+ schedule.run_pending()
+ # 1秒待ってから繰り返す
+ sleep(1)
if __name__ == "__main__":
main()
これで 1 時間おきに実行するプログラムができました
実際に走らせてみると、1 時間毎に寿司ネタをつぶやいてくれていますね
さいごに
リプライが来たら返信するような実装も余裕があれば書きたいです
ちなみに一番好きな寿司ネタはいくらです
Discussion