Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

likesGetList for 1000+ likes #27

Open
rekonchik opened this issue Oct 22, 2017 · 5 comments
Open

likesGetList for 1000+ likes #27

rekonchik opened this issue Oct 22, 2017 · 5 comments

Comments

@rekonchik
Copy link

Привет. Есть способ выгружать список всех пользователей ставивших лайки для объектов с более 1000 лайками? Пример: likesGetList(type = "post",owner_id = '-9693056',item_id = 1444195)

@rekonchik
Copy link
Author

Добавил параметр offset в функцию. Внутри while забираю до максимального поста с лайками, где больше 1000 поставлено.
Единственное, не разобрался, как getWallExecute после того как заберу фильтровать, чтобы не производить лишнюю работу по запросам к ВК.

@Dementiy
Copy link
Owner

Попробуй посмотреть эти функции: https://gist.github.com/Dementiy/22ba40c8d56962f54059650d1fd806c0

@rekonchik
Copy link
Author

Для ряда задач может пригодиться) Иногда нужно с указанием лайков получать результат.

@rekonchik
Copy link
Author

rekonchik commented Nov 2, 2017

Кстати, внутри https://gist.github.com/Dementiy/22ba40c8d56962f54059650d1fd806c0 есть likesGetListForObjects, тоже ведь только 1000 пользователей собирает, а остальных игнорирует?

zzz1 <- data.table(owner_id = -9693056,
id = 1444195)
likesGetListForObjects(objects = zzz1,type = "post")
вернет 1000 внутри функции, а по факту там >10 тыс.
Я обошел эту проблему за счёт смещения (offset) с шагом в 1000, но дополнительной функцией.

likesGetListForObjects1 <- function(objects, type = 'post', filter = 'likes', friends_only = 0, extended = 0, skip_own = 0, progress_bar = FALSE, v = getAPIVersion(),offset_value=0) {
get_likes <- function(objects, type = 'post', filter = 'likes', friends_only = 0, extended = 0, skip_own = 0, v = getAPIVersion()) {
num_requests <- ceiling(nrow(objects) / 25)
from <- 1
to <- 25
likes <- list()
for (i in 1:num_requests) {
code <- 'var likes_per_object = {}; var likes;'
if (to > nrow(objects))
to <- nrow(objects)
for (index in from:to) {
owner_id <- objects[index, ]$owner_id
obj_id <- objects[index, ]$id

    code <- paste0(code, 'likes = API.likes.getList({
                   "type":"', type, '",
                   "owner_id":"', owner_id, '",
                   "item_id":"', obj_id, '",
                   "page_url":"', '', '",
                   "filter":"', filter, '",
                   "friends_only":"', friends_only, '",
                   "extended":"', extended, '",
                   "skip_own":"', skip_own, '",
                   "count":"', 1000, '",
                   "offset":"', offset_value, '",
                   "v":"', v, '"}).items;
                   likes_per_object.obj', obj_id, "=likes;", sep = "")
}
  code <- paste0(code, 'return likes_per_object;')
  likes <- append(likes, execute(code))
  from <- from + 25
  to <- to + 25
}

obj_ids <- unlist(strsplit(names(likes), "obj", fixed = T))
obj_ids <- as.integer(obj_ids[obj_ids != ""])
names(likes) <- obj_ids #objects$id
likes

}

if ("posts.list" %in% class(objects))
objects <- objects$posts

likes <- list()
from <- 1
max_count <- nrow(objects)
to <- ifelse(max_count >= 75, 75, max_count)

if (progress_bar) {
pb <- txtProgressBar(min = 0, max = nrow(objects), style = 3)
setTxtProgressBar(pb, 0)
}

repeat {
likes75 <- get_likes(objects[from:to, ],
type = type,
filter = filter,
friends_only = friends_only,
extended = extended,
skip_own = skip_own,
v = v)
likes <- append(likes, likes75)

if (progress_bar)
  setTxtProgressBar(pb, length(likes))

if (to >= max_count)
  break

from <- to + 1
to <- ifelse(to + 75 >= max_count, max_count, to + 75)

}

if (progress_bar)
close(pb)

class(likes) <- c(class(likes), paste0("vk.likes_per_", type))
likes
}
И провожу её в цикле while

@rekonchik
Copy link
Author

rekonchik commented Nov 2, 2017

likesGetListForObjects1 <- function(objects, type = 'post', filter = 'likes', friends_only = 0, extended = 0, skip_own = 0, progress_bar = FALSE, v = getAPIVersion(),offset_value=0) {
  get_likes <- function(objects, type = 'post', filter = 'likes', friends_only = 0, extended = 0, skip_own = 0, v = getAPIVersion()) {
    num_requests <- ceiling(nrow(objects) / 25)
    from <- 1
    to <- 25
    likes <- list()
    for (i in 1:num_requests) {
      code <- 'var likes_per_object = {}; var likes;'
      if (to > nrow(objects))
        to <- nrow(objects)
      for (index in from:to) {
        owner_id <- objects[index, ]$owner_id
        obj_id <- objects[index, ]$id
        
        code <- paste0(code, 'likes = API.likes.getList({
                       "type":"', type, '",
                       "owner_id":"', owner_id, '",
                       "item_id":"', obj_id, '",
                       "page_url":"', '', '",
                       "filter":"', filter, '",
                       "friends_only":"', friends_only, '",
                       "extended":"', extended, '",
                       "skip_own":"', skip_own, '",
                       "count":"', 1000, '",
                       "offset":"', offset_value, '",
                       "v":"', v, '"}).items;
                       likes_per_object.obj', obj_id, "=likes;", sep = "")
    }
      code <- paste0(code, 'return likes_per_object;')
      likes <- append(likes, execute(code))
      from <- from + 25
      to <- to + 25
    }
    
    obj_ids <- unlist(strsplit(names(likes), "obj", fixed = T))
    obj_ids <- as.integer(obj_ids[obj_ids != ""])
    names(likes) <- obj_ids #objects$id
    likes
  }
  
  if ("posts.list" %in% class(objects))
    objects <- objects$posts
  
  likes <- list()
  from <- 1
  max_count <- nrow(objects)
  to <- ifelse(max_count >= 75, 75, max_count)
  
  if (progress_bar) {
    pb <- txtProgressBar(min = 0, max = nrow(objects), style = 3)
    setTxtProgressBar(pb, 0)
  }
  
  repeat {
    likes75 <- get_likes(objects[from:to, ],
                         type = type,
                         filter = filter,
                         friends_only = friends_only,
                         extended = extended,
                         skip_own = skip_own,
                         v = v)
    likes <- append(likes, likes75)
    
    if (progress_bar)
      setTxtProgressBar(pb, length(likes))
    
    if (to >= max_count)
      break
    
    from <- to + 1
    to <- ifelse(to + 75 >= max_count, max_count, to + 75)
  }
  
  if (progress_bar)
    close(pb)
  
  class(likes) <- c(class(likes), paste0("vk.likes_per_", type))
  likes
}

И провожу её в цикле while

@rekonchik rekonchik reopened this Nov 2, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants