├── README.md ├── create_account ├── README.md ├── create_account.py └── create_account.xlsx ├── delete_account ├── README.md ├── delete_account.py └── delete_account.xlsx ├── generate_qr ├── README.md ├── generate_qr.exe ├── input │ ├── config.xlsx │ └── ye.png └── src │ └── generate_qr.py └── 科学上网简要教程.md /README.md: -------------------------------------------------------------------------------- 1 | # ssr_tools 2 | 3 | ssr_tools项目主要内容: 4 | 5 | - 科学上网ssrmu.sh的辅助脚本 6 | - ssr客户端软件及使用教程(Wiki) 7 | - 使用ssrmu.sh脚本在VPS上快速地搭建ssr服务,实现科学上网 8 | 9 | ## ssrmu.sh辅助脚本 10 | 11 | - 批量创建账号: 12 | - 批量删除账号: 13 | - 批量生成ssr二维码: 14 | 15 | ## ssr客户端使用教程 16 | 17 | ssr支持操作系统:IOS,Android,Windows,Mac,Linux 18 | 19 | 使用说明见Wiki: 20 | 21 | ## ShadowsocksR 一键安装管理脚本 22 | 23 | - ssrmu.sh脚本说明:ShadowsocksR 一键安装管理脚本 24 | - ssrmu.sh脚本地址: 25 | 26 | 如何使用ssrmu.sh脚本在VPS上快速地搭建ssr服务,实现科学上网,见文档: 27 | -------------------------------------------------------------------------------- /create_account/README.md: -------------------------------------------------------------------------------- 1 | # create_account 2 | 3 | 批量创建账号 4 | 5 | ## 安装三方库 6 | 7 | 1. 如果没有pip,先安装pip;有则进行第2步 8 | 9 | ``` 10 | sudo yum -y install epel-release 11 | sudo yum -y install python-pip 12 | ``` 13 | 14 | 2. 安装三方库 15 | 16 | ``` 17 | pip install xlrd 18 | pip install pexpect 19 | ``` 20 | 21 | ## 使用说明 22 | 23 | 1. 将需要新增的用户名,端口号,密码,限制设备数,总流量填入到create_account.xlsx表格中 24 | 25 | 2. 拷贝create_account.py脚本和create_account.xlsx表格到与ssrmu.sh文件的同级目录下 26 | 27 | 3. 运行脚本 28 | 29 | ``` 30 | python create_account.py 31 | ``` 32 | 33 | 注:如果需要重新配置加密方式,协议等,在create_account.py的main函数中的config字典中修改 -------------------------------------------------------------------------------- /create_account/create_account.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding:utf-8 -*- 3 | 4 | import xlrd 5 | import pexpect 6 | import sys 7 | import logging 8 | import time 9 | 10 | 11 | def get_userinfo(excel_name, sheet_name): 12 | logging.info("读取{}表格,{}页签。") 13 | try: 14 | wb = xlrd.open_workbook(excel_name) 15 | ws = wb.sheet_by_name(sheet_name) 16 | except: 17 | logging.info("打开EXCEL表格失败,请确认{0}文件,{1}页签是否存在。".format(excel_name, sheet_name)) 18 | return {} 19 | user_info = {} 20 | password_col = 0 21 | port_col = 0 22 | user_col = 0 23 | dev_col = 0 24 | flow_col = 0 25 | for i in range(0, ws.ncols): 26 | if ws.cell(rowx=0, colx=i).value == u"用户名": 27 | user_col = i 28 | elif ws.cell(rowx=0, colx=i).value == u"端口": 29 | port_col = i 30 | elif ws.cell(rowx=0, colx=i).value == u"密码": 31 | password_col = i 32 | elif ws.cell(rowx=0, colx=i).value == u"设备数": 33 | dev_col = i 34 | elif ws.cell(rowx=0, colx=i).value == u"总流量": 35 | flow_col = i 36 | 37 | for j in range(1, ws.nrows): 38 | user_name = str(ws.cell(rowx=j, colx=user_col).value) 39 | # port = str(int(ws.cell(rowx=j, colx=port_col).value)) 40 | # password = str(ws.cell(rowx=j, colx=password_col).value) 41 | user_info.update({user_name: { 42 | "pass_word": str(ws.cell(rowx=j, colx=password_col).value), 43 | "port": str(int(ws.cell(rowx=j, colx=port_col).value)), 44 | "dev": str(int(ws.cell(rowx=j, colx=dev_col).value)), 45 | "flow": str(int(ws.cell(rowx=j, colx=flow_col).value)), 46 | }}) 47 | 48 | return user_info 49 | 50 | 51 | def create_one_account(process, user_name, value, config): 52 | process.expect("要设置的用户") 53 | process.sendline(user_name) 54 | process.expect("端口") 55 | process.sendline(value["port"]) 56 | process.expect("密码") 57 | process.sendline(value["pass_word"]) 58 | process.expect("加密方式") 59 | process.sendline(config["加密方式"]) 60 | process.expect("协议插件") 61 | process.sendline(config["协议插件"]) 62 | process.expect("混淆插件") 63 | process.sendline(config["混淆插件"]) 64 | process.expect("限制的设备数") 65 | process.sendline(value["dev"]) 66 | process.expect("单线程 限速上限") 67 | process.sendline(config["单线程 限速上限"]) 68 | process.expect("总速度 限速上限") 69 | process.sendline(config["总速度 限速上限"]) 70 | process.expect("总流量上限") 71 | process.sendline(value["flow"]) 72 | process.expect("禁止访问的端口") 73 | process.sendline(config["禁止访问的端口"]) 74 | 75 | 76 | def create_account(user_info, config): 77 | process = pexpect.spawn("bash ssrmu.sh", logfile=sys.stdout) 78 | process.expect("管理脚本") 79 | process.sendline("7") 80 | process.expect("用户配置") 81 | process.sendline("1") 82 | 83 | sorted_user = sorted(user_info.items(), key=lambda x: x[0]) 84 | for key, value in sorted_user: 85 | create_one_account(process, key, value, config) 86 | try: 87 | process.expect("是否继续") 88 | process.sendline("Y") 89 | except: 90 | # process.expect("错误") 91 | process = pexpect.spawn("bash ssrmu.sh", logfile=sys.stdout) 92 | process.expect("管理脚本") 93 | process.sendline("7") 94 | process.expect("用户配置") 95 | process.sendline("1") 96 | 97 | show_account() 98 | return True 99 | 100 | 101 | def show_account(): 102 | process = pexpect.spawn("bash ssrmu.sh", logfile=sys.stdout) 103 | process.expect("请输入数字") 104 | process.sendline("5") 105 | process.expect("已使用流量总和") 106 | time.sleep(1) 107 | 108 | 109 | if __name__ == '__main__': 110 | # 配置项 111 | config = { 112 | "加密方式": "10", 113 | "协议插件": "1", 114 | "混淆插件": "1", 115 | "限制的设备数": "5", 116 | "单线程 限速上限": "", 117 | "总速度 限速上限": "", 118 | "总流量上限": "30", 119 | "禁止访问的端口": "", 120 | } 121 | logging.basicConfig(level=logging.INFO) 122 | try: 123 | excel_name = sys.argv[1] 124 | sheet_name = sys.argv[2] 125 | except: 126 | excel_name = "create_account.xlsx" 127 | sheet_name = "Sheet1" 128 | logging.info("未指定EXCEL与页签,默认读取{0}表格,{1}页签。".format(excel_name, sheet_name)) 129 | # 获取EXCEL信息 130 | user_info = get_userinfo(excel_name, sheet_name) 131 | if not user_info: 132 | logging.error("读取EXCEL内容为空,任务失败。") 133 | sys.exit(-1) 134 | # 创建账号 135 | create_account(user_info, config) 136 | 137 | logging.info("任务完成。") 138 | -------------------------------------------------------------------------------- /create_account/create_account.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YeYoot/ssr_tools/b2c62aafd232552581449d09c48c0b8b2bf42300/create_account/create_account.xlsx -------------------------------------------------------------------------------- /delete_account/README.md: -------------------------------------------------------------------------------- 1 | # delete_account 2 | 3 | 批量删除账号 4 | 5 | 依赖库: 6 | 7 | - xlrd 8 | - pexpect 9 | 10 | ## 使用说明 11 | 12 | 1. 将需要删除的端口号填入到delete_account.xlsx表格中 13 | 14 | 2. 拷贝delete_account.py脚本和delete_account.xlsx表格到与ssrmu.sh文件的同级目录下 15 | 16 | 3. 运行脚本 17 | 18 | ``` 19 | python delete_account.py 20 | ``` 21 | 22 | -------------------------------------------------------------------------------- /delete_account/delete_account.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding:utf-8 -*- 3 | import pexpect 4 | import xlrd 5 | import sys 6 | import logging 7 | import time 8 | 9 | def get_userinfo(excel_name, sheet_name): 10 | logging.info("读取{}表格,{}页签。") 11 | try: 12 | wb = xlrd.open_workbook(excel_name) 13 | ws = wb.sheet_by_name(sheet_name) 14 | except: 15 | logging.info("打开EXCEL表格失败,请确认{0}文件,{1}页签是否存在。".format(excel_name, sheet_name)) 16 | sys.exit(-1) 17 | user_info = [] 18 | port_col = 0 19 | for i in range(0, ws.ncols): 20 | if ws.cell(rowx=0, colx=i).value == u"端口": 21 | port_col = i 22 | 23 | for j in range(1, ws.nrows): 24 | port = str(int(ws.cell(rowx=j, colx=port_col).value)) 25 | user_info.append(port) 26 | 27 | return user_info 28 | 29 | 30 | def delete_one_account(port): 31 | process = pexpect.spawn("bash ssrmu.sh", logfile=sys.stdout) 32 | process.expect("管理脚本") 33 | process.sendline("7") 34 | process.expect("用户配置") 35 | process.sendline("2") 36 | process.expect("要删除的用户") 37 | process.sendline(port) 38 | time.sleep(0.5) 39 | 40 | 41 | def delete_account(user_info): 42 | for port in user_info: 43 | delete_one_account(port) 44 | show_account() 45 | return True 46 | 47 | 48 | def show_account(): 49 | process = pexpect.spawn("bash ssrmu.sh", logfile=sys.stdout) 50 | process.expect("请输入数字") 51 | process.sendline("5") 52 | process.expect("用户总数") 53 | time.sleep(1) 54 | 55 | 56 | if __name__ == '__main__': 57 | logging.basicConfig(level=logging.INFO) 58 | try: 59 | excel_name = sys.argv[1] 60 | sheet_name = sys.argv[2] 61 | except: 62 | excel_name = "delete_account.xlsx" 63 | sheet_name = "Sheet1" 64 | logging.info("未指定EXCEL与页签,默认读取{0}表格,{1}页签。".format(excel_name, sheet_name)) 65 | user_info = get_userinfo(excel_name, sheet_name) 66 | delete_account(user_info) 67 | -------------------------------------------------------------------------------- /delete_account/delete_account.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YeYoot/ssr_tools/b2c62aafd232552581449d09c48c0b8b2bf42300/delete_account/delete_account.xlsx -------------------------------------------------------------------------------- /generate_qr/README.md: -------------------------------------------------------------------------------- 1 | # generate_qr 2 | 3 | 说明:批量生成ss二维码 4 | 5 | ## 使用方法 6 | 7 | 1. 将ss节点的配置信息填入到input/config.xlsx表格中并保存。 8 | 2. 双击generate_qr.exe 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /generate_qr/generate_qr.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YeYoot/ssr_tools/b2c62aafd232552581449d09c48c0b8b2bf42300/generate_qr/generate_qr.exe -------------------------------------------------------------------------------- /generate_qr/input/config.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YeYoot/ssr_tools/b2c62aafd232552581449d09c48c0b8b2bf42300/generate_qr/input/config.xlsx -------------------------------------------------------------------------------- /generate_qr/input/ye.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YeYoot/ssr_tools/b2c62aafd232552581449d09c48c0b8b2bf42300/generate_qr/input/ye.png -------------------------------------------------------------------------------- /generate_qr/src/generate_qr.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding:utf-8 -*- 3 | import os 4 | import xlrd 5 | import base64 6 | import logging 7 | from MyQR import myqr 8 | 9 | 10 | def get_config(excel_name, sheet_name): 11 | logging.info("读取{}表格,{}页签。") 12 | excel_name = os.path.join(os.getcwd(), "input", excel_name) 13 | try: 14 | wb = xlrd.open_workbook(excel_name) 15 | ws = wb.sheet_by_name(sheet_name) 16 | except: 17 | logging.info("打开EXCEL表格失败,请确认{0}文件,{1}页签是否存在。".format(excel_name, sheet_name)) 18 | exit(-1) 19 | col = { 20 | "IP": -1, 21 | "端口": -1, 22 | "密码": -1, 23 | "协议": -1, 24 | } 25 | for i in range(0, ws.ncols): 26 | for key, val in col.items(): 27 | if ws.cell(rowx=0, colx=i).value == key: 28 | col[key] = i 29 | config = {} 30 | for j in range(1, ws.nrows): 31 | config.update({ 32 | str(int(ws.cell(rowx=j, colx=col["端口"]).value)): 33 | { 34 | "password": str(ws.cell(rowx=j, colx=col["密码"]).value), 35 | "ip": str(ws.cell(rowx=j, colx=col["IP"]).value), 36 | "method": str(ws.cell(rowx=j, colx=col["协议"]).value), 37 | 38 | }}) 39 | 40 | return config 41 | 42 | 43 | def generate_qr(config, picture="ye.png"): 44 | output_dir = os.path.join(os.getcwd(), "二维码") 45 | picture = os.path.join(os.getcwd(), "input", picture) 46 | if not os.path.exists(output_dir): 47 | os.mkdir(output_dir) 48 | for port, val in config.items(): 49 | ori_str = val["method"] + ":" + val["password"] + "@" + val["ip"] + ":" + port 50 | encode_str = base64.b64encode(ori_str.encode('utf-8')) 51 | des_str = "ss://".encode('utf-8') + encode_str 52 | pic_name = str(port) + ".jpg" 53 | myqr.run(des_str.decode(), save_name=pic_name, picture=picture, save_dir=output_dir) 54 | 55 | 56 | def main(): 57 | config = get_config("config.xlsx", "Sheet1") 58 | generate_qr(config) 59 | 60 | 61 | if __name__ == '__main__': 62 | main() 63 | -------------------------------------------------------------------------------- /科学上网简要教程.md: -------------------------------------------------------------------------------- 1 | # 科学上网简要教程 2 | 3 | 安装ssr服务器很简单,分三步:先买服务器,一般5$的服务器就够用了;然后安装ssr服务端;最后再加速,就可以用了,都很简单,有不懂的可以提issues。 4 | 5 | ## 购买服务器 6 | 7 | 1. 首先你需要拥有一台VPS服务器,商家很多,自行选择购买。此处推荐vultr,理由是这家即使IP被墙也能随时删除重新换机器,以免发生刚买了一年IP就被墙了这种尴尬的事。官网: 8 | 2. VPS服务器选择CentOS6+ / Debian6+ / Ubuntu14+ 9 | 10 | ## 安装shadowsocksR 11 | 12 | 1. 远程登陆到VPS服务器,执行以下命令: 13 | 14 | ``` 15 | wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ssrmu.sh && chmod +x ssrmu.sh && bash ssrmu.sh 16 | ``` 17 | 18 | 2. 脚本执行后,输入1,回车,开始安装shadowsocksR;接下来根据自己的情况输入即可,不想看的,可以按我的顺序无脑来: 19 | 20 | ``` 21 | 显示IP:默认 (直接回车) 22 | 用户名:admin 23 | 端口:1234 24 | 密码:password 25 | 加密方式:10 26 | 协议插件:1 27 | 混淆插件:1 28 | 下面的限制视情况而定,可以直接回车默认 29 | 30 | 开始安装后,中途会提示输入y,输入y并回车即可,然后等待安装结束。 31 | ``` 32 | 33 | 当弹出用户配置信息界面后,即成功安装shadowsocksR。然后进行加速即可使用。 34 | 35 | ## 加速 36 | 37 | 1. 更换服务器内核(会重启): 38 | 39 | ``` 40 | wget --no-check-certificate https://blog.asuhu.com/sh/ruisu.sh && bash ruisu.sh 41 | ``` 42 | 43 | 服务器断开连接后,等待1,2分钟后重连。 44 | 45 | 2. 安装锐速: 46 | 47 | ``` 48 | wget -N --no-check-certificate https://raw.githubusercontent.com/91yun/serverspeeder/master/serverspeeder-all.sh && bash serverspeeder-all.sh 49 | ``` 50 | 51 | 当命令执行结束,并且有[Running Status]ServerSpeeder is running!时,说明加速成功。 52 | 53 | ## 使用 54 | 55 | ssr服务器搭建好后,客户端使用方法: 56 | 57 | ## 其他 58 | 59 | 服务器搭建好后,可以使用以下辅助脚本。 60 | 61 | - 批量创建账号: 62 | - 批量删除账号: 63 | - 批量生成ssr二维码: --------------------------------------------------------------------------------