Найти - Пользователи
Полная версия: Метод get_all из библиотеки vk_api не работает
Начало » Python для новичков » Метод get_all из библиотеки vk_api не работает
1
vcomp71
Есть пример в официальной документации библиотеки vk_api
https://pypi.org/project/vk-api/

get_all(method, max_count, values=None, key='items', limit=None, stop_fn=None, negative_offset=False)
Использовать только если нужно загрузить все объекты в память.
Eсли вы можете обрабатывать объекты по частям, то лучше использовать get_all_iter
Например если вы записываете объекты в БД, то нет смысла загружать все данные в память


 def main():
    """ Пример получения всех постов со стены """
    login, password = 'python@vk.com', 'mypassword'
    vk_session = vk_api.VkApi(login, password)
    try:
        vk_session.auth(token_only=True)
    except vk_api.AuthError as error_msg:
        print(error_msg)
        return
    tools = vk_api.VkTools(vk_session)
        При использовании get_all сокращается количество запросов к API
        за счет метода execute в 25 раз.
        Например за раз со стены можно получить 100 * 25 = 2500, где
        100 - максимальное количество постов, которое можно получить за один
        запрос (обычно написано на странице с описанием метода)
    """
    wall = tools.get_all('wall.get', 100, {'owner_id': 1})
    print('Posts count:', wall['count'])
    if wall['count']:
        print('First post:', wall['items'][0], '\n')
    if wall['count'] > 1:
        print('Last post:', wall['items'][-1])
if __name__ == '__main__':
    main()

При запуске метода пишет ошибку:

wall = tools.get_all('wall.get', 100, {'owner_id': 1})
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: VkApiMethod.__call__() takes 1 positional argument but 4 were given
Traceback

Traceback (most recent call last):
File “C:\Python\proekt\vk\vk_api\main.py”, line 129, in main_vk
wall = tools.get_all('wall.get', 100, {'owner_id': acc})
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: VkApiMethod.__call__() takes 1 positional argument but 4 were given

Вот что интересно… Пример из документации не работает!
Можно, конечно, всё сделать через requests, но зачем, когда есть уже готовый метод?
ZerG
Тебе даже форум показывает что у тебя код синтаксичекие ошибки содержит ты пропустил символ екранировки
https://github.com/python273/vk_api/blob/master/examples/get_full_wall.py
вот попробуй скопировать и не удалять лишних строк
vcomp71
Вот так вот сразу - и глупый ответ????
А погуглить не судьба ошибку:
takes 1 positional argument but 4 were given

https://stackoverflow.com/questions/72614861/python-error-on-class-method-takes-1-positional-argument-but-2-were-given


По ссылки перейди и посмотри код.
https://github.com/python273/vk_api/blob/master/examples/get_full_wall.py
Я копировал пример из документации, а не свой рабочий код. У меня код проще.

 def vk_auth(vid,acc_n):
    match vid:
        case "vk_api":
            # vk_session = vk_api.VkApi(token = acc[acc_n]['ACCESS_TOKEN'])
            vk_session = vk_api.VkApi(acc[acc_n]['ACCESS_TOKEN'])
            try:
                vk_session.auth(token_only=True)
            except vk_api.AuthError as error_msg:
                print(error_msg)
                return error_msg
            tools = vk_session.get_api()
            return tools
        case "vk":
            return 0
        case "vkontakte":
            vk_session = vkontakte.API(token=acc[acc_n]['ACCESS_TOKEN'])
            tools = vkontakte.API(token=acc[acc_n]['ACCESS_TOKEN'])
            return tools
        case unknown_command:
            print(f"Unknown command'{unknown_command}'")
def main_vk():
    tools = vk_auth("vk_api",1)
    if (isinstance(tools, str)):
        print(tools)
        exit()
    # id_user = acc[1]['DOMAIN']
    # print(id_user)
    try:
        wall = tools.get_all('wall.get', 100, {'owner_id': acc[1]['ID']})
    except Exception as e:
        exception_traceback = traceback.format_exc()
        print(exception_traceback)
        exit()
    print('Posts count:', wall['count'])
    if wall['count']:
        print('First post:', wall['items'][0], '\n')
    if wall['count'] > 1:
        print('Last post:', wall['items'][-1])
if __name__ == '__main__':
    main_vk()
    # main_req()

Но за сообщение о том, что пропуск символа каретки вызывает такую ошибку - спасибо. Посмеялся.
Вопрос к знатокам библиотеки vk_api. С какими аргументами надо функцию вызывать?
ZerG
То есть ошибку выдает код написанный вами
но на форум вы выложили код из примера с гита
При этом как то так выложили что даже форум дает засвет из за пропущенных кавычек
(мы ведь предполагаем что вы выложили именно тот код который вы запускаете в том же виде где ошибка)
И мы в этой связке должны угадать что вы передаете в виде параметров в вашу функцию и соответствствует ли оно действительности?
При этом вы бросаете линк на овефлов который к вашей проблеме не имеет только косвенное отношение по общему названию ошибки
И мы тут все виноваты?

Вот для того что бы исключить человеческий фактор я вам и предложил
1. Возьмите полностью код из примера с гита
2. Измените в нем только логин пароль (айди если нужно)
(Не нужно создавать словарь список или класс для хранения паролей - просто замените в примере на свои)
3. Выполните код и предоставьте результаты - тогда можно смотреть в сторону библиотеки
Потому что как ваш код вобще работает а не вываливается в кору это уже большой вопрос.
py.user.next
vcomp71
Я копировал пример из документации
Учись копировать. Ты накопировал отовсюду из разных мест код в одну точку и потом её запускаешь. Конечно, она выдаёт какие-то ошибки непредсказуемые. Они вообще с методом не связаны.
Kiodlso
Are we all to blame when you included a link to an overflow error that is unrelated to your issue but shares the same name?
spacebar clicker
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB