Мне потребовалось узнать через Twitter API кто лайкал тот или иной твит. Однако, несколько раз перечитав документацию, я не обнаружил такой очевидной и необходимой возможности. Тогда я предположил, что это делается как-то опосредованно и начал гуглить. К моему великому разочарованию, выяснилось, что Twitter не предоставляет такой возможности ни через API, ни как-то иначе, хотя спрос очень велик. Интернет-пользователи предположили, что это слишком ценная информация, с помощью которой можно проводить разного рода анализ и которой Twitter никогда не поделится. Печально! Но мне, тем не менее, удалось частично решить проблему. Я научился получать такой список, то только из первых 25 человек, кто лайкнул (ранее это называлось «добавил в избранное») определённый твит. Согласитесь, что это лучше, чем совсем ничего. А для моих задач, так и вообще оказалось достаточно, так как я анализирую не слишком популярные твиты, которые редко кто лайкает свыше 25 раз.
Я обратил внимание, что заходя в Twitter через браузер, я таки могу посмотреть список лайкнувших, не всех, конечно, а только первых 25 человек. Я проанализировал запрос браузера и ответ сайта, и сделал то же самое, но на Python. И вот, что у меня получилось:
import requests from bs4 import BeautifulSoup STATUS_ID = 935591323964452865 # Номер интересующего твита url = 'https://twitter.com/i/activity/favorited_popup?id=' + str(STATUS_ID) response = requests.get(url) html_users = response.json().get('htmlUsers') soup = BeautifulSoup(html_users, "html.parser") users = soup.find_all('div', class_='account js-actionable-user js-profile-popup-actionable ') for user in users: a = user.get('data-user-id') # Идентификатор пользователя b = user.get('data-name') # Отображаемое имя пользователя c = user.get('data-screen-name') # Зарегистрированный ник пользователя print(a + ': ' + b + ' (@' + c + ')')
После запуска этого кода на экран будут выведены первые 25 пользователей лайкнувших твит, номер которого задан в константе STATUS_ID:
349771130: Jesús Sanabria Martos (@mrmartos)
962381673634480128: Darrelyn (@Darrelyn12)
795037326577717248: Daniel Silva 👠 (@Daniellsillva20)
945972103429414913: Iván. Toala (@IvnToala1)
2379258727: ❤️✨ARIA | BLAKE✨❤️ (@TheAriaBlake)
952753272: Liss♢Mercado (@lisethmerkdo)
851954819699007489: poc (@spanishLulaby)
3269382655: i could’ve dropped my croissant (@reneekalee)
1027127156: Alberto Villamar (@al_villamar)
1322826428: adrianah23 (@adrianahuff23)
521158789: nry (@hernandezatreyu)
3821490633: S. Frances Tiger (@SFrancesTiger)
974695248197771265: 罗欣雨 (@luoxinyu0)
870872736469590016: christo.tsakiri@gmai (@ChristoTsakiri)
947357203681431552: AD Jones@JESUS license777 (@AjSlick007)
193148406: Guillermo Jimenez (@J1mEn3z)
2301341356: Alyx Kahl (@AlyxKahl)
978106588534857729: Mohammas (@Mohamma97950826)
979010404293554176: Shibsankar Das (@Shibsan39266625)
2741494735: DJA'AR👑 (@DJAARMusic)
2861650798: Stephen Braverman (@stephenbraverm1)
1613852833: Kev__Lennon (@ShadyDavila)
907429808824573953: Luís (@luissgusstt)
4393419136: Xoxo, Zaah 👒 (@Zaah_carvalho)
315234146: Sherry (@SherrySherry274)
Всё делается без авторизации и без участия Twitter-API. Надеюсь, что это кому-то пригодится.
UPDATE 23.05.2018
21 мая 2018 в промежутке между 20:20 (ещё работало) и 21:00 (уже не работало) по Московскому времени Twitter внёс изменения и список лайкнувших перестал отдаваться по указанному выше методу. Потребовалось внести корректировку, чтобы всё заработало. А именно теперь скрипту требуется прикидываться браузером и передавать специальные заголовки, в противном случае сайт рапортует об ошибке 404.
Итак, чтобы всё заработало вновь необходимо заменить вот эту строчку:
response = requests.get(url)
Вот на такую конструкцию:
hdr = {"Host": "twitter.com", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3", "Accept-Encoding": "gzip, deflate, br", "Referer": url, "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1", "Pragma": "no-cache", "Cache-Control": "no-cache"} response = requests.get(url, headers=hdr)
Спасибо большое! это избавило меня от большой боли и усилий, пытаясь исправить это, так как они начали требовать заголовок User-Agent пару дней назад: https://github.com/snarfed/bridgy/issues/823 . (похоже, что это единственный заголовок, который имеет значение.) Я очень ценю, что вы его опубликовали!
(извинения за перевод, я использовал Google Translate. 😁)
Thanks for your comment! I’ve answered you on GitHub.