XF 2.2 Проблема с API

Версия XenForo
2.2

Ruimter

Участники
Сообщения
7
Реакции
-1
Баллы
16
6.1. Не создавайте темы с малопонятным содержанием. + 6.11
Проблема с API-ключами я даю боту Ключ суперпользователя и ставлю везде галочки но он не может использавать метод

POST users/{id}/​


Знімок екрана 2024-07-28 165934.png
 
Возможно, ты хочешь что-то отредактировать в профиле пользователя.(скинь пример запроса)
Указывай в запросе XF-Api-User, либо ставь параметр api_bypass_permissions 1.
If the API key selected is a super user key, you may pass the user ID of the context user via the XF-Api-User header. If no user ID is passed, the context will default to a guest.
If the request is made with a super user key and you wish to bypass the context user's permissions, this may be done on a per-request basis by setting the api_bypass_permissions parameter to 1. (This can be passed via a query string or as part of the request body.)
 
Последнее редактирование:
многие вещи возможны, но мы сюда не гадать пришли
человек задал вопрос, дал 0 информации, получил симметричный ответ
тут, КАК МИНИМУМ, должен быть приведен сниппет с запросом
 
Python:
def change_nickname(old_nickname, new_nickname):
find_user_url = f"{XENFORO_FORUM_URL}users/find-name"
    headers = {
'Content-Type': 'application/json',
        'XF-Api-Key': XENFORO_USER_API_KEY
    }
params = {'username': old_nickname}
response = requests.get(find_user_url, headers=headers, params=params)
    user_data = response.json()

if 'exact' in user_data and user_data['exact']:
user_id = user_data['exact']['user_id']

update_user_url = f"{XENFORO_FORUM_URL}users/{user_id}/"
        data = {
 'username': new_nickname
        }

response = requests.post(update_user_url, headers=headers, data=json.dumps(data))
print(f"Response status code: {response.status_code}")
print(f"Response content: {response.content}")

        update_response = response.json()
 print(update_response)

if 'success' in update_response and update_response['success']:
return True, "Nickname changed successfully."
        else:
if 'errors' in update_response:
error_message = update_response['errors'][0]['message']
return False, f"Failed to update nickname: {error_message}"
            return False, "Failed to update nickname for an unknown reason."
    else:
 return False, "User not found."


Ошибка происходит тут -

Python:
update_user_url = f"{XENFORO_FORUM_URL}users/{user_id}/"
        data = {
 'username': new_nickname
        }

response = requests.post(update_user_url, headers=headers, data=json.dumps(data))
print(f"Response status code: {response.status_code}")
print(f"Response content: {response.content}")

        update_response = response.json()
 print(update_response)

if 'success' in update_response and update_response['success']:
return True, "Nickname changed successfully."
        else:
if 'errors' in update_response:
error_message = update_response['errors'][0]['message']
return False, f"Failed to update nickname: {error_message}"
            return False, "Failed to update nickname for an unknown reason."
    else:
 return False, "User not found."
 
Ruimter,
Код:
++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.

А запрос-то какой ? Или тут клуб любителей душить питона ?
 
Последнее редактирование:
Возможно, ты хочешь что-то отредактировать в профиле пользователя.(скинь пример запроса)
Указывай в запросе XF-Api-User, либо ставь параметр api_bypass_permissions 1.


 
Ну вообще-то Ксен не поддерживает JSON в виде тела, о чём прямо в их документации сказано:
Requests bodies must be sent using the application/x-www-form-urlencoded encoding or, if a file is being uploaded, the multipart/form-data encoding.
Если очень хочется "срать жсонами", то можно установить мой плагин, которое "научит" движок читать JSON.
Так же в этой же документации указано очень важное замечание:
If the API key selected is a super user key, you may pass the user ID of the context user via the XF-Api-User header. If no user ID is passed, the context will default to a guest.
Т.к. Вы не указываете явно какого-либо пользователя, то движок стандартно исполняет Ваш запрос "от имени гостя", у которого, естественно, нет прав на такие махинации. Именно если используется супер-ключ.
Так что решение проблемы - добавить параметр api_bypass_permissions, если мы насильно меняем никнейм, либо указать контекстом пользователя, от кого меняем.

Мне было очень больно читать Ваш код без вменяемой табуляции, так что я сделал свой, делающий похожую вещь, и немного более абстрагированный.
Python:
#!/usr/bin/env python3

from requests import Session

class ForumManager:
    def __init__(self, url, key, headers={}):
        self._url = url
        self._key = key
        self._headers = headers


    def _session(self):
        session = Session()
        session.headers.update({**{
            'XF-API-Key': self._key
        }, **self._headers})
        return session


    def find_user_by_name(self, name):
        with self._session() as session:
            return session.get(f'{self._url}users/find-name', params={'username': name}).json()['exact']


    def edit_user(self, user_id, bypass_permissions=False, **kwargs):
        with self._session() as session:
            params = {
                'api_bypass_permissions': 1 if bypass_permissions else 0
            }

            response = session.post(f'{self._url}users/{user_id}/', params=params, data=kwargs)
            response.raise_for_status()
            return response.json()['user']


manager = ForumManager('http://localhost/index.php?api/', 'mRi1HkG-0xSDEZ8kO703xPV909h3-_UL')
user = manager.find_user_by_name('Dummy')
print(f'Found user with ID {user["user_id"]}, changing username...')
edited_user = manager.edit_user(user['user_id'], True, username='Чебурекw')
print(f'Done, now user with ID {user["user_id"]} is named as {edited_user["username"]}')
1722272736959.png

OFFTOP

В нормальной ситуации, ссылка на форум и апи-ключ должны браться из энвов, но это быстрозапиленный на коленке скрипт.

 
Последнее редактирование модератором:
Ну вообще-то Ксен не поддерживает JSON в виде тела, о чём прямо в их документации сказано:

Если очень хочется "срать жсонами", то можно установить моё дополнение, которое "научит" движок читать JSON.
Так же в этой же документации указано очень важное замечание:

Т.к. Вы не указываете явно какого-либо пользователя, то движок стандартно исполняет Ваш запрос "от имени гостя", у которого, естественно, нет прав на такие махинации. Именно если используется супер-ключ.
Так что решение проблемы - добавить параметр api_bypass_permissions, если мы насильно меняем никнейм, либо указать контекстом пользователя, от кого меняем.

Мне было очень больно читать Ваш код без вменяемой табуляции, так что я сделал свой, делающий похожую вещь, и немного более абстрагированный.
Python:
#!/usr/bin/env python3

from requests import Session

class ForumManager:
    def __init__(self, url, key, headers={}):
        self._url = url
        self._key = key
        self._headers = headers


    def _session(self):
        session = Session()
        session.headers.update({**{
            'XF-API-Key': self._key
        }, **self._headers})
        return session


    def find_user_by_name(self, name):
        with self._session() as session:
            return session.get(f'{self._url}users/find-name', params={'username': name}).json()['exact']


    def edit_user(self, user_id, bypass_permissions=False, **kwargs):
        with self._session() as session:
            params = {
                'api_bypass_permissions': 1 if bypass_permissions else 0
            }

            response = session.post(f'{self._url}users/{user_id}/', params=params, data=kwargs)
            response.raise_for_status()
            return response.json()['user']


manager = ForumManager('http://localhost/index.php?api/', 'mRi1HkG-0xSDEZ8kO703xPV909h3-_UL')
user = manager.find_user_by_name('Dummy')
print(f'Found user with ID {user["user_id"]}, changing username...')
edited_user = manager.edit_user(user['user_id'], True, username='Чебурекw')
print(f'Done, now user with ID {user["user_id"]} is named as {edited_user["username"]}')
Посмотреть вложение 154144

OFFTOP

В нормальной ситуации, ссылка на форум и апи-ключ должны браться из энвов, но это быстрозапиленный на коленке скрипт.

Спасибо, я читал документацию, но половины не понял такая английский плохой, а русской документации xenforo нет. Еще раз спасибо.
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу