使用python请求通过用户服务插件在openfire中创建新用户

使用python请求通过用户服务插件在openfire中创建新用户,python,python-requests,openfire,Python,Python Requests,Openfire,我正在尝试编写一个python程序,它将向openfire服务器添加一个新用户。我已经启用了用户服务请求和http基本身份验证。 我得到了401的回复。这是我的密码 import requests from requests.auth import HTTPDigestAuth def add_controller(name,password): xml = """<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

我正在尝试编写一个python程序,它将向openfire服务器添加一个新用户。我已经启用了用户服务请求和http基本身份验证。 我得到了401的回复。这是我的密码

import requests
from requests.auth import HTTPDigestAuth
def add_controller(name,password):
    xml = """<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<user>
    <username>""" + name + """</username>
    <password>""" + password + """<password>
</user>"""
    headers = {'Content-Type': 'application/xml','Authorization':'Basic YWRtaW46MTIzNDU='}
    r = requests.post(url='http://192.168.200.115:9090/plugins/userService/users', data=xml, headers=headers ,auth=HTTPDigestAuth('admin','admin'))
    print r

add_controller("test@example.com","test")
导入请求
从requests.auth导入HTTPDigestAuth
def add_控制器(名称、密码):
xml=”“”
“+name+”
“+密码+”
"""
headers={'Content-Type':'application/xml','Authorization':'Basic YWRtaW46MTIzNDU='}
r=requests.post(url=)http://192.168.200.115:9090/plugins/userService/users,data=xml,headers=headers,auth=HTTPDigestAuth('admin','admin'))
印刷机
添加\u控制器(“test@example.com“,“测试”)

您不应设置两个
授权
标题。您可以执行基本授权或摘要授权,而
auth
参数可以处理这两种授权。挑一个或另一个

使用基本身份验证:

headers = {'Content-Type': 'application/xml'}
r = requests.post(
    url='http://192.168.200.115:9090/plugins/userService/users',
    data=xml, headers=headers, 
    auth=('admin', '12345'))
或使用摘要验证:

headers = {'Content-Type': 'application/xml'}
r = requests.post(
    url='http://192.168.200.115:9090/plugins/userService/users',
    data=xml, headers=headers, 
    auth=HTTPDigestAuth('admin', '12345'))
请参阅文档的第页

与基本的auth选项配合使用应该可以很好地工作

您可以使用模板更轻松地创建XML文档,并且您应该真正使用来确保您的数据适合包含在文档中:

from xml.sax.saxutils import escape

xml = """\
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<user>
    <username>{}</username>
    <password>{}<password>
</user>""".format(escape(name), escape(password))
从xml.sax.saxutils导入转义
xml=”“”\
{}
{}
“”格式(转义(名称)、转义(密码))

这是我以后的参考,openfire需要授权标头。我的工作代码如下,它添加了测试用户和密码作为测试

import requests 
from xml.sax.saxutils import escape

def add_controller(name,password):
    xml = """<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<user>
    <username>{}</username>
    <password>{}</password>
</user>""".format(escape(name), escape(password))

    headers = {'Content-Type': 'application/xml','Authorization': 'Basic YWRtaW46MTIzNDU='}
    r = requests.post(
        url='http://192.168.200.105:9090/plugins/userService/users',
        data=xml, headers=headers, 
        auth=('admin', 'admin')
    )
    print r 

add_controller("test","test")
导入请求
从xml.sax.saxutils导入转义
def add_控制器(名称、密码):
xml=”“”
{}
{}
“”格式(转义(名称)、转义(密码))
headers={'Content-Type':'application/xml','Authorization':'Basic YWRtaW46MTIzNDU='}
r=请求数.post(
url='1〕http://192.168.200.105:9090/plugins/userService/users',
data=xml,headers=headers,
auth=('admin','admin')
)
印刷机
添加控制器(“测试”、“测试”)

它看起来像是您混合使用的Basic和Digest auth。我猜这是一个赢家auth=HTTPDigestAuth('admin','admin')。@iamads你是如何使用python从openfire服务器获取数据(消息的?@AvinashRaj我使用sleekxmpp连接到openfire@Matijn的,正如你所说的,我试过了,但我仍然得到400的回复,有什么想法吗?@iamads:我不知道。我建议的更改肯定会使发布的信息与已发布的规范相符。Openfire端是否记录了任何内容?最终,它开始工作,必须添加授权标头。感谢you@iamads使用
auth=…
添加该标题。你确定你的用户名和密码正确吗?不要将新的用户名和密码放在那里?您的
授权
标题的作用与
auth=('admin','12345')
相同。您的
auth
元组使用
('admin','admin')*。看起来你在这里输入了错误的密码;如果您使用
auth=(用户名、密码)
则不需要
Authorization`标题,但您必须输入正确的用户名和密码。您可以自己检查:将
Basic
后面的字符解码为Base64;您将看到它解码为
管理员:12345
;用户名和密码由
分隔。