Whoever has an accout on Hive for some time will probably have heard at least once the controversial Global Hive Blacklist.
A huge list, union of all existing blacklists on Hive.
<p dir="auto"><span><img src="https://images.hive.blog/0x0/https://files.peakd.com/file/peakd-hive/hiveio/XsnzlWHl-social_hive_flare.jpg" />
<p dir="auto">Understood by a few, loved by a very few and hated by many.<br />
The <em>Poor Global Hive Blacklist, born with the noble intent to safeguard our dear Blockchain from bad users, has arrived at the end of his life.<br /><br />
With this API it was possible to check with a couple of clicks if a Hive user was part of some blacklists such as spaminator, buildawhale, hivewatchers etc. etc.<br />
Very useful for those who do curation on Hive.<span>
Or rather the Global Blacklist API managed by <a href="/@themarkarkmark">@themarkarkmark is no longer running.
<p dir="auto"><span>For our <a href="/@discovery-it">@discovery-it curators team the Global Blacklist API was very important, in fact our bot called "discoBOT" :) with a simple query was able to automatically check if the authors chosen by the curators were part of some blacklists. And in the affirmative case the bot did not upvote the post in question.
<p dir="auto">Fortunately despite the closure of the service we managed to recover the blacklist, a huge JSON file containing about 85000 accounts, which is now examined directly by discoBOT.
<p dir="auto">You can find a copy of this blacklist <a href="https://github.com/mesballo/discoblacklist" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">here on Github.
<p dir="auto">In this post I want to share with you the simple but operative solution that I found to run the bot without the need to occupy the program memory with the entire list.
<p dir="auto">Simply, instead of loading the JSON file into a variable, I created a <strong>SQLite database that remains outside the code and allow the scrypt to interact to it quickly and safely.
<p dir="auto"><br />
<em>I take this opportunity to thank him for the fundamental contribution he brings to Hive.<span>Discobot is written in Python and interacts with our Blockchain thanks to the Beem library of <a href="/@holger80">@holger80.
<p dir="auto">Let's talk about the code:
<p dir="auto">To be able to use a SQLite database in a Python scrypt you must first import the sqlite3 library within the code.
<pre><code>import sqlite3
<p dir="auto">Then you need to create a connection with the database. If as in this case, the database still does not exist, don't worry the following line of code will create an empty one inside the current folder.<br />
To do this I have defined a variable <em>conn and used the <em>connect() method from the sqlite3 library.<br />
The name I chose for the database is <strong>black.db
<pre><code>conn = sqlite3.connect("black.db")
<p dir="auto">For this specific database, I decided to create a table called BLACK with a single column of textual values called NAME. Normally databases are rather complicated objects, thanks to tables and columns they can store a lot of different information, such as: name, surname, sex, age, job, etc. etc.<br />
But in this case the only information I needed is whether a given account is part of the blacklist. So the single NAME column which contains all the accounts is more than enough for my purpose.<br />
I used the <em>execute() method to create the table called BLACK.
<pre><code>conn.execute("CREATE TABLE BLACK (NAME TEXT NOT NULL);")
<p dir="auto">Now one needs to fill the database with the list of users.<br />
The list is a simple array contained in a json <em>Blacklist.json file, so you need to import the json library and define a variable to store its contents.
<pre><code>import json
black_list = json.load(open('Blacklist.json'))
<p dir="auto">For each blacklist user I have created an INSERT query<br />
and with a <em>for cycle I ran them all in the database. Finally I used the <em>commit() method, to load the data permanently and the <em>close() method to close the connection.
<pre><code>for name in black_list:
query = "INSERT INTO BLACK (NAME) VALUES ('"+name+"');"
conn.execute(query)
conn.commit()
conn.close()
<p dir="auto">Well at this point the black.db database is ready to be used.
<p dir="auto">Remains to show you the piece of code I added to discoBOT
<p dir="auto">For simplicity, the <em>nick variable will represent the author of a post selected by a curator. My goal is to know if that author is blacklisted or not, so just do a SELECT query like this: SELECT NAME FROM BLACK WHERE NAME = nick. If the author belongs to the blacklist then the query will return the author's name otherwise it will return a null value.<br />
To distinguish the 2 cases I used an <em>if on the length of the output obtained using the <em>fetchall() method of the <em>cursor() class which produces an array as a response.<br />
Therefore, since the output is an array, if the value is null, the array will be an empty array and therefore of zero length. In this case <em>len(result) will be equal to zero.
<pre><code># Previous Code
query = "SELECT NAME FROM BLACK WHERE NAME = '"+nick+"'"
conn = sqlite3.connect('black.db')
cursor = conn.cursor()
cursor.execute(query)
result = cursor.fetchall()
conn.close()
if len(result) > 0:
# the author is on the blacklist
# do nothing or scold the curator!! :)
else:
# the author is NOT on the blacklist
# vote , comment , follow , spread love , smoke weed!!!
<p dir="auto">Well and with this I leave you for today. Bye Bye!!
<hr />
<p dir="auto"><center><strong>ITA
<p dir="auto">Chi bazzica su Hive da qualche tempo avrà probabilmente sentito nominare almeno una volta la controversa e famigerata <strong>Global Hive Blacklist.<br />
Una lista enorme, unione di tutte le blacklist esistenti su Hive.
<p dir="auto"><span><img src="https://images.hive.blog/0x0/https://files.peakd.com/file/peakd-hive/hiveio/XsnzlWHl-social_hive_flare.jpg" />
<p dir="auto">Compresa da pochi, amata da pochissimi e odiata da molti.<br />
La <em>povera Global Hive Blacklist, nata con il nobile intento di salvaguardare la nostra cara blockchain da utenti maleintenzionati, è arrivata a termine della sua vita.<br /><br />
Con questa Api era possibile controllare con un paio di click se un utente di Hive faceva parte di qualche blacklist come quelle di Spaminator, BuildAWhale, HiveWatchers ecc ecc.<br />
Molto utile per chi fa curation su Hive.<span>
O meglio la Global Blacklist API gestita da <a href="/@themarkymark">@themarkymark non è più in funzione.
<p dir="auto"><span>Per il nostro team di curatori di <a href="/@discovery-it">@discovery-it la Global Blacklist API era molto importante, infatti il nostro bot chiamato "discoBOT" :) con una semplice query controllava in automatico se gli autori scelti dai curatori facevano parte di qualche blacklist. E in caso affermativo il bot non curava il post in questione.
<p dir="auto">Fortunatamente nonostante la chiusura del servizio siamo riusciti a recuperare la blacklist, un file JSON enorme contenente circa 85000 account, il quale ora viene esaminato direttamente da discoBOT.
<p dir="auto">Potete trovare una copia di questa blacklist <a href="https://github.com/mesballo/discoblacklist" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">qui su Github.
<p dir="auto">In questo post volevo condividere con voi la soluzione seppur semplice ma efficace che ho trovato per far girare il bot senza il bisogno di occupare la memoria del programma con l'intera lista.
<p dir="auto">Semplicemente invece di caricare il file JSON in una variabile, ho creato un database <strong>SQLite che rimane esterno al codice e con cui lo scrypt può interagire in maniera rapida e sicura.
<p dir="auto"><br />
<em>Colgo l'occasione per ringraziarlo per il fondamentale contributo che porta ad Hive.<span>DiscoBot è scritto in python e interagisce con la nostra blockchain grazie alla libreria Beem di <a href="/@holger80">@holger80.
<p dir="auto">Passo ora a parlarvi del codice:
<p dir="auto">Per poter utilizzare un database SQLite in uno scrypt python bisogna innanzitutto importare la libreria sqlite3 all'interno del codice.
<pre><code>import sqlite3
<p dir="auto">Poi bisogna creare una connessione con il database. Se come in questo caso, il database ancora non esiste, non vi preoccupate la seguente riga di codice ne creerà uno vuoto all'interno della cartella di lavoro.<br />
Per fare questo ho definito una variabile <em>conn e utilizzato il metodo <em>connect() della libreria sqlite3.<br />
Il nome che ho scelto per il database è <strong>black.db
<pre><code>conn = sqlite3.connect("black.db")
<p dir="auto">Per questo database in particolare, ho deciso di creare una tabella chiamata BLACK con un'unica colonna di valori testuali chiamata NAME. Normalmente i database sono oggetti piuttosto complicati, grazie a tabelle e colonne possono archiviare molte informazioni differenti, come ad esempio: nome, cognome, sesso, età, lavoro, ecc ecc.<br />
Ma in questo caso l'unica informazione che mi serviva è se un dato account fa parte della blacklist. Quindi la sola colonna NAME che contiene tutti gli account è più che sufficiente per il mio scopo.<br />
Ho utilizzato il metodo <em>execute() per creare la tabella chiamata BLACK.
<pre><code>conn.execute("CREATE TABLE BLACK (NAME TEXT NOT NULL);")
<p dir="auto">Adesso bisogna riempire il database con la lista degli utenti.<br />
La lista è un semplice array contenuto in un file json <em>Blacklist.json , bisogna quindi importare la libreria json e definire una variabile per memorizzarne il contenuto.
<pre><code>import json
black_list = json.load(open('Blacklist.json'))
<p dir="auto">Per ogni utente della blacklist ho creato una query INSERT<br />
e con un cliclo <em>for le ho eseguite tutte nel database. Infine ho utilizzato il metodo <em>commit(), per caricare i dati in maniera definitiva e il metodo <em>close() per chiudere la connessione.
<pre><code>for name in black_list:
query = "INSERT INTO BLACK (NAME) VALUES ('"+name+"');"
conn.execute(query)
conn.commit()
conn.close()
<p dir="auto">Bene arrivati a questo punto il database black.db è pronto per essere usato.
<p dir="auto">Mi resta da mostrare la parte di codice che ho aggiunto a discoBOT.
<p dir="auto">Per semplicità la variabile <em>nick rappresenterà l'autore di un post selezionato da un curatore. Il mio obiettivo è sapere se quell'autore fa parte della blacklist o meno, quindi basterà fare una query SELECT di questo tipo: SELECT NAME FROM BLACK WHERE NAME = nick. Se l'autore appartiene alla blacklist la query restituirà il nome dell'autore altrimenti restituirà un valore nullo.<br />
Per distinguere i 2 casi ho usato un <em>if sulla lunghezza dell'output ottenuto utilizzato il metodo <em>fetchall() della classe <em>cursor() che produce un array come risposta.<br />
Dunque essendo l'output un array, se il valore è nullo, l'array sarà un array vuoto e quindi di lunghezza zero. In questo caso <em>len(result) sarà uguale a zero.
<pre><code># Previous Code
query = "SELECT NAME FROM BLACK WHERE NAME = '"+nick+"'"
conn = sqlite3.connect('black.db')
cursor = conn.cursor()
cursor.execute(query)
result = cursor.fetchall()
conn.close()
if len(result) > 0:
# the author is on the blacklist
# do nothing or scold the curator!! :)
else:
# the author is NOT on the blacklist
# vote , comment , follow , spread love , smoke weed!!!
<p dir="auto">Bene e con questo vi saluto. Ciao ciao!!
<hr />
<p dir="auto"><center><i>I'm a member of the Discovery-it Witness Team
<p dir="auto"><center>
<p dir="auto"><a href="https://hivesigner.com/sign/account-witness-vote?witness=discovery-it&approve=true" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Vote for Us as Witness!<br />
<a href="https://hive.blog/trending/hive-193212">Join our community! <br />
<center><span> <img src="https://images.hive.blog/768x0/https://files.peakd.com/file/peakd-hive/discovery-it/xjB70hST-BannerCommenti_4.jpg" srcset="https://images.hive.blog/768x0/https://files.peakd.com/file/peakd-hive/discovery-it/xjB70hST-BannerCommenti_4.jpg 1x, https://images.hive.blog/1536x0/https://files.peakd.com/file/peakd-hive/discovery-it/xjB70hST-BannerCommenti_4.jpg 2x" />
A large benefit of the Blacklist (at least mine) was it was updated daily. While it remains fairly accurate, without updates (adding and removing) the blacklist usefulness and accuracy declines each day.
doing, could be a start.Yeah you are all right. Little by little i'm adding and removing authors as we found. That's the best we can do. Waiting for a decentralized solution...maybe something like what @keys-defender is
Indeed, yesterday I also released an update:
https://hive.blog/hive-169321/@keys-defender/new-commands-and-ban-lists
And as mentioned in the post I’ll soon allow whitelisted users and top40 witnesses to remove entries with commands on chain.
Really good job!!
Sempre al top!
eh eh eh grazie! :)
Grande! È tempo che impari Python! =]
:) Grazie! Sono sicuro che te lo mangi in poco tempo. E' il linguaggio più semplice che abbia mai usato!
Grande lallo! Ce ne fossero un po di più come te qui sopra!
:) Grazie mille Armà. Un caro e sincero abbraccio per le tue gentili parole
Congratulations @lallo! You have completed the following achievement on the Hive blockchain and have been rewarded with new badge(s) :
<table><tr><td><img src="https://images.hive.blog/60x70/http://hivebuzz.me/@lallo/upvotes.png?202104101259" /><td>You distributed more than 19000 upvotes.<br />Your next target is to reach 20000 upvotes. <p dir="auto"><sub><em>You can view your badges on <a href="https://hivebuzz.me/@lallo" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">your board and compare yourself to others in the <a href="https://hivebuzz.me/ranking" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Ranking<br /> <sub><em>If you no longer want to receive notifications, reply to this comment with the word <code>STOP <h6>Support the HiveBuzz project. <a href="https://hivesigner.com/sign/update_proposal_votes?proposal_ids=%5B%22109%22%5D&approve=true" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Vote for <a href="https://peakd.com/me/proposals/147" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">our proposal!thanks for sharing.
you are welcome :)
Interessante ed i complimenti per le tue abilità informatiche
Grazie mille Stefano non si finisce mai di imparare :)