Giter VIP home page Giter VIP logo

vkr's Introduction

Travis-CI Build Status CRAN_Status_Badge

vkR is an R package which provides access to the VKontakte (VK) API.

Installation

To get the current released version from CRAN:

install.packages("vkR")

To get the current development version from github:

install.packages("devtools")
devtools::install_github("Dementiy/vkR")
library("vkR")

Authorization

Most API requests require the use of an access token. VK has several types of authorization mechanisms. Check out the documentation for more details.

vkOAuth(CLIENT_ID, 'SCOPE', 'EMAIL', 'PASSWORD')

where:

  • CLIENT_ID - is an application ID. You have to create new Standalone-app in VK to get ID (or use the already existing).
  • SCOPE - the list of comma separated access rights, e.g. 'friends,groups'- provide the access to user friends and groups. List of all rights can be found here.
  • EMAIL and PASSWORD - username and password.

If the EMAIL and PASSWORD have been omitted, a browser window will be opened. In the address bar an access token will be shown. Access token must be copied and passed as an argument into the following function:

setAccessToken(access_token = 'YOUR ACCESS TOKEN')

Example of use

At your own risk you can use mongodb and mongolite package for storing data:

> db_init()
> wall <- getWallExecute(domain="data_mining_in_action", count=0, use_db=TRUE, progress_bar=TRUE)
|======================...======================| 100%
> show_collections()
    db            collection       suffix count
1 temp data_mining_in_action         wall   232

If connection was aborted by some reasons we don't lose our data:

> wall <- getWallExecute(domain='privivkanet', count=0, use_db = T, progress_bar = T)
|=================                              |  25%
Show Traceback
 
 Rerun with Debug
 Error in curl::curl_fetch_memory(url, handle = handle) : 
  Operation was aborted by an application callback ...
> show_collections()
    db            collection       suffix count
1 temp data_mining_in_action         wall   232
2 temp           privivkanet         wall   916
> wall <- getWallExecute(domain='privivkanet', count=0, offset=916, use_db = T, progress_bar = T)
|======================...======================| 100%
> show_collections()
    db            collection       suffix count
1 temp data_mining_in_action         wall   232
2 temp           privivkanet         wall  3664

You can specify the collection name:

> wall <- getWallExecute(domain="data_mining_in_action", count=0, 
        use_db=TRUE, db_params=list('collection'='dm', 'suffix'='posts'), progress_bar=TRUE)
|======================...======================| 100%
> show_collections()
    db            collection       suffix count
1 temp data_mining_in_action         wall   232
2 temp           privivkanet         wall  3664
3 temp                    dm        posts   232

> friends <- getFriends()
> users <- getUsersExecute(friends$items, use_db = TRUE, db_params=list('collection'='my_friends'), progress_bar = TRUE)
> show_collections()
    db            collection       suffix count
1 temp data_mining_in_action         wall   232
2 temp           privivkanet         wall  3664
3 temp                    dm        posts   232
4 temp            my_friends                141

For load collection into a namespace you can use db_load_collection function:

> db_load_collection('data_mining_in_action', 'wall')
 Imported 232 records. Simplifying into dataframe...
> ls()
[1] "temp.data_mining_in_action.wall"
> nrow(temp.data_mining_in_action.wall)
[1] 232

Building a Friend Graph:

my_friends <- getFriends(fields = 'sex')
my_friends <- filter(my_friends$items, is.na(deactivated))
network <- getNetwork(my_friends$id)

library("igraph")
g <- graph.adjacency(as.matrix(network), weighted = T, mode = "undirected")
layout <- layout.fruchterman.reingold(g)
plot(g, layout = layout)

Analyzing community activity:

domain <- 'nipponkoku'
wall <- getWallExecute(domain = domain, count = 0, progress_bar = TRUE)
metrics <- jsonlite::flatten(wall$posts[c("date", "likes", "comments", "reposts")])
metrics$date <- as.POSIXct(metrics$date, origin="1970-01-01", tz='Europe/Moscow')

library(dplyr)
df <- metrics %>% 
  mutate(period = as.Date(cut(date, breaks='month'))) %>% 
  group_by(period) %>%
  summarise(likes = sum(likes.count), comments = sum(comments.count), reposts = sum(reposts.count), n = n())

library(ggplot2)
library(tidyr)
ggplot(data=gather(df, 'type', 'count', 2:5), aes(period, count)) + geom_line(aes(colour=type)) +
  labs(x='Date', y='Count')

Coomunity activity

You can find more examples in examples directory.

vkr's People

Contributors

dementiy avatar tonytonov avatar volokhonsky avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

vkr's Issues

Non-standard files/directories found at top level

R CMD CHECK отмечает:

checking top-level files ... NOTE
Non-standard files/directories found at top level:
  'examples' 'images'

Если эти файлы должны остаться в системе пользователя после установки, то их нужно переместить в inst. Если это только для гитхаба, то их надо занести в .Rbuildignore.

CRAN release

The latest version of jsonlite no longer includes the deprecated jsonlite::rbind.pages function. You have already fixed this here, but it is not on CRAN yet.

Would it be possible to do a release soon? Otherwise vkR can no longer be used with the current version of jsonlite (which no longer has jsonlite::rbind.pages)

Проблемы с файлом igraph_gefx_exporter.R

R CMD CHECK ругается на функцию saveAsGEXF:

checking R code for possible problems ... NOTE
saveAsGEXF: no visible global function definition for 'V'
saveAsGEXF: no visible global function definition for 'V<-'
saveAsGEXF: no visible global function definition for 'E'
saveAsGEXF: no visible global function definition for 'E<-'
saveAsGEXF: no visible global function definition for 'ecount'
saveAsGEXF: no visible binding for global variable 'get.edge'
saveAsGEXF: no visible global function definition for
  'list.vertex.attributes'
saveAsGEXF : <anonymous>: no visible global function definition for
  'get.vertex.attribute'
saveAsGEXF: no visible global function definition for
  'list.edge.attributes'
saveAsGEXF : <anonymous>: no visible global function definition for
  'get.edge.attribute'
saveAsGEXF: no visible global function definition for
  'list.graph.attributes'
saveAsGEXF : <anonymous>: no visible global function definition for
  'get.graph.attribute'
saveAsGEXF: no visible global function definition for 'write.gexf'
Undefined global functions or variables:
  E E<- V V<- ecount get.edge get.edge.attribute get.graph.attribute
  get.vertex.attribute list.edge.attributes list.graph.attributes
  list.vertex.attributes write.gexf

Незадокументированные аргументы функций

Релевантный кусок вывода R CMD CHECK:

checking Rd \usage sections ... WARNING
Undocumented arguments in documentation object 'getURLs'
  'message_body'

Undocumented arguments in documentation object 'has_error'
  'response'

Undocumented arguments in documentation object 'likesGetListForObjects'
  'objects'

Undocumented arguments in documentation object 'messagesGetHistory'
  'peer_id'

Undocumented arguments in documentation object 'messagesGetHistoryAll'
  'peer_id'

Undocumented arguments in documentation object 'messagesGetHistoryExecute'
  'peer_id'

Ошибка с API Version

wall <-
getWallExecute(
domain = "data_mining_in_action",
count = 0,
progress_bar = TRUE
)

Error: VK API request failed
VK error message [8]: Invalid request: v (version) is required

Пробовал указывать версию как числом, так строкой, так и функцией setAPIVersion(5.73)
Не срабатывает.
Также
getAPIVersion()
выдает
Error in getAPIVersion() : could not find function "getAPIVersion"

Подписчики

Пока сбор списка, на кого подписаны uid выдает ошибку по числу запросов в секундую

Ошибка при получении комментариев

Действую по https://vk.com/doc-89201406_442504700?dl=cf6aecc195b7a42c68.
Создаю объект wall и пытаюсь выполнить:
comments_list <- lapply(wall, vkR::wallGetCommentsList, progress_bar = TRUE)
После выкачивания (бар на 100%) получаю:
Ошибка в posts$comments :$ operator is invalid for atomic vectors
Пакет:
Package: vkR
Type: Package
Title: Access to VK API via R
Description: Provides an interface to the VK API https://vk.com/dev/methods.
VK https://vk.com/ is the largest European online social networking
service, based in Russia.
Version: 0.1
Date: 2016-12-01

Function me() error

Странная ошибка. Остальные функции работают.
2017-12-07_17-44-04

getUsersExecute- кодировка+сервисный ключ

Во-первых, хочу сказать спасибо за библиотеку!

Заметил несколько непоняток:

  1. Функция getUsersExecute возвращает кракозябры в кириллице, а между тем как, например, метод getGroupsMembers выдает все в читаемом виде. Попытка применить iconv в разных вариациях не помогла.
    http://prntscr.com/eyd9a7

  2. Функция getUsersExecute не работает с сервисным ключом доступа, хотя такая возможность указана в документации https://vk.com/dev/users.get. (Устаревший метод getUsers позволяет использовать сервисный ключ)

Кстати, пока и users.get и groups.getMembers работают вообще без токенов. Хотя ВК и обещает это изменить в скором времени. Возможно нужно сделать возможность использовать эти методы и без проверки авторизации. Работа без авторизации позволяет избежать ограничения на вызов апи макс 3 раза/сек.

  1. Не удалось запустить код из примера Building a Friend Graph
    http://prntscr.com/eydf95

wallGetCommentsList выдает ошибку если комментариев в посте больше 100

Функция wallGetCommentsList не может обрабатывать посты со 100 и более комментариями.
Выкачивает только комментарии первого уровня.
Результат функции нельзя передать ей повторно, чтобы скачать комментарии из тредов.

Функция wallGetComments выкачивает только комментарии первого уровня. Возможность скачать комментарии из тредов отсутствует совсем.

vkOAuth error

Пытаюсь авторизоваться vkOAuth(6372986, 'friends', 'my_mail', 'my_pass')
Получаю ошибку:
Error in if (!is.null(location) & grepl("access_token", location)) { :
argument is of length zero

С одного аккаунта авторизуюсь без проблем, второй выдает такое.

Another methods

Допустим, я хочу использовать метод вне пакета, напр photos.getById. Как мне его запустить, или писать функцию с нуля? Есть ли метод, который запустит другие методы API?

List of communities

Будет ли реализация поиска сообществ по тегам, тематике? Появится ли возможность отображать статусы сообществ (открытое/закрытое, официальное, сообщество-встреча и т.д.)?

queries.R добавить события в обработчик ошибок - предложение

Есть предложение - если POST запрос вернул чисто сетевую ошибку, например, "Error in open.connection(con, "rb") : Couldn't connect to server", то запрос необходимо повторить несколько раз, а уже потом выдавать ошибку и останавливать скрипт.

Часто такое бывает, что запрос не отрабатывает по техническим причинам (загруженность серверов, потери пакетов и т.д.) Неудобно, что из-за такой мелочи останавливается весь скрипт, и его надо перезапускать руками.

getGroupsById ошибка при больших количествах group_ids

Функция возвращает ошибку. (Видимо, при слишком длинной строке group_ids)

# тут все ок
groups_count <- getGroupsById(group_ids=paste(c(1:232), collapse = ","), fields='members_count')

# добавляем еще один group_id
groups_count <- getGroupsById(group_ids=paste(c(1:233), collapse = ","), fields='members_count')
Error: lexical error: invalid char in json text.
                                       https://api.vk.com/method/group
                     (right here) ------^

Ограничения контакта на максимальное число идентификаторов (500) не нарушаются.

# сами по себе идентификатор группы 233 ошибок не вызывает
# тут все снова ок
groups_count <- getGroupsById(group_ids=paste(c(230:235), collapse = ","), fields='members_count')

Надо заметить, что число 232 не является волшебным. По мере увеличения разрядности самих идентификаторов минимальное количество групп для появления ошибки уменьшается.

И, насколько я заметил, до недавнего (возможно до правки бага #18) функция работала без ошибок при тех же условиях.

GetWallExecute puts warnings

При вызове getWallExecute не происходит возврата списка постов. При этом функция кидает warning типа такого: "Parameter "count" was tuned: 117 per request.". И иногда еще вот такую ошибку: "Error in curl::curl_fetch_memory(url, handle = handle) : Operation was aborted by an application callback".
2017-11-27_19-15-41

GetWallExecute не работает

При использовании метода GetWallExecute не могу получить никаких данных.
Включаю прогресс бар и он все время на нуле.

`

domain <- 'kingfestival'
wall <- getWallExecute(domain = domain, count = 0, progress_bar = TRUE)
| | 0%
`

image

В чем может быть проблема? Не могу понять, может со стороны апи вк?
Обычный метод, не Execute работает, но все время пишет, что он устаревший.

UPD.
Если очень долго подождать, то все прерывается и выдает такую ошибку
Error in curl::curl_fetch_memory(url, handle = handle) : OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054 In addition: There were 50 or more warnings (use warnings() to see the first 50)

image

getNetwork пропал

Не смог повторить построение графа друзей из примера.
Функция getNetwork не найдена

Error in getNetwork(my_friends$id) : could not find function "getNetwork"

ставил пакет с github

Проблема с получением access token'а

Когда я пытаюсь авторизоваться, вместо открытия окна я получаю следующую ошибку:
Ошибка в curl::curl_fetch_memory(url, handle = handle) :
URL using bad/illegal format or missing URL
Я знаю, что curl не очень хорошо работает под виндой, но не уверен, в этом ли проблема.

annulment vkOAuth

Есть несколько ключей доступа. Хочу сделать, чтобы в процессе исполнения скрипт переключался от одного ключа к другому. Но если после одного vkOAuth сделать другой, вылазит ошибка
Error in if (!is.null(location) & grepl("access_token", location)) { :
argument is of length zero
Как сперва выключить одну vkOAuth чтобы заработала другая учетка?

Проверки на использование в интерактивном режиме

Как правильно советует @artemklevtsov, перед вызовом browseURL и любых других функций, ожидающих ответа пользователя, необходимо проверять, что сессия интерактивна. Это проще всего делать через функцию interactive.

Пример: https://github.com/Dementiy/vkR/blob/master/R/auth.R#L35
Это наверняка не единственное такое место.

GetWallExecute фильтры

Привет. Есть такие вопросы: можно ли сделать GetWallExecute от определенной даты и можно ли не забирать тексты сообщений?
Ситуация такая: собираю лайки в определенных сообществах. Есть только список сообществ.
Я хочу получить список постов за определенный период, чтобы по каждому собрать список лайков.
При этом желательно получать ещё число лайков для каждого поста (и перепостов), чтобы потом делать меньше запросов. Сейчас использую GetWallExecute. Проблема в том, что мне приходится собирать список вообще всех постов, чтобы потом отфильтровать их по дате. Вторая проблема- метод передает ещё и текст поста, что нагружает результат, выдает специфические ошибки. + При многократном вызове GetWallExecute появляется ошибка: C stack usage, на Windows вообще при удалении объекта GetWallExecute остается занята оператива.

getGroupsMembersExecute - Error

Трудноуловимая ошибка. Конкретный пример:

getGroupsMembersExecute(1, fields = 'sex,bdate,city,country,relation,last_seen')
Error: lexical error: invalid char in json text.
                                       <html>  <head><title>404 Not Fo
                     (right here) ------^

Подсказки:
Ошибка появляется не всегда. Она проявляется при сочетании двух факторов:

а) длины переменной fields. Если в fields будет меньше параметров, то функция отработает без ошибки. Например:
getGroupsMembersExecute(1, fields = 'sex,bdate,city') # ошибок нет

б) количества пользователей в группе. Если группа малочисленна, то функция отработает без ошибки. Например, возьмем группу с group_id=20. (всего 4483 пользователей):
getGroupsMembersExecute(20, fields = 'sex,bdate,city,country,relation,last_seen') # ошибок нет

Вывод: по приблизительным оценкам ошибка проявляется, если в поле fields указаны больше трех параметров И размер группы больше ~50К пользователей.

Видимо, существует некий критический объем данных. Если предпринимается попытка получить из api данные большего объема, то ошибка проявляется. Где-то ловится 404 Not Found.

P/S В методе getGroupsMembers таких ошибок не наблюдалось.

Invalid request: versions below 5.81 are deprecated

Добрый день! Пытаюсь выполнить примерно вот такой код:

setAccessToken(access_token = 'xxxxxx')
vkR::getWallExecute(domain = 'overhear_berdsk', v = '5.81')

на что мне возвращает ошибку:
Error in vk_stop(message = response$error$error_msg, error_code = response$error$error_code): Invalid request: versions below 5.81 are deprecated. Version param should be passed as "v". "version" param is invalid and not supported. For more information go to https://vk.com/dev/constant_version_updates
Traceback:

  1. vkR::getWallExecute(domain = "overhear_berdsk", v = "5.131")
  2. execute(code)
  3. try_handle_error(response)
  4. tryCatch(vk_stop(message = response$error$error_msg, error_code = response$error$error_code),
    . vk_error14 = function(e) {
    . params <- handle_captcha(response$error)
    . return(repeat_last_query(params = params, n = 6))
    . }, vk_error17 = function(e) {
    . handle_validation(response$error)
    . return(repeat_last_query(n = 6))
    . }, vk_error6 = function(e) {
    . request_delay()
    . return(repeat_last_query(n = 6))
    . })
  5. tryCatchList(expr, classes, parentenv, handlers)
  6. tryCatchOne(tryCatchList(expr, names[-nh], parentenv, handlers[-nh]),
    . names[nh], parentenv, handlers[[nh]])
  7. doTryCatch(return(expr), name, parentenv, handler)
  8. tryCatchList(expr, names[-nh], parentenv, handlers[-nh])
  9. tryCatchOne(tryCatchList(expr, names[-nh], parentenv, handlers[-nh]),
    . names[nh], parentenv, handlers[[nh]])
  10. doTryCatch(return(expr), name, parentenv, handler)
  11. tryCatchList(expr, names[-nh], parentenv, handlers[-nh])
  12. tryCatchOne(expr, names, parentenv, handlers[[1L]])
  13. doTryCatch(return(expr), name, parentenv, handler)
  14. vk_stop(message = response$error$error_msg, error_code = response$error$error_code)

Пробовал не ставить параметр v, и ставить разные цифры туда. Подскажите, пожалуйста, как я могу исправить проблему? Спасибо!

Ошибка при использовании любого метода

Видимо, что-то поменялось в API в ВК. При вызове любой функции из пакета выдается ошибка:

> getGroupsForUsers(1)
Ошибка: VK API request failed
VK error message [8]: Invalid request: v is required. Version param should be passed as "v". "version" param is invalid and not supported.

Где этот "version" в коде, я так и не смог найти.

groupsSearch поисковый запрос не может содержать больше одного слова

Если в поисковой строке больше одного слова, то возвращает ошибку:

groupsSearch(q="здоровое питание", country_id = 1, count = 1000)
Error in open.connection(con, "rb") : HTTP error 400.

Никакие вариации на тему, q="'здоровое питание'" или q=с("здоровое", "питание") не помогают.

Music search

Будет ли реализован поиск по аудио трекам, исполнителям, сбор списков аудитории исполнителей, треков, парсинг аудио записей пользователей?

usersGetFollowers - дубликаты в выдаче (очень много)

В выдаче функции большая часть фолловеров продублированы по нескольку раз. Хотя суммарное число выданных фолловеров = заявленному во ВКонтакте.

library("vkR")
library(data.table)
library(magrittr)

# получаем подписчиков Филиппа Киркорова )))
followers <- usersGetFollowers(273251945, fields='sex,bdate', flatten=TRUE)
followers <- followers$followers
dim(followers)
[1] 93237     6   # совпадает с заявленным числом поклонников Бедросовича в  ВК :)

# проверяем на уникальность по id
dim(subset(followers, duplicated(id))) 
[1] 62236     6  # это все дубли!
dim(subset(followers, !duplicated(id)))
[1] 31001     6  # это уникальные фолловеры

# выведем дубликаты для контроля просортировав их по id
test_duplicate <- subset(followers, duplicated(id))
head(test_duplicate[order(test_duplicate[,1]),], n=10)
         id first_name last_name sex      bdate deactivated
37370 26564    Татьяна    Зорьян   1 30.12.1987        <NA>
59370 26564    Татьяна    Зорьян   1 30.12.1987        <NA>
81370 26564    Татьяна    Зорьян   1 30.12.1987        <NA>
69280 69567     Оксана Плешакова   1   2.5.1986        <NA>
91280 69567     Оксана Плешакова   1   2.5.1986        <NA>
37153 88085       Илья   Босенок   2       <NA>        <NA>
59153 88085       Илья   Босенок   2       <NA>        <NA>
81153 88085       Илья   Босенок   2       <NA>        <NA>
41739 91863  Анастасия  Семенова   1  30.8.1984        <NA>
63739 91863  Анастасия  Семенова   1  30.8.1984        <NA>

# альтернативный скрипт вывода уникальных id
test_duplicate <- as.data.table(followers) %>% setkey(id) %>% unique
dim(test_duplicate)
[1] 31001     6

getArbitraryNetwork Exeption

members = int [1:80870] - набор пользователей группы ВК

> members_network <- getArbitraryNetwork(members)
Ошибка в `colnames<-`(`*tmp*`, value = c("from", "to")) :
  attempt to set 'colnames' on an object with less than two dimensions

Ошибка появляется спустя длительное время. Хотелось бы предварительная валидация, дабы не ждать длительное время + описание ошибки

Invalide access tocken following vkOAuthWeb

Following an authentificatio using vkOAuthWeb I'm getting error message when trying to run api call.

Try to run:
member_list = getGroupsMembers( group_id = "newprague")
return:
Error: VK API request failed
VK error message [5]: User authorization failed: invalid access_token (4).

I think it is because vkOAuthWeb return "access_token=XXXXX...". shouldn't it return only the token without the "access_token= " in front?

getGroupsForUsers и getGroupsForUsers не совпадают

Привет. Есть группа 86359614. Там есть пользователь 186726546, но почему-то когда я забираю её группы через getGroupsForUsers, то в наборе групп 86359614 нет. И такое с этой группой очень часто. В чем причина и как с этим бороться, чтобы по пользователю получать полный набор групп?

Ошибка в usersGetSubscriptions

Во время опроса API по списку пользователей для получения подписок с одним из пользователей получил ошибку. Выбрал id пользователя, запрос его подписок выдаёт ошибку:

> vkR::usersGetSubscriptions(user_id = 244699353) 
Error: all(vapply(pages, is.data.frame, logical(1))) is not TRUE

Не подскажете, в чём дело?

likesGetList for 1000+ likes

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

Bot API

Появятся ли инструменты создания спам-ботов для отправления личных сообщений другим пользователям, выкладка фотографий и т.д.?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.