Решил на досуге проверить, кто из друзей Вконтакте пользуется Twitter.
Вконтакте очень не любят, когда пользователи уходят покидают их сайт, поэтому не особо любят постинг статусов из других сервисов (частенько прикрывают пути постинга статусов twitter->vk), зато в обратную сторону – пожалуйста, пользуйтесь на здоровье.
Предположение: пользователь забрасывает вконтактик, пишет себе в профиль линк на свой акк в Twitter и уходит туда с головой. Статусы во вконтактике больше не пишет.
Задача: проверить, кто из друзей вконакте указал у себя в профиле линк на Twitter.
Реализация.
Вконтакте очень гордятся своей русскоязычной капчей, обычным wget-ом слить странички друзей и распарсить не получилось, пошёл в обход таким способом:
- получить список друзей;
- сгенерить тесты Selenium, открывающие страницы друзей и ищущих слово “Twitter”;
- пройтись по тестам.
Итак,
- Список друзей я получаю через userapi с помощью самопального приложения – жму кнопку “Войти в контакте” и потом сохраняю в текстовый файл friends.
- Далее с помощью bash-скрипта (лёгкий sed и while по друзьям) генерирую Selenium-тесты.
#!/bin/bash
while read vkfile; do
out=`echo $vkfile | sed -e "s/http:\/\/vkontakte.ru\///g"`;
export abc="
<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n<head profile=\"http://selenium-ide.openqa.org/profiles/test-case\">\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n<link rel=\"selenium.base\" href=\"localhost\" />\n<title>$out</title>\n</head>\n<body>\n<table cellpadding=\"1\" cellspacing=\"1\" border=\"1\">\n<thead>\n<tr><td rowspan=\"1\" colspan=\"3\">$out</td></tr>\n</thead><tbody>\n<tr>\n <td>open</td>\n <td>$vkfile</td>\n <td></td>\n</tr>\n<tr>\n <td>click</td>\n <td>link=показать подробную информацию</td>\n <td></td>\n</tr>\n<tr>\n <td>verifyTextPresent</td>\n <td>twitter</td>\n <td></td>\n</tr>\n</tbody></table>\n</body>\n</html>\n";
echo $abc > $out;
done < friends
Для тех пользователей, которые установили у себя в профиле “не скрывать подробную информацию” тесты почти такие же:
#!/bin/bash
while read vkfile; do
out=`echo $vkfile | sed -e "s/http:\/\/vkontakte.ru\///g"`;
export abc="
<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n<head profile=\"http://selenium-ide.openqa.org/profiles/test-case\">\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n<link rel=\"selenium.base\" href=\"localhost\" />\n<title>$out</title>\n</head>\n<body>\n<table cellpadding=\"1\" cellspacing=\"1\" border=\"1\">\n<thead>\n<tr><td rowspan=\"1\" colspan=\"3\">$out</td></tr>\n</thead><tbody>\n<tr>\n <td>open</td>\n <td>$vkfile</td>\n <td></td>\n</tr>\n<tr>\n <td>verifyTextPresent</td>\n <td>twitter</td>\n <td></td>\n</tr>\n</tbody></table>\n</body>\n</html>\n";
echo $abc > $out;
done < friends
- Прохожу 2 раза этими тестами (для пользователей у которых надо нажимать на кнопку “Показать подробную информацию” и для тех, у кого не надо).
Добавляю все сгенерированные тесты в testSuite и жму кнопку “Play entire test suite”. Скорость ставлю низкую, чтоб не забанили и не было проблем с капчей. Картинки в Firefox отключаю.
Получаю в окошке Selenium подсвеченные зелёным цветом строчки тех юзеров, кто обмолвился словечком “Twitter” у себя в профиле.
Из 369 моих друзей на 8 страницах было найдено слово “Twitter”, из этих восьми 5 человек (1,35% от всех друзей) – указали свои профили, остальные три – профили в подписках. Предположение, можно считать верным 🙂
Все исходники в одном zip.