I also have hundreds of spam users, although using reCaptcha (I use OJS 2.4.7.1). Neither Merge Users nor command-line approaches seem to be handy. Either way, you need to choose or enter hundreds of usernames. I just wanted to remove all users who didn’t validate their accounts directly from database. Anyone has tried it and encountered any problems?
I tested removing disabled users from users table, but the entries in dependent tables were not deleted, i.e., in tables: user_settings, user_interests, roles. Any other tables to include? This could help to remove those users.
may i ask why there has never been an option to delete a user completely? I mean, I have never seen an application where you have to “merge into an existing user” to get rid of another one which brings the next question to the table: what do I do with the merged user then? I simply registered a user in a live environment to test something in expectation that I can remove the user later easily via admin … but to no avail. I’m a bit shocked frankly speaking.
If you want to get rid of a test account, merge it into your administrator account. The distinction between “merge” and “delete” is that the merged account’s submissions etc. are preserved.
Regards,
Alec Smecher
Public Knowledge Project Team
Assuming you’re in the main OJS directory, then type this: for i in "${users[@]}"; do php tools/mergeUsers.php username_to_merge_into_here $i; done
This will loop through your array and merge each user in the “users” array into the “username_to_merge_into_here” username. Obviously replace that with the username you want to merge into. Also be sure that the mergeUsers.php has execute permissions for your user account.
Spam users not registered have not a role, they are not in the table roles. The “good” user have role and theirs user_id are present in the roles table.
The query to delete them is:
delete from users where user_id not in (select user_id from roles);
Thank you ctgraham. I suspected that, but is there any other way to delete 22.000 false users? It seems incredible but OJS have no way to delete these spam users. The recommendation to merge users one by one to delete them afterwards is not very exciting.
One wonders how is it possible that OJS allows the existence of these users in the first place.
It adds support for merging multiple users at once to the command-line tool, removing the need for a shell script loop. It also adds support for specifying users to be merged by user ID, not just username.
Regards,
Alec Smecher
Public Knowledge Project Team
this could be is usefull to retrieve a list of users to be merged by the tools/mergeUsers.php .
however it seems like some spammers are registered as authors, so they do have a role.
What we want is to refine the query to list all users who:
are authors but dont have a submission, and
are not reviewers and dont have any other role in any journal.
The problem is that roles’ table uses an integer to registetr this information in the role_id column. I suspect it is a bitwise encoding, but couldn’t find any documentation about it.
So our query to list suspecious users would be:
select user_id from users where user_id not in
(
select user_id from roles where role_id = <integer for reviewers, managers, admin, etc..>
UNION
select user_id from roles r, articles a where r.user_id = a.user_id and r.role_id = <integer for authors>
)
or something like that…
could anyone help us discover what are the integer codes for the roles mentioned on the query?
select user_id from users where user_id not in
(
select user_id from roles where role_id < 65536
UNION
select r.user_id from roles r, articles a where r.user_id = a.user_id and (r.role_id = 65536 or r.role_id = 1114112)
)
Hi. I have an OJS portal with a half of million users. 99% of them are spam users.
I made some search via users table and merged about 150000 users. It is not difficult to find all users with “porno” or “casino” in url and merge them.
Now i am searching users in user_settings table. I can get not names, but user ids in this table. Is it possible to use mergeUsers.php with user ids? Any way to convert ids to names? I know not enough about sql, and i need a simple tool to make this cleanup.
select user_id from users where user_id not in
(
select user_id from roles where role_id < 65536
UNION
select r.user_id from roles r, articles a where r.user_id = a.user_id and (r.role_id = 65536 or r.role_id = 1114112)
).