xmpppy + google talk => Remote control
收+发
- 返回信息(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)