VK API снипет ращепления запроса.

gluckbahr

Client
Регистрация
05.04.2014
Сообщения
84
Благодарностей
25
Баллы
18
Уважаемые коллеги помогите найти ошибку
Задача снипета получить переменную значение <1000
И строку из списка
получает ссылку из списка apiRequestsX и число из {-Variable.resultsInRecentRequest-}
результат: в конец списка дописать варианты частичного ращепление
если в ссылке не указан пол или указан 0 то ращепить эту ссылку на тот же вариант но с sex=1 и sex=0
Но сейчас получается что он ращепляет ссылку https://api.vk.com/method/users.sea...e_from=14&age_to=14&has_photo=1&access_token=
на перебирая все месяца
https://api.vk.com/method/users.sea...has_photo=1&sex=2&birth_month=1&access_token=


Код:
//Разбивалка запросов на части. © Nikolay Komarov, 2015
//ожидается, что есть список с именем apiRequests и переменная resultsInRecentRequest
//в цикле на «кубиках» эти запросы дёргаются, и если вернулось меньше 1000 ответов, то
//запрос удаляется из списка. Если вернулось больше, то запрос остаётся в списке, а в
//переменную resultsInRecentRequest кладётся само количество ответов (оно доступно)
//после этого проверяется, что в запросе нет слова &sort=, в таком случае разбиение уже невозможно
//в результате работы сниппета элементы списка дробятся, так что при получении слишком большого списка ответов
//можно просто вызвать сниппет и отправлять запросы снова, удаляя из списка удавшиеся,
//пока в первом запросе не появится слово sort - это признак того, что дальше дробить некуда
/*
    bool varFound = false;
    foreach(ILocalVariable variable in project.Variables)
    {
        if(variable.Name == "resultsInRecentRequest")
            varFound = true;
    }
    if(!varFound)
    //add this fucking var
        return 0;*/
      
int resultsInRecentRequest = 0;
bool parseResult = int.TryParse(project.Variables["resultsInRecentRequest"].Value, out resultsInRecentRequest);
if(!parseResult)
{
    project.SendErrorToLog("ИСКЛЮЧИТЕЛЬНАЯ СИТУАЦИЯ! Не могу сконвертировать " + project.Variables["resultsInRecentRequest"].Value + " в целое число!");
    project.SendErrorToLog("ОБРАБОТКА ЗАПРОСОВ ПРЕРВАНА В СНИППЕТЕ!");
    return -2;
}
  
if(resultsInRecentRequest <= 1000)
{
    project.SendErrorToLog("ИСКЛЮЧИТЕЛЬНАЯ СИТУАЦИЯ! Результатов в последнем запросе меньше тысячи, а именно " + resultsInRecentRequest);
    project.SendErrorToLog("Незачем расщеплять этот запрос, ОБРАБОТКА В СНИППЕТЕ ПРЕРВАНА!");
    return -1;
}
// получаем список, в котором будем искать
var requests = project.Lists["apiRequestsX"];
//для тестирования закомментировать предыдущую строчку и раскомментировать три следующие
//List<String> requests = new List<string>(10);
//requests.Add("https://api.vk.com/method/users.search.xml?count=10&q=VARparam_q&country=VARparam_country&city=VARparam_city&age_from=VARparam_age_from&age_to=VARparam_age_to&age_to=VARparam_age_to&birth_day=VARparam_birth_day&birth_month=VARparam_birth_month&birth_year=VARparam_birth_year&has_photo=VARparam_has_photo&has_photo=VARparam_has_photo&from_list=VARparam_from_list&group_id=VARparam_group_id&status=VARparam_add_status&interests=VARparam_add_interests&access_token=VARtoken");
//requests.Add("https://api.vk.com/method/users.search.xml?count=10&q=VARparam_q&country=VARparam_country&city=VARparam_city&sex=VARparam_sex&age_from=VARparam_age_from&age_to=VARparam_age_to&age_to=VARparam_age_to&birth_day=VARparam_birth_day&birth_month=VARparam_birth_month&birth_year=VARparam_birth_year&has_photo=VARparam_has_photo&has_photo=VARparam_has_photo&from_list=VARparam_from_list&group_id=VARparam_group_id&status=VARparam_add_status&interests=VARparam_add_interests&access_token=VARtoken");
// ищем в каждой строчке в списке
    //        List<String> requests(List<String> requests, int resultsInRecentRequest)
    if (requests.Count == 0)
    {
        project.SendErrorToLog("ИСКЛЮЧИТЕЛЬНАЯ СИТУАЦИЯ! Список запросов пуст.");
        return 666;
    }
  
    project.SendInfoToLog("Начальное значение переменной results in Recent Request: " + resultsInRecentRequest);
    project.SendInfoToLog("Начальное количество запросов в списке apiRequests: " + requests.Count);
    int counter = 1, splitCounter = 0;
    string request;
    decimal answersForecast;
    for(;((answersForecast = resultsInRecentRequest / requests.Count) > 1000 && splitCounter < 100);splitCounter++)
    {
        project.SendInfoToLog("счётчик расщепления splitCounter = " + splitCounter);
        request = requests[0];
        requests.RemoveAt(0);
        //в 2 раза
        if (!request.Contains("sex=") || request.Contains("sex=&") )
        {
            requests.Add(request.Replace("&access_token", "&sex=2&access_token"));
            requests.Add(request.Replace("&access_token", "&sex=1&access_token"));
            continue;
        }
        //в 12 раз
        if (!request.Contains("birth_month=") || request.Contains("birth_month=&"))
        {
            for (counter = 1; counter <= 12; counter++)
            {
                requests.Add(request.Replace("&access_token", "&birth_month=" + counter + "&access_token"));
            }
            continue;
        }
        //в 31 раз
        if (!request.Contains("birth_day=") || request.Contains("birth_day=&"))
        {
            for (counter = 1; counter <= 31; counter++)
            {
                requests.Add(request.Replace("&access_token", "&birth_day=" + counter + "&access_token"));
            }
            continue;
        }
        //в 47 раз
        if ((!request.Contains("age_from=") && !request.Contains("age_to=") && !request.Contains("birth_year=")) ||
            (    (request.Contains("age_from=&") && request.Contains("age_to=&") && request.Contains("birth_year=&"))))
        {
            for (counter = DateTime.Now.Year - 65; counter <= DateTime.Now.Year - 18; counter++)
            {
                requests.Add(request.Replace("&access_token", "&birth_year=" + counter + "&access_token"));
            }
            continue;
        }
        //последняя попытка, просто сортировкой - до двух раз, но возможно, с пересечениями
        if (!request.Contains("sort=") || request.Contains("sort=&"))
        {
            requests.Add(request.Replace("&access_token", "&sort=0&access_token"));
            requests.Add(request.Replace("&access_token", "&sort=1&access_token"));
            continue;
        }
        //необработанные параметры
        //country=VARparam_country&
        //city=VARparam_city&
        //group_id
        //interests";
        //в текущем запросе нечего расщеплять, добавим его в конец списка
        project.SendInfoToLog("Нечего расщеплять в запросе " + request);
        project.SendInfoToLog("Пропускаем его и ищем следующий запрос...");
      
        requests.Add(request);
    }
    project.Variables["resultsInRecentRequest"].Value = answersForecast.ToString();
    project.SendInfoToLog("Расщепление завершено в " + splitCounter + " шагов");
    project.SendInfoToLog("Ожидаемое количество ответах в будущих запросах, в среднем " + answersForecast);
    project.SendInfoToLog("В итоге запросов в списке стало: " + requests.Count);
    return requests.Count;
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)