TransWikia.com

TypeError: __call__() takes 1 positional argument but 3 were given

Stack Overflow на русском Asked by 645 546 on February 22, 2021

Вот ошибка:

    Traceback (most recent call last):
  File "C:/Users/Danila/PycharmProjects/bot_all_to_telegramm/main.py", line 4, in <module>
    vk_bot()
  File "C:UsersDanilaPycharmProjectsbot_all_to_telegrammvk_bot.py", line 23, in vk_bot
    longpoll = VkLongPoll(vk_session)
  File "C:UsersDanilaAppDataLocalProgramsPythonPython37-32libsite-packagesvk_apilongpoll.py", line 517, in __init__
    self.update_longpoll_server()
  File "C:UsersDanilaAppDataLocalProgramsPythonPython37-32libsite-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

auth.py

import telebot
import vk_api

bot = telebot.TeleBot('токен')

def captcha_handler(captcha):
    """ При возникновении капчи вызывается эта функция и ей передается объект
        капчи. Через метод get_url можно получить ссылку на изображение.
        Через метод try_again можно попытаться отправить запрос с кодом капчи
    """

    key = input("Enter captcha code {0}: ".format(captcha.get_url())).strip()

    # Пробуем снова отправить запрос с капчей
    return captcha.try_again(key)
    
session_api = vk_api.VkApi(login='логин', password='пароль', app_id=2685278,
                           captcha_handler = captcha_handler)
session_api.auth(token_only=True)


vk_session = session_api.get_api()

vk_bot.py

from vk_api.longpoll import VkEventType, VkLongPoll
import random

from auth import bot, session_api, vk_session



def name_from_id(user_id):
    user = vk_session.method("users.get", {"user_ids": user_id})
    return user[0]['first_name'] + ' ' + user[0]['last_name']


def send_message(peer_id, message=None, attachment=None, keyboard=None, payload=None):
    session_api.messages.send(peer_id=peer_id, message=message, random_id=random.randint(-2147483648, +2147483648),
                              attachment=attachment, keyboard=keyboard, payload=payload)

def vk_bot():
    bot.send_message(1052739314, 'КУ!')
    longpoll = VkLongPoll(vk_session)
    print('Бот Вк успешно запустился!')
    for event in longpoll.listen():
        if event.type == VkEventType.MESSAGE_NEW:
...

Отправка сообщений со страницы пользователя взята от сюда: https://www.youtube.com/watch?v=gsSZ7VPlkKs&feature=youtu.be. Это работает. Но в связке с телеграм ботом работать не хочет. Почему?

One Answer

Судя по нагугленным мной примерам, здесь get_api() лишнее:

session_api = vk_api.VkApi(login='логин', password='пароль', app_id=2685278, 
    captcha_handler = captcha_handler)
session_api.auth(token_only=True)
vk_session = session_api.get_api()
                        ^^^^^^^^^^

longpoll = VkLongPoll(vk_session)

Надо так:

vk_session = session_api

Или без промежуточной переменной:

VkLongPoll(session_api)

Но не исключаю, что дальше по коду вам понадобится другая переменная со значением session_api.get_api(), это надо разбираться. У вас скорее всего путаница какая-то в переменных.

Correct answer by CrazyElf on February 22, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP