import vk_api.vk_api from vk_api.bot_longpoll import VkBotLongPoll from vk_api.bot_longpoll import VkBotEventType
class Server: def __init__(self, api_token, group_id, server_name: str="Empty"): # self.server_name = server_name # Long Poll self.vk = vk_api.VkApi(token=api_token) # Long Poll API self.long_poll = VkBotLongPoll(self.vk, group_id) # vk_api self.vk_api = self.vk.get_api() def send_msg(self, send_id, message): """ messages.send :param send_id: vk id , :param message: :return: None """ self.vk_api.messages.send(peer_id=send_id, message=message) def test(self): # ID self.send_msg(255396611, "-!")
# Server from server import Server # config.py api-token from config import vk_api_token server1 = Server(vk_api_token, 172998024, "server1") # vk_api_token - API , # 172998024 - id - # "server1" - server1.test()
Important!
A bot can write messages only to those users who have allowed the bot to send messages. This can be done on the community page or first write a bot
def start(self): for event in self.long_poll.listen(): print(event)
server1.start()
<< class 'vk_api.bot_longpoll.VkBotMessageEvent'> ({'type': 'message_new', 'object': {'date': 1541273151, 'from_id': 25599999999, 'id': 0, 'out': 0, 'peer_id': 2000000001, 'text': '[club172998024 | bot in da Vk] this is a text!', 'conversation_message_id': 187, 'fwd_messages': [], 'important': False, 'random_id': 0 , 'attachments': [], 'is_hidden': False}, 'group_id': 172998024})>
<< class 'vk_api.bot_longpoll.VkBotMessageEvent'> ({'type': 'message_new', 'object': {'date': 1541273238, 'from_id': 25599999999, 'id': 47, 'out': 0, 'peer_id': 255396611, 'text': 'this is a private message', 'conversation_message_id': 47, 'fwd_messages': [],' important ': False,' random_id ': 0,' attachments': [], 'is_hidden ': False},' group_id ': 172998024})>
def start(self): for event in self.long_poll.listen(): # # if event.type == VkBotEventType.MESSAGE_NEW: print("Username: " + self.get_user_name(event.object.from_id)) print("From: " + self.get_user_city(event.object.from_id)) print("Text: " + event.object.text) print("Type: ", end="") if event.object.id > 0: print("private message") else: print("group message") print(" --- ") def get_user_name(self, user_id): """ """ return self.vk_api.users.get(user_id=user_id)[0]['first_name'] def get_user_city(self, user_id): """ """ return self.vk_api.users.get(user_id=user_id, fields="city")[0]["city"]['title']
Username: Arthur
From: St. Petersburg
Text: [club172998024 | @ club172998024] this is a message from group
Type: group message
-
Username: Arthur
From: St. Petersburg
Text: this is a private message
Type: private message
-
Note
As you can see before the message in the group there is [club172998024 | @ club172998024], to correctly process the command, you should get rid of all the content in square brackets, or allow the bot access to all correspondence
def send_message(self, peer_id, message): self.vk_api.messages.send(peer_id=peer_id, message=message)
def start(self): for event in self.long_poll.listen(): # # if event.type == VkBotEventType.MESSAGE_NEW: username = self.get_user_name(event.object.from_id) print("Username: " + username) print("From: " + self.get_user_city(event.object.from_id)) print("Text: " + event.object.text) print("Type: ", end="") if event.object.id > 0: print("private message") else: print("group message") print(" --- ") self.send_message(event.object.peer_id, f"{username}, !")
Arthur, I received your message!
import vk_api.vk_api from vk_api.bot_longpoll import VkBotLongPoll from vk_api.bot_longpoll import VkBotEventType class Server: def __init__(self, api_token, group_id, server_name: str="Empty"): # self.server_name = server_name # Long Poll self.vk = vk_api.VkApi(token=api_token) # Long Poll API self.long_poll = VkBotLongPoll(self.vk, group_id, wait=20) # vk_api self.vk_api = self.vk.get_api() def send_msg(self, send_id, message): """ messages.send :param send_id: vk id , :param message: :return: None """ self.vk_api.messages.send(peer_id=send_id, message=message) def test(self): self.send_msg(255396611, "-!") def start(self): for event in self.long_poll.listen(): # # if event.type == VkBotEventType.MESSAGE_NEW: username = self.get_user_name(event.object.from_id) print("Username: " + username) print("From: " + self.get_user_city(event.object.from_id)) print("Text: " + event.object.text) print("Type: ", end="") if event.object.id > 0: print("private message") else: print("group message") print(" --- ") self.send_message(event.object.peer_id, f"{username}, !") def get_user_name(self, user_id): """ """ return self.vk_api.users.get(user_id=user_id)[0]['first_name'] def get_user_city(self, user_id): """ """ return self.vk_api.users.get(user_id=user_id, fields="city")[0]["city"]['title'] def send_message(self, peer_id, message): self.vk_api.messages.send(peer_id=peer_id, message=message)
# Server from server import Server # config.py api-token from config import vk_api_token server1 = Server(vk_api_token, 172998024, "server1") server1.start()
vkcom / club172998024? z =photo-172998024_456239017% 2Falbum-172998024_256250731
def send_img(self, peer_id): self.vk_api.messages.send(peer_id=peer_id, attachment="photo-172998024_456239017")
class Commander: def __init__(self, vk_api, user_id): self.vk_api = vk_api self.user_id = user_id def input(self, msg): """ :param msg: :return: , """ pass
from enum import Enum class Command(Enum): """ weather """ weather = ["weather", ""] """ myanimelist """ anime_top = ["top anime", " "]
from enum import Enum class Mode(Enum): default = [" ", "default"] translate = [" ", "translate"] get_ans = 0
# , from command_enum import Command from mode_enum import Mode # from translate.yandex_translate import Translator from weather import Weather from myanimelist import Myanimelist # Config from config import yandex_translate_api class Commander: def __init__(self): # , self.now_mode = Mode.default self.last_mode = Mode.default self.last_command = None # self.last_ans = None # self.translator = Translator(yandex_translate_api) def change_mode(self, to_mode): """ :param to_mode: """ self.last_mode = self.now_mode self.now_mode = to_mode self.last_ans = None def input(self, msg): """ :param msg: :return: , """ # if msg.startswith("/"): for mode in Mode: if msg[1::] in mode.value: self.change_mode(mode) return " " + self.now_mode.value[0] return " " + msg[1::] # if self.now_mode == Mode.get_ans: self.last_ans = msg self.now_mode = self.last_mode return "Ok!" if self.now_mode == Mode.default: # if msg in Command.weather.value: return Weather.get_weather_today() # if msg in Command.anime_top.value: res = "" top = Myanimelist.get_top() for anime in top: res += anime + " : " + top[anime] + "\n" return res if self.now_mode == Mode.translate: if self.last_ans is None: # , self.change_mode(Mode.get_ans) self.last_command = msg return " " elif self.last_ans == "change": # self.last_ans = None self.change_mode(Mode.default) else: # return self.translator.translate_to(msg, self.last_ans) return " !"
import requests from bs4 import BeautifulSoup class Weather: @staticmethod def get_weather_today(city: str = "-") -> list: http = "https://sinoptik.com.ru/-" + city b = BeautifulSoup(requests.get(http).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
import requests import bs4 class Myanimelist: @staticmethod def get_top(count: int=5, by: str="") -> dict: types = ["", "airing", "upcoming", "tv", "movie", "ova", "special", "bypopularity", "favorite"] if by not in types: return {"error: ": " !"} html = requests.get("https://myanimelist.net/topanime.php?type="+by) soup = bs4.BeautifulSoup(html.text, "html.parser") res = {} for anime in soup.select(".ranking-list", limit=count): url = anime.select(".hoverinfo_trigger")[0]['href'] anime = anime.select(".hoverinfo_trigger")[0].findAll("img")[0] name = anime['alt'].split(":")[1].strip(" ") res[name] = url return res
import requests from config import yandex_translate_api class Translator: """ - API Yandex Translate : _key -- API Yandex.Translate _yandex_comment -- API Yandex.Translate """ def __init__(self, key, comment=None): """ :param key: API Yandex.Translate :param comment: """ self._key = key if comment is None: self._yandex_comment = "\n «.» http://translate.yandex.ru/" else: self._yandex_comment = comment def translate(self, text, lang, to_lang=None): """ :param text: , :param lang: :param to_lang: :return: """ if to_lang is not None: lang = f"{lang}-{to_lang}" main_url = "https://translate.yandex.net/api/v1.5/tr.json/translate" response = requests.get(f"{main_url}?" f"key={self._key}&" f"lang={lang}&" f"text={text}") return response.json()['text'][0] + self._yandex_comment def lang_identify(self, text, hint="ru,en"): """ :param text: :param hint: :return: """ main_url = "https://translate.yandex.net/api/v1.5/tr.json/detect" response = requests.get(f"{main_url}?" f"key={self._key}&" f"hint={hint}&" f"text={text}") return response.json()['lang'] def translate_ru_en(self, text): """ :param text: , :return: """ if self.lang_identify(text) == "ru": to_lang = "en" from_lang = "ru" else: to_lang = "ru" from_lang = "en" return self.translate(text, from_lang, to_lang) def translate_to_ru(self, text, hint=None): """ :param text: , :param hint: :return: """ if hint is None: hint = "ru,en" from_lang = self.lang_identify(text, hint) return self.translate(text, from_lang, "ru") def translate_to(self, text, to_lang, hint=None): """ :param text: , :param to_lang: :param hint: :return: """ if hint is None: hint = "ru,en" from_lang = self.lang_identify(text, hint) return self.translate(text, from_lang, to_lang)
vk_api.messages.send(...,keyboard=keyboard_json,...)
vk_api.messages.send(...,keyboard=open(filename,"r",encoding="UTF-8").read()
{ "one_time": false, "buttons": [ [{ "action": { "type": "text", "label": "top anime" }, "color": "positive" }, { "action": { "type": "text", "label": "weather" }, "color": "positive" }], [{ "action": { "type": "text", "label": "translate" }, "color": "default" }] ] }
{"buttons":[],"one_time":true}
def send_msg(self, send_id, message): """ messages.send :param send_id: vk id , :param message: :return: None """ return self.vk_api.messages.send(peer_id=send_id, message=message, keyboard=open("keyboards/default.json", "r", encoding="UTF-8").read())
def start(self): for event in self.long_poll.listen(): # if event.type == VkBotEventType.MESSAGE_NEW: if event.object.from_id not in self.users: self.users[event.object.from_id] = Commander() # if event.type == VkBotEventType.MESSAGE_NEW: self.send_msg(event.object.peer_id, self.users[event.object.from_id].input(event.object.text))
Source: https://habr.com/ru/post/428680/