项目作者: chanyipiaomiao

项目描述 :
Golang + Beego 编写 提供开发/运维常用操作的HTTP API接口: 手机归属地查询、IP地址查询、工作日节假日判断、微信报警、钉钉报警、2步验证、密码存储、发送邮件、生成随机密码等功能
高级语言: Go
项目地址: git://github.com/chanyipiaomiao/devops-api.git
创建时间: 2018-02-27T13:08:29Z
项目社区:https://github.com/chanyipiaomiao/devops-api

开源协议:MIT License

下载


devops-api

Golang + Beego编写, 提供一些开发/运维常见操作的HTTP API接口,提供开发/运维常用操作的HTTP API接口: 手机归属地查询、IP地址查询、工作日节假日判断、微信报警、钉钉报警、2步验证、密码存储、发送邮件、生成随机密码等功能

主要功能

  • 手机归属地查询
  • IP地址查询
  • 工作日节假日判断
  • 微信报警
  • 钉钉报警
  • 2步验证(Google Authenticator验证)
  • 密码存储
  • 发送邮件
  • 生成随机密码
  • 获取字符串的MD5值
  • 生成验证密码

更多功能,正在思考中…

目录

安装使用

安装

直接下载二级制文件即可

使用

配置文件说明:

  • app.conf 主配置文件
  • dev.conf 开发时的配置文件
  • prod.conf 线上生产运行时的配置文件
  • authpassword.conf 验证密码配置文件
  • db.conf 数据库配置文件
  • email.conf 邮箱用户名和密码配置
  • log.conf 日志相关配置
  • security.conf 安全相关的配置
  • twostep.conf 2步验证相关
  • weixin.conf 微信报警相关
  • phone.conf 手机归属地查询配置

主配置文件 app.conf 通过include的方式加载其他的配置文件

注意: 如果配置文件security.conf中, security->enableToken 的值是 false, 可以跳过 步骤2 和 步骤3, 默认为true, 如果是false 可以不用在请求头里面添加 DEVOPS-API-TOKEN 头

  1. 自定义配置(该步骤可选)

    • 配置监听端口
    • 配置上传目录,确保有权限写入
    • 配置日志目录,默认情况当前目录下,确保有权限写入
    • 配置日志最大存放天数
    • 配置邮箱地址、端口、用户名、密码
    • 配置是否启用token验证
    • 配置jwt token签名字符串,请自行生成修改
    • 配置微信报警的配置, corpID、warningAppAgentID、warningAppSecret,可参考文档设置微信报警流程
    • 配置钉钉机器人的URL(可选)
  2. 首先初始化, 会生成root token,该root token 管理其他的token(该步骤可选)

  1. ./devops-api init
  1. 注意: 忘记root token, 可以使用以下重新生成
  2. ./devops-api init --refresh-root-token
  1. 使用root token 生成普通的token,用于验证请求(该步骤可选)
  1. ./devops-api token --create=名称 --root-token=上边的root token
  2. 注意:忘记token,重新生成即可
  1. 启动服务
  1. ./devops-api server --mode=prod
  2. --mode 指定程序运行模式, prod: 生产模式 dev: 开发模式, 默认是开发模式
  3. 也可以在配置文件app.conf中修改 runmode=prod 也可以设置为生产模式
  1. 使用生成token就能愉快的访问API
  2. 注意: token必须放到请求头里面,名称必须是: DEVOPS-API-TOKEN
  1. 获取帮助
  1. ./devops-api --help
  1. 备份数据库文件
  1. ./devops-api backup --filepath=备份文件路径

返回到目录

开发依赖

  1. go get github.com/astaxie/beego
  2. go get github.com/robfig/cron
  3. go get gopkg.in/alecthomas/kingpin.v2
  4. go get github.com/satori/go.uuid
  5. go get github.com/sec51/twofactor
  6. go get github.com/tidwall/gjson
  7. go get github.com/chanyipiaomiao/hltool
  8. go get github.com/chanyipiaomiao/weixin-kit
  9. go get github.com/chanyipiaomiao/cal
  10. go get github.com/chanyipiaomiao/ip2region/binding/golang
  11. go get github.com/chanyipiaomiao/phonedata

返回到目录

API

手机归属地查询

本功能使用了 xluohome 项目提供的手机归属地数据库

首先进入到script目录,执行 get_phone_dat.sh 来下载数据文件,可以定期执行脚本获取最新的.

  1. /api/v1/queryphone?phone=手机号
  2. phone 要查询的手机号

返回:

  1. {
  2. "data": {
  3. "AreaZone": "021",
  4. "CardType": "中国移动",
  5. "City": "上海",
  6. "PhoneNum": "xxxxxxxxxx",
  7. "Province": "上海",
  8. "ZipCode": "200000"
  9. },
  10. "entryType": "Query Phone Location",
  11. "errmsg": "",
  12. "requestId": "0860edaa-db7f-46ee-ac89-d41eeb2ed80d",
  13. "statuscode": 0
  14. }

IP地址查询

本功能使用了 狮子的魂 项目提供的IP地址数据库.

首先进入到script目录, 执行 gen_ip_region.sh 脚本, 来下载IP地址数据库, 可以定期执行脚本获取最新的.

  1. GET /api/v1/queryip?ip=xxx.xxx.xxx.xxx
  2. ip 要查询的IP地址

返回:

  1. {
  2. "data": {
  3. "ip": "xxx.xxx.xxx.xxx",
  4. "ipInfo": {
  5. "CityId": 995,
  6. "Country": "中国",
  7. "Region": "0",
  8. "Province": "上海",
  9. "City": "上海市",
  10. "ISP": "电信"
  11. }
  12. },
  13. "entryType": "Query IP",
  14. "errmsg": "",
  15. "requestId": "6aae483e-5c72-4cb7-bbb7-50089e2da4d3",
  16. "statuscode": 0
  17. }

返回到目录

工作日节假日判断

设置节假日和工作日

  1. POST /api/v1/holiworkday
  2. 设置头部: Content-Type: application/json
  3. 内容: 参考下面的模板

节假日和工作日模板json, 每年都要根据国内的放假安排提前做一下设置,毕竟国内放假安排不是固定的,日期不足2位必须补0

workday 是指放假安排中的调整上班的日期

  1. {
  2. "year": "2018",
  3. "holiday": [
  4. {
  5. "name": "yuandan",
  6. "zh_name": "元旦",
  7. "start_time": "2018-01-01",
  8. "end_time": "2018-01-01"
  9. },
  10. {
  11. "name": "chunjie",
  12. "zh_name": "春节",
  13. "start_time": "2018-02-15",
  14. "end_time": "2018-02-21"
  15. },
  16. {
  17. "name": "qingming",
  18. "zh_name": "清明节",
  19. "start_time": "2018-04-05",
  20. "end_time": "2018-04-07"
  21. },
  22. {
  23. "name": "laodong",
  24. "zh_name": "劳动节",
  25. "start_time": "2018-04-29",
  26. "end_time": "2018-05-01"
  27. },
  28. {
  29. "name": "duanwu",
  30. "zh_name": "端午节",
  31. "start_time": "2018-06-16",
  32. "end_time": "2018-06-18"
  33. },
  34. {
  35. "name": "zhongqiu",
  36. "zh_name": "中秋节",
  37. "start_time": "2018-09-22",
  38. "end_time": "2018-09-24"
  39. },
  40. {
  41. "name": "guoqing",
  42. "zh_name": "国庆节",
  43. "start_time": "2018-10-01",
  44. "end_time": "2018-10-07"
  45. }
  46. ],
  47. "workday": [
  48. "2018-02-11",
  49. "2018-02-24",
  50. "2018-04-08",
  51. "2018-04-28",
  52. "2018-09-29",
  53. "2018-09-30"
  54. ]
  55. }

返回到目录

判断给定的日期是节假日工作日周末

  1. GET /api/v1/holiworkday?date=2018-08-25
  2. date: 判断的日期, 日期格式不足2位必须补0

返回:

  1. {
  2. "data": {
  3. "date": "2018-08-25",
  4. "dateType": "weekend"
  5. },
  6. "entryType": "Get Holiday/Workday",
  7. "errmsg": "",
  8. "requestId": "562444c2-1a48-4c69-9ed1-d2553dea3cba",
  9. "statuscode": 0
  10. }
  11. dateType: 3 workday: 工作日 holiday: 节假日 weekend: 周末

返回到目录

微信报警

点击查看设置微信报警流程

还需要在 conf/app.conf 中配置已下3个参数

  • corpID 公司或者组织的ID
  • warningAppAgentID 报警应用的ID
  • warningAppSecret 报警应用的密钥

这3个参数可以在企业微信后台管理页面可以看到,详情可以查看上面的文档。

发送微信消息

  1. POST /api/v1/sendmsg/weixin
  2. msgType: text 消息类型,目前只支持文本消息
  3. toTag: 标签ID 在企业微信后台可以查看到
  4. toUser 用户ID 在企业微信后台可以查看到
  5. toParty: 部门ID 在企业微信后台可以查看到
  6. msg 要发送的消息

返回到目录

钉钉报警

需要在conf/app.conf 配置钉钉机器人的URL,或者是在POST中传递url参数指定钉钉机器人地址

发送钉钉消息

  1. POST /api/v1/sendmsg/dingding
  2. msgType text|markdown
  3. msg: 要发送的消息
  4. title: 发送markdown消息时需要指定此参数,指定标题
  5. url: 可以指定钉钉机器人的URL,这样就不用在conf/app.conf 配置钉钉机器人的URL

注意: 在发送markdown消息时,markdown的语法可以查看官方文档

返回到目录

2步验证

2步验证,可以方便的集成到系统中,只需要调用3个API即可.

2步验证api接口

启用2步验证

  1. GET /api/v1/twostepauth/enable?username=用户名&issuer=发行者
  2. username email或者是用户名
  3. issuer 可以是比如 公司的域名/公司的代号等

返回结果:

  1. {
  2. "data": {
  3. "key": "xxxxxxxxxxxx",
  4. "qrImage": "/static/download/qr/xxxx.png"
  5. },
  6. "entryType": "TwoStepAuth",
  7. "errmsg": "",
  8. "requestId": "e55fc2ea-4465-4a4f-aba7-f73272900b03",
  9. "statuscode": 0
  10. }
  11. qrImage 2步验证 二维码图片路径
  12. key 没办法扫描二维码时可以手动添加
  13. statuscode 返回0,代表成功,其他失败

返回到目录

验证Google Authenticator或是其他的类似的APP生成的6位数字

  1. POST /api/v1/twostepauth/auth
  2. username: 用户名
  3. issuer: 发行者
  4. token: 6位数字的验证码

返回结果:

  1. {
  2. "data": {
  3. "auth": false,
  4. "issuer": "xxxxx",
  5. "username": "xxxxxxx"
  6. },
  7. "entryType": "TwoStepAuth",
  8. "errmsg": "Tokens mismatch.",
  9. "requestId": "5529567b-1c5a-4e04-aaa0-5a86ac19ca94",
  10. "statuscode": 1
  11. }
  12. auth: 验证成功true, 不成功false

返回到目录

禁用2步验证

  1. GET /api/v1/twostepauth/disable?username=用户名

返回结果:

  1. {
  2. "data": {
  3. "disable": "yes",
  4. "username": "xxxxx"
  5. },
  6. "entryType": "TwoStepAuth",
  7. "errmsg": "",
  8. "requestId": "4451ef02-f245-466a-8bb4-172238f47c50",
  9. "statuscode": 0
  10. }
  11. disable: yes 禁用成功,删除二维码图片,从数据库中删除该用户

返回到目录

密码存储

密码存储API

存储

  1. POST /api/v1/storepass
  2. 设置头部: Content-Type: application/json
  3. 请求体内容格式:
  4. {
  5. "uniqueId": "10.10.1.2",
  6. "password": [
  7. {"name": "root", "password": "444"},
  8. {"name": "user1", "password": "333"}
  9. ]
  10. }
  11. uniqueId 唯一标识
  12. 注意字段名称必须是以上格式

返回结果:

  1. {
  2. "data": {
  3. "update": "ok"
  4. },
  5. "entryType": "Store Password",
  6. "errmsg": "",
  7. "requestId": "2494ad20-ca52-4d3e-8e8e-6dd0d6289f4a",
  8. "statuscode": 0
  9. }

返回到目录

查询

  1. GET /api/v1/storepass/10.10.1.2,1.1.1.1
  2. 多个标识逗号分开

返回结果:

  1. {
  2. "data": {
  3. "password": {
  4. "1.1.1.1": {},
  5. "10.10.1.2": {
  6. "root": "444",
  7. "user1": "333"
  8. }
  9. }
  10. },
  11. "entryType": "Store Password",
  12. "errmsg": "",
  13. "requestId": "d5f61efe-8c22-4e4e-9d97-c343eb1e7f58",
  14. "statuscode": 0
  15. }
  16. 1.1.1.1 在数据库中不存在则返回的是空

返回到目录

删除

  1. DELETE /api/v1/storepass/10.10.1.2,1.1.1.1
  2. 如果请求的标识在数据库中不存从则返回空

返回结果:

  1. {
  2. "data": {
  3. "delete": "ok",
  4. "id": "10.10.1.2,1.1.1.1"
  5. },
  6. "entryType": "Store Password",
  7. "errmsg": "",
  8. "requestId": "29ed3301-319f-45b6-8cbd-934becc7c5cb",
  9. "statuscode": 0
  10. }

返回到目录

发送邮件

发送邮件api接口

  1. POST /api/v1/sendmsg/mail
  • DEVOPS-API-TOKEN 指定API-TOKEN
  • subject 主题
  • content 内容
  • type text/plain|text/html
  • to 收件人多个用逗号分开
  • cc 抄送人多个用逗号分开
  • attach 指定附件的路径
  • isattach 是否有附件 true|false

返回到目录

Curl 示例

  1. curl -X POST \
  2. http://127.0.0.1:8080/api/v1/sendmsg/mail \
  3. -H 'DEVOPS-API-TOKEN: 生成Token' \
  4. -H 'content-type: multipart/form-data' \
  5. -F subject=haha \
  6. -F 'content=测试一下哈' \
  7. -F type=text/plain \
  8. -F to=xxxx@qq.com,xxx@163.com \
  9. -F cc=xxxx@qq.com,xxx@163.com \
  10. -F 'attach=@C:\Users\41176\Desktop\1111.txt' \
  11. -F isattach=true

返回到目录

Python 文本邮件/html邮件 示例

记得安装 requests

  1. pip install requests
  1. import requests
  2. url = "http://127.0.0.1:8080/api/v1/sendmsg/mail"
  3. token = "生成的Token"
  4. headers = {'DEVOPS-API-TOKEN': token}
  5. payload = {
  6. "subject": u"测试邮件",
  7. "content": u"测试邮件内容", # u"<h1>测试邮件内容</h1>",
  8. "type": "text/plain", # "text/html"
  9. "to": "xxxx@qq.com,xxx@163.com",
  10. "cc": "xxxx@qq.com,xxx@163.com",
  11. }
  12. response = requests.post(url, data=payload, headers=headers)
  13. print(response.json())

返回到目录

Python 发送带附件邮件 示例

  1. import requests
  2. url = "http://127.0.0.1:8080/api/v1/sendmsg/mail"
  3. token = "生成的Token"
  4. payload = {
  5. "subject": u"测试邮件",
  6. "content": u"测试邮件内容",
  7. "type": "text/plain",
  8. "to": "xxxx@qq.com",
  9. "cc": "xxxx@163.com",
  10. "isattach": "true"
  11. }
  12. headers = {'DEVOPS-API-TOKEN': token}
  13. files = {'attach': open('文件的路径', 'rb')} # 键名必须是 attach
  14. response = requests.post(url, data=payload, headers=headers, files=files)
  15. print(response.json())

返回到目录

Go 文本邮件/html邮件 示例

记得安装 grequests

  1. go get github.com/levigross/grequests
  1. package main
  2. import (
  3. "log"
  4. "github.com/levigross/grequests"
  5. )
  6. func main() {
  7. url := "http://127.0.0.1:8080/api/v1/sendmsg/mail"
  8. token := "生成的Token"
  9. o := &grequests.RequestOptions{
  10. Headers: map[string]string{
  11. "DEVOPS-API-TOKEN": token,
  12. },
  13. Data: map[string]string{
  14. "subject": "测试邮件",
  15. "content": "测试邮件内容", // <h1>测试邮件内容</h1>
  16. "type": "text/plain", // text/html
  17. "to": "xxxx@qq.com,xxx@163.com",
  18. "cc": "xxxx@qq.com,xxx@163.com",
  19. },
  20. }
  21. resp, err := grequests.Post(url, o)
  22. if err != nil {
  23. log.Fatalln("Unable to make request: ", err)
  24. }
  25. log.Println(resp.String())
  26. }

返回到目录

Go 发送带附件的邮件 示例

  1. package main
  2. import (
  3. "log"
  4. "os"
  5. "github.com/levigross/grequests"
  6. )
  7. func main() {
  8. url := "http://127.0.0.1:8080/api/v1/sendmsg/mail"
  9. token := "生成的token"
  10. fd, err := os.Open("文件路径")
  11. if err != nil {
  12. log.Fatalln("open file error: ", err)
  13. }
  14. o := &grequests.RequestOptions{
  15. Headers: map[string]string{
  16. "DEVOPS-API-TOKEN": token,
  17. },
  18. Data: map[string]string{
  19. "subject": "测试邮件",
  20. "content": "测试邮件内容",
  21. "type": "text/plain",
  22. "to": "xxx@qq.com",
  23. "cc": "xxxx@163.com",
  24. "isattach": "true",
  25. },
  26. Files: []grequests.FileUpload{
  27. grequests.FileUpload{
  28. FileName: "上传之后生成的文件名",
  29. FileContents: fd,
  30. FieldName: "attach", // FieldName 必须是 attach
  31. },
  32. },
  33. }
  34. resp, err := grequests.Post(url, o)
  35. if err != nil {
  36. log.Fatalln("Unable to make request: ", err)
  37. }
  38. log.Println(resp.String())
  39. }

返回到目录

生成随机密码

生成随机密码api接口

  1. GET /api/v1/password/generation

生成随机密码 默认32位, 可以添加如下参数

  • length 指定长度
  • name 指定多个名称,为多个名称生成密码
  • specialChar 是否添加特殊字符(!@#%$*.=)到密码里面 specialChar=yes 添加,其他不添加

返回到目录

Curl 示例

  1. curl http://127.0.0.1:8080/api/v1/password/generation?length=64 \
  2. -H 'DEVOPS-API-TOKEN: 生成的Token'

返回到目录

别名使用

首先设置一下环境变量

  1. export DEVOPS_API_TOKEN=生成的Token

Linux

  1. alias genpwd="curl -H \"DEVOPS-API-TOKEN: ${DEVOPS_API_TOKEN}\" http://127.0.0.1:8080/api/v1/password/generation?length=64;echo"
  2. alias genpwdspecial="curl -H \"DEVOPS-API-TOKEN: ${DEVOPS_API_TOKEN}\" http://127.0.0.1:8080/api/v1/password/generation?length=64&specialChar=yes;echo"

Mac 可能需要把?=&转义一下

  1. alias genpwd="curl -H \"DEVOPS-API-TOKEN: ${DEVOPS_API_TOKEN}\" http://127.0.0.1:8080/api/v1/password/generation\?length\=64;echo"
  2. alias genpwdspecial="curl -H \"DEVOPS-API-TOKEN: ${DEVOPS_API_TOKEN}\" http://127.0.0.1:8080/api/v1/password/generation\?length\=64\&specialChar\=yes;echo"

返回到目录

Python示例

  1. import requests
  2. import pprint
  3. url = "http://127.0.0.1:8080/api/v1/password/generation"
  4. token = "生成的Token"
  5. payload = {
  6. "length": 64, # 指定密码长度
  7. "name": "user1,user2,user3", # 可以为多个名称生成密码
  8. "specialChar": "yes" # 密码中是否带有特殊字符
  9. }
  10. headers = {'DEVOPS-API-TOKEN': token}
  11. response = requests.get(url, params=payload, headers=headers)
  12. pprint.pprint(response.json())

返回到目录

Go示例

  1. package main
  2. import (
  3. "log"
  4. "github.com/levigross/grequests"
  5. )
  6. func main() {
  7. url := "http://127.0.0.1:8080/api/v1/password/generation"
  8. token := "生成的Token"
  9. o := &grequests.RequestOptions{
  10. Headers: map[string]string{
  11. "DEVOPS-API-TOKEN": token,
  12. },
  13. Params: map[string]string{
  14. "length": "64", // 指定密码长度
  15. "name": "user1,user2,user3", // 可以为多个名称生成密码
  16. "specialChar": "yes", // 密码中是否带有特殊字符
  17. },
  18. }
  19. resp, err := grequests.Get(url, o)
  20. if err != nil {
  21. log.Fatalln("Unable to make request: ", err)
  22. }
  23. log.Println(resp.String())
  24. }

返回到目录

获取字符串的MD5值

获取字符串的MD5值api接口

  1. GET /api/v1/md5?rawstr=123456

可以写一个shell脚本命令行传入字符串,返回MD5值

返回到目录

生成验证密码

生成验证密码

生成验证密码api接口

  1. GET /api/v1/password/manualGenAuthPassword

手动生成验证密码,该功能是 生成一个32位的密码,然后通过钉钉或者邮件通知,别人可以拿这个密码到本程序验证是否正确,这个密码也会定时的清除,不会一直生效 执行成功返回 {“manualGenAuthPassword”: true}

验证上面的密码是否正确

验证密码api接口

  1. POST /api/v1/password/authPassword

验证密码是否正确,就上一个API生成的密码, 参数: password 执行成功返回 {“auth”, true}

返回到目录

获取程序自身版本信息

获取程序自身版本信息api接口

  1. GET /api/v1/version

返回到目录