image

В этой статье я расскажу о хранимых процедурах. Как их использовать и зачем, лимиты, примеры крутых процедуры которые я использую.

Хранимые процедуры позволяют исполнять код на стороне сервера API аналогично методу execute, но без передачи кода процедуры по сети.
Хранимая процедура — это заданный алгоритм, позволяющий Вам реализовать быстрый вызов сразу нескольких методов API, аналогично принципу работы метода execute, но без передачи кода по сети (в запросе необходимо указывать только имя процедуры и необходимые параметры).

Создавать новые хранимые процедуры Вы можете на соответствующей вкладке раздела редактирования Вашего приложения.
Код для хранимых процедур пишется на VKScript языке.

image
VKScript для метода execute получается не всегда маленький, и передавать его в запросе очень жирно. Так же для хранимых процедур реализован удобный клиент прямо в Вконтакте. Дергать процедуру по ее названию, в этом случае передавать code уже не нужно. Не используя хранимые процедуры при отправке запросов с клиента, ваш код отправляемый к API, можно посмотреть.
Отправляя код с браузера к API, его может посмотреть любой человек. При отправке только названия хранимой процедуры и параметров, код будет не доступен.

Лимиты

Макс. запросов в секунду 3
Макс. размер ответа 5 МБ
Макс. кол-во обращение внутри процедуры к методам API 25
Макс. кол-во операций внутри процедуры 1000


Мои процедуры


  • Умный поиск людей, без даты рождения и точного города — не важно указан у пользователя в профиле город или дата рождения.
    execute.userSearch
    • Шаг 1
      1. ФИО, дата рождения, город. По данным полям ищем совпадения среди аккаунтов сети Вконтакте, у которых есть фото. В случае, если находим 2 и более аккаунтов используем тот, у которого дата последнего входа максимальна. В случае, если ничего не найдено переходим на Шаг 2.

    • Шаг 2
      1. Используя данные по фамилии и имени, дате рождения производим повторный поиск.
        В случае, если находим 2 и более аккаунтов, переходим на Шаг 3.2. В случае, если ничего не найдено переходим на Шаг 3.3.

    • Шаг 3
      1. Ищем 10 самых популярных групп выбранного города Вконтакте.
      2. В этих группах ищем по ФИ, Дате рождения, страна Россия, есть фото. Если что-то нашлось, то сохраняем текущий результат, иначе идем в шаг 3.3.
      3. По группам ищем по ФИ, страна Россия, есть фото. Если что-то нашлось сохраняем результат, иначе «пусто».

    var name = Args.fullname;
    var birth_day = Args.birth_day;
    var birth_month = Args.birth_month;
    var birth_year = Args.birth_year;
    var city = Args.city;
    var fields = "photo_id, sex, bdate, city, country, home_town, photo_max_orig, contacts, site, education, universities, schools, status, last_seen, followers_count, common_count, occupation, nickname, relatives, relation, personal, connections, exports, activities, interests, music, movies, tv, books, games, about, quotes, can_post, can_see_all_posts, can_see_audio, can_write_private_message, can_send_friend_request, is_favorite, is_hidden_from_feed, timezone, screen_name, maiden_name, career, military";
    var countGroups = 10;
    var res = [];
    var item = {};
    
    var city_id = 0;
    if (city != "") {
        city_id = API.database.getCities({"q": city, "country_id": 1}).items@.id[0];
    }
    if (birth_day != "" && city_id > 0) {
        item = API.users.search({
                  "q": name,
                  "country":1,
                  "city": city_id,
                  "has_photo":1,
                  "fields": fields,
                  "birth_day": birth_day,
                  "birth_month": birth_month,
                  "birth_year": birth_year
                }).items;
            var i = 0;
            while (i < item.length) {
                var item_ = item[i];
                item_.criterion = "Дата рождения, ФИО, Город";
                item_.step = "1.1";
                res.push(item_);
                i = i +1;
            }
    } else {
        countGroups = countGroups + 1;
    }
    
    if (item.length > 0) {
        return res;
    }
    if (birth_day != "") {
            item = API.users.search({
              "q": name,
              "country": 1,
              "has_photo": 1,
              "fields": fields,
              "birth_day": birth_day,
              "birth_month": birth_month,
              "birth_year": birth_year
            }).items;
            var i = 0;
            while (i < item.length) {
                var item_ = item[i];
                item_.criterion = "Дата рождения, ФИО";
                item_.step = "2.1";
                res.push(item_);
                i = i +1;
            }
    }
    if (item.length > 0) {
        return res;
    }
    
    if (city.length > 0) {
        var groupsIDs = API.groups.search({
          "q": city,
          "sort": 6,
          "type": "page",
          "count": countGroups
        }).items@.id;
    
      var count = 0;
      while (count < groupsIDs.length) {
            var item2 = {};
            if (birth_day != "") {
              item2 = API.users.search({
                "q": name,
                "country":1,
                "has_photo":1,
                "fields": fields,
                "birth_day": birth_day,
                "birth_month": birth_month,
                "birth_year": birth_year,
                "group_id": groupsIDs[count]
              }).items;
            }
          if (item2.length > 0) {
                var i = 0;
                while (i < item2.length) {
                    var item_ = item2[i];
                    item_.criterion = "Дата рождения, ФИО, Состоит в пабликах города";
                    item_.step = "3.2";
                    item_.groupID = groupsIDs[count];
                    res.push(item_);
                    i = i +1;
                }
          } else {
              item2 = API.users.search({
                "q": name,
                "country":1,
                "has_photo":1,
                "fields": fields,
                "count": 5,
                "group_id": groupsIDs[count]
              }).items;
                var i = 0;
                while (i < item2.length) {
                    var item_ = item2[i];
                    item_.criterion = "ФИО, Состоит в пабликах города";
                    item_.step = "3.3";
                    item_.groupID = groupsIDs[count];
                    res.push(item_);
                    i = i +1;
                }
          }
          count = count + 1;
      }
    }
    return res;


  • Получить список дат рождения друзей пользователя — я использовал этот метод для определения примерного возраста человека.
    execute.getFriendsBDates
    
    var response = "";
    
    var bdates = API.friends.get({"user_id": Args.user_id, "fields": "bdate", "v": "5.103"}).items@.bdate;
    response = response + bdates;
    
    if (!bdates.length || bdates[0].length == 5000) {
        response = response + API.friends.get({"user_id": Args.user_id, "fields": "bdate", "offset": "5000", "v": "5.103"}).items@.bdate;
    }
    
    return response;
    


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


  • Получить список друзей пользователей.
    execute.getFriends
    
    var user_ids = Args.user_ids.split(',');
    
    var friends = API.friends.get({"user_id": user_ids[0], "v": "5.27", "sort": "id_asc", "count": "10000"}).items;
    var i = 1;
    while (user_ids.length > i && i < 25)
    {
        friends = friends + "," + API.friends.get({"user_id": user_ids[i], "v": "5.27", "sort": "id_asc", "count": "10000"}).items;
        i = i + 1;
    }
    return friends;
    


  • Поиск людей в сообществах по запросу, к примеру состоят ли пользоватли в группах с названием «Кино онлайн».
    execute.isMemberGroups
    
    var groups = API.groups.search({"q": Args.q, "v": "5.27", "offset": Args.offset, "count": "24"}).items;
    var members = [];
    var i = 0;
    while (groups.length > i)
    {
        var groupIsMember = [];
        groupIsMember.members = API.groups.isMember({"group_id": groups[i].id, "user_ids": Args.user_ids, "v": "5.27"});
        groupIsMember.group_id = groups[i].id;
        members.push(groupIsMember);
        i = i + 1;
    }
    return members;
    


Комментарии (0)