How to get users ID, who favorite specific tweet?

Мне потребовалось узнать через 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)

2 thoughts on “How to get users ID, who favorite specific tweet?

  1. Ryan
    #

    Спасибо большое! это избавило меня от большой боли и усилий, пытаясь исправить это, так как они начали требовать заголовок User-Agent пару дней назад: https://github.com/snarfed/bridgy/issues/823 . (похоже, что это единственный заголовок, который имеет значение.) Я очень ценю, что вы его опубликовали!

    (извинения за перевод, я использовал Google Translate. 😁)

    1. CityAceE Автор сообщения
      #

      Thanks for your comment! I’ve answered you on GitHub.

Оставить ответ

Войти с помощью: 

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

Защита от спама * Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.