====== Lemmy API PHP Command Line Client ======
After the recent (June 2023) influx of Lemmy spam accounts, there isn't an easy way to delete the hundreds of spam accounts that showed up over night (before I felt forced to enable captchas and email verification etc).
I built a small API command line client to basically allow me to run the [[https://join-lemmy.org/api/classes/LemmyHttp.html#purgePerson|purgePerson]] API command easily in a loop.
You can run it very simply with something like this:
./lemmy-api.php purgePerson 116
or to iterate over a number of ids:
for i in 145 156 162; do ./lemmy-api.php purgePerson $i; done
and to work through all IDs from 170-240:
for i in `seq 170 240`; do ./lemmy-api.php purgePerson $i; done
You can view the code on my repo at https://git.mckillop.org/gitweb/?p=lemmy-api-php or checkout directly with git using:
git clone https://git.mckillop.org/lemmy-api-php
Made a copy of the config file and edit ''config.php'' to add your domain, username and password to get started.
cd lemmy-api-php
cp config.example.php config.php
Here is some example code for a PHP command line tool that will let you purge local users.
#!/usr/bin/php
"PERSONID [reason]",
"deletePost" => "POSTID"
);
if(empty($argv[1]) or empty($argv[2])) {
echo "Usage: ./".basename(__FILE__)." COMMAND [parameters]\n";
echo "You can get help on a specific command with ./".basename(__FILE__)." help COMMAND\n";
echo "Available commands: ".implode(", ", array_keys($implemented_commands))."\n";
exit(0);
} else {
$selected_command = $argv[1];
}
// generate token, or load one from the cache file
if(!file_exists($token_file)) {
echo "Logging in for the first time and storing token...";
$data = json_decode(http_post($lemmy_api_url."user/login", array('username_or_email'=>$username, 'password'=>$password)), true);
$token = $data['jwt'];
if(!empty($token)) {
echo "OK";
file_put_contents($token_file, $token);
} else {
echo "Error logging in.";
}
echo "\n";
} else {
$token = file_get_contents($token_file);
}
switch($selected_command) {
case "help":
if(in_array($argv[2], array_keys($implemented_commands))) {
echo "Usage: ./".basename(__FILE__)." {$argv[2]} ".$implemented_commands[$argv[2]]."\n";
} else {
echo "Unrecognised command, available commands: ".implode(", ", array_keys($implemented_commands))."\n";
}
break;
case "purgePerson":
if(sizeof($argv) > 4)
exit("Too many parameters, if supplying a reason, please use enclose with quotation marks\n");
$person_id = $argv[2];
$reason = "";
if(!empty($argv[3]))
$reason = $argv[3];
echo "Attempting to purge person $person_id...";
$data = json_decode(http_post($lemmy_api_url."admin/purge/person", array('auth' => $token, 'person_id'=>intval($person_id), 'reason'=>$reason)), true);
$status = "ERROR";
if(!empty($data['success']) and $data['success'] == 1)
$status = "OK";
echo $status."\n";
break;
case "deletePost":
$post_id = $argv[2];
echo "Attempting to delete post ID $post_id...";
$data = json_decode(http_post($lemmy_api_url."post/delete", array('auth' => $token, 'post_id'=>intval($post_id), 'deleted'=>true)), true);
$status = "ERROR";
if(!empty($data['post_view']) and $data['post_view']['post']['deleted'] == 1)
$status = "OK";
echo $status."\n";
break;
default:
echo "Unrecognised command";
break;
}
function http_post($url, $data) {
$ch = curl_init();
$payload = json_encode($data);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER,
array('Content-Type:application/json')
);
$result = curl_exec($ch);
if(curl_errno($ch))
print_r(curl_error($ch));
return $result;
}
?>
That should be enough to get you started using the API from the command line. If I get time I'll put a more complete version of this with some other useful commands (like banPerson) on my repo as I find a use for them.
===== Getting Local Lemmy Users =====
To get the list of local users (person_id column) on your Lemmy instance, connect to the postgres database. For me, in docker, this is something like:
sudo docker exec -it bash
psql -U lemmy
select * from local_user;
===== Pre v0.18 =====
While working on this, I discovered the API purgePerson command didn't actually work - something to do with the order of routes. Working with [[https://matrix.to/#/@ksynwa:matrix.org|@ksynwa:matrix.org]] in the Lemmy Development Matrix room, he found a fix and [[https://github.com/LemmyNet/lemmy/pull/3244/commits/53c9efc09fe1caced310da18ac9588b3d2fd2b01|made a PR]] that was accepted into v0.18 (so this should be working in subsequent version of Lemmy (after v0.17.4).