Nextcloud批量添加新用户

需求

我们现在已经在CentOS上搭建好了Nextcloud环境,现在需要新增用户,由于用户数量较多,我们不可能人工一个个手动添加,既费时又费力,因此需要批量新增用户。但是Nextcloud自己不提供这个功能,因此需要借助脚本的力量,我们使用Python来完成这个工作。

开始

使用官方接口

这是官方的用户接口,提供了许多可用接口,我们这里需要使用的是Add a new user,如下:

add

官方使用方法:

1
$ curl -X POST http://admin:secret@example.com/ocs/v1.php/cloud/users -d userid="Frank" -d password="frankspassword"

但是我们要用Python,因此不需要用到curl

使用开发者工具解析

我们打开浏览器的开发者工具,然后手动添加一个用户,观察参数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{
"ocs": {
"meta": {
"status": "ok",
"statuscode": 200,
"message": "OK"
},
"data": {
"enabled": true,
"storageLocation": "/var/www/html/nextcloud/data/test",
"id": "test",
"lastLogin": 0,
"backend": "Database",
"subadmin": [
"临时用户"
],
"quota": {
"quota": 1073741824,
"used": 0
},
"email": "test@test.com",
"displayname": "测试用户",
"phone": "",
"address": "",
"website": "",
"twitter": "",
"groups": [
"临时用户"
],
"language": "zh_CN",
"locale": "",
"backendCapabilities": {
"setDisplayName": true,
"setPassword": true
}
}
}
}

因此,当我们新增用户的时候,需要的关键参数如下(你也可以自己决定你需要的关键参数):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"userid": "Test",
"displayName": "测试用户",
"password": "testpassword",
"email": "test@new.com",
"groups": [
"普通用户"
],
"subadmin": [
"普通用户"
],
"quota": "1GB",
"language": "zh_CN"
}

注意此处坑点:你可能发现,开发者工具中看到的显示名称字段为displayname,n是小写,但是注意,你的代码中一定要写成displayName,即N要大写,这是我的Nextcloud 19.0.13的一个小bug,如果你的版本不同,不一定遇到这个问题

获取头文件信息

在刚刚的开发者工具中,将最新一次你登录的信息记录下来,这里我们需要记录的信息有:CookierequesttokenUser-Agent

Headers

当你每一次重新登录的时候,这里的三个信息都需要更新,因此你可以将这三个信息记录在文件中然后用代码读取,本例将包括这三个信息的五条信息都存在文件中。

即我们的头文件信息需要:

1
2
3
4
5
6
7
headers = {
"HOST": host,
"Referer": url,
"User-Agent": user_agent,
"Cookie": cookies,
"requesttoken": request_token
}

完整的Python代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import xlrd
import copy
import requests


class Header:
def __init__(self):
self.host = ""
self.url = ""
self.cookies = ""
self.user_agent = ""
self.request_token = ""

def get_headers(self, filename):
data = xlrd.open_workbook(filename)
table = data.sheets()[0]
self.host = table.cell_value(0, 1)
self.url = table.cell_value(1, 1)
self.cookies = table.cell_value(2, 1)
self.user_agent = table.cell_value(3, 1)
self.request_token = table.cell_value(4, 1)
return {
"HOST": self.host,
"Referer": self.url,
"User-Agent": self.user_agent,
"Cookie": self.cookies,
"requesttoken": self.request_token
}


class User:
def __init__(self):
self.template = {"userid": "Test", "displayName": "测试用户", "password": "testpassword", "email": "test@new.com",
"groups": ["普通用户"], "subadmin": ["普通用户"], "quota": "1GB", "language": "zh_CN"}

def get_user_data(self, filename):
res = []
data = xlrd.open_workbook(filename)
table = data.sheets()[0]
n_rows = table.nrows
for i in range(1, n_rows):
self.template['userid'] = table.cell_value(i, 0)
self.template['displayName'] = table.cell_value(i, 1)
self.template['password'] = table.cell_value(i, 2)
self.template['email'] = table.cell_value(i, 3)
if table.cell_value(i, 4).__len__() > 0:
self.template['groups'] = table.cell_value(i, 4).split('、')
else:
self.template['groups'] = []
if table.cell_value(i, 5).__len__() > 0:
self.template['subadmin'] = table.cell_value(i, 5).split('、')
else:
self.template['subadmin'] = []
self.template['quota'] = table.cell_value(i, 6)
res.append(copy.copy(self.template))
return res


if __name__ == '__main__':
user_file = "users.xlsx"
header_file = "headers.xlsx"
user = User()
header = Header()

user_info = user.get_user_data(user_file)
headers = header.get_headers(header_file)
url = headers["Referer"]

for info in user_info:
print(info)
response = requests.post(url, json=info, headers=headers)
print(response.text)

准备好你的用户信息文件

我这里使用Excel文件,users.xlsxheaders.xlsx

users

headers

注意:分组管理员请谨慎填写,因为这会让普通用户也拥有对于用户的管理权限

运行Python脚本

结果

当你看到200的状态码时,说明你成功了

成功

项目地址

地址