精华内容
下载资源
问答
  • 微信公众号开发——关键词自动回复

    万次阅读 多人点赞 2017-11-05 20:17:22
    功能就是调数据并回复给用户,需要用户发送给公众号一个关键词,通过关键词自动回复消息。这时就是查询微信公众平台文档了,地址如下: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432 按照...

    最近忙国赛的一个项目,我得做一个微信公众号。功能就是调数据并回复给用户,需要用户发送给公众号一个关键词,通过关键词自动回复消息。

    这时就是查询微信公众平台文档了,地址如下:
    https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432
    按照它的入门指南,我基本上了解了用户给公众号发送消息的一个机制,并且一旦给公众号发送消息,在开发者后台,会收到公众平台发送的一个xml,所以通过编写Python脚本进行xml的解析与自动发送功能。

    如果用户给公众号发送一段text消息,比如“hello”,那么后台就会收到一个xml为:

    <xml>
    <ToUserName><![CDATA[公众号]]></ToUserName>
    <FromUserName><![CDATA[粉丝号]]></FromUserName>
    <CreateTime>1460541339</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[hello]]></Content>
    </xml>
    

    注意这里面有一些标记对于我们开发者来说是非常有用的:ToUserName,FromUserName,MsgType,Content
    所以我们只要知道了这些信息,我们就能做到自动回复的功能。
    我们发现这个MsgType 为 ‘text’。而微信中的MsgType有“text”(文本)、“image”(图像)、“voice”(语音)、“video”(视频)、“shortvideo”(短视频)、“location”(位置)、“link”(链接)、“event”(事件)


    首先我们写一个main.py文件
    main.py

    # -*- coding: utf-8 -*-
    # filename: main.py
    import web
    from handle import Handle
    
    urls = (
        '/wx', 'Handle',
    )
    
    if __name__ == '__main__':
        app = web.application(urls, globals())
        app.run()
    

    然后写一个receive.py,作为接受用户发送过来的数据,并解析xml,返回数据的脚本。
    receive.py

    import xml.etree.ElementTree as ET
    
    def parse_xml(web_data):
        if len(web_data) == 0:
            return None
        xmlData = ET.fromstring(web_data)
        msg_type = xmlData.find('MsgType').text
        if msg_type == 'text':
            #print('text')
            return TextMsg(xmlData)
        elif msg_type == 'image':
            return ImageMsg(xmlData)
        elif msg_type == 'location':
            #print('location')
            return LocationMsg(xmlData)
        elif msg_type == 'event':
            #print('event')
            return EventMsg(xmlData)
    
    class Event(object):
        def __init__(self, xmlData):
            self.ToUserName = xmlData.find('ToUserName').text
            self.FromUserName = xmlData.find('FromUserName').text
            self.CreateTime = xmlData.find('CreateTime').text
            self.MsgType = xmlData.find('MsgType').text
            self.Eventkey = xmlData.find('EventKey').text
            
    class Msg(object):
        def __init__(self, xmlData):
            self.ToUserName = xmlData.find('ToUserName').text
            self.FromUserName = xmlData.find('FromUserName').text
            self.CreateTime = xmlData.find('CreateTime').text
            self.MsgType = xmlData.find('MsgType').text
            self.MsgId = xmlData.find('MsgId').text
    
    class TextMsg(Msg):
        def __init__(self, xmlData):
            Msg.__init__(self, xmlData)
            self.Content = xmlData.find('Content').text.encode("utf-8")
    
    class ImageMsg(Msg):
        def __init__(self, xmlData):
            Msg.__init__(self, xmlData)
            self.PicUrl = xmlData.find('PicUrl').text
            self.MediaId = xmlData.find('MediaId').text
        
    class LocationMsg(Msg):
        def __init__(self, xmlData):
            Msg.__init__(self, xmlData)
            self.Location_X = xmlData.find('Location_X').text
            self.Location_Y = xmlData.find('Location_Y').text
    
    class EventMsg(Msg):
        def __init__(self, xmlData):
            Event.__init__(self, xmlData)
            self.Event = xmlData.find('Event').text
    

    其中,我们使用xml.etree.ElementTree,这是一个简单而有效的用户解析和创建XML数据的API。而fromstring()就是解析xml的函数,然后通过标签进行find(),即可得到标记内的内容。

    同时还要写一个reply.py,作为自动返回数据的脚本。
    刚才提到了,用户给公众号发送消息,公众号的后台会接收到一个xml,那么如果公众号给用户发送消息呢,其实也就是公众号给用户发送一个xml,只是ToUserName,FromUserName换了一下而已,内容自己定。

    <xml>
    <ToUserName><![CDATA[粉丝号]]></ToUserName>
    <FromUserName><![CDATA[公众号]]></FromUserName>
    <CreateTime>1460541339</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[test]]></Content>
    </xml>
    

    reply.py

    import time
    
    class Msg(object):
        def __init__(self):
            pass
        def send(self):
            return "success"
    
    class TextMsg(Msg):
        def __init__(self, toUserName, fromUserName, content):
            self.__dict = dict()
            self.__dict['ToUserName'] = toUserName
            self.__dict['FromUserName'] = fromUserName
            self.__dict['CreateTime'] = int(time.time())
            self.__dict['Content'] = content
    
        def send(self):
            XmlForm = """
            <xml>
            <ToUserName><![CDATA[{ToUserName}]]></ToUserName>
            <FromUserName><![CDATA[{FromUserName}]]></FromUserName>
            <CreateTime>{CreateTime}</CreateTime>
            <MsgType><![CDATA[text]]></MsgType>
            <Content><![CDATA[{Content}]]></Content>
            </xml>
            """
            return XmlForm.format(**self.__dict)
        
    class ImageMsg(Msg):
        def __init__(self, toUserName, fromUserName, mediaId):
            self.__dict = dict()
            self.__dict['ToUserName'] = toUserName
            self.__dict['FromUserName'] = fromUserName
            self.__dict['CreateTime'] = int(time.time())
            self.__dict['MediaId'] = mediaId
        def send(self):
            XmlForm = """
            <xml>
            <ToUserName><![CDATA[{ToUserName}]]></ToUserName>
            <FromUserName><![CDATA[{FromUserName}]]></FromUserName>
            <CreateTime>{CreateTime}</CreateTime>
            <MsgType><![CDATA[image]]></MsgType>
            <Image>
            <MediaId><![CDATA[{MediaId}]]></MediaId>
            </Image>
            </xml>
            """
            return XmlForm.format(**self.__dict)
    
    

    接着我们要写一个handle.py,作为对消息进行反映处理(自动回复)的脚本。
    handle.py

    import web
    import reply
    import receive
    import JsonData
    import xml.dom.minidom
    class Handle(object):
        def GET(self):
            try:
                data = web.input()
                if len(data) == 0:
                    return "hello, this is handle view"
                signature = data.signature
                timestamp = data.timestamp
                nonce = data.nonce
                echostr = data.echostr
                token = "hello2016"
    
                list = [token, timestamp, nonce]
                list.sort()
                sha1 = hashlib.sha1()
                map(sha1.update, list)
                hashcode = sha1.hexdigest()
                #print("handle/GET func: hashcode, signature: ", hashcode, signature)
                if hashcode == signature:
                    return echostr
                else:
                    return ""
            except Exception as Argument:
                return Argument
        def POST(self):
            try:
                webData = web.data()
                #print(webData)
                recMsg = receive.parse_xml(webData)
                #print(recMsg)
                if isinstance(recMsg, receive.Msg):
                    toUser = recMsg.FromUserName
                    fromUser = recMsg.ToUserName
                    if recMsg.MsgType == 'text':
                        try:
                            a = JsonData.praserJsonFile()
                            #print(a)
                        except Exception as Argument:
                            return Argument
                        if a['status'] == '1':
                            content = "No equipment"
                        else:
                            if a['data'][0]['weather']=='0':
                                israin = '7.没有下雨'
                            else:
                                israin = '7.下雨'
                            #print(israin)
                            content = ""
                            #print(content)
                        replyMsg = reply.TextMsg(toUser, fromUser, content)
                        return replyMsg.send()
                    if recMsg.MsgType == 'image':
                        mediaId = recMsg.MediaId
                        replyMsg = reply.ImageMsg(toUser, fromUser, mediaId)
                        return replyMsg.send()
                    if recMsg.MsgType == 'location':
                        location_x = recMsg.Location_X
                        location_y = recMsg.Location_Y
                        content = "您所在的位置是在:经度为"+location_x+";纬度为:"+location_y
                        replyMsg = reply.TextMsg(toUser, fromUser, content)
                        return replyMsg.send()
                    if recMsg.MsgType == 'event':
                        #print('yes')
                        event = recMsg.Event
                        if event == 'subscribe':
                            content = "欢迎关注"
                            replyMsg = reply.TextMsg(toUser, fromUser, content)
                            return replyMsg.send()
                    else:
                        return reply.Msg().send()
                else:
                    print("not do")
                    return reply.Msg().send()
            except Exception as Argment:
                return Argment
    

    注:代码贴了目前写的所有功能,接收关键字并自动返回数据;关注后自动回复欢迎文字;发送定位获得GPS信息。

    那么我怎么样使用微信公众号去调取服务器上的数据呢,因为有了数据的json文件,我们就可以使用Python脚本进行json的解析,然后将数据在content中体现出来就可以了。

    Json文件解析

    import types
    import urllib.request
    import json
    
    
    def praserJsonFile():
        url = ""
        data = urllib.request.urlopen(url).read()
        value = json.loads(data.decode())
        #print(value)    
        #print(value['data'])
        return value
    
    #praserJsonFile()
    
    
    

    这个value就是我们解析json出来的一个list

    展开全文
  • 功能就是调数据并回复给用户,需要用户发送给公众号一个关键词,通过关键词自动回复消息。 这时就是查询微信公众平台文档了,地址如下: 文档 按照它的入门指南,我基本上了解了用户给公众号发送消息的一个机制,...
  • 消息自动回复添加第10行代码,作用是调用第22行的responseMsg回复信息方法

    消息自动回复

    添加第10行代码,作用是调用第22行的responseMsg回复信息方法<?php

    /**

    * wechat php test

    */

    //define your token

    define("TOKEN", "test");

    $wechatObj = new wechatCallbackapiTest();

    //$wechatObj->valid();

    //调用回复方法

    $wechatObj -> responseMsg();

    class wechatCallbackapiTest

    {

    public function valid()

    {

    $echoStr = $_GET["echostr"];

    //valid signature , option

    if($this->checkSignature()){

    echo $echoStr;

    exit;

    }

    }

    public function responseMsg()

    {

    //get post data, May be due to the different environments

    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

    //extract post data

    if (!empty($postStr)){

    $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

    $fromUsername = $postObj->FromUserName;

    $toUsername = $postObj->ToUserName;

    $keyword = trim($postObj->Content);

    $time = time();

    $textTpl = "

    %s

    0

    ";

    if(!empty( $keyword ))

    {

    $msgType = "text";

    $contentStr = "Hello,欢迎关注";

    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);

    echo $resultStr;

    }else{

    echo "Input something...";

    }

    }else {

    echo "";

    exit;

    }

    }

    private function checkSignature()

    {

    $signature = $_GET["signature"];

    $timestamp = $_GET["timestamp"];

    $nonce = $_GET["nonce"];

    $token = TOKEN;

    $tmpArr = array($token, $timestamp, $nonce);

    sort($tmpArr);

    $tmpStr = implode( $tmpArr );

    $tmpStr = sha1( $tmpStr );

    if( $tmpStr == $signature ){

    return true;

    }else{

    return false;

    }

    }

    }

    ?>

    第46行代码是自动回复的内容$contentStr = "Hello,欢迎关注";

    关键词自动回复

    用if语句进行判断,if语句格式为:if($keyword=="手机"){}

    if (!empty($postStr)){

    $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

    $fromUsername = $postObj->FromUserName;

    $toUsername = $postObj->ToUserName;

    $keyword = trim($postObj->Content);

    $time = time();

    $textTpl = "

    %s

    0

    ";

    if(!empty( $keyword ))

    {

    $msgType = "text";

    $contentStr = "Hello";

    if($keyword == "手机") //关键词是手机时回复内容

    {

    $contentStr = "你回复的关键词是手机";

    }

    if($keyword == "电脑") //关键词是手机时回复内容

    {

    $contentStr = "你回复的关键词是电脑";

    }

    if($keyword == "相机") //关键词是手机时回复内容

    {

    $contentStr = "你回复的关键词是相机";

    }

    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);

    echo $resultStr;

    }else{

    echo "Input something...";

    }

    }else {

    echo "";

    exit;

    }

    关键词为“手机”时回复内容

    $contentStr="你回复的关键词是手机";

    展开全文
  • Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、文件在线上传下载、应用发布部署、在线任务计划、配置中心、监控、报警等一系列功能。环境说明:主机名...

    前言:在之前的文章批量执行crontab指定条目的注释和解注释提到过spug平台,本文具体的对该平台做详细介绍。

    Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、文件在线上传下载、应用发布部署、在线任务计划、配置中心、监控、报警等一系列功能。

    环境说明:

    主机名操作系统版本ip地址docker版本Spug版本备注
    ansibleCentos 7.6.1810172.27.34.5118.09.9v2.3.8管理服务器

    一、特性

    • 批量执行: 主机命令在线批量执行

    • 在线终端: 主机支持浏览器在线终端登录

    • 文件管理: 主机文件在线上传下载

    • 任务计划: 灵活的在线任务计划

    • 发布部署: 支持自定义发布部署流程

    • 配置中心: 支持 KV、文本、json 等格式的配置

    • 监控中心: 支持站点、端口、进程、自定义等监控

    • 报警中心: 支持短信、邮件、钉钉、微信等报警方式

    • 优雅美观: 基于 Ant Design 的 UI 界面

    • 开源免费: 前后端代码完全开源

    本文会对‘批量执行’、‘在线终端’、‘文件管理’、‘任务计划’、‘监控中心’、‘报警中心’等功能。‘应用发布’和‘配置中心’下篇再做介绍。

    二、软件安装

    1.安装软件

    [root@ansible yaml]# docker pull registry.aliyuncs.com/openspug/spug[root@ansible yaml]# docker run -d --name=spug -p 80:80 -v /mydata/:/data registry.aliyuncs.com/openspug/spug[root@ansible yaml]#  docker exec spug init_spug admin spug.dev

    9e90580ed36f52748ffd501cb9e98ff0.png

    通过docker方式安装,docker安装请参考:k8s实践(一):Centos7.6部署k8s(v1.14.2)集群中docker安装章节。

    '-p 80:80',spug的80端口映射端口为系统的80端口,‘-v /mydata/:/data’将容器的/data路径映射为系统的/mydata目录。

    初始化管理员账号admin,密码为spug.dev

    2.登陆

    http://172.27.34.51

    89b9dfafafc6036f8005c8241842bf21.png

    三、工作台

    5c85a88222ae7bc1ce07ac1884599221.png

    工作台是一个概览,包含应用、主机任务、监控和报警等信息。

    四、主机管理

    1.新建主机

    c4d766737f0ea4be5dadbf7e381b9c98.png

    '主机类别'为自定义类别,分别输入主机名和连接地址,单击验证

    9a2005803db97ad1bb2fd5dfa1a735f4.png

    输入root用户密码

    acf8e9ebc565061d84f85afc8f455d53.png

    主机添加成功

    2.批量导入主机

    5ba8cf86a17926f1257c3664166dc5f9.png

    使用批量导入方式导入主机,可以先下载模板在更新上传。

    7125e2e33ce37ba62f0b2cd3c3ed3984.png

    登陆密码一栏填写个主机密码,若为空则为默认密码'spug-default-keys'

    fd71f40e9f53533cb7479a48c77bef7e.png

    导入成功

    818a1341122ad02c7b138bb756d19543.png

    登陆密码为传输公钥时使用,系统不保存密码,下次可免密登陆访问。

    通信原理:第一次在登录的时候会生产公私钥,密码只是用在第一次发送公钥上。

    20ced521188e0059488ea9dab40d040a.png

    公钥保存在各个被管理主机上,私钥存在于spug平台里(不是172.27.34.51服务里上面)。

    五、在线终端

    f3ce736519d41eee82ab68167d5ac86b.png

    单机主机栏后面的'Console'即可免密进入终端

    c1da221f6b866505578973d855a6ef7d.png

    进入终端,执行'df -h'命令

    六、文件管理

    进入在线终端后点击右上角的'文件管理器'即可进行文件上传下载操作

    b4d8e6ce7944b1a3551cd9744e6e21a0.png

    65bad6589fe947a9f029b2fee11a4cb1.png

    spug可方便的进行文件上传下载,不用使用ftp工具或者繁琐的命令。

    七、批量执行

    该功能为spug核心功能之一,现从命令方式和模板方式演示。

    1.命令方式

    30c7d823ead47dfd7a222b0d5cb7244a.png

    选择执行主机ansible、test162、test163,执行命令'df -h'和'echo "hello world"'

    执行结果:

    5e6061b3189a79b8af63995353035512.png

    2.模板方式

    b647877f272e229f6df04af211641a16.png

    新建两个模板'注释crontab'和'解注释crontab',模板内容其实也是shell脚本,比如'注释crontab':

    71d302700c459112d42605baebd44d3b.png

    模板方式批量执行:

    b12f41591e8eab07836dedbda472a09d.png

    执行完成,该模板内容为批量注释指定的crontab

    973172346f61c38ab1590035b5b29b4a.png

    八、任务计划

    60622cb9f8101da070914798b4777c39.png

    新建任务计划date,任务类型可自定义,失败通知选钉钉,后面会有介绍,下一步

    6afc67b647a7bc5f01d4fd3452068a43.png

    执行对象选择test162和test163

    1b27405a87f6d81c18ddb86b21b62acd.png

    选择执行规则,UNIX Cron和linux的crontab类似,这里设置每分钟执行一次。

    f8e375300daa2d06f4ba7d2510770c41.png

    激活任务

    b31a27cd735e164efa7e88d5e0635b10.png

    验证:

    9a6d9e487b94875d1f86379c8d03c998.png

    每分钟向/tmp/date.txt文件输入当前时间。

    九、报警中心

    在介绍监控中心之前先介绍报警中心

    1.报警历史

    b59a93b0a0457a2d82553d2d1bff6452.png

    报警历史可以查看报警的历史信息,包括任务名、通知方式、通知对象和发生时间等。

    2.报警联系人

    以添加联系人loong576说明

    2.1 报警联系人概览

    9a24d86aafcd17be35f7915e177d33bf.png

    告警方式包括邮箱、微信、钉钉和企业微信。

    2.2 获取微信Token

    关注微信公众号'Spug运维',点击'我的'菜单获取

    dbd0fa7ac93e1e8534c7381279a5f612.png

    2.3 获取钉钉webhook

    0b6e641a134faa37559adf8e474c9ff7.png

    首先新建群聊

    09b77b0f5b224aae5ed3f93763816a3a.png

    选择接收的联系人,创建群‘spug告警接收’

    be9e475979047afef2ef5f40fdddb952.png

    dc074e23e51b4c8abcdb52ee0a5274fb.png

    256424d005e44612b77c90384ba329d2.png

    0b1db4624374f0ede08b704aa32e23c5.png

    f2f4c8c24cea075edea2a2151149e7bc.png

    be4c17303fb0a561eadae7c040736ea6.png

    点击群聊窗口右边的‘群设置’,‘智能群助手’,‘添加机器人’,‘自定义’,单击‘添加’

    da110440f1644b29db9afcd657e2d5be.png

    根据实际情况填写安全设置,我这里填的是‘自定义关键词’,最多匹配10个,任意一个关键词被匹配到就会接收消息。

    3c8fe38e7339f1005f39f2cb1d5c7807.png

    完成机器人添加,复制webhook。

    2.4 获取企业微信webhook

    企业微信获取webhook方式和钉钉有些类似,也是先建群,然后添加机器人。

    d4666ec749a54b807793472687158411.png

    建群,选中群,添加群机器人

    d761c1ed2d5a88fa1ee94d4cbd57d754.png

    eec81358e3b321a0a2a22ded769f7206.png

    创建一个机器人

    f6076d381ede510dba406bed6836b818.png

    e02d5237b87be0493061e9eeeb8211ca.png

    复制webhook地址

    3.报警联系人组

    e862e7f7859c421ef46c1fd04075dad7.png

    告警是以组的方式发送的,新建告警组test_team,将告警联系人loong576加入改组。

    6216290f89a09a57bdd87e9f871198a4.png

    十、监控中心

    1.监控中心概览

    3919f7f596d2a5ef5f362363f7f25992.png

    监控方式有四种:站点监控、端口监控、站点监控和自定义监控。这里以端口监控和自定义监控做说明。

    2.端口监控

    0d3c8c8136896a56985be48039b6a05d.png

    新建端口监控,监控地址为172.27.34.51,监控端口为8808

    a664c0a15f77259bce42819bebac1e31.png

    监控频率为1分钟,即1分钟检查一次;报警阀值为3次,即检查3次不成功才发出报警;报警联系人组为test_team;报警方式为微信、钉钉、邮件和企业微信;通道沉默为5分钟,表示每5分钟发送一次报警消息。

    afadbd9f2782a05cd711634cc4addacf.png

    提交后等待检测

    b43842a1b70e60c999a7bc8e28988eec.png

    发现8808端口检测异常

    2.1 微信告警

    9ec83fa3c824d0065891cdd0726217e8.png

    2.2 钉钉告警

    e1868dd81c5e96add0faa35a3a19fc69.png

    2.3 邮件告警

    9b2a750ad41487e50968a0b70c885e23.png

    db1cfe45106b3bbc3b23fd7cd3a76aea.png

    2.4 企业微信告警

    adb71c9d7d96f9b48f3810208ef1d80f.png

    3. 自定义监控

    以监控文件系统使用率为例,超过5%即报警,监控脚本如下:

    #!/bin/bashnum=5df -h|grep -vE 'tmpfs|cdrom'| awk -F '[ %]+' 'NR == 1 {next} {print $6 "     "  $5}' |while read df_file;do   value=$(echo $df_file | awk '{ print $2}')  name=$(echo $df_file | awk '{ print $1 }')  if [ $value -ge $num ]  then  echo "主机`hostname`文件系统 $name 使用率为 $value% "  fidonefor i in $(df -h| awk -F '[ %]+' 'NR == 1 {next} {print $5}'|xargs) do   if [ $i -ge $num ]  then  exit $i   fidone

    f4a08fd7a44f0cc4526c513dcae63afb.png

    脚本逻辑:首先设置阀值为'num=5',通过'df -h'获取文件系统使用率所在的列,然后与阀值循环比较,如果大于阀值则输出告警信息'主机hostname文件系统 使用率为value% '。

    自定义告警的原理:通过脚本判断监控项,脚本执行退出状态码为 0 则判定为正常,其他为异常。

    3.1 报警信息

    微信:

    80a14beea094b50e4772d79b96ee794c.png

    钉钉:

    67be6e2395903dbe8f2812ea65d92390.png

    邮件:

    52859eea2c57d3342d64c42fbc414059.png

    企业微信:

    a3e8591351095a22206d06a8d080db79.png

    十一、系统管理

    1.角色管理

    fe4420fcc54721d22b2e566a822d0d96.png

    新建角色test_role

    d112ac7dd474eb1f199f09a28c4ea736.png

    分配权限如图

    2.账户管理

    0e3a5d1f5d7438d1d022d949f47a8bdb.png

    新建账户loong576,分配角色test_role

    cfe6675a54340adb1b9182b2374e3d8f.png

    2.1 账户禁用问题

    现象:

    b0e4cf9700c49e0aaf5adc6b588cbe2d.png

    解决:

    [root@ansible ~]# docker exec spug python3 /data/spug/spug_api/manage.py user enable -u admin

    43fe0e1283c58226d274372d81ed3fab.png

    2.2 重置密码

    现象:

    67fd9505274b5f55511cc44bfebc980c.png

    解决:

    [root@ansible ~]# docker exec spug python3 /data/spug/spug_api/manage.py user reset -u admin -p Admin01!

    1164cfc20f8671476b2210590c70f2d8.png

    3.系统设置

    3.1 秘钥设置

    40cf294fefcfc4ffd4354c12871959a6.png

    spug 有自己的密钥对,公钥保存在被管理的主机内,私钥保存在spug平台内(不是管理主机172.27.34.51里)。通过

    十二、其它问题

    1.root无法直接登录问题

    1.1 问题说明

    由于root用户禁止直接登录,新建主机时登录用户不能设置为root,否则会报错,此时如果需要执行需要root权限的命令时,需要加sudo,但是运行sudo时需要输入密码确认,spug平台批量执行时没有交互窗口,运行命令会报错,此时则需要进行提权操作且免密。

    [monitor@work01 /]$ iduid=1002(monitor) gid=1002(monitor) 组=1002(monitor)[monitor@work01 /]$ more /etc/sudoers/etc/sudoers: 权限不够[monitor@work01 /]$ sudo more /etc/sudoers|grep monitormonitor    ALL=(ALL)   NOPASSWD:    ALL

    修改文件'/etc/sudoers',新增:'monitor    ALL=(ALL)   NOPASSWD:    ALL'

    1.2 monitor用户获取root权限运行示例

    不使用sudo情况:

    10fd4a696839e64b5a5e95bc2d6f6d4e.png

    使用sudo:

    46e335fa02f35896ba65d8ba520ca9a6.png

    254b932d8f66557bb9729958ca9dd486.png

    使用sudo运行需要root权限的额命令,直接运行,不需要二次输入密码。

    2.打通网络

    如果是生产环境无法联网的话,发送告警信息则需要打通网络

    到微信:http://spug-wx.qbangmang.com 80到钉钉:https://oapi.dingtalk.com 443到企业微信:https://qyapi.weixin.qq.com 443

    3.设置容器自启动

    [root@ansible ~]# docker update --restart=always spugspug

    设置后若主机重启容器spug会自动启动,无需手动在拉起来

    4.更换平台ip

    如需更换ip,则直接修改,然后重启主机即可。

    十三、总结

    轻量、快捷、好用是spug的特点,部署简单,安全可靠、无agent、可视化,可以快速高效的批量对主机进行命令分发、监控等,非常适用于日常变更上线操作。spug平台既可当跳板机,也可以替代堡垒机部分功能,如进入console、文件上传下载等。

    参考

    官网:https://www.spug.dev/

    github:https://github.com/openspug/spug

    文档:https://www.spug.dev/docs/about-spug

    展开全文
  • 微信自动回复脚本

    千次阅读 2020-03-20 11:36:09
  • Python微信自动回复脚本

    千次阅读 多人点赞 2019-01-25 14:58:05
    一、在命令提示符中输入pip install itchat,安装微信接口的第三方模块 二、编译并运行源代码  #coding=utf8 ... #主要是一些关键词设置 ...#开启自动回复 ...四、启动自动回复功能  
  • QQ自动回复

    2018-10-11 15:10:53
    QQ自动回复软件,android 版本,支持自定义语句回复,关键词回复
  • java实现自动回复聊天机器人

    千次阅读 2021-03-09 03:56:28
    本文实例为大家分享了java实现自动回复聊天机器人的具体代码,供大家参考,具体内容如下聊天机器人调用网上现有的接口,然后解析数据以上是演示图片基本工作流程就是,调用api,解析返回的数据httputil类,调用api,...
  • 微信关键词自动回复代码

    千次阅读 2015-09-02 13:23:02
    } if ($keyword == "3") {//关键词为3时回复 $contentStr = "浙江省杭州市江干区闸弄口街道!"; } $resultStr = sprintf($textTpl,$fromUsername,$toUsername,$time,$msgType,$contentStr...
  • 1.触及到我的知识盲区了2....没回复就是放牛去了 一直没回复就是牛丢了8.您好,您当前与靓妹的聊天费用已欠费请及时续费与本靓妹聊天。9.有事说事 我是你牛爷爷10.人工服务请按111.你好,我是xx的自动...
  • 回复资源表【news_reply 图文表、images_reply 图片表、video_reply 视频表......】得到资源返回rule表字段id, uniacid, name, module, displayorder, status, containtypeuniacid:商户IDname:规则名称m...
  • wxpyPython 写 微信聊天 根据 自动回复 接入机器人 等等....wxpy: 用 Python 玩微信#项目介绍wxpy登录就给好友发消息 发图片 自动回复信息 添加好友自动同意wxpy2.在指定群中提取老板信息, 并发送到 文件助手wxpy5....
  • 在社群运营中,需要经历创建群、...尤其是在微信群比较活跃的时候,重要消息难捕捉,如果用户的消息或者问题没有得到及时回复,就会增加用户关系维系成本,用户留存率也难以得到保障。 所以很多运营者在微信社群运营
  • 通过参与叠蛋糕的活动来瓜分10亿现金红包,想要瓜分这10亿红包每天就要做大量的任务~~~太费时费力了,这里给大家分享一个全自动做叠蛋糕任务的脚本。京东618叠蛋糕金币任务自动脚本本方法仅适用于安卓手机,苹果用户...
  • 淘宝千牛客服自动回复,如何设置成这种的,第一次询问时弹出这样的文字,买家想问的问题点击红字怎么进入您如果是千牛,可以设置千牛...1、自动回复:就是客户发信息过来触发了关键词,机器人就会自动回复你设置好的...
  • 本文实例为大家分享了php微信文本消息自动回复 别代码,供大家参考,具体内容如下1.PHP示例代码下载下载地址1:http://xiazai.zyiz.net/201608/yuanma/phpwx(zyiz.net).rar下载地址2:...》接入指南-》PHP示例代码下载)...
  • 微信关键字自动回复功能实现

    万次阅读 2015-03-10 19:12:44
    微信自动回复可以分为三种,一种是首次关注的欢迎语,一种是关键字自动回复,还有就是无法识别的回复。这三种模式在实现上是完全一样的,只是基于的事件不同而已。要想实现自动回复功能,首先要对微信相关API进行...
  • Bilibili自动签到脚本

    千次阅读 2021-03-04 16:25:17
    脚本介绍 这是一个利用 Linux Crontab , GitHub Action 等方式实现哔哩哔哩(Bilibili)每日任务投币,点赞,分享视频,直播签到,银瓜子兑换硬币,漫画每日签到,简单配置即可每日轻松获取 65 经验值 微信订阅通知 ...
  • 版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途此文章来源于项目...连接设备、初始化poco、打开应用这几个脚本顺序应该怎么放3.循环执行1个测试动作,直到满足某个条件为止4.多次执行同一脚...
  • 实现了钉钉群机器人自动发送提醒消息的shell脚本。。。
  • 像电商类的客服,像大的QQ群/微信群管理员,以及我们打游戏的时候,挂着脚本就行,机器人自动帮你回消息,一时半会儿不会得罪女朋友,哈哈哈! 今天就来教大家一招,16行Python代码实现1个微信聊天智能机器人(图灵...
  • 接上篇,实时获取到微信聊天消息,hook数据库插入操作:...我们要构造回复内容,然后用Xposed去执行微信的回复方法,从而达到自动回复的效果。 新建一个类Wechat...
  • 搭建公众号自动回复功能

    千次阅读 2017-07-23 17:59:00
    程序员爱炫技,写个公众号文章,都想拿点技术整整【自动回复】;程序员爱偷懒,什么都想做个【自动化】,最好所有事情系统都给做了,点点手指头就能达到目标。 今天的主角是如何搭建一个公众号自动回复功能。整个...
  • 分享一个最近很火的项目,一对一直播自动打招呼脚本,保护生态r9和高山流水小精灵的JS核心代码 该源码是Auto.js编写,可以二次重构。可以直接打包运行 function 首页ui() { importClass(android.view.MenuItem);...
  • 前几天有粉丝和我说,最近在网上看到一些视频营销号一天能发布几百条短视频, 感觉都是批量生成的,能不能用Python做个自动化短视频生成脚本呢? 今天就带大家一起用Python做个自动化视频生成脚本,实现热门视频批量...
  • 大家好我又来了,我是今天这个教程的讲师:万花,我们今天给大家带来的干货是用易语言开发一款QQ群自动回复的机器人!原理也很简单,大家看上面的原理图就大概有个了解了。 不废话我们打开易语言,然后简单的设置...
  • 一、为什么需要一个测试脚本?之前讲解了 Android Monkey 命令的使用方式,今天趁着还热乎就手把手用 Monkey 写一个压力测试的脚本。还不了解什么是 Monkey 的,可以看看之前的文章,《关于 Monkey ,你所需要知道的...
  • RebateBot 返利机器人 项目地址 项目描述 关键词: 返利 微信 阿里妈妈 机器人 跨平台 ...利用闲置微信和极小的电脑性能开启24小时无人轮值返利机器人 购物只需要发送链接给机器人,机器人能马上给你回复优惠价...
  • 2.连接设备、初始化poco、打开应用这几个脚本顺序应该怎么放 3.循环执行1个测试动作,直到满足某个条件为止 4.多次执行同一脚本,并且每一次执行都生成1份测试报告 下文的例子中用到的demo可以在我们官网上下载到...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,581
精华内容 1,832
关键字:

关键词自动回复脚本