Parsing curation reports: inleo example

in Programming & Dev14 hours ago


Copy of Copy of Copy of Copy of Copy of Copy of Copy of Banner Pizza News (19).png

Banner created in canva

1- Motivation:

  First, I want to thank @leo-curation for providing reports from its curation. This is an example of every curation program to bring transparency to our community. I saw the post from @anonyi about one of its curators speculating about possible "self-voting" from a curators to its accounts. I remembered that inleo has this posts about its curations and went to check it, and I saw some trends there associated to the name and commented on @anonyi post about that. But then my programming curiosity thought about, the possibility of parsing all the curation reports, at least the organic ones since in theory the curated user is organically curated without any other type of influence. Inleo has other types of curation programs including the stake, X and threads curation. Those are more directed since the author triggers the possibility of curation. But the organic curation is different, more similar to a regular curation program which is independent of anything. The curator checks a post under the community and curates it if they like it. The full scripts are available at github .

2- Script building:

  I used Python since it is the language that I am currently using more around here, I started to use some JS but I stopped a bit. I am aware by some nice clients built for hive, but I decided to use the regular "request" library to perform get HTTP methods. I wanted to be simple and the job requires simple tools. Just gathering comment transactions from permlinks that follow the trend of the organic curation reports from inleo! They started to post these reports on their week 24 of "curation" so I am not sure what I missed before there. This type of condition can be used for other curation reports published by other users so I am showing bellow where you can find that in the script:

author = post["author"]
permlink = post["permlink"]
if author == "leo-curation" and permlink.startswith("organic-curation-report"):

  My idea for the stats was to find highly curated users and show their curators how many times each curator upvoted this specific user. First I made a regular expression to capture the rows where you had the user in the beginning of the row (curated user) and also at the end of the row after the last "|" and a space you can find the curator username. You can find this in the exctract_stats function in the script. I build a dictionary where the parent key is the curated user, and the value is another dictionary where you can have 1 or more keys (curators) and the value of that is the number of times, so for example if I am curated by John and Mary one time we have stats['gwajnberg']= { 'John':1, 'Mary':1} .

  In the end I process the final dictionary of dictionaries with the numbers ordering and organize the print. First I sort by the total number of curation using this code below:

def print_stats(stats):
    sorted_stats = sorted(
        stats.items(),
        key=lambda item: sum(item[1].values()),  # Total curations
        reverse=True
    )

  The last part of the function I just print the organized list with one curated user by each row in this format: "User1 5 (2 by curator1, 3 by curator2)". The loop to create these prints are bellow:


 for curated_user, curators in sorted_stats:
        total_curations = sum(curators.values())
        curators_str = ", ".join(
            f"{count} by {curator}" for curator, count in curators.items()
        )
        print(f"{curated_user} {total_curations} ({curators_str})"

3- Results:

  Here are some top results of these findings, giving results with users more than 8 times curated, maybe that agrees with @hivewatchers and @anonyi discussion in that post, we can find two supposed alts from the curator being highly curated by this one in the top 3.

UserTotal CurationBreakdown
davidpena21235 by olujay, 8 by vikvitnik, 10 by joheredia21
reeta01192323 by alokkumar121
shriram192121 by alokkumar121
abenad2018 by olujay, 2 by vikvitnik
jhymi164 by princessbusayo, 11 by olujay, 1 by vikvitnik
joyben1514 by uyobong, 1 by princessbusayo
mickymouse1514 by uyobong, 1 by thetimetravelerz
utibeabasi1414 by uyobong
mclarenf111413 by joheredia21, 1 by vikvitnik
nancydominic131 by princessbusayo, 11 by uyobong, 1 by alokkumar121
daniasi137 by olujay, 1 by thetimetravelerz, 3 by joheredia21, 1 by princessbusayo, 1 by alokkumar121
milik80134 by vikvitnik, 4 by alokkumar121, 3 by joheredia21, 1 by olujay, 1 by princessbusayo
mistakili1312 by idiosyncratic1, 1 by alokkumar121
pricelessudy1211 by uyobong, 1 by princessbusayo
newbreed129 by uyobong, 2 by alokkumar121, 1 by princessbusayo
creativepearl1211 by olujay, 1 by vikvitnik
nkemakonam89116 by princessbusayo, 4 by olujay, 1 by alokkumar121
behiver111 by vikvitnik, 10 by alokkumar121
franz54117 by joheredia21, 3 by vikvitnik, 1 by olujay
bitcoinflood114 by thetimetravelerz, 2 by idiosyncratic1, 4 by vikvitnik, 1 by alokkumar121
mummygo1110 by uyobong, 1 by alokkumar121
bala41288118 by thetimetravelerz, 3 by alokkumar121
psalmmy264108 by olujay, 1 by princessbusayo, 1 by vikvitnik
bipolar95101 by uyobong, 6 by olujay, 1 by alokkumar121, 2 by princessbusayo
fonpet109 by uyobong, 1 by princessbusayo
shawnnft102 by vikvitnik, 6 by olujay, 2 by alokkumar121
ukotex109 by uyobong, 1 by princessbusayo
eliany98 by uyobong, 1 by vikvitnik
deraaa97 by olujay, 1 by princessbusayo, 1 by vikvitnik
cjlugo92 by vikvitnik, 7 by joheredia21
nhaji0198 by olujay, 1 by princessbusayo
coolguy12398 by alokkumar121, 1 by olujay
empressjay91 by princessbusayo, 3 by alokkumar121, 5 by fokusnow
luckyali92 by thetimetravelerz, 7 by alokkumar121
sofiaquino9891 by alokkumar121, 3 by joheredia21, 2 by olujay, 3 by vikvitnik
gadrian99 by alokkumar121
etorobong98 by uyobong, 1 by alokkumar121
lileisabel82 by princessbusayo, 4 by alokkumar121, 1 by vikvitnik, 1 by olujay
omarcitorojas86 by vikvitnik, 1 by alokkumar121, 1 by joheredia21
sylvasticks86 by uyobong, 2 by princessbusayo
ibbtammy86 by olujay, 2 by princessbusayo

4- Extra Results:

  Before posting I had the curiosity in seeing this as a monthly trend, it was an interesting result as well, I added another script to the same repo where we can group the same github . In this case I used the "last_updated" object in the Get result from the same comment transactions. Here we go for the last 3 months.

November 2024

UserTotal CurationBreakdown
mamaemigrante51 by olujay, 2 by vikvitnik, 2 by joheredia21
peckypeace54 by uyobong, 1 by olujay
wbrandt44 by joheredia21
cjlugo42 by vikvitnik, 2 by joheredia21
nkemakonam8943 by princessbusayo, 1 by olujay
utibeabasi44 by uyobong
sperosamuel1544 by princessbusayo
mickymouse44 by uyobong
shriram1944 by alokkumar121
joyben33 by uyobong
lileisabel32 by princessbusayo, 1 by alokkumar121
omarcitorojas33 by vikvitnik
duncanek33 by uyobong
eniolaabioye33 by princessbusayo
sylvasticks32 by uyobong, 1 by princessbusayo
nancydominic31 by princessbusayo, 2 by uyobong
pricelessudy33 by uyobong
abenad33 by olujay
hylene7432 by vikvitnik, 1 by olujay
ibbtammy33 by olujay
lisbethseijas31 by olujay, 1 by vikvitnik, 1 by joheredia21
soyunasantacruz32 by olujay, 1 by joheredia21
milik8032 by vikvitnik, 1 by alokkumar121
reeta011933 by alokkumar121

October 2024

UserTotal CurationBreakdown
mclarenf1151 by vikvitnik, 4 by joheredia21
abenad43 by olujay, 1 by vikvitnik
milik8041 by alokkumar121, 2 by joheredia21, 1 by vikvitnik
shriram1944 by alokkumar121
coolguy12332 by alokkumar121, 1 by olujay
pricelessudy33 by uyobong
reeta011933 by alokkumar121
jhymi32 by princessbusayo, 1 by olujay
franz5431 by vikvitnik, 1 by joheredia21, 1 by olujay
davidpena2133 by joheredia21
beckyroyal31 by olujay, 2 by princessbusayo
daniasi32 by joheredia21, 1 by olujay

September 2024

UserTotal CurationBreakdown
abenad88 by olujay
ukotex65 by uyobong, 1 by princessbusayo
mummygo54 by uyobong, 1 by alokkumar121
newbreed55 by uyobong
bipolar9554 by olujay, 1 by princessbusayo
peckypeace55 by uyobong
shriram1944 by alokkumar121
joyben44 by uyobong
milik8041 by olujay, 1 by princessbusayo, 2 by alokkumar121
coolguy12344 by alokkumar121
gargi43 by alokkumar121, 1 by thetimetravelerz
mclarenf1144 by joheredia21
dimeilaz32 by joheredia21, 1 by vikvitnik
behiver33 by alokkumar121
fonpet33 by uyobong
davidpena2132 by vikvitnik, 1 by joheredia21
priyanarc33 by alokkumar121
daniasi32 by olujay, 1 by joheredia21
chinay0431 by olujay, 2 by princessbusayo
mmenyene33 by uyobong
olujay33 by olujay
viviehardika31 by olujay, 1 by alokkumar121, 1 by vikvitnik
edeyglezsosa33 by vikvitnik
bala4128833 by thetimetravelerz
pricelessudy32 by uyobong, 1 by princessbusayo
valblesza32 by uyobong, 1 by princessbusayo

5- Conclusion:

 The script was interesting to build, I had a question and the script helped me to answer the question. I invite anyone to use this type to approach including @leo-curation managers to avoid trends and give some type of help in identifying the exploitation of a big curation account like this one.


Banner created in canva

lucoin1.png


[PT-BR]

  Primeiro, quero agradecer a @leo-curation por fornecer relatórios de sua curadoria. Este é um exemplo de cada programa de curadoria para trazer transparência à nossa comunidade. Vi a postagem de @anonyi sobre um de seus curadores especulando sobre possível "autovotação" de um curador para suas contas. Lembrei que a inleo tem essas postagens sobre suas curadorias e fui verificar, e vi algumas tendências associadas ao nome e comentei na postagem de @anonyi sobre isso. Mas então minha curiosidade em programação pensou sobre a possibilidade de analisar todos os relatórios de curadoria, pelo menos os orgânicos, já que em teoria o usuário curado é curado organicamente sem nenhum outro tipo de influência. A Inleo tem outros tipos de programas de curadoria, incluindo a curadoria de stake, X e threads. Esses são mais direcionados, já que o autor aciona a possibilidade de curadoria. Mas a curadoria orgânica é diferente, mais parecida com um programa de curadoria regular que é independente de qualquer coisa. O curador verifica uma publicação na comunidade e faz a curadoria se gostar. Os scripts completos estão disponíveis em github .

2- Construção de script:

  Usei Python, pois é a linguagem que estou usando mais por aqui no momento, comecei a usar um pouco de JS, mas parei um pouco. Estou ciente de alguns clientes legais criados para o Hive, mas decidi usar a biblioteca regular "request" para executar métodos HTTP get. Eu queria ser simples e o trabalho requer ferramentas simples. Apenas reunir transações de comentários de permlinks que seguem a tendência dos relatórios de curadoria orgânica do inleo! Eles começaram a postar esses relatórios na semana 24 de "curadoria", então não tenho certeza do que perdi antes. Esse tipo de condição pode ser usado para outros relatórios de curadoria publicados por outros usuários, então estou mostrando abaixo onde você pode encontrar isso no script:

author = post["author"]
permlink = post["permlink"]
if author == "leo-curation" and permlink.startswith("organic-curation-report"):

  Minha ideia para as estatísticas era encontrar usuários altamente curados e mostrar aos curadores quantas vezes cada curador votou positivamente nesse usuário específico. Primeiro, criei uma expressão regular para capturar as linhas onde você tinha o usuário no início da linha (usuário curado) e também no final da linha após o último "|" e um espaço, você pode encontrar o nome de usuário do curador. Você pode encontrar isso na função exctract_stats no script. Eu construo um dicionário onde a chave pai é o usuário curado, e o valor é outro dicionário onde você pode ter 1 ou mais chaves (curadores) e o valor disso é o número de vezes, então, por exemplo, se eu for curado por John e Mary uma vez, temos stats['gwajnberg']= { 'John':1, 'Mary':1} .

  No final, eu processo o dicionário final de dicionários com a ordenação dos números e organizo a impressão. Primeiro, eu classifico pelo número total de curadoria usando este código abaixo:

def print_stats(stats):
sorted_stats = sorted(
stats.items(),
key=lambda item: sum(item[1].values()), # Total de curadorias
reverse=True
)

  A última parte da função eu apenas imprimo a lista organizada com um usuário curado por cada linha neste formato: "Usuário1 5 (2 por curador1, 3 por curador2)". O loop para criar essas impressões está abaixo:


para curated_user, curators em sorted_stats:
total_curations = sum(curators.values())
curators_str = ", ".join(
f"{count} por {curator}" para curator, count em curators.items()
)
print(f"{curated_user} {total_curations} ({curators_str})"

3- Resultados:

  Aqui estão alguns dos principais resultados dessas descobertas, dando resultados com usuários mais de 8 vezes curados, talvez isso concorde com a discussão de @hivewatchers e @anonyi naquele post, podemos encontrar dois supostos alts do curador sendo altamente curados por este no top 3.

UserTotal CurationBreakdown
davidpena21235 por olujay, 8 por vikvitnik, 10 por joheredia21
reeta01192323 por alokkumar121
shriram192121 por alokkumar121
abenad2018 por olujay, 2 por vikvitnik
jhymi164 por princessbusayo, 11 por olujay, 1 por vikvitnik
joyben1514 por uyobong, 1 por princessbusayo
mickymouse1514 by uyobong, 1 by thetimetravelerz
utibeabasi1414 by uyobong
mclarenf111413 by joheredia21, 1 by vikvitnik
nancydominic131 by princessbusayo, 11 by uyobong, 1 by alokkumar121
daniasi137 by olujay, 1 by thetimetravelerz, 3 by joheredia21, 1 by princessbusayo, 1 by alokkumar121
milik80134 by vikvitnik, 4 by alokkumar121, 3 by joheredia21, 1 by olujay, 1 by princessbusayo
mistakili1312 by idiosyncratic1, 1 by alokkumar121
pricelessudy1211 by uyobong, 1 by princessbusayo
newbreed129 by uyobong, 2 by alokkumar121, 1 by princessbusayo
creativepearl1211 by olujay, 1 by vikvitnik
nkemakonam89116 by princessbusayo, 4 by olujay, 1 by alokkumar121
behiver111 by vikvitnik, 10 by alokkumar121
franz54117 by joheredia21, 3 by vikvitnik, 1 by olujay
bitcoinflood114 by thetimetravelerz, 2 by idiosyncratic1, 4 by vikvitnik, 1 by alokkumar121
mummygo1110 by uyobong, 1 by alokkumar121
bala41288118 by thetimetravelerz, 3 by alokkumar121
psalmmy264108 by olujay, 1 by princessbusayo, 1 by vikvitnik
bipolar95101 by uyobong, 6 by olujay, 1 by alokkumar121, 2 by princessbusayo
fonpet109 by uyobong, 1 by princessbusayo
shawnnft102 by vikvitnik, 6 by olujay, 2 by alokkumar121
ukotex109 by uyobong, 1 by princessbusayo
eliany98 by uyobong, 1 by vikvitnik
deraaa97 by olujay, 1 by princessbusayo, 1 by vikvitnik
cjlugo92 by vikvitnik, 7 by joheredia21
nhaji0198 by olujay, 1 by princessbusayo
coolguy12398 by alokkumar121, 1 by olujay
empressjay91 by princessbusayo, 3 by alokkumar121, 5 by fokusnow
luckyali92 by thetimetravelerz, 7 by alokkumar121
sofiaquino9891 by alokkumar121, 3 by joheredia21, 2 by olujay, 3 by vikvitnik
gadrian99 by alokkumar121
etorobong98 by uyobong, 1 by alokkumar121
lileisabel82 by princessbusayo, 4 by alokkumar121, 1 by vikvitnik, 1 by olujay
omarcitorojas86 by vikvitnik, 1 by alokkumar121, 1 by joheredia21
sylvasticks86 by uyobong, 2 by princessbusayo
ibbtammy86 by olujay, 2 by princessbusayo

4- Extra Results:

  Before posting I had the curiosity in seeing this as a monthly trend, it was an interesting result as well, I added another script to the same repo where we can group the same github . In this case I used the "last_updated" object in the Get result from the same comment transactions. Here we go for the last 3 months.

November 2024

UserTotal CurationBreakdown
mamaemigrante51 by olujay, 2 by vikvitnik, 2 by joheredia21
peckypeace54 by uyobong, 1 by olujay
wbrandt44 by joheredia21
cjlugo42 by vikvitnik, 2 by joheredia21
nkemakonam8943 by princessbusayo, 1 by olujay
utibeabasi44 by uyobong
sperosamuel1544 by princessbusayo
mickymouse44 by uyobong
shriram1944 by alokkumar121
joyben33 by uyobong
lileisabel32 by princessbusayo, 1 by alokkumar121
omarcitorojas33 by vikvitnik
duncanek33 by uyobong
eniolaabioye33 por princessbusayo
sylvasticks32 por uyobong, 1 por princessbusayo
nancydominic31 por princessbusayo, 2 por uyobong
pricelessudy33 por uyobong
abenad33 por olujay
hylene7432 por vikvitnik, 1 por olujay
ibbtammy33 por olujay
lisbethseijas31 por olujay, 1 por vikvitnik, 1 por joheredia21
soyunasantacruz32 por olujay, 1 por joheredia21
milik8032 por vikvitnik, 1 por alokkumar121
reeta011933 por alokkumar121

Outubro de 2024

UserTotal CurationBreakdown
mclarenf1151 by vikvitnik, 4 by joheredia21
abenad43 by olujay, 1 by vikvitnik
milik8041 by alokkumar121, 2 by joheredia21, 1 by vikvitnik
shriram1944 by alokkumar121
coolguy12332 by alokkumar121, 1 by olujay
pricelessudy33 by uyobong
reeta011933 by alokkumar121
jhymi32 by princessbusayo, 1 by olujay
franz5431 by vikvitnik, 1 by joheredia21, 1 by olujay
davidpena2133 by joheredia21
beckyroyal31 by olujay, 2 by princessbusayo
daniasi32 by joheredia21, 1 by olujay

September 2024

UserTotal CurationBreakdown
abenad88 by olujay
ukotex65 by uyobong, 1 by princessbusayo
mummygo54 by uyobong, 1 by alokkumar121
newbreed55 by uyobong
bipolar9554 by olujay, 1 by princessbusayo
peckypeace55 by uyobong
shriram1944 by alokkumar121
joyben44 by uyobong
milik8041 by olujay, 1 by princessbusayo, 2 by alokkumar121
coolguy12344 by alokkumar121
gargi43 by alokkumar121, 1 by thetimetravelerz
mclarenf1144 by joheredia21
dimeilaz32 by joheredia21, 1 by vikvitnik
behiver33 by alokkumar121
fonpet33 by uyobong
davidpena2132 by vikvitnik, 1 by joheredia21
priyanarc33 by alokkumar121
daniasi32 by olujay, 1 by joheredia21
chinay0431 by olujay, 2 by princessbusayo
mmenyene33 by uyobong
olujay33 by olujay
viviehardika31 by olujay, 1 by alokkumar121, 1 by vikvitnik
edeyglezsosa33 by vikvitnik
bala4128833 by thetimetravelerz
pricelessudy32 by uyobong, 1 by princessbusayo
valblesza32 by uyobong, 1 by princessbusayo

5- Conclusão:

 O script foi interessante de construir, eu tinha uma pergunta e o script me ajudou a respondê-la. Convido qualquer um a usar esse tipo de abordagem, incluindo os gerentes do @leo-curation, para evitar tendências e dar algum tipo de ajuda na identificação da exploração de uma grande conta de curadoria como essa.


Banner criado no canva

Sort:  

These curation reports are not about transparency but about farming more rewards on auto pilot.

But in the end with this farming they also expose their weakness!

We all know the weakness already, just no one gives a fuck to do anything about it.

It is a minority of sure

 2 hours ago Reveal Comment
 2 hours ago Reveal Comment
 2 hours ago Reveal Comment
 2 hours ago Reveal Comment

It looks like not only Mr Alok is suspicious there, there are other names too.

and I believe the same case exists in Curangel and OCD too, but its harder to detect this kind of case on there

It is difficult to detect who pushed the button if it happens only in a private discord channel the recording! Or even if someone has the keys of the curation account…

Thanks for your contribution. Looks like they need to go back to the drawing board and come up with a better 'organic' curation method.

@alokkumar121 anything else to say?

Obrigado por promover a comunidade Hive-BR em suas postagens.

Vamos seguir fortalecendo a Hive

Metade das recompensas dessa resposta serão destinadas ao autor do post.

Vote no @perfilbrasil para Testemunha Hive.

Congratulations @gwajnberg! You have completed the following achievement on the Hive blockchain And have been rewarded with New badge(s)

You got more than 10000 replies.
Your next target is to reach 10500 replies.

You can view your badges on your board and compare yourself to others in the Ranking
If you no longer want to receive notifications, reply to this comment with the word STOP

Check out our last posts:

Hive Power Up Day - December 1st 2024

That's quite interesting - milik80's or bitcoinflood's curation seems rather healthy to me, they were curated by (almost) all curators in a kinda equal distribution.

Accounts curated like 15 times by one and only curator seem rather peculiar.

Could you also list accounts with upvoted comments? With say 4%+ VP, which would make the payout at least $1, if I am not mistaken? I assume there might be some more milking under the radar - upvoted smileys and so.


Your post was manually curated by @shiftrox.
banner_hiver_br_01.png

Delegate your HP to the hive-br.voter account and earn Hive daily!

50 HP
100 HP
200 HP
500 HP
1000 HP

🔹 Follow our Curation Trail and don't miss voting! 🔹

In the end of the day everyone acts like that, if it's not one upvoting it's alts, it's huge upvotes to friends on worthless posts, hive is full of crap posts getting huge curations and rewards and good posts getting nothing

 2 hours ago Reveal Comment