Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

VkInviter – приглашатель-помощник менеджерам групп ВКонтакте

Anna | 17.06.2014 | нет комментариев
Всем добродушного дня!

Я являюсь менеджером одной музыкальной группы ВКонтакте (дальше – ВК). Музыканты Зачастую ездят с гастролями по различным городам России и странам СНГ. Один из методов оповестить фанатов группы о грядущем концерте в их городе – разослать приглашения на соответствующую встречу ВК.
В статье хочу показать одно из допустимых решений этой задачи.

Верю, что данная статья будет пригодна иным менеджерам групп, число приглашений пользователей на события не в их городе уменьшится и огромнее людей разблокирует вероятность приглашать их на встречи!

Раньше каждого, вы обязаны являться менеджером группы ВК и данная группа должна быть организатором встречи в ВК.

Решение «Все сделать вручную»

Присутствующий интерфейс разрешает сделать такую рассылку вручную через меню встречи:
«Пригласить друзей» – «Пригласить участников группы»:

Минусы этого решения очевидны:

  • Длинно, т.к. в некоторых городах число участников огромнее нескольких тысяч
  • Немыслимо исполнить приглашение участников, проживающих в определенном городе
Решение «Автоматизировать процесс»

Тут есть два подхода: написать приложение с поддержкой ВК API либо standalone через post-get запросы.

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

Следственно, придется исследовать post-get запросы, и написать «симулятор» пользователя.

Разглядим основные этапы работы:

  • Авторизация пользователя
  • Приобретение участников группы в определенном городе
  • Рассылка приглашений
Авторизация

С логином все довольно легко – POST запрос по адресу login.vk.com:
act=login&q=1&al_frame=1&expire=1&captcha_sid=&captcha_key=&from_host=vk.com&from_protocol=http&email=USERNAME&pass=PASSWORD
В результат получаем параметр location с адресом, на тот, что будет исполнен редирект:
http://vk.com/login.php?act=slogin&al_frame=1&hash=bd7aed27961c325b407332b5855fa1c1&s=1 

Позже редиректа в куки записывается параметр remixsid – идентификатор сессии, тот, что является подтверждением удачной авторизации

Поклонники из города N

Для приобретения списка участников группы из определенного города воспользуемся стандартным поиском vk.com/search, нам исключительно значим данный комплект фильтров:

Исполнить поиск по участникам группы дозволено со страницы группы, при этом запрос будет иметь вид:
al_search.php?al=1&c[group]=6206&c[section]=people 
где group — id группы.

Позже добавления фильтрации по стране и городу запрос примет вид:
al_search.php?al=1&c[city]=1&c[country]=1&c[group]=6206&c[section]=people 
где, соответственно, city — id города, country — id страны

Результатом на запрос является список пользователей.
Заголовок результата несет в себе два значимых значения:
"has_more":true,"offset":200 
has_more — определяет, будут ли еще пользователи в выдаче
offset — «отступ» либо сдвиг от первого пользователя

Блок с информацией об одном пользователе имеет вид:

<div>
  <div onmouseover="Searcher.bigphOver(this, 1746355)">
    <a href="/romasladky" onclick="return nav.go(this, event);"><img src="http://cs425828.vk.me/v425828355/11c7e/WlD9D-hBeJI.jpg" /></a>
  </div>
  <div>
    <div><a href="/romasladky" onclick="return nav.go(this, event);">Рома Сладкин</a></div><div>Климатпрофф</div><div>Online</div>
  </div>

В этом блоке увлекательны данные:

  • id
  • имя
  • href на страницу

Парсить результат довольно комфортно с поддержкой регулярных выражений.
Для приобретения id использую такое выражение:
"<div[^>]*onmouseover=\"Searcher.bigphOver\\(this, (\\d )\\)\">" 

Для приобретения имени и href:
"<div class=\"labeled name\"><a href=\"/([^\"] )\" onclick=\"return nav\\.go\\(this, event\\);\">([^<] )<"; 

В данном подходе есть одно синтетическое лимитация — контакт не выдает больше 1000 итогов поиска. Это критично, т.к., скажем, в Москве у группы 3000 участников. Что бы обойти это лимитация придется добавить дополнительную фильтрацию на пользователей, а после этого объединить итоги работы всех фильтров.

Из доступных нужно предпочесть только те фильтры, у которых значения фиксированы и их не так много.
Для этой задачи подойдут:
Пол — [sex], значения: 0-2
Порядок сортировки – [sortId], значения 0-1
Семейное расположение – [statusId], значения 0-7.

На ruby данный перебор выглядит так:

offset=0
	for sort_id in 0..1 do
		for status_id in 0..7 do
			for sex_id in 0..2 do
				offset=0
				begin
					get_str = "/al_search.php?al=1"
					get_str  = "&c[city]=#{city_id}" if city_id.to_i>0
					get_str  = "&c[country]=#{country_id}" if country_id.to_i>0
					get_str  = "&c[group]=#{group_id}"
					get_str  = "&c[name]=1&c[section]=people"
					get_str  = "&c[sex]=#{sex_id}" if sex_id>0
					get_str  = "&c[sort]=#{sort_id}" if sort_id>0
					get_str  = "&c[status]=#{status_id}" if status_id>0
					get_str  = "&offset=#{offset}" if offset>0

					...

Таким образом будет получен список всех пользователей в городе.

Если будем делать отправку приглашений вручную, то подметим, что оно отправляется способом POST:
act=a_invite&al=1&gid=65898108&hash=99247d766b77d7a584&mid=22935 
где gid – id встречи, mid – id пользователя, hash – некоторый хэш, несущий информацию о приглашающем. Вот данный-то хэш сейчас нужно получить для всех пользователей из нашего списка.

Приобретение hash

Для приобретения хэша придется парсить список «друзей», которых я могу пригласить на встречу. Друзья указаны в кавычках, т.к. тут под этим представлением выступают все участники группы-организатора.

GET-запрос приобретения этого списка выглядит так:
vk.com/friends?act=get_section_friends&al=1&gid=65898108&offset=0&section=members&sugg_rev=0 
, где gid – id встречи
Результатом будет является json-строка с комплектом блоков вида:
['1298','http://cs315422.vk.me/u01298/d_e13351b2.jpg','/id1298','2','0','Сергей Суворов','0','1','61','','0','2d9d4211c2297c3a06'] 
где 1-й параметр – id пользователя, а конечный – необходимый нам хэш.
Обработка этих данных исполнена с поддержкой регулярного выражения:
@"\['(\d*)','[^']*','\/([\w\.] )','[^']*','[^']*','([^'] )','[^']*','(\d )','[^']*','[^']*','[^']*','(\w )'\]" 

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

На С# эта проверка выглядит так:

string patternNorm = @"'http:\/\/cs\d \.vk\.me";
string patternDeactiveOrDeleted = @"'\/images\/\w \.gif'";

MatchCollection mcNorm = Regex.Matches(responseString, patternNorm);
MatchCollection mcDeactiveOrDeleted = Regex.Matches(responseString, patternDeactiveOrDeleted);

int httpCount = mcNorm.Count   mcDeactiveOrDeleted.Count;
if (listVkUser.Count != httpCount)
{
	throw new Exception("http total count != user count");
}

Позже обработки списка «друзей» и слияния его со списком пользователей из города все готово к рассылке приглашений.

В процессе рассылки было выяснено, что через всякие 40 приглашений нужно вводить капчу, ссылка на капчу выдается в виде:
captcha.php?sid={1}&s=1 , где sid – неповторимый id данной капчи.
При всяком запросе по данному url будет выдаваться новая картинка с капчей.
Тут – исключительное место, где в процессе требуется участие пользователя и ручной ввод.

Программа VkInviter

Для автоматизации перечисленных действий написана программа VkInviter.
Основное окно программы представлено на скриншоте:
image
Помимо описанного алгорифма, программа разрешает делать выборку по нескольким городам, что актуально, когда приглашения рассылаются не только по городу, но и по ближайшим областям.

Начальный код выложен на github, также выложен скрипт на ruby, тот, что может быть пригоден для понимания всеобщей логики.

Завершение

В завершении хочу сказать, пару слов об результативности.
Подметил, что примерно 60% всех пользователей запретили приглашать себя на встречи.
Из принявших приглашение на встречу приходит где-то 10%.
Не знаю, как длинно данный функционал останется в ВК и отчего вероятность пригласить всех была выпилена несколько лет назад.

Начальным кодом может пользоваться всякий желающий по своему усмотрению.

 

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB