Удалить все сообщения пользователя на всём сайте через API?

Как мне это сделать? Не могу понять, что именно нужно сделать…

Я посмотрел:

https://www.postman.com/api-evangelist/workspace/discourse/documentation/35240-c739e2a5-3ddf-4ffc-90e9-7dd579e8a55d?entity=request-35240-b041dc53-b653-4c46-b067-aee2b0a5cb46

но ничего не понял. Главное, что я тоже не понимаю, — как получать каждый случайный ID и затем отправлять его на удаление, поскольку каждый ID отличается…

Лоло, как удалить все сообщения пользователя Discourse через API?

Кстати, я не думаю, что существует способ массового удаления через API. Мне кажется, вам нужно написать скрипт, который будет перебирать каждый пост для удаления. В зависимости от количества постов могут возникнуть проблемы с ограничениями скорости запросов.

Лола, как написать скрипт для массового удаления постов в Discourse?

Кстати, зачем вы используете API для этого?

Я думаю, это также можно сделать с помощью задачи rake из командной строки.

Спасибо, попробую это сегодня! Так что, можно ли выполнить эту задачу с помощью rake-скрипта как обычный пользователь? Я хочу, чтобы всё делалось от имени обычного пользователя, не из числа сотрудников.

Именно так.

Когда я запустил приведённый ниже Python-скрипт:

import requests
# Configuration
discourse_base_url = 'https://forums.mysite.me/'
api_key = 'eb4065d1dergrgh45h45h54h45reg4g70cbeb274bf7f87'
api_username = 'username'
target_username = 'targetusername'

# Headers for API requests
headers = {
    'eb4065d1dergrgh45h45h54h45reg4g70cbeb274bf7f87': api_key,
    'B': api_username
}

def get_user_posts(username):
    """Fetch posts by a specific user."""
    posts = []
    url = f'{discourse_base_url}/posts.json?username={username}'
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        posts_data = response.json()
        posts = posts_data.get('latest_posts', [])
    return posts

def delete_post(post_id):
    """Delete a specific post."""
    url = f'{discourse_base_url}/posts/{post_id}.json'
    response = requests.delete(url, headers=headers)
    return response.status_code == 200

def main():
    # Fetch user posts
    posts = get_user_posts(target_username)
    
    # Delete each post
    for post in posts:
        post_id = post.get('id')
        if delete_post(post_id):
            print(f'Successfully deleted post {post_id}')
        else:
            print(f'Failed to delete post {post_id}')

if __name__ == '__main__':
    main()

В моём терминале/консоли я получил:

Failed to delete post 73
Failed to delete post 71
Failed to delete post 69
Failed to delete post 60
Failed to delete post 47

Я пробовал два API-ключа, которые создал. Один — только для меня, другой — для всех пользователей. В обоих случаях использовал опцию «Global». Результат тот же.

Извините, но это заставило меня рассмеяться вслух. Мне это было нужно сегодня утром, ха-ха.

Это не сработает. Даже для API-запросов. После определённого момента пользователи не могут удалять свои собственные сообщения.

Обычно лучшим вариантом является анонимизация всех сообщений пользователя, если он больше не хочет участвовать на форуме. Это просто изменит его имя пользователя на случайное, чтобы его сообщения больше не были с ним связаны.

@Lilly Я видел ваш удалённый ответ. Так что, как насчёт того, чтобы это работало для меня или другого администратора? Не уверен, видели ли вы, но я отредактировал свой предыдущий пост, чтобы включить результат, который я получаю при использовании этого скрипта.

Думаю, то же самое можно спросить и у вас, @blake, ха-ха.

Пока это только для тестирования.

Я удалил, так как Блейк уже ответил.

Вы можете попробовать этот запрос curl для вашего идентификатора поста

curl -i -sS -X DELETE "http://localhost:4200/posts/<post-id>.json"  \
-H "Content-Type: multipart/form-data"  \
-H "Api-Key: key"  \
-H "Api-Username: username"

Чтобы проверить, вернёт ли он другую ошибку, но скорее всего он просто напишет «Произошла ошибка» :frowning:

Похоже, что существуют настройки сайта, касающиеся удаления постов пользователями, которые можно настроить. Также похоже, что где-то может быть кнопка «Удалить все посты».

Попробовав команду curl выше:

curl -X GET "https://forums.mysite.me/posts.json?username=targetusername" \
-H "Api-Key: eb4065d56u7u6u65u54y54uy566575w4yer343434ac8a770cbeb274bf7f87" \
-H "Api-Username: AdminUsername"

Она выполнилась и вернула мне посты… но затем я получил это:

C:\Users\User>-H "Api-Key: eb4065d56u7u6u65u54y54uy566575w4yer343434ac8a770cbeb274bf7f87"
'-H' не является внутренней или внешней командой,
исполняемой программой или файлом пакетной обработки.

C:\Users\User>-H "Api-Username: AdminUsername"
'-H' не является внутренней или внешней командой,
исполняемой программой или файлом пакетной обработки.

Это нормально или почему это происходит?

Введённая вами команда curl отличается от той, что приведена выше.

Похоже, вы используете терминал Windows cmd; возможно, он не принимает символ \ для разделения строк. Вы можете просто удалить их, чтобы команда была в одной строке.

Попробовал уже без слэшей. Всё заработало, когда сделал всё в одну строку, спасибо!

Извините, имел в виду ту, которую поделилась Лилли.

Похоже, существует конечная точка для пакетного удаления всех сообщений пользователя.

Она активируется этой кнопкой на странице пользователя из панели администратора.

Итак, вместо того чтобы вручную вводить ID поста (ведь в таком случае я мог бы просто зайти на сам сайт и нажать кнопки удаления, верно?), как можно автоматически подставлять его для каждого поста?

О, отлично! Значит, мне нужно просто составить URL:
http://mysite.com/admin/users/79/delete_posts_batch?
Или что означает «79» здесь? Это ID пользователя, который, я предполагаю, можно получить, перейдя на профиль пользователя?

Да, это ID пользователя, и это PUT-запрос. Он возвращает количество удалённых постов.

О, значит, я не должен этого делать?

curl -i -sS -X DELETE "http://forums.mysite.com/admin/users/0/delete_posts_batch"  \
-H "Content-Type: multipart/form-data"  \
-H "Api-Key: eb4065d45745678u564754y4545y545445674y34545y50cbeb274bf7f87" \
-H "Api-Username: AdminUsername"

Не DELETE, а PUT запрос. Также здесь нет параметров формы.

Если удаление выполняет администратор, существует административная операция :garbage: Удалить все сообщения для пользователя.

Возможно, вам потребуется сначала изменить другие настройки, чтобы разрешить это (delete all posts max).

Я искренне надеюсь, что это не настоящий API-ключ вашего сайта. Как уже отмечалось ранее, довольно легко понять, какой именно это сайт.

Следует считать этот ключ скомпрометированным и заменить его.

Так что просто полностью убрать эту строку формы?

РЕДАКТИРОВАНО: Я оставил строку, просто заменил “DELETE” на “PUT”, и всё заработало.

Удаление постов через API не работает у меня — возвращается ошибка 403 с телом {“errors”:[“Вы не имеете права просматривать запрошенный ресурс.”],“error_type”:“invalid_access”}

Есть ли какие-то идеи, как это исправить?