Лайфхак для твиттерян, или по следам Твидиума

от автора

После закрытия Леонидом Кофманом своего знаменитого проекта Твидиум длинный ряд пользователей Твиттера в полной мере ощутил, сколь неудобна и недружелюбна к юзерам эта социальная сеть. Говорю практически без сарказма, т. к. сам прочно нахожусь в числе недовольных… анфолловинг и массфолловинг нажатием всего одной кнопки, парсинг твитов и отложенный постинг, как в Твиттере жить без всего этого? — согласитесь, ну нереально же.

Недовольство влечет за собой, как правило, желание подвигать за… пошевелить мозгами. Данный материал представляет собой, так сказать, отчет о результатах соответствующих изысканий, призванных вернуть себе — хотя б в некоторой степени — прежние удобства. Но автор не жадина и всегда готов поделиться тем немногим, чем располагает, с благодарными читателями… Представленный сегодня на ваш суд скрипт, пожалуй, сыроват для имиджа коммерческого интернет-сервиса (API Twitter всячески противится такого рода использованию своих ресурсов, что и было, как представляется автору, началом конца Твидиума и ему подобных проектов), но в качестве однопользовательского «домашнего» приложения — изрядно облегчает работу с несколькими твиттер-аккаунтами.

Twitter Toolkit onRails
Twitter Toolkit onRails

Итак, поехали. Для начала зададимся вопросом, что именно нам понадобится, дабы автоматизировать процесс анфолловинга невзаимных аккаунтов? Иными словами — как в Твиттере «на автомате» отписаться от тех, кого читаете вы, но кто не читает вас? — все, на самом деле, весьма несложно. И беспрестанные изменения веб-интерфейса Твиттера (твиттеряне этого почти не замечают) нам с вами ровно побоку, коль скоро API Twitter не чинит (в данном случае) никаких препятствий.

Примечание. Вам потребуются установленные на вашем ПК Ruby и gem ‘twitter’ (зависимости будут инсталлированы автоматически).

Понадобятся ключи доступа, запрос которых теперь проходят в Твиттере ручную модерацию. Которые, после получения, инициализируем следующим образом:

  def client     config = {       consumer_key: '******************',       consumer_secret: '*******************',       access_token: '***************************',       access_token_secret: '************************'     }     Twitter::REST::Client.new config   end

И — элегантно получаем список читателей (фолловеров) аккаунта, вызывая метод get_followers с параметрами client, user_id (user_id — ваш никнейм в Твиттере):

  def get_followers(*args)     follower_ids = []     next_cursor = -1     while next_cursor != 0       cursor = args[0].follower_ids(args[1], cursor: next_cursor)       follower_ids.concat cursor.attrs[:ids]       next_cursor = cursor.send(:next_cursor)     end     followers = []     follower_ids.each_slice(100) do |ids|       followers.concat args[0].users(ids)     end   end

Совершенно аналогично достаем массив френдов, после чего вычитаем первый массив из второго, получая список аккаунтов, предназначенных для анфолловинга. В скобках: в этот перечень войдут также и аккаунты, действие которых приостановлено Твиттером.

Вот, собственно, и вся премудрость… а дальше совсем просто:

unfollow(client, list)

Полностью рабочий скрипт доступен по ссылке, требуется лишь вписать токены доступа и никнейм твиттер-аккаунта. Автор готов поручиться, что ни один ваш читатель не будет таким образом анфолловлен, не беспокойтесь. Пробуйте.

И сразу возникает вопрос: если изменить вектор вычитания — получим, стало быть, список аккаунтов уже для фолловинга? — т.е. перечень тех, кто подписан на вас, но на которых не подписались пока еще вы. Как с этим?

Получаем перечень фолловеров
Получаем перечень фолловеров

Ответ — да, верно. Список акков мы таким образом получим, но далее пойдет не столь гладко, как с анфолловингом. Вкупе с массфолловингом в игру моментально вступают ограничения API Twitter.

Ответный фолловинг
Ответный фолловинг

Взгляните на скриншоты. Сперва прога получает перечень фолловеров, затем — френдов; далее идет сравнение двух массивов и начинается фолловинг. Каждый раз после подписки на несколько аккаунтов — от Твиттера приходит отлуп, и приложению приходится засыпать (rescue) на некоторое время, после чего работа возобновляется. Увы, в отличие от анфолловинга, API Twitter делает все для того, чтобы затруднить нам с вами автоматический фолловинг, хотя бы и ответный, приходится с этим мириться. В качестве альтернативы я написал некий комбинированный сервис: приложение (да, это уже не скрипт) в качестве итога работы выводит на страничку заданное число ссылок на ваших фолловеров, в каждую из которых нужно ткнуться мышкой и вручную зафолловить. Как вариант.

Несколько слов о приложении, которое всегда доступно в гитхабе. Это rails-app (Ruby on Rails 6), веб-интерфейс которого выполнен на основе Bootstrap 4, информационные сообщения — Flash Messages; на данный момент умеет ответный фолловинг описанными выше двумя способами (автоматический и наполовину ручной), анфолловинг без никаких ограничений, парсинг твитов из любого указанного вами твиттер-аккаунта и постинг твитов с рандомными промежутками времени, также любое количество ретвитов по ключевым словам или тэгам; также способен вытаскивать перечень читателей твиттер-аккаунта (меня однажды попросили об этой фиче).

Парсинг твитов
Парсинг твитов

Приложение способно работать с любым количеством твиттер-аккаунтов, в том числе и одновременно: все задачи объявляются на основе Active Job, позволяя параллельное выполнение. Разумеется, реализована возможность работы посредством https-прокси (внимание, без проксей одновременная работа с несколькими аккаунтами крайне нежелательна и способна привести к временному либо даже перманентному их закрытию; но работа с одним аккаунтом вполне безопасна). Не составляет труда доустановить сверху sidekiq, при желании (вкупе с Redis обеспечит более стабильную работу).

Авторетвиты по ключу "checkmate"
Авторетвиты по ключу «checkmate»

Ну, вот как-то так. Леонид Кофман скептически пожмет плечами, вероятно, но… но вот как умеем. Хотя Твидиум был круче, конечно.

ссылка на оригинал статьи https://habr.com/ru/post/568814/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *