//Разбивалка запросов на части. © 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;