Pornind de la urmatoarele afirmatii

* [https://twitter.com/gbuhnici/status/1548726211366494210](https://twitter.com/gbuhnici/status/1548726211366494210)
* [https://twitter.com/gbuhnici/status/1548804197541449728](https://twitter.com/gbuhnici/status/1548804197541449728)
* [https://twitter.com/gbuhnici/status/1548680342118219778](https://twitter.com/gbuhnici/status/1548680342118219778) m-am gandit sa vedem cam cati din followerii lui gbuhnici s-ar incadra si ei in acesta categorie.

Pentru asta, folosind API-ul de la Twitter am accesat urmatoarele informatii publice:

1. Lista de followers
2. Pentru fiecare follower informatii despre contul respectiv cum ar fi cand a fost creat, daca are sau nu poza de profil, daca a dat cel putin un like la vreun tweet si daca are cel putin un follower. ​ Mai intai am sa afisez datele obtinute si apoi si scripturile care m-au ajutat sa obtin aceste date.

**Top 15 date la care au fost create cele mai multe conturi care i-au dat follow:**

|Data|Numar de conturi create la data respectiva|
|:-|:-|
|2022-02-24|2811|
|2022-02-25|2511|
|2022-02-26|3388|
|2022-02-27|4446|
|2022-02-28|3380|
|2022-03-01|2212|
|2022-03-02|2045|
|2022-03-03|1460|
|2022-03-04|1215|
|2022-03-05|1186|
|2022-03-06|1096|
|2022-04-26|1838|
|2022-04-27|1097|
|2022-04-28|922|
|2022-04-29|950|

Se poate observa cum in anumite zile succesive (24, 25, 26, 27, 28, etc.) apar conturi noi cu miile/sutele, care mai apoi ii dau follow. Sa fie o metoda de a-si “cumpara/face” followeri intr-un mod artificial ca sa ajunga la un numar mai mare per total? Sa fie persoane reale? Nu stiu, va las pe voi sa va dati cu parerea.

**Followeri care nu au poza la profil** Din cei 638081 de followeri (la data la care a rulat scriptul) **287865** au default\_profile\_image=True lucru care indica (conform [https://developer.twitter.com/en/docs/twitter-api/v1/data-dictionary/object-model/user](https://developer.twitter.com/en/docs/twitter-api/v1/data-dictionary/object-model/user)) ca followerii respectivi nu au poza la profil (nu au deloc, deci nici nu vorbim daca ar fi reala sau nu). ​

**Followeri care nu au dat nici macar un like la vreun tweet** Din cei 638081 de followeri (la data la care a rulat scriptul) **384357** au favourites\_count=0 lucru care indica (conform [https://developer.twitter.com/en/docs/twitter-api/v1/data-dictionary/object-model/user](https://developer.twitter.com/en/docs/twitter-api/v1/data-dictionary/object-model/user)) ca followerii respectivi nu au dat nici macar un singur like la vreun oricare tweet de la oricare user. ​

**Followeri care la randul lor nu au nici macar un follower** Din cei 638081 de followeri (la data la care a rulat scriptul) **254701** au followers\_count=0 lucru care indica (conform [https://developer.twitter.com/en/docs/twitter-api/v1/data-dictionary/object-model/user](https://developer.twitter.com/en/docs/twitter-api/v1/data-dictionary/object-model/user)) ca followerii respectivi nu au dat nici macar un singur follower. ​

**Followeri care nu au postat nici macar un tweet/retweet** Din cei 638081 de followeri (la data la care a rulat scriptul) **349573** au statuses\_count=0 lucru care indica (conform [https://developer.twitter.com/en/docs/twitter-api/v1/data-dictionary/object-model/user](https://developer.twitter.com/en/docs/twitter-api/v1/data-dictionary/object-model/user)) ca followerii respectivi nu au postat nici macar un tweet sau retweet. ​ Putem trage vreo concluzie daca ne uitam la toate informatiile si numerele de mai sus? Va las pe voi sa decideti. ​

Mai jos, scripturile cu care puteti si voi obtine aceleasi rezultate:

import os
import httpx
import time

from dotenv import load_dotenv

load_dotenv()

TWITTER_SCREEN_NAME = os.getenv(“TWITTER_SCREEN_NAME”)
TWITTER_BEARER_TOKEN = os.getenv(“TWITTER_BEARER_TOKEN”)

cursor = “-1″
while True:
print(f”Cursor => {cursor}”)

res = httpx.get(
“https://api.twitter.com/1.1/followers/ids.json”,
params={“cursor”: cursor, “screen_name”: TWITTER_SCREEN_NAME, “count”: 5000, “stringify_ids”: “true”},
headers={“authorization”: f”Bearer {TWITTER_BEARER_TOKEN}”},
)

data = res.json()
cursor = data.get(“next_cursor_str”)

with open(“followers.txt”, “a”) as f:
ids = data.get(“ids”)

if len(ids) < 1:
break

for i in ids:
f.write(f”{i}\n”)

# Rate limited? Yes
# Requests / 15-min window? 15
time.sleep(60)



&nbsp;



import os
import httpx
import csv
import time

from dotenv import load_dotenv

load_dotenv()

TWITTER_BEARER_TOKEN = os.getenv(“TWITTER_BEARER_TOKEN”)

followers: list[str] = []
with open(“followers.txt”, “r”) as f:
for line in f.readlines():
follower_id = line.strip()
if len(follower_id) > 0:
followers.append(follower_id)

# id_str – The string representation of the unique identifier for this User.
# screen_name – The screen name, handle, or alias that this user identifies themselves with. screen_names are unique but subject to change.
# created_at – The UTC datetime that the user account was created on Twitter.
# followers_count – The number of followers this account currently has.
# friends_count – The number of users this account is following.
# favourites_count – The number of Tweets this user has liked in the account’s lifetime.
# verified – When true, indicates that the user has a verified account.
# statuses_count – The number of Tweets (including retweets) issued by the user.
# default_profile – When true, indicates that the user has not altered the theme or background of their user profile.
# default_profile_image – When true, indicates that the user has not uploaded their own profile image and a default image is used instead.

with open(“data.csv”, “a”) as f:
csv_w = csv.writer(f)
csv_w.writerow(
[
“id_str”,
“screen_name”,
“created_at”,
“followers_count”,
“friends_count”,
“favourites_count”,
“verified”,
“statuses_count”,
“default_profile”,
“default_profile_image”,
]
)

followers_chunks = [followers[i : i + 100] for i in range(0, len(followers), 100)]
for followers_idx, followers_chunk in enumerate(followers_chunks):
print(f”Chunk {followers_idx + 1} of {len(followers_chunks)}…”)

res = httpx.get(
“https://api.twitter.com/1.1/users/lookup.json”,
params={“user_id”: “,”.join(followers_chunk)},
headers={“authorization”: f”Bearer {TWITTER_BEARER_TOKEN}”},
)

users = res.json()
for u in users:
try:
csv_w.writerow(
[
u.get(“id_str”),
u.get(“screen_name”),
u.get(“created_at”),
u.get(“followers_count”),
u.get(“friends_count”),
u.get(“favourites_count”),
u.get(“verified”),
u.get(“statuses_count”),
u.get(“default_profile”),
u.get(“default_profile_image”),
]
)
except Exception as ex:
print(res.text)
raise ex

# Rate limited? Yes
# Requests / 15-min window? 300
time.sleep(3)




&nbsp;





# liniile de cod de mai jos trebuie rulate in Jupyter Notebook
import pandas as pd

data = pd.read_csv(“data_uniq.csv”)
data[“created_at_days”] = pd.to_datetime(data[“created_at”]).dt.strftime(“%Y-%m-%d”)

data.created_at_days.value_counts().head(15).sort_index()
data.default_profile_image.value_counts()
data[data.favourites_count == 0].favourites_count.value_counts()
data[data.followers_count == 0].followers_count.value_counts()
data[data.statuses_count == 0].statuses_count.value_counts()

40 comments
  1. Decât tentativa nereușită de spațiu gol, mai bine bagi o linie orizontală între bucățile de cod cu:

    Ai putea să pui și niște subtitluri, poate cu cod de genul ăsta:

    ### a.py

    import …

    ### b.py

    import …

    ### c.ipynb

    import …

  2. Folosesc Twitter de ceva timp, și pot spune că acele câteva persoane sau “useri” care au sute de mii, milioane de urmăritori pe Facebook sau Instagram, nu reușesc să adune 10 like-uri pe Twitter.
    Așa că mă îndoiesc de faptul că sunt peste 630k de români cu conturi active pe Twitter, ba chiar teoretic ar trebui să fue mai mulți de atât, cei 630k sunt cei care îl și urmăresc pe Bufnici.

  3. Ba, pe bune acum, stop, e un cacau de om, hai sa trecem peste. Hai sa ne folosim energia la chestii mai importante, nu la un bufon care a facut o bufonarie.

  4. Observ ca ai folosit httpx, eu sunt obisnuit cu requests si eram curios care e diferenta. Really cool stuff btw 👏

  5. Tre să faci o diagramă Venn între grupurile alea să vezi câți sunt și fără poză și fără followeri și nu dau like la nimic, că ăia sunt mai mult ca sigur boți.

  6. Ne concentram prea mult pe cineva care a scris lucruri răutăcioase…
    Sunt unii care amenință pe alții și nu li se întâmplă nimic. Generația noastră e prea slaba

  7. Haha nu as trage concluzia ca isi cumpara followeri. Asta pt ca acele conturi false nu interactioneaza cu contentul iar algoritmul de obicei ia asta ca pe un cont de proasta calutate, ne fiind mai departe expus si sugerat potentialilor urmaritori.

    Pana si Elon Musk are 25% din followers conturi false sau spam.

    Si se estimeaza ca aprox 20% din conturile de Twitter sunt false.

    It’s not that much of a conspiracy 😅

  8. S-a obosit degeaba. In podcastul lui Micutu, Bufnici, povesteste ca a platit o firma pentru a depista nr. de foloweri reali, iar rezultatul a fost de 83% conturi false. Explica acolo cum si de ce… Nu era nevoie sa se sparga in linii de cod. Era suficient un click pe youtube.

  9. I mean, felicitări pentru munca depusă. Dar era clar din capul locului că sunt falși. Buhnici postează in română și să-mi bag daca sunt 600k de romani cu Twitter.

  10. e ceva ce sponsorii lui ar fi trebuit sa faca inainte de a semna vreun contract.

    Elon Musk foloseste argumentul conturilor fake pentru a nu cumpara Twitter. Ma lasa rece sa vad ca brandurile mari nu cer o analiza a folowerilor.

    Inainte sa bage mii de euro intr-un ‘promoter’, companiile ar face bine sa dea 0,…% din sumele respective pentru o analiza

    fain ca te-ai gandit sa imparti public.

  11. Intr-un cuvant Bufnici isi cumpara followersii la fel ca si Simion, si au cometarii la fel de cacacioase, cel mai bine ar fi sa uitam ca acesti indivizi chiar exista in internetul romanesc.

Leave a Reply