Python 3のVKで簡単なチャットボットを作成する

ボットの基盤を作成するには、次の手順を実行します。


  1. VKでボットを作成する
  2. APIキーの生成
  3. LongPoolVKを介してボットプログラムを作成する

この記事の対象者


この記事は、初心者プログラマを対象としています。 プログラムの動作方法は非常にシンプルであり、Python構文を知っていて、少しOOPを知っている人なら誰でもニーズに合わせて実装できます。 しかし、原則として、OOPの原則を知らなくても、単純な関数を追加する方法を学習できると思います。少なくとも極端な場合は、GitHubの既製のソースを使用してください。

この記事には何が含まれていますか?


ボットの基礎を作成します。 その後、好きなようにプログラムできます。 ルーチンを自動化するか、対話者として使用します。

改善(ボットのやや複雑なバージョン)。 ボットの単純な手続き型コードを最初に導入し、次にボットを大幅に改善する関数を追加することで少し複雑にすることにしました。

気象伝達関数を追加します。 ボットに天気を教えるように教えます。

VKでボットを作成する


ボット、つまりVKのグループを作成することから始めます。

これを行うには、「グループ」→「コミュニティを作成」に進みます。

任意のタイプのコミュニティを選択し、名前、グループテーマを入力します。

開いた設定ページで、[APIの操作]を選択します

次に、APIキーを作成する必要があります。

次に、APIキーへのアクセスで必要なパラメーターを選択します。

ほとんどの場合、携帯電話を使用してVKでアクションを確認する必要があります。 次に、結果のAPIキーをファイルのどこかにコピーします。 まだ必要です。

次に、メッセージを許可する必要があります。 これを行うには、「メッセージ」に移動してオンにします。

ボットのプログラム部分に進みましょう


VKへのリクエストを通じて実装することはありません。より正確には、VkLongPoolライブラリを使用するだけです。

これにはvk_apiライブラリが必要です。 pip経由でインストールします。

python -m pip install vk_api

しかし、個人的には、Anacondaの仮想環境で作業しています。 これは、最初の作業中に問題を引き起こすことがよくあります。 通常、問題はシステムがpythonコマンドを認識しないことです。 そして、この問題はPATHに追加することで解決します。

コード自体に取りかかりましょう:

必要なモジュールをインポートします。

import vk_api from vk_api.longpoll import VkLongPoll, VkEventType 

次に、コード:

 def write_msg(user_id, message): vk.method('messages.send', {'user_id': user_id, 'message': message}) # API-   token = "6a9c267cd469388709a9e9acaddbe0aa81a0abbf12239b3e597a31729ffbddb9c88e80a443554c918b8f7" #    vk = vk_api.VkApi(token=token) #    longpoll = VkLongPoll(vk) #   for event in longpoll.listen(): #     if event.type == VkEventType.MESSAGE_NEW: #      (   ) if event.to_me: #    request = event.text #    if request == "": write_msg(event.user_id, "") elif request == "": write_msg(event.user_id, "((") else: write_msg(event.user_id, "   ...") 

write_msg関数は、VKユーザーID <user_id>を受信し、そのユーザーにメッセージとメッセージ自体を送信します。

 def write_msg(user_id, message): vk.method('messages.send', {'user_id': user_id, 'message': message}) 

コミュニティとしてログインし、ロングプールをセットアップします。

 # API-   token = "6a9c267cd469388709a9e9acaddbe0aa81a0abbf12239b3e597a31729ffbddb9c88e80a443554c918b8f7" #    vk = vk_api.VkApi(token=token) #    longpoll = VkLongPoll(vk)    : #   for event in longpoll.listen(): 

その中で、イベントを周期的にチェックします。 そして、event.typeでイベントタイプを取得できます。

その後、ユーザーからメッセージを受信したら、すでに作成されたwrite_msg関数を使用して、対応する文字をユーザーに送信できます。

そのため、VKで同じ単純な実装で非常に単純なボットを作成しました。 また、ボットのロジックは好きなようにプログラムできます。

GHコードリスト

それでは、実際のプログラミングを始めましょう。


ボットとして機能するvk_bot.pyファイルにVkBotクラスを作成します。

 class VkBot: def __init__(self, user_id): print("  !") self._USER_ID = user_id self._USERNAME = self._get_user_name_from_vk_id(user_id) self._COMMANDS = ["", "", "", ""] 

そして、vk idを介してユーザー名を取得できるメソッドをそこに追加します。

 def _get_user_name_from_vk_id(self, user_id): request = requests.get("https://vk.com/id"+str(user_id)) bs = bs4.BeautifulSoup(request.text, "html.parser") user_name = self._clean_all_tag_from_str(bs.findAll("title")[0]) return user_name.split()[0] 

これはbeatifulsoup4を使用して行われます。

そうでない場合はインストールします。
python -m pip install bs4
勉強する価値のある記事が十分にあります。 それを使用して、さらにいくつかのメソッドを作成します。

 #  : def _get_time(self): request = requests.get("https://my-calend.ru/date-and-time-today") b = bs4.BeautifulSoup(request.text, "html.parser") return self._clean_all_tag_from_str(str(b.select(".page")[0].findAll("h2")[1])).split()[1] #   def _get_weather(city: str = "-") -> list: request = requests.get("https://sinoptik.com.ru/-" + city) b = bs4.BeautifulSoup(request.text, "html.parser") p3 = b.select('.temperature .p3') weather1 = p3[0].getText() p4 = b.select('.temperature .p4') weather2 = p4[0].getText() p5 = b.select('.temperature .p5') weather3 = p5[0].getText() p6 = b.select('.temperature .p6') weather4 = p6[0].getText() result = '' result = result + (' :' + weather1 + ' ' + weather2) + '\n' result = result + (' :' + weather3 + ' ' + weather4) + '\n' temp = b.select('.rSide .description') weather = temp[0].getText() result = result + weather.strip() return result #       @staticmethod def _clean_all_tag_from_str(string_line): """   stringLine      :param string_line:   :return:   """ result = "" not_skip = True for i in list(string_line): if not_skip: if i == "<": not_skip = False else: result += i else: if i == ">": not_skip = True return result 

_get_weatherパラメーターを目的の都市に変更すると、後でこのメソッドを都市で呼び出すことができ、デフォルトでは指定された値になります。

これらの方法を使用して、時間と天気を取得できます。 これらのメソッドは、私のメインボットプロジェクトからカットされています。 継承を使用して、個別のパッケージとクラスに整理します。 しかし、仕事の例のために、これらすべてを1つのボットクラスに適合させることにしました。これは確かに悪いことです。

ユーザーのメッセージを処理して応答を返すnew_messageメインメソッドを作成しましょう。

 def new_message(self, message): #  if message.upper() == self._COMMANDS[0]: return f"-, {self._USERNAME}!" #  elif message.upper() == self._COMMANDS[1]: return self._get_weather() #  elif message.upper() == self._COMMANDS[2]: return self._get_time() #  elif message.upper() == self._COMMANDS[3]: return f"-, {self._USERNAME}!" else: return "    ..." 

実行可能ファイルに戻ります。

ボットのクラスをインポートします。

 from vk_bot import VkBot 

メインループを変更しましょう。

 print("Server started") for event in longpoll.listen(): if event.type == VkEventType.MESSAGE_NEW: if event.to_me: print('New message:') print(f'For me by: {event.user_id}', end='') bot = VkBot(event.user_id) write_msg(event.user_id, bot.new_message(event.text)) print('Text: ', event.text) 

つまり、受信したメッセージをボットオブジェクトに送信し、ボットオブジェクトが目的の回答を返します。

このプログラムの複雑さは、ボットの機能をさらに改善する場合にのみ必要です。

_get_timeおよび_get_weather関数ごとに個別のパッケージとクラスを作成します。 一般クラスからの継承を整理します。 そして、それぞれの新しい関数を別々のクラスで定義します。もちろん、パッケージに分割することも最善です。

ユーザーIDキーとボットオブジェクト値を含む辞書を追加します。 したがって、サイクルのたびにボットオブジェクトを作成する必要はありません。 さらに、これにより、複雑な設計で複数のユーザーが同時に使用できるようになります。

したがって、適切なコードアーキテクチャを選択すると、多機能ボットを作成できます。

たとえば、ボットにコンピューターで音楽を再生し、電話に座ってサイトを開くように教えました。 朝食、昼食、夕食のレシピを送信します。

自分でボットを編集できます。

記事のボット

GHのメインボットプロジェクト(高度)

私はあなたのアイデアに喜んでいるでしょう。 ご質問については、お書きください。

Source: https://habr.com/ru/post/J427691/


All Articles