RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 780304
Accepted
iskander1220
iskander1220
Asked:2020-02-05 06:43:19 +0000 UTC2020-02-05 06:43:19 +0000 UTC 2020-02-05 06:43:19 +0000 UTC

使用execute方法(VK API)接收评论和vk.com社区成员

  • 772

你好!有一个关于此答案中提出的解决方案的问题,该解决方案是关于接收在 vk 上的特定社区中留下的用户评论。似乎我在我的应用程序中复制了该过程,将第一篇文章的评论中的配置文件 ID 和随机用户的 ID 替换为此配置文件(更改了他们的位置),但每次都显示错误消息。请看一下:https ://i.stack.imgur.com/cixeP.png

此外,获取社区成员列表的以下代码(来自此处)使用相同的方法失败:

VK.init({
    apiId: 6456476 // ID вашего приложения VK
});

var membersGroups = []; // массив участников группы
getMembers(30666517);

// получаем информацию о группе и её участников
function getMembers(group_id) {
    VK.Api.call('groups.getById', {group_id: group_id, fields: 'photo_50,members_count', v: '5.27'}, function(r) {
            if(r.response) {
                $('.group_info')
                .html('<img src="' + r.response[0].photo_50 + '"/><br/>' 
                    + r.response[0].name
                    + '<br/>Участников: ' + r.response[0].members_count);
                getMembers20k(group_id, r.response[0].members_count); // получаем участников группы и пишем в массив membersGroups
            }
    });
}

// получаем участников группы, members_count - количество участников
function getMembers20k(group_id, members_count) {
    var code =  'var members = API.groups.getMembers({"group_id": ' + group_id + ', "v": "5.27", "sort": "id_asc", "count": "1000", "offset": ' + membersGroups.length + '}).items;' // делаем первый запрос и создаем массив
            +   'var offset = 1000;' // это сдвиг по участникам группы
            +   'while (offset < 25000 && (offset + ' + membersGroups.length + ') < ' + members_count + ')' // пока не получили 20000 и не прошлись по всем участникам
            +   '{'
                +   'members = members + "," + API.groups.getMembers({"group_id": ' + group_id + ', "v": "5.27", "sort": "id_asc", "count": "1000", "offset": (' + membersGroups.length + ' + offset)}).items;' // сдвиг участников на offset + мощность массива
                +   'offset = offset + 1000;' // увеличиваем сдвиг на 1000
            +   '};'
            +   'return members;'; // вернуть массив members

    VK.Api.call("execute", {code: code}, function(data) {
        if (data.response) {
            membersGroups = membersGroups.concat(JSON.parse("[" + data.response + "]")); // запишем это в массив
            $('.member_ids').html('Загрузка: ' + membersGroups.length + '/' + members_count);
            if (members_count >  membersGroups.length) // если еще не всех участников получили
                setTimeout(function() { getMembers20k(group_id, members_count); }, 333); // задержка 0.333 с. после чего запустим еще раз
            else // если конец то
                alert('Ура тест закончен! В массиве membersGroups теперь ' + membersGroups.length + ' элементов.');
        } else {
            alert(data.error.error_msg); // в случае ошибки выведем её
        }
    });
}
вконтакте
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Mr Morgan
    2020-02-07T01:55:40Z2020-02-07T01:55:40Z

    你需要使用execute方法

    该方法的文档非常清楚,该方法允许每个方法请求最多25 个API请求。 据我了解,您需要收集帖子中的所有评论(如果没有,请写在评论中)。 但是在这里您立即需要设置以下限制 :只有25 个请求,因此我们可以获得25 * 100条评论。(100 条因为对于 1 个对wall.getComments的请求,我们将获得不超过 100 条评论) 下一步是编写一个代码,该代码将从具体帖子。





    var post_id = Args.post_id;
    var owner_id = Args.owner_id;
    var count = Args.count;
    var offset = Args.offset;
    
    if(post_id == null || owner_id == null){
        return {"count": 0, "items": []};  // Если параметры не заданы, возвращаем пустой массив
    }
    if(count == null){
        count = 10; // Значение по умолчанию
    }
    if(offset == null){
        offset = 0; // Значение по умолчанию
    }
    var i = 0;
    var items = [];
    while(i < 25 && count > items.length){
        var cur_count = count - items.length;
        if(cur_count > 100){
            cur_count = 100;
        }
        items = items + API.wall.getComments({"owner_id": owner_id, "post_id": post_id, "offset": offset+100*i, "count": cur_count})["items"];
        i = i + 1;
    }
    return {"count": items.length, "items": items};
    

    此代码可以作为参数传递给执行(代码参数),以及与此参数一起传递的参数post_id和ower_id其余部分。
    第二个选项是在您的应用程序中创建一个过程,并已使用为您的应用程序接收到的令牌调用它,使用参数调用此过程,owner_id其余post_id部分。

    如何获得超过 2500 条评论?

    为此,您只需要使用不同的参数多次调用此代码offset(不断增加 2500) python3
    中的示例:

    from math import ceil
    import json,time
    
    import vk_api
    vk = vk_api.VkApi(token='...')  # Ваш токен
    api = vk.get_api()
    
    posts = api.wall.getById(posts='{owner_id}_{post_id}'.format(owner_id='<owner_id>', post_id='<post_id>'))  # Где <owner_id> - id пользователя/группы, post_id - id поста. *см. комментарии после кода
    
    if not posts:
        print('No posts found!')
    
    post = posts[0]
    posts = []
    
    for offset in range(ceil(post['comments']['count'] // 2500)):
        posts.extend(api.execute.getCommentsFromPost(owner_id='<owner_id>', post_id='<post_id>', offset=2500*offset, count=2500)['items'])  # тут всё по аналогии, как и в первый раз
        time.sleep(0.34)  # избегаем flood control
    
    with open('output.json', 'w') as file:
        json.dump(posts, file)
    

    需要注意的是,community id 应该用减号表示,例如-1。
    还值得一提的是,当多次调用同一个方法时,VK 会阻止对它的访问。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5