xmpppy + google talk => Remote control

xmpppy + google talk => Remote control

收+发

下载参考代码:echo.py

使用Python+xmpppy通过gtalk服务收发消息

  • 返回信息(robot send)

    cnx.send(xmpp.Message(str(msg.getFrom()), str(msg.getBody())))

执行command

  • import os

    os.system('ifconfig')
    os.system(str(msg.getBody()))

  • import subprocess 〖带返回信息output〗

    proc = subprocess.Popen([cmd], stdout=subprocess.PIPE, shell=True)
    (out, err) = proc.communicate()
    注:〖shell=True, 这一行参数的结果,即可实现 识别带参数的command〗

返回command结果

  • 基本思路
    subprocess.Popen + cnx.send

  • timeout(如ping命令,执行时间过长,即kill process)
    参考如下代码Ref


        from subprocess import Popen, PIPE
        import signal

        class ProcessTimeout(Exception):
            pass

        def timeout_handler(signum, frame):
            raise ProcessTimeout

        def run_timeout(cmd, timeout=None):
            if timeout:
                signal.signal(signal.SIGALRM, timeout_handler)
                signal.alarm(timeout)
            # proc = Popen(cmd, stdout=PIPE, stderr=PIPE)
            proc = Popen([cmd], stdout=PIPE, stderr=PIPE, shell=True)
            stdout = stderr = ''
            try:
                stdout, stderr = proc.communicate()
                signal.alarm(0)
            except ProcessTimeout:
                proc.kill()
                stdout = 'Calculation was taking too long, so I killed it dead.'
            del proc
            return (stdout, stderr)

        #**************************************
        cmd="ping -c4 baidu.com"
        (out,err) = run_timeout(cmd, 10)
        (out2,err2) = run_timeout(cmd, 2)

        print "program output:", out
        print "program output2:", out2
        #**************************************

最终代码

            #! /usr/bin/env python
            # encoding=UTF-8
            import os
            import xmpp
            import time
            import subprocess
            from subprocess import Popen, PIPE                                             
            import signal

            #****timeout
            class ProcessTimeout(Exception):
                pass

            def timeout_handler(signum, frame):
                raise ProcessTimeout

            def run_timeout(cmd, timeout=None):
                if timeout:
                    signal.signal(signal.SIGALRM, timeout_handler)
                    signal.alarm(timeout)
                # proc = Popen(cmd, stdout=PIPE, stderr=PIPE)
                proc = Popen([cmd], stdout=PIPE, stderr=PIPE, shell=True) #", shell=True"识别带参数
                stdout = stderr = ''
                try:
                    stdout, stderr = proc.communicate()
                    signal.alarm(0)
                except ProcessTimeout:
                    proc.kill()
                    stdout = 'Calculation was taking too long, so I killed it dead.'
                del proc
                return (stdout, stderr)
            #****

            # 消息回调函数
            def messageCB(cnx, msg):
                # # 显示消息发送者和内容
                print "Sender: " + str(msg.getFrom())
                print "Content: " + str(msg.getBody())

                cnx.send(xmpp.Message(str(msg.getFrom()), 'Accepted'))
                text = msg.getBody()
                user = msg.getFrom()

                (out,err) = run_timeout(str(text), 10)
                print "program output:", out
                # # 将消息又返回给发送者
                cnx.send(xmpp.Message(str(msg.getFrom()), '\n' + out))

            if __name__ == '__main__':
                # 给实例的gtalk帐号和密码
                login = 'user***'
                pwd = 'pwd***'
                # 创建client对象
                cnx = xmpp.Client('gmail.com', debug=[])
                # 连接到google的服务器
                # cnx.connect(server=('talk.google.com', 443))
                cnx.connect(server=('talk.google.com', 5223)) #HW from“打印”
                # 用户身份认证
                cnx.auth(login, pwd, 'UDPonNAT')
                # 告诉gtalk服务器用户已经上线
                cnx.sendInitPresence()
                # 设置消息回调函数
                cnx.RegisterHandler('message', messageCB)
                # 循环处理消息,如果网络断开则结束循环
                while True:
                    if cnx.Process(1) == None:
                        print 'Lost connection.'
                        break
                # 无用,方便windows命令窗口调试
                while True:
                    time.sleep(1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值