У Вас сразу несколько ошибок в коде:
- Вы пытаетесь импортировать неопределённый класс
VkLongPol
. Но я не буду заострять на этом внимание, потому что он Вам вообще не нужен.
Вы авторизуетесь по ключу сообщества, поэтому должны использовать модуль vk_api.bot_longpoll
.
- Вы не передаёте параметр
group_id
при подключении к
longPoll
серверу. - Вы пытаетесь вызвать несуществующий метод
API
—messeg.send
.
Скорее всего, Вы опечатались и имели в видуmessages.send
.
Пример:
from vk_api import VkApi
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
from vk_api.utils import get_random_id
def main() -> None:
vk_session = VkApi(token='[token]')
long_poll = VkBotLongPoll(vk_session, '[group_id]')
vk = vk_session.get_api()
for event in long_poll.listen():
if event.type == VkBotEventType.MESSAGE_NEW:
peer_id = event.obj['peer_id']
message = event.obj['text'].lower()
if message == 'привет':
vk.messages.send(
peer_id=peer_id,
message='Привет!',
random_id=get_random_id(),
)
if __name__ == '__main__':
main()
Не забудьте заменить [token]
и [group_id]
на свои значения!
Данный код отвечает на сообщение привет
в любом регистре аналогичным Привет!
.
Хотелось бы отметить то, что я использую peer_id
для отправки сообщений. Это универсальный идентификатор, который позволяет отвечать как в беседах, так и в ЛС.
Костыль random_id()
я заменил аналогичной функцией vk_api.utils.get_random_id
.
Также данный код, в отличие от Вашего, следует стандартам PEP-8
.
Ошибка:
NameError: name ‘VkLongPoll’ is not defined
Код:
import requests
import vk_api
vk_session = vk_api.VkApi(token='big yellow Cocks')
longpoll = VkLongPoll(vk_session)
vk = vk_session.get_api()
for event in longpoll.listen():
if event.type == VkEventType.MESSAGE_NEW and event.to_me and event.text:
if event.text == 'Первый вариант фразы' or event.text == 'Второй вариант фразы': #Если написали заданную фразу
if event.from_user: #Если написали в ЛС
vk.messages.send( #Отправляем сообщение
user_id=event.user_id,
message='Ваш текст'
)
elif event.from_chat: #Если написали в Беседе
vk.messages.send( #Отправляем собщение
chat_id=event.chat_id,
message='Ваш текст'
)
У меня возникла проблема при использовании User Long Poll API.
import vk_api from vk_api.longpoll import VkLongPoll login, password = 'login', 'pass' vk_session = vk_api.VkApi(login, password) vk_session.auth(token_only=True) longpoll = VkLongPoll(vk_session) for event in longpoll.listen(): print(event.type)
При запуске возникает следующая ошибка:
Traceback (most recent call last): File "main.py", line 9, in <module> longpoll = VkLongPoll(vk_session) File "/usr/local/lib/python3.6/dist-packages/vk_api-11.4.0-py3.6.egg/vk_api/longpoll.py", line 503, in __init__ File "/usr/local/lib/python3.6/dist-packages/vk_api-11.4.0-py3.6.egg/vk_api/longpoll.py", line 513, in update_longpoll_server File "/usr/local/lib/python3.6/dist-packages/vk_api-11.4.0-py3.6.egg/vk_api/vk_api.py", line 636, in method vk_api.exceptions.ApiError: [15] Access denied: no access to call this method
Проблема в аккаунте или в коде?
Вот код. Вот что выдает. не понимаю что эта ошибка значит и как ее решить.
Причем при ручном подключении без использования модуля vk_api все подключается прекрасно.
from vk_api.longpoll import VkLongPoll
import vk_api
import requests
token = "использован_access_token_странички_пользователя_вк"
v = 5.103
vk_session = vk_api.VkApi(token=token, api_version=v)
session_api = vk_session.get_api()
longpoll = VkLongPoll(vk = session_api)
Traceback (most recent call last):
File "C:Program FilesJetBrainsPyCharm Community Edition 2020.1pluginspython-cehelperspydevpydevd.py", line 1438, in _exec
pydev_imports.execfile(file, globals, locals) # execute the script
File "C:Program FilesJetBrainsPyCharm Community Edition 2020.1pluginspython-cehelperspydev_pydev_imps_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"n", file, 'exec'), glob, loc)
File "C:/Users/Иван/PycharmProjects/vk-tg-bot/main.py", line 8, in <module>
longpoll = VkLongPoll(vk = session_api)
File "C:UsersИванPycharmProjectsvk-tg-botvenvlibsite-packagesvk_apilongpoll.py", line 517, in __init__
self.update_longpoll_server()
File "C:UsersИванPycharmProjectsvk-tg-botvenvlibsite-packagesvk_apilongpoll.py", line 531, in update_longpoll_server
response = self.vk.method('messages.getLongPollServer', values)
TypeError: __call__() takes 1 positional argument but 3 were given
Process finished with exit code 1
Код бота:
import vk_api
from vk_api.longpoll import VkLongPoll, VkEventType
from vk_api.keyboard import VkKeyboard, VkKeyboardColor
from datetime import datetime, timedelta
import time
# установка токена и id группы
token = ‘vk1.a.JnY25aJ28uh35wTwx3SmvQyxlcTBEYu6xuYnUf6kPC5gNyjo-GkuEjfUoFl9KLGUBN-ZXbD2HjcOL0QMGn_LvBNB8Zr9FEwIcOPk9H3sAcaa3GnldaO-oi95vPvgFCQR_lCpOlKw9E73yIHpp502RzjuA’
group_id = ‘217447654’
try:
vk_session = vk_api.VkApi(token=token)
longpoll = VkLongPoll(vk_session, group_id)
except vk_api.AuthError as error_msg:
print(error_msg)
quit()
# инициализация переменных
users = {}
admin_id = ‘282381901’
# определение функций для отправки сообщений и сохранения информации о пользователе
def send_message(peer_id, text, keyboard=None):
vk_session.method(‘messages.send’, {‘peer_id’: peer_id, ‘message’: text, ‘random_id’: 0, ‘keyboard’: keyboard})
def add_user(user_id, phone, date):
users[user_id] = {‘phone’: phone, ‘date’: date}
# создание клавиатуры
keyboard = VkKeyboard(one_time=True)
keyboard.add_button(‘Записаться’, color=VkKeyboardColor.POSITIVE)
keyboard.add_button(‘Отменить запись’, color=VkKeyboardColor.NEGATIVE)
# цикл обработки сообщений
for event in longpoll.listen():
if event.type == VkEventType.MESSAGE_NEW:
# обработка сообщения от пользователя
if event.text == ‘Начать’:
send_message(event.peer_id, ‘Добро пожаловать! Хотите записаться?’, keyboard=keyboard.get_keyboard())
elif event.text == ‘Записаться’:
send_message(event.peer_id, ‘Введите дату и время в формате ДД.ММ.ГГГГ ЧЧ:ММ’)
users[event.peer_id] = {‘state’: ‘date’}
elif event.text == ‘Отменить запись’:
if event.peer_id in users:
del users[event.peer_id]
send_message(event.peer_id, ‘Ваша запись отменена’)
else:
send_message(event.peer_id, ‘У вас нет активной записи’)
elif event.peer_id in users and users[event.peer_id][‘state’] == ‘date’:
try:
date = datetime.strptime(event.text, ‘%d.%m.%Y %H:%M’)
users[event.peer_id][‘date’] = date
users[event.peer_id][‘state’] = ‘phone’
send_message(event.peer_id, ‘Введите Ваш номер телефона: ‘)
except ValueError:
send_message(event.peer_id, ‘Некорректный формат даты и времени, попробуйте еще раз’)
elif event.peer_id in users and users[event.peer_id][‘state’] == ‘phone’:
try:
phone = int(event.text)
add_user(event.peer_id, phone, users[event.peer_id][‘date’])
send_message(event.peer_id, ‘Вы успешно записались на {} на номер {}’.format(users[event.peer_id][‘date’].strftime(‘%d.%m.%Y %H:%M’), phone))
del users[event.peer_id]
except ValueError:
send_message(event.peer_id, ‘Некорректный формат номера телефона, попробуйте еще раз’)
# обработка сообщения от администратора
elif event.peer_id == admin_id and event.text == ‘Записи’:
if len(users) > 0:
message = ‘Список записей:nn’
for user_id, info in users.items():
message += ‘Пользователь ID {}nДата и время: {}nНомер телефона: {}nn’.format(user_id, info[‘date’].strftime(‘%d.%m.%Y %H:%M’), info[‘phone’])
send_message(admin_id, message)
else:
send_message(admin_id, ‘Список записей пуст’)
# отправка уведомления за день до записи
for user_id, info in users.items():
if (info[‘date’] — datetime.now()).days == 1:
send_message(user_id, ‘Напоминаем, что завтра в {} у вас запись. Номер телефона для связи: {}’.format(info[‘date’].strftime(‘%H:%M’), info[‘phone’]))
Выдает ошибку:
C:Program FilesSublime Text 3Projects>4567.py
Traceback (most recent call last):
File «C:Program FilesSublime Text 3Projects4567.py», line 35, in <module>
for event in longpoll.listen():
File «C:UsersADMINAppDataLocalProgramsPythonPython311Libsite-packagesvk_apilongpoll.py», line 619, in listen
for event in self.check():
^^^^^^^^^^^^
File «C:UsersADMINAppDataLocalProgramsPythonPython311Libsite-packagesvk_apilongpoll.py», line 558, in check
timeout=self.wait + 10
~~~~~~~~~~^~~~
TypeError: can only concatenate str (not «int») to st