Помните приложение Birthday Calendar для Facebook? Оно могло генерировать десятки… нет, даже сотни уведомлений, приходящих вам. Любой ваш друг, установив его, автоматически отмечал вас на фотографиях с датами рождения. Вчера я сам попался на похожую схему в казалось бы нормальном приложении (WeHeartPics), которое только-только вышло. Нажав всего одну кнопку 1-tap invite, которая обещала для меня “Easy way”, я и не догадывался, что этот путь будет не самым легким для меня.
Вот так за пару минут я (точнее приложение) успело разослать на стенки большинства моих знакомых этот спам. Ожидал ли я этого? Вы удивитесь — да, хотя не сразу в это поверил. В статье я расскажу, как бороться с такими приложениями:
— оперативно убрать возможность постить за вас
— определить, кому отправили на стену
— как удалить все спам сообщения со стен друзей
— рабочий пример: проверьте, кому из друзей отправили эти сообщения
Ну и самое главное для разработчиков — как правильно реализовать функционал приглашений и инвайтов, при этом не раздражая пользователей: где использовать Facebook Dialogs, Achievements and Scores APIs, Open Graph.
Why We DON’T Heart Pics
Вчера в ленте я заметил дубль сообщений. Написал коммент отправителю, но решил проверить свои догадки сам. Перейдя на сайт из заголовка сообщения, скачал приложение на iPad и авторизовался.
Я всегда обращаю внимание на окно авторизации, особенно на расширенные пермишены, которые дают доступ к постингу от моего имени в любое время (подробно о доступе и permissions в Facebook я уже писал).
Обычно увидя два последних пермишена я либо закрываю приложение (если оно мне не очень интересно), либо разрешаю, и после этого удаляю их в настройках приложений в самом фейсбуке. Ну да и ладно, мне не жалко. Авторизовался. Начал смотреть приложение, при этом посматривая, не отправило ли оно приветы от меня. Они не отправляли. Может быть я был неправ, и мой знакомый действительно сам отправил на стены друзей эти сообщения, — думал я. А потом попал на эту страницу, которую опишу отдельно.
Перейдя из блока Connect with friends в окно (справа), я увидел три иконки (на рисунке состояние приложения после нажатия Facebook). Так как логинился с фейсбуком, логично было нажать именно его.
Внимание! Если вы не готовы отправить всем своим друзьям на стенку “приветы”, ни в коем случае не нажимайте 1-tap invite!
Как вы поняли, моей ошибкой стало то, что я нажал эту кнопку. Я даже не знаю, винить ли разработчиков, что они мне не объяснили, что эта кнопка делает. Для них это Easy way, легкий способ набрать себе больше аудитории, как оказалось позже. В принципе я сам виноват, что я ожидал? Что эта кнопка поднимет волшебный Request Dialog, или что мне выплывет Feed Dialog, где я бы смог пошарить себе в ленту пост, какое же прекрасный новый стартап (напомнил Path). Но приложение лишь поменяло + Invite на © Resend, и я понял — я попал.
Убираем возможность совершать действия за вас
Последовательность действий в таких ситуациях у меня была отработана: переходим в полную веб версию Facebook, переходим в Privacy Settings, внизу в Apps and Websites переходим в редактирование настроек приложений и сайтов, которые используют фейсбук коннект. Редактируем нужное приложение: убираем все пермишены, которые можем убрать, или просто удаляем приложение. Потом на всякий случай выходим из фейсбука и логинимся заново, чтобы приложение не могло использовать ваш access_token для дальнейшей рассылки спама.
Приложение я удалил. Теперь нужно было оценить “урон”. Первое, что пришло в голову — посмотреть свою активность в таймлайне (кнопка Activity Log). Но там было пусто. У меня более 1000 френдов, поэтому перебирать вручную было глупо. Но и оставлять эти сообщения было опасно, я бы не хотел, чтобы меня удалили интересные люди.
Определяем кому отправили спам
Для работы с Facebook API я использую Graph API Explorer. Приложение же тоже как я делает запросы, например: /me/friends/ возвращает одинаковый результат — список друзей, отсортированный по возрастанию id. Я начал смотреть каждого. В итоге я вручную удалил около 30-и сообщений со стен. Видимо я быстро сориентировался и перекрыл доступ. Может у приложения установлено какое-то ограничение — я не знаю, как и то, отправлялись запросы с iPad или с сервера.
Удалив все сообщения, я подумал: почему бы не написать скрипт, который обходит всех моих друзей, ищет сообщения от меня, отправленные через это приложение, и удаляет их. Залогинился в приложении еще раз, разрешив опять все пермишены. Только в этот раз я не нажимал волшебную зеленую кнопку, а отправил пару “инвайтов” персонально (оказывается не нужно выбирать “легких путей” Easy way). Убив на всякий случай дополнительные пермишены, начал крутить Graph API Explorer. Я знал, что нужно найти id постов на стенку друзьям, что легко делалось в виде /{username}/feed/
Найдя нужный id поста, который я сам добавил моему другу, решил попробовать удалить его через API. Обычно это делается отправкой DELETE запроса на него, вместо GET (по которому получается подробная информация про пост). В Graph API Explorer нужно было только поменять GET на DELETE перед строкой запроса. Жмем Submit и получаем… ошибку.
«message»: "(#200) This post wasn't created by the application"
Как удалить все отправленные сообщения
Как оказалось, удалить пост можно либо через веб версию (или официального клиента), либо через то приложение, которое создало этот пост. Консоль разработчика хоть и имела полный доступ (все пермишены которые только возможны), но все-таки была реализована одноименным приложением Graph API Explorer, которое не могло бы удалить все найденные посты от WeHeartPics. Не могло и любое другое приложение.
Но раз сам WeHeartPics мог их удалить, то мне нужен был их access_token. Сначала я опустил руки, так как приложение крутилось на iPad, и вызов диалога авторизации через строку в браузере ничего бы не дал. Но потом я вспомнил, что на самом сайте weheartpics.com была авторизация. Открыв Firebug, я поймал access_token (на данный момент авторизация уже изменена, поэтому поймать его тем же способом у меня при написании статьи не получилось). С нужным токеном запрос на удаление в Graph API Explorer прошел, чему я конечно обрадовался — ведь теперь можно было создать лекарство от подобных приложений и их действий.
Проверьте ваших друзей
Чтобы быстро проверить, кому отправлен спам, был выбран http://www.fbrell.com — консоль разработчика Facebook (вы можете посмотреть готовые примеры по ссылке Examples под редактором). Если вставить в окно редактора этот код и запустить, вы проверите стенки всех своих друзей на наличие сообщений от WeHeartPics (всех, не только от вас).
Рекомендации разработчикам
Сообщения на стену друзьям и отметки их на фотографиях — это способ грязного продвижения. Вспомните Birthday Calendar, и делайте правильно:
- Не используйте publish_stream permission для автоматической публикации, тем более массовые рассылки на стену. Если хотите, чтобы пользователь поделился у себя (у друга или в группу) вашим сообщением, выберите Feed Dialog. Он адаптирован под мобильные, при этом пользователь видит что делает (а вы не требуете лишний пермишен).
- Не отсылайте инвайты и приглашения на стену, используйте личные сообщения и уведомления. Первое реализуется с помощью Send Dialog, с помощью поторого пользователь может отправить сообщение нескольким друзьям. Уведомления же реализуются с помощью Request Dialog. Этот диалог можно гибко настраивать, например: показывать только друзей, еще не установивших приложение, исключить конкретных пользователей (кто запретил им присылать уведомления у вас в настройках).
- Используйте server-side requests только для уведомлений для самого пользователя.
- Используйте Achievements и Scores API для созранения и публикации каких-то достижений. Чаще всего это понадобится играм или проектам с игровыми механиками.
- Для публикации действий пользователя в приложении и их агрегации в таймлайне внедрите Open Graph. Не публикуйте эти действия с помощью Feed Dialog!
- Используйте обновленный OAuth Dialog для авторизации. Он более понятный для пользователя, главное настройте его правильно, задайте описание приложения и почему вам нужны расширенные пермишены.
- Ну и главное — лучше лишний раз спросить, чем сделать что-то, чего пользователь не ждал.
Не хотел этой статьей как-то обидеть разработчиков этого стартапа. Мне он был приятен во всем, кроме момента с кнопкой Easy way. На их месте мог оказаться любой проект. Разработчики приложения были уведомлены и обещали принять во внимание все рекомендации.
Автор: antonsnowy