Jak zrobić twitterowego bota?

Automaty rządzą naszym życiem. Czy tego chcemy czy nie. Szczególnie w sieciach społecznościowych, nawet podobno wygrały wybory prezydenckie w USA (ciekawe czy w Rosji też). Spróbujmy zatem samodzielnie napisać jakiś automat działający w social mediach. W R, chociaż można w czymkolwiek innym.

Przygotujemy automat (bota), który będzie na Twitterze publikował wybrane przez nas treści. Taki bot już istnieje – to @rstatspl. W tym wpisie znajdziecie informacje jak powstał.

Bot @rstatspl robi trzy rzeczy:

  • Repostuje twitty z tagu #rstats – te, które są po polsku oraz te napisane przez konta z ustawionym językiem polskim. To dwie różne sprawy, bo jak się okazało w trakcie prac Twitter sam rozpoznaje (mniej lub bardziej skutecznie) język w jakim napisany jest dany twitt.
  • Repostuje posty z fanpage Dane i analizy – ot, taki forward manager :)
  • Wita nowych obserwujących i odwdzięcza się; takie “follow za follow”

Aby cokolwiek zrobić automatycznie na Twitterze potrzebujemy aplikacji korzystającej z API. Jak przygotować aplikację? Szczegółowe informacje znajdziecie na stronach Twittera dla developerów. Ja zrobiłem tak:

  • utworzyłem nowe konto @rstatspl
  • będąc zalogowanym na tym koncie utworzyłem aplikację korzystając z dedykowanej ku temu strony
  • po utworzeniu aplikacji potrzebujemy dwóch numerków: Consumer Key (API Key) oraz Consumer Secret (API Secret)

Do języka R mamy oczywiście gotową bibliotekę – rtweet, z której wykorzystamy kilka funkcji:

  • do pobierania twittów – search_tweets()
  • do wysyłania twittów – post_tweet()
  • do pobierania informacji o użytkownikach – lookup_users()

W pierwszej kolejności jednak potrzebujemy tokena, którym nasz skrypt przedstawi się API Twittera. Proces szczegółowo opisany jest na stronie biblioteki, a pokrótce chodzi o:

Powyższy kod wystarczy uruchomić tylko raz, bo później tak przygotowany token wystarczy przypisać do zmiennej środowiskowej, z której korzysta biblioteka:

Teraz możemy już korzystać z biblioteki i naszej twitterowej aplikacji. Na przykład pobrać 100 najnowszych twittów z tagu #rstats, bez re-twittów:

Jakie dane otrzymujemy?

Mamy bardzo dużo ciekawostek, z których coś można wybierać: ID twittu, nazwa i ID użytkownika, który twitt opublikował, czas publikacji, sama treść, wszelakie wymienione linki czy tagi, położenie geograficzne z którego opublikowany został twitt (bardzo rzadko wypełnione, nie nakręcajcie się) i wiele innych.

W przypadku naszego bota interesuje nas język opublikowanego twitta – wybierzmy te, które są po polsku (według Twittera). Do opublikowania retwitta potrzebujemy ID oryginalnego twitta oraz nazwy użytkownika, który twitta opublikował. Zatem:

status_id screen_name text
976322838998241281 dziennikarz Najbardziej angażujący tweet o #rstats w ciągu ostatnich 6h. https://t.co/4zstibrNJW
976232262076334080 dziennikarz Najbardziej angażujący tweet o #rstats w ciągu ostatnich 6h. https://t.co/MRV29j4UcC
976141643983327233 dziennikarz Najbardziej angażujący tweet o #rstats w ciągu ostatnich 6h. https://t.co/vTWu76Z531
976051031078416384 dziennikarz Najbardziej angażujący tweet o #rstats w ciągu ostatnich 6h. https://t.co/fU8ofzWZce
975960423282376704 dziennikarz Najbardziej angażujący tweet o #rstats w ciągu ostatnich 6h. https://t.co/aib1UhETOW
975869832280371200 dziennikarz Najbardziej angażujący tweet o #rstats w ciągu ostatnich 6h. https://t.co/MSZRWCxGgS
975779242993770496 dziennikarz Najbardziej angażujący tweet o #rstats w ciągu ostatnich 6h. https://t.co/CNRKKJ0u54
975688644307628032 dziennikarz Najbardziej angażujący tweet o #rstats w ciągu ostatnich 6h. https://t.co/xDd2qvibvx
975598041670586368 dziennikarz Najbardziej angażujący tweet o #rstats w ciągu ostatnich 6h. https://t.co/jvUokwc3DL
975507448890101760 dziennikarz Najbardziej angażujący tweet o #rstats w ciągu ostatnich 6h. https://t.co/iTJ93yfH03
975416866037534720 dziennikarz Najbardziej angażujący tweet o #rstats w ciągu ostatnich 6h. https://t.co/XLmhPFdjxj
975326266608975872 dziennikarz Najbardziej angażujący tweet o #rstats w ciągu ostatnich 6h. https://t.co/qoqlnEKLhw
975235666161340416 dziennikarz Najbardziej angażujący tweet o #rstats w ciągu ostatnich 6h. https://t.co/ogOv94ol6O
975145081043812352 dziennikarz Najbardziej angażujący tweet o #rstats w ciągu ostatnich 6h. https://t.co/GiBxJiZAxA

Mamy listę, którą możemy przepisać na nasze konto. Bot będzie taką listę pobierał co jakiś czas, więc interesują nas tylko te twitty, których jeszcze nie przesłaliśmy dalej. Musimy sobie więc zapamiętywać co już poszło i tego po prostu nie przekazywać – będziemy to zapamiętywać w pliczku, który sobie teraz wczytamy:

Początkowo zmienna last_rstats_tweet_id może być pusta (możemy jej przypisać zero), po pierwszym retwicie się ustawi odpowiednio.

Bot ma przekazywać twitty po polsku oraz od polskich kont. Potrzebujemy więc wybrać polskie konta, które coś opublikowały (z listy pobranych twittów):

Teraz z puli pobranych twittów wybieramy te, które spełniają nasze ograniczenia:

Dostajemy kilka twittów:

status_id screen_name lang url
975145081043812352 dziennikarz pl https://twitter.com/dziennikarz/status/975145081043812352
975235666161340416 dziennikarz pl https://twitter.com/dziennikarz/status/975235666161340416
975326266608975872 dziennikarz pl https://twitter.com/dziennikarz/status/975326266608975872
975416866037534720 dziennikarz pl https://twitter.com/dziennikarz/status/975416866037534720
975507448890101760 dziennikarz pl https://twitter.com/dziennikarz/status/975507448890101760
975598041670586368 dziennikarz pl https://twitter.com/dziennikarz/status/975598041670586368
975688644307628032 dziennikarz pl https://twitter.com/dziennikarz/status/975688644307628032
975770064430526464 whyRconf de https://twitter.com/whyRconf/status/975770064430526464
975779242993770496 dziennikarz pl https://twitter.com/dziennikarz/status/975779242993770496
975842124892721154 olga_mie en https://twitter.com/olga_mie/status/975842124892721154
975848771308478465 whyRconf en https://twitter.com/whyRconf/status/975848771308478465
975869832280371200 dziennikarz pl https://twitter.com/dziennikarz/status/975869832280371200
975960423282376704 dziennikarz pl https://twitter.com/dziennikarz/status/975960423282376704
976051031078416384 dziennikarz pl https://twitter.com/dziennikarz/status/976051031078416384
976070741115498497 olga_mie en https://twitter.com/olga_mie/status/976070741115498497
976141643983327233 dziennikarz pl https://twitter.com/dziennikarz/status/976141643983327233
976213656575922177 kosinski_rblog en https://twitter.com/kosinski_rblog/status/976213656575922177
976232262076334080 dziennikarz pl https://twitter.com/dziennikarz/status/976232262076334080
976322838998241281 dziennikarz pl https://twitter.com/dziennikarz/status/976322838998241281

które w pętli możemy opublikować u siebie:

Twitty jakie opublikujemy to kolejno:

Pierwsze zadanie wykonane – bot pobiera najnowsze twitty z tagiem #rstats i publikuje linki do tych, które Twitter uznał za napisane po polsku lub pochodzą z kont, które mają ustawiony język polski.

Drugim zadaniem jest przepublikowanie na Twitterze postów z fanpage’a Dane i analizy. Do pobrania postów z fanpage’a wykorzystamy bibliotekę Rfacebook, która pobiera dane przez API Facebooka.

Podobnie jak poprzednio tworzymy aplikację facebookową, a której potrzebujemy klucza (zmienna fb_app_id niżej) oraz sekretnego kodu (zmienna fb_app_secret). Podobnie potrzebujemy utworzyć token, który zapiszemy sobie na później:

Powyższy kod wystarczy uruchomić tylko raz.

Na początek przygotujemy funkcję, która pobierze nam najnowsze posty z fanpage’a:

Teraz dla każdego fanpage’a pobierzemy po jednym najnowszym poście, sprawdzamy czy już był opublikowany (po jego ID)

W efekcie opublikujemy:

Na koniec zapisujemy listę opublikowanych postów:

Ostatnie zadanie to follow za follow i podziękowanie za obserwowanie. Algorytm jest podobny:

  • pobieramy listę obserwujących
  • porównujemy ją z poprzednim (na przykład sprzed godziny) przebiegiem
  • jeśli jest ktoś nowy to zaczynamy go obserwować i jednocześnie piszemy, że miło go widzieć

Gotowy kod (cały skrypt):

Ostatnia rzecz to uruchomienie bota cyklicznie. Do tego przydaje się środowisko linuxowe i cron. Dodajemy do zadań cyklicznych trzy skrypty, chociaż można je połączyć w jedno. Ja przygotowałem trzy, które uruchamiają się w podobnych cyklach, aby nie zalewać konta w jednym momencie kilkoma twittami na raz. Crontab wygląda tak:

Co można jeszcze zrobić?

Możemy przygotować kilka list obserwowanych użytkowników Twittera i na ich podstawie coś robić. Bardzo fajne boty prowadzi @dziennikarz korzystając na przykład z własnej listy dziennikarzy. Co sześć godzin bot pobiera najnowsze twitty osób należących do listy i re-twittuje tego twita, który miał największe zaangażowanie (liczba like’ów i retwittów). Podobnie działają Najbardziej angażujący twitt o #dataviz #ddj oraz Najbardziej angażujący twitt o #rstats (który był inspiracją do całej tej zabawy).

Analogiczne narzędzia (ale za każdym razem zbierające dane przy uruchomieniu aplikacji) napisałem w Shiny:

Pierwsza z dwóch powyższych aplikacji robi prostą analizę tekstu, co może być ciekawym zajęciem dla bota. Wyobrażam sobie pobranie twittów dziennikarzy (korzystając z listy @dziennikarza), przygotowanie listy tematów (na przykład analiza LDA Latent Dirichlet allocation – zobacz mój wpis na ten temat) i napisanie coś na ten temat (@Warzecha dzisiaj pisze o…, @Gzyms@Gmyz o…, a @Lis ciągle o tym samym, czyli o…).

Inny pomysł to odpowiadanie na cudze twitty. Tutaj robi się już trudniej, bo trzeba przeanalizować o czym był twitt. Ewentualnie można to olać i zawsze wkurzać tekstami typu Smoleńsk, kurwa! czy też czymś w tym stylu (na przykład losowo) – to już bardziej dogadywanie… Łatwo w takim przypadku być zbanowanym (albo chociaż wyciszonym).

Tak czy inaczej to w tym wariancie jest największa zabawa i największe pole do popisu. Dlatego też takim powodzeniem cieszy się maszynowe przetwarzanie tekstu w ogłoszeniach rekrutacyjnych dla data scientists – wszyscy chcą pisać boty przyjmujące zamówienia z Facebooka (z Messengera konkretnie).

A teraz popatrzmy na to wszystko nieco inaczej, przy okazji afery z Facebookiem i Cambridge Analytica. Gdyby zamiast jednego bota przygotować ich wiele – kilkadziesiąt, kilkaset? Bot w sumie może być jeden, kont musi być dużo. Farma taka. Gdyby analizować treści pod określonym kontem i na przykład w odpowiedzi na twitty wychwalające rząd (jakikolwiek) wysyłać setki twittów z argumentami przeciw, pokazywaniem jakichś wpadek (vide Komorowski wizytujący Japonię czym grał PiS przed wyborami prezydenckimi), nawołujące do buntu itd itp. Jedna strona mogłaby zalać Twittera swoimi poglądami. Tak się rozprzestrzenia fake news na masową skalę. I teraz od użytkowników zależy w co uwierzą.

Bądź czujny!

Dlatego warto być krytycznym, warto myśleć samodzielnie, oglądać obie strony medalu (czytaj: obie stacje telewizyjne). Dlatego nie warto przyjmować niczego za pewnik – to, że jedni głośno mówią, że rozliczają Żydów, komunistów i złodziejską kastę nie znaczy że jednocześnie nie robią podobnie przyznając sobie nagrody, zmieniając prawo i podporządkowując to czy owo siłom politycznym. Za Kazikiem Staszewskim: Żelazne prawo oligarchii: kto władzę ma najpierw o nią się martwi. Bądźcie czujni!

1 komentarz do wpisu “Jak zrobić twitterowego bota?

  1. hejaaa

    gratulacje wpisu! jestem początkująca w tej tematyce, a wszystko wydaje się jasne
    spróbuję stworzyć swojego bota :-) dzięki!

Dodaj komentarz