Example #1
0
def get_event_content(event_id):
    #os.system('''export http_proxy=""''')
    print '获取id为[%d]的活动内容' % event_id

    http = Http('plogin.12580.com', 80)
    #para = {'act':'xml','id':event_id}
    #req_para = http.getparams(para)
    url = '%s%d' % ('/cmps/wapcms/wap/web_online_xml.php?id=', event_id)
    ret = http.request(url)

    #解析返回的xml报文
    #om = parseString(ret)
    #field_node = dom.documentElement
    #content_node = field_node.getElementsByTagName('content')[0]

    #data = None
    #if content_node.nodeType in (content_node.TEXT_NODE,content_node.CDATA_SECTION_NODE):
    #	data = content_node.data
    #else:
    #	print content_node.nodeType
    print 'cms返回报文: %s ' % ret

    root = ET.fromstring(ret)
    msg = {}
    for node in root:
        msg[node.tag] = node.text

    data = msg['content']
    print 'cms返回的活动内容为:%s' % (data or 'cms返回空')

    #os.system('''export http_proxy="http://127.0.0.1:8087/"''')
    return data
Example #2
0
 def upload(self, url, data):
     import json
     data = json.dumps(data)
     ip = Http.get("http://ip.6655.com/ip.aspx",
                   datas={},
                   heads={'content-type': 'application/json'})
     ip = ip.text
     headers = {
         'content-type': 'application/json',
         'ip': '%s' % (ip),
         'Authorization': '258JWTAUTH %s' % (self.get_token())
     }
     try:
         import json
         data = Http.post(
             'http://%s:%s/%s' %
             (self.config()['domain'], self.config()['port'], url), data,
             headers)
         print "dfds"
         print data.text
         data = json.loads(data.text)
         print data
         if data['code'] == 400:
             return "上报数据失败"
         return True
     except Exception, e:
         print e
         return False
Example #3
0
 def doProcess(self, index, showInfo):
     try:
         mobile = Mobile()
         items = mobile.assemble(
             self._config.choiceDev(),
             int(self._config.getGlobal('count'))).__dict__
         items.update(self._config.choiceAct())
         data = package('password', json.dumps(items))
         http = Http(self._config.getGlobal('host'),
                     self._config.getGlobal('port'))
         data = http.request(data)
         size = hex2int(data[36:44])
         body = data[44:45 + size]
         ret = None
         if showInfo:
             print 'start %s' % ("=" * 20)
             if ftype.isZIP(body):
                 ret = "BINARY"
                 print 'recv zip format data.'
             else:
                 ret = "TEXT"
                 print '%s' % ungzip(body)
             print 'End %s %s' % (index, "=" * 20)
         else:
             ret = body
     except:
         ret = None
     return ret
Example #4
0
def get_event_content(event_id):
	#os.system('''export http_proxy=""''')
	print '获取id为[%d]的活动内容' % event_id

	http = Http('plogin.12580.com',80)
	#para = {'act':'xml','id':event_id}
	#req_para = http.getparams(para)
	url = '%s%d' % ('/cmps/wapcms/wap/web_online_xml.php?id=',event_id)
	ret = http.request(url)

	#解析返回的xml报文
	#om = parseString(ret)
	#field_node = dom.documentElement
	#content_node = field_node.getElementsByTagName('content')[0]

	#data = None
	#if content_node.nodeType in (content_node.TEXT_NODE,content_node.CDATA_SECTION_NODE):
	#	data = content_node.data
	#else:
	#	print content_node.nodeType
	print 'cms返回报文: %s ' % ret

	root = ET.fromstring(ret)
	msg = {}
	for node in root:
		msg[node.tag] = node.text

	data = msg['content']
	print 'cms返回的活动内容为:%s' % (data or 'cms返回空')

	#os.system('''export http_proxy="http://127.0.0.1:8087/"''')
	return data
Example #5
0
 def __init__(self, url, account=None, passwd=None, encoding='utf-8'):
     self.url = url.rstrip("/")
     self.account = account
     self.passwd = passwd
     self.encoding = encoding
     self.token = None
     self.uttpUtil = Http()
Example #6
0
    def __init__(self, name="0000000", count=0, makeRooms=[]):
        self.robot = Robot()
        self.http = Http()
        self.name = name
        self.count = count  #编号

        self.listMsgQue = []  #消息发送队列
        self.timeDetaMsgSend = 1.1  #最小发送消息间隔s

        self.makeRooms = makeRooms
        self.roomIndex = {}  #房间号 及其<用户>信息
        self.roomMsg = {}  #消息 记录
        self.roomId = ""  #当前房号

        ############### 心情模块
        self.statusMin = 20
        self.statusMax = 95
        self.statusDefault = 80
        self.status = 90  #说话欲望值 0-100
        self.statusOnDeta = 15  #开心
        self.statusOffDeta = 15  #难过
        self.statusDownDeta = 40  #闭嘴

        self.getMsgDetaTime = 1  #抓取消息间隔
        self.lastMsgTime = int(
            time.time() * 10000) * 1.0 / 10000  #上一次更新房间聊天记录时间
        self.lastEchoTime = tool.getNowTime()  #上次说话时间
        self.maxDetaTime = 1000 * 60 * 3  # 最大沉默时间
        self.lastMusicTime = tool.getNowTime()
        self.maxMusicTime = 1000 * 60 * 4  #音乐间隔 暂不解析音乐文件时长控制
        self.musicNow = {}
        self.musicPlayType = -1
        self.ifOnMusic = True
        self.tail = " の... "
Example #7
0
    def __init__(self, name="Test", id="18408249138", pwd="1234qwer"):
        reload(sys)
        sys.setdefaultencoding('utf8') #针对socket发送中文异常
        self.detaTime = 3600 * 1000 #推送延时 60min
        self.detaTimeMin = 1200 * 1000 #推送延时 20min

        self.id = id
        self.pwd = pwd
        self.name = name
        self.robot = Robot()
        self.http = Http()
        self.db = Database('sqlite_' + self.id + '.db')
        self.socket = Socket()
        self.onConnect = False
        self.ifOk = False
        # sendTime添加时间, type消息类型, msg发送消息体, deta间隔发送时间, preTime预期发送时间节点
        self.db.execute(
            ''' 
            create table if not exists cochat(
                id  text,
                sendTime    text,
                sendTimeT text,
                deta    text,
                preTime text,
                preTimeT text,
                type        text,
                msg    text,
                flag    text
            )
            ''' )
        self.sendList = [] #发送队列 (time, deta, type, data)
        return
Example #8
0
 def __init__(self, name="0000000"):
     self.http = Http()
     self.name = name
     # https://console.bce.baidu.com/ai/?_=1533038198056&fromai=1#/ai/speech/app/detail~appId=464300
     self.appId = "11615410"
     self.appKey = "zzTM1VXx7Edmj4QXqCcnhZfF"
     self.appSecret = "jekAAbrElm87rpMM7jVBFFuKrm8ZWbwy"
     self.loginRes = {}
     self.access_token = ""
Example #9
0
File: skype.py Project: wd5/my-blog
def translate(msg, langpair):
    print msg
    #import pdb; pdb.set_trace()
    http = Http('ajax.googleapis.com', 443)
    params = {'v': '1.0', 'q': msg, 'langpair': langpair}
    #if http.request('/ajax/services/language/translate?v=1.0&q=%s&langpair=%s' % (msg, langpair)):
    if http.request('/ajax/services/language/translate', 'GET', params):
        response = http.parse()
	print response
        if response.get('responseStatus', None) == 200:
	    result = response['responseData']['translatedText']
            print 'TRANSLATION:', result
	    return result
class Glance:

    def __init__(self, server, port, auth_token):
        self.__server = server
        self.__http = Http(server)
        self.__http.set_port(port)
        self.__auth_token = auth_token

    def get_image_ref(self, image_name=None):
        header = {"X-Auth-Token": self.__auth_token}
        data = self.__http.send_get('v2/images', {}, header)
        if image_name is None:
            return self.__server + data['images'][0]['self']
        for i in range(0, len(data['images'])):
            if data['images'][0]['name'] == image_name:
                return self.__server + data['images'][i]['self']
Example #11
0
class HttpProcessor(threading.Thread):
    """ Thread object to spawn multiple HTTP connection threads """
    def __init__(self, queue, cookiejar, connection_pool):
        """ @param queue: The C{Queue.Queue} object that contains L{HttpRequest} objects.
            @param cookiejar: The C{LockableCookieJar} cookie object to share among requests.
            @param connection_pool: The C{ConnectionPool} object which contains connections to share among requests.
        """
        threading.Thread.__init__(self)
        self.queue = queue
        self.http = Http(cookiejar=cookiejar, connection_pool=connection_pool)
        
    def run(self):
        # The Queue item is expected to either an HttpRequest object
        # or None (to shut down the thread)
        logging.debug('Thread started, waiting for requests.')
        while (True):
            item = self.queue.get()
            if item is None:
                logging.debug('Shutting down thread.')
                return
            try:
                item.data = self.http.request(*item.args, **item.kwargs)
            finally:
                if item.lock:
                    item.lock.release()
class Network:

    def __init__(self, server, port, auth_token):
        self.__http = Http(server)
        self.__http.set_port(port)
        self.__auth_token = auth_token

    def get_network_id(self, network_name=''):
        header = {"X-Auth-Token": self.__auth_token}
        data = self.__http.send_get('v2.0/networks', {}, header)
        networks = data['networks']
        for i in range(0, len(networks)):
            if networks[i]['name'] == network_name:
                return networks[i]['id']

        return 0
Example #13
0
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)

        self.mimes = {'team': 'application/x-team-item',
                      'event':  'application/x-calendar-event',
                      }
        self.rooms = []
        self.tree = []
        self.rfid_id = None

        self.http = Http(self)

        self.work_hours = (8, 24)
        self.schedule_quant = timedelta(minutes=30)

        self.menus = []
        self.create_menus()
        self.setup_views()

        settings = QSettings()
        settings.beginGroup('network')
        host = settings.value('addressHttpServer', QVariant('WrongHost'))
        settings.endGroup()

        if 'WrongHost' == host.toString():
            self.setupApp()

        self.baseTitle = _('Manager\'s interface')
        self.logoutTitle()
        self.statusBar().showMessage(_('Ready'), 2000)
        self.resize(640, 480)
Example #14
0
 def __init__(self, queue, cookiejar, connection_pool):
     """ @param queue: The C{Queue.Queue} object that contains L{HttpRequest} objects.
         @param cookiejar: The C{LockableCookieJar} cookie object to share among requests.
         @param connection_pool: The C{ConnectionPool} object which contains connections to share among requests.
     """
     threading.Thread.__init__(self)
     self.queue = queue
     self.http = Http(cookiejar=cookiejar, connection_pool=connection_pool)
Example #15
0
 def run(self):
     self._debug('started')
     inmates = Inmates(Inmate, self._monitor)
     inmates_scraper = InmatesScraper(Http(), inmates, InmateDetails, self._monitor)
     search_commands = SearchCommands(inmates_scraper, self._monitor)
     controller = Controller(self._monitor, search_commands, inmates_scraper, inmates)
     controller.run()
     self._debug('waiting for processing to finish')
     controller.wait_for_finish()
     self._debug('finished')
Example #16
0
 def check_for_missing_inmates(self, start_date):
     self._debug('started check_for_missing_inmates')
     inmates = Inmates(Inmate, self._monitor)
     inmates_scraper = InmatesScraper(Http(), inmates, InmateDetails, self._monitor, workers_to_start=70)
     search_commands = SearchCommands(inmates_scraper, self._monitor)
     controller = Controller(self._monitor, search_commands, inmates_scraper, inmates)
     controller.find_missing_inmates(start_date)
     self._debug('waiting for check_for_missing_inmates processing to finish')
     controller.wait_for_finish()
     self._debug('finished check_for_missing_inmates')
    def __init__(self, server, port, username, password, domain='default'):

        self.__http = Http(server)
        self.__http.set_port(port)

        self.__username = username
        self.__password = password

        self.__get_auth_token()
        self.__get_tenant_id()
Example #18
0
    def __init__(self, name="Test"):
        self.name = name

        self.http = Http()
        self.db = Database()
        self.db.execute(''' 
            create table if not exists auto(
                url         text,
                about        text,
                time        text,
                v1       text,
                v2       text,
                v3       text,
                v4       text,
                v5       text
            )
            ''')

        return
class Auth:

    def __init__(self, server, port, username, password, domain='default'):

        self.__http = Http(server)
        self.__http.set_port(port)

        self.__username = username
        self.__password = password

        self.__get_auth_token()
        self.__get_tenant_id()

    def __get_auth_token(self):
        data_request = {
            "auth": {
                "tenantName": self.__username,
                "passwordCredentials": {
                    "username": self.__username,
                    "password": self.__password
                }
            }
        }

        data = self.__http.send_post('v2.0/tokens', data_request)
        self.__auth_token = data['access']['token']['id']

    def __get_tenant_id(self):
        header = {"X-Auth-Token": self.__auth_token}
        data = self.__http.send_get('v2.0/tenants', {}, header)
        tenants = data['tenants']
        for i in range(0, len(tenants), 1):
            if tenants[i]['name'] == self.__username:
                self.__tenant_id = tenants[i]['id']

    def get_auth_token(self):
        return self.__auth_token

    def get_tenant_id(self):
        return self.__tenant_id
Example #20
0
    def dissect(tcp):
        """Runs all TCP dissectors.
        @param conn: connection.
        @param data: payload data.
        """
        ptcp = {}  # populate array of connections of Cuckoo default report
        ptcp["layer"] = 4  # Source port
        ptcp["protocol_name"] = "TCP"
        ptcp["sport"] = tcp.sport  # Source port
        ptcp["dport"] = tcp.dport  # Destination port
        ptcp["seqnum"] = tcp.seq  # Sequence number
        ptcp["acknum"] = tcp.flags  # Acknowledge number
        ptcp["off"] = tcp.off  # Data offset
        ptcp["reserved"] = 0  # Reserved - always 0
        ptcp["cb"] = Tcp.tcp_flags(tcp.data)  # Verify flag of control bits
        ptcp["win"] = tcp.win  # Window
        ptcp["cksum"] = tcp.sum  # Checksum
        ptcp["urp"] = tcp.urp  # Urgent Pointer
        ptcp["options"] = tcp.opts  # Options
        ptcp["padding"] = ''  # TODO not present in dpkt.ip.IP (maybe computed)

        # HTTP
        if http.check(tcp.data):
            ptcp["payload"] = http.dissect(tcp.data)
        # SMTP.
        elif smtp.check(tcp):
            ptcp["payload"] = smtp.dissect(tcp.data)
        # IRC
        elif irc.check(tcp):
            ptcp["payload"] = irc.dissect(tcp.data)
        # DNS
        elif dns.check(tcp):
            ptcp["payload"] = dns.dissect(tcp.data)
        # Unknown Protocol
        else:
            ptcp["payload"] = "unknown protocol on layer " + str(
                ptcp["layer"] + 1)

        return ptcp
Example #21
0
    def dissect(tcp):
        """Runs all TCP dissectors.
        @param conn: connection.
        @param data: payload data.
        """
        ptcp = {} # populate array of connections of Cuckoo default report
        ptcp["layer"] = 4  # Source port
        ptcp["protocol_name"] = "TCP"
        ptcp["sport"] = tcp.sport  # Source port
        ptcp["dport"] = tcp.dport  # Destination port
        ptcp["seqnum"] = tcp.seq  # Sequence number
        ptcp["acknum"] = tcp.flags  # Acknowledge number
        ptcp["off"] = tcp.off  # Data offset
        ptcp["reserved"] = 0  # Reserved - always 0
        ptcp["cb"] = Tcp.tcp_flags(tcp.data)  # Verify flag of control bits
        ptcp["win"] = tcp.win  # Window
        ptcp["cksum"] = tcp.sum  # Checksum
        ptcp["urp"] = tcp.urp  # Urgent Pointer
        ptcp["options"] = tcp.opts  # Options
        ptcp["padding"] = ''  # TODO not present in dpkt.ip.IP (maybe computed)

        # HTTP
        if http.check(tcp.data):
            ptcp["payload"] = http.dissect(tcp.data)
        # SMTP.
        elif smtp.check(tcp):
            ptcp["payload"] = smtp.dissect(tcp.data)
        # IRC
        elif irc.check(tcp):
            ptcp["payload"] = irc.dissect(tcp.data)
        # DNS
        elif dns.check(tcp):
            ptcp["payload"] = dns.dissect(tcp.data)
        # Unknown Protocol
        else:
            ptcp["payload"] = "unknown protocol on layer " + str(ptcp["layer"]+1)

        return ptcp
Example #22
0
    def __init__(self, name="0000000",flowName="", count = 0, makeRooms=[]):
        self.robot = Robot()
        self.http = Http()
        self.name = name
        self.flowName = flowName
        self.count = count   #编号

        self.listMsgQue = []    #消息发送队列
        self.timeDetaMsgSend = 1.5    #最小发送消息间隔s
        self.makeRooms = makeRooms
        self.userIndex = {} # 用户name -> 用户id
        self.userIndexRe = {} #id -> name
        self.roomIndex = {} #房间号 及其<用户>信息
        self.roomMsg = {}   #消息 记录
        self.roomId = ""  #当前房号
        self.ifWelcom = False #是否迎客
        self.ifTime = False #是否存货确认
        self.admins = {}
        self.tripcodeIndex = {} #上次房间记录 的 用户名 绑定的 tc code
        self.linkStart = 0 #链接状态

        self.init()
        self.tail = " の... "
Example #23
0
    def __init__(self):
        self.id = "test id"
        self.name = "test name"
        self.http = Http()
        self.auto163 = Auto163("Music")
        self.apiKey = "bfbf6432b655493b9e861b470bca9921"
        self.userId = "WalkerDust"

        self.db = Database()
        self.db.execute(''' 
        create table if not exists music(
            url         text primary key,
            name        text,
            duration    text,
            fromName    text,
            count       text
        )
        ''')
        self.db.execute(''' 
            create table if not exists user(
                name        text primary key,
                id          text,
                icon        text,
                flag        text
            )
            ''')
        self.db.execute(''' 
            create table if not exists msg(
                id            text primary key, 
                userName      text,
                data          text,
                time          text
            )
            ''')
        self.initMusic()
        self.palyHistoryMusic = []
        return
Example #24
0
 def doProcess(self, index, showInfo):
     try:
         mobile = Mobile()
         items = mobile.assemble(self._config.choiceDev(), int(self._config.getGlobal('count'))).__dict__
         items.update(self._config.choiceAct())
         data = package('password', json.dumps(items))
         http = Http(self._config.getGlobal('host'), self._config.getGlobal('port'))
         data = http.request(data)
         size = hex2int(data[36:44])
         body = data[44:45 + size]
         ret = None
         if showInfo:
             print 'start %s' % ("=" * 20)
             if ftype.isZIP(body):
                 ret = "BINARY"
                 print 'recv zip format data.'
             else:
                 ret = "TEXT"
                 print '%s' % ungzip(body)
             print 'End %s %s' % (index, "=" * 20)
         else: ret = body
     except:
         ret = None
     return ret
Example #25
0
    def __init__(self, name="Test"):
        self.name = name

        self.http = Http()
        self.db = Database()
        self.db.execute(''' 
            create table if not exists music(
                url         text primary key,
                name        text,
                fromName    text,
                count       text
            )
            ''')

        return
Example #26
0
	def get(attraction):
		url = "{}{}".format("/attraction/get/", attraction['id'])
		res = Http.get(url, True)
		json = res.json()
		
		status = ''
		
		if json['ShortWaitTimeDisplay'] == 'Closed':
			status = attraction['closed_message']
		else:
			status = "{} {} minutes".format(attraction['open_message'], json['PostedWaitTime'])
			
		if 'twitter_cfg' in attraction:
			Comm.tweet(status, attraction['twitter_cfg'])
		else:
			print status
Example #27
0
 def login(self):
     from http import Http
     import json
     data = {'username': self.username, 'password': self.password}
     headers = {'content-type': 'application/json'}
     try:
         data = Http.post(
             'http://%s:%s/api/token/' %
             (self.config()['domain'], self.config()['port']), data,
             headers)
         if data.status_code == 400:
             return False
         data = json.loads(data.text)
         return data['token']
     except Exception, e:
         return False
Example #28
0
    def get(attraction):
        url = "{}{}".format("/attraction/get/", attraction['id'])
        res = Http.get(url, True)
        json = res.json()

        status = ''

        if json['ShortWaitTimeDisplay'] == 'Closed':
            status = attraction['closed_message']
        else:
            status = "{} {} minutes".format(attraction['open_message'],
                                            json['PostedWaitTime'])

        if 'twitter_cfg' in attraction:
            Comm.tweet(status, attraction['twitter_cfg'])
        else:
            print status
Example #29
0
def log():
    print e.get()
    number = e.get()
    if number == '':
        show_tip()
    else:
        key = Http.get_key(number)
        print key

        if key == '':
            show_code_error()
        else:
            print key

            root.withdraw()
            chrome = Chrome(key)
            chrome.open_web()
Example #30
0
class Auto:
    def __init__(self, name="Test"):
        self.name = name

        self.http = Http()
        self.db = Database()
        self.db.execute(
            ''' 
            create table if not exists auto(
                url         text,
                about        text,
                time        text,
                v1       text,
                v2       text,
                v3       text,
                v4       text,
                v5       text
            )
            ''' )

        return
    # 日志输出
    def out(self, obj):
        print(time.strftime("%Y%m%d %H:%M:%S", time.localtime()) + "." + self.__module__ + self.name + "." + str(obj))
        # tools.out(obj)
        return
    # 实时控制帮助
    def help(self):
        self.out(dir(self))
        return
    # doMethod([methodName arg1 arg2]) -> methodName(arg1,arg2)
    def doMethod(self, listArgs):
        size = len(listArgs)
        res = None
        if(size > 0):
            if(hasattr(self, listArgs[0])):
                method = getattr(self, listArgs[0])
                if(callable(method)):
                    if(size == 2):
                        res = method(listArgs[1])
                    elif(size == 3):
                        res = method(listArgs[1], listArgs[2])
                    elif(size == 4):
                        res = method(listArgs[1], listArgs[2], listArgs[3])
                    elif(size == 5):
                        res = method(listArgs[1], listArgs[2], listArgs[3], listArgs[4])
                    else:
                        res = method()
                else:
                    self.out(method)
        return res
    # 手动命令监控
    def inputHello(self):
        self.out("开启输入监控!")
        self.help()
        while(True):
            try:
                cmd=raw_input("")
                if(cmd != ""):
                    if(not self.doMethod(cmd.split(" "))):
                        self.doCmd(cmd)
                        time.sleep(1)
            except Exception as e:
                self.out(repr(e))
        return
    # 测试用
    def test(self):
        self.login()
        # 输入监控线程
        ThreadRun( "InputHello." + str(self.name),  self.inputHello ).start()

        tool.wait()
        return
    # 非函数调用 属性变量查看 其他的指令控制
    def doCmd(self, cmd):
        self.out("其他指令." + str(cmd))
        
        return

    # 认证登录
    def login(self):
        self.out("访问主页 获取 token session")
#        http://content.icbc.com.cn/site1/a5f9ff6d068a46e68d363426ca69bd07/login_unfirst.html?pageOrder=login_unfirst.html;index.html&_mp_cmp_ttime=1548294412328
# "http://content.icbc.com.cn/site1/a5f9ff6d068a46e68d363426ca69bd07/login_unfirst.html?pageOrder=login_unfirst.html;index.html&_mp_cmp_ttime=1545268253550"
#http://content.icbc.com.cn/site1/a5f9ff6d068a46e68d363426ca69bd07/login_unfirst.html?pageOrder=login_unfirst.html;index.html&_mp_cmp_ttime=1552005766720
        ttt = str(tool.getNowTime())
        kkk = 'a5f9ff6d068a46e68d363426ca69bd07'
        url = "http://content.icbc.com.cn/site1/" + kkk + "/login_unfirst.html?pageOrder=login_unfirst.html;index.html&_mp_cmp_ttime=" + ttt
        
        
#BIGipServerwifi_ContextPlat_80_Pool	2097346570.20480.0000	N/A	N/A	N/A	59				
#cmp_glb_param	98f7808c851a9f53da5f0c3f1639b678	N/A	N/A	N/A	46				
#layerNettimeType	true	N/A	N/A	N/A	23				
#layerPosterType	true	N/A	N/A	N/A	22				
#layerSafeType	true	N/A	N/A	N/A	20

#Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
#Accept-Encoding: gzip, deflate
#Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
#Connection: keep-alive

        header = {
            "Cookie"    : "BIGipServerwifi_ContextPlat_80_Pool=2097346570.20480.0000; layerSafeType=true; layerPosterType=true; layerNettimeType=true; cmp_glb_param=98f7808c851a9f53da5f0c3f1639b678"
            
        }
        self.http.addHeader(header)
        
        self.http.show()
        responce = self.http.doGet(url)
        re = responce.read()
        soup =BeautifulSoup.BeautifulSoup(re)
        nameList = soup.findAll('button',{'id':{'login_btn'}})
        if(len(nameList) > 0):
            self.out(nameList)
            self.out("抓取成功: ")
            self.http.show(responce)
            self.out("模拟登录")
# http://content.icbc.com.cn/cmp/AuthSkipController.do?method=authSkip&ajaxRequest=true
            url = "http://content.icbc.com.cn/cmp/AuthSkipController.do?method=authSkip&ajaxRequest=true"
#{"msg":"GlbInfo检查不通过","retCode":1,"success":false,"data":{"needJump":"http%3A%2F%2Fwww.baidu.com%2F"}}

            json=self.http.doJson(url)
            self.out((json))
            self.out(json["msg"])
            self.out(json["data"]["needJump"])
        else:
            self.out("error! 没能抓取到token")
        return False
Example #31
0
 def search_by_isbn(cls, isbn):
     # 根据isbn来查询书籍
     url = cls.isbn_url.format(isbn)
     result = Http.get(url)
     return result
Example #32
0
class Auto:
    def __init__(self, name="Test"):
        self.name = name

        self.http = Http()
        self.db = Database()
        self.db.execute(
            ''' 
            create table if not exists auto(
                url         text,
                about        text,
                time        text,
                v1       text,
                v2       text,
                v3       text,
                v4       text,
                v5       text
            )
            ''' )

        return
    # 日志输出
    def out(self, obj):
        print(time.strftime("%Y%m%d %H:%M:%S", time.localtime()) + "." + self.__module__ + self.name + "." + str(obj))
        # tools.out(obj)
        return
    # 实时控制帮助
    def help(self):
        self.out(dir(self))
        return
    # doMethod([methodName arg1 arg2]) -> methodName(arg1,arg2)
    def doMethod(self, listArgs):
        size = len(listArgs)
        res = None
        if(size > 0):
            if(hasattr(self, listArgs[0])):
                method = getattr(self, listArgs[0])
                if(callable(method)):
                    if(size == 2):
                        res = method(listArgs[1])
                    elif(size == 3):
                        res = method(listArgs[1], listArgs[2])
                    elif(size == 4):
                        res = method(listArgs[1], listArgs[2], listArgs[3])
                    elif(size == 5):
                        res = method(listArgs[1], listArgs[2], listArgs[3], listArgs[4])
                    else:
                        res = method()
                else:
                    self.out(method)
        return res
    # 手动命令监控
    def inputHello(self):
        self.out("开启输入监控!")
        self.help()
        while(True):
            try:
                cmd=raw_input("")
                if(cmd != ""):
                    if(not self.doMethod(cmd.split(" "))):
                        self.doCmd(cmd)
                        time.sleep(1)
            except Exception as e:
                self.out(repr(e))
        return
    # 测试用
    def test(self):
        self.login()
        # 输入监控线程
        ThreadRun( "InputHello." + str(self.name),  self.inputHello ).start()

        tool.wait()
        return
    # 非函数调用 属性变量查看 其他的指令控制
    def doCmd(self, cmd):
        self.out("其他指令." + str(cmd))
        
        return

    # 认证登录
    def login(self):
        self.out("访问主页 获取 token session")
# "http://content.icbc.com.cn/site1/a5f9ff6d068a46e68d363426ca69bd07/login_unfirst.html?pageOrder=login_unfirst.html;index.html&_mp_cmp_ttime=1545268253550"
        ttt = '1545268253550' #str(tool.getNowTime())
        kkk = 'a5f9ff6d068a46e68d363426ca69bd07'
        url = "http://content.icbc.com.cn/site1/" + kkk + "/login_unfirst.html?pageOrder=login_unfirst.html;index.html&_mp_cmp_ttime=" + ttt
        
        responce = self.http.doGet(url)
        re = responce.read()
        soup =BeautifulSoup.BeautifulSoup(re)
        nameList = soup.findAll('button',{'id':{'login_btn'}})
        if(len(nameList) > 0):
            self.out(nameList)
            self.out("抓取成功: ")
            self.out("cookie\t " + tool.toString(self.http.getCookie()))
            self.out("模拟登录")
# http://content.icbc.com.cn/cmp/AuthSkipController.do?method=authSkip&ajaxRequest=true
            url = "http://content.icbc.com.cn/cmp/AuthSkipController.do?method=authSkip&ajaxRequest=true"
            json=self.http.doJson(url)
            self.out((json))
        else:
            self.out("error! 没能抓取到token")
        return False
Example #33
0
class AutoSophia:
    def __init__(self, name="0000000", count=0, makeRooms=[]):
        self.robot = Robot()
        self.http = Http()
        self.name = name
        self.count = count  #编号

        self.listMsgQue = []  #消息发送队列
        self.timeDetaMsgSend = 1.1  #最小发送消息间隔s

        self.makeRooms = makeRooms
        self.roomIndex = {}  #房间号 及其<用户>信息
        self.roomMsg = {}  #消息 记录
        self.roomId = ""  #当前房号

        ############### 心情模块
        self.statusMin = 20
        self.statusMax = 95
        self.statusDefault = 80
        self.status = 90  #说话欲望值 0-100
        self.statusOnDeta = 15  #开心
        self.statusOffDeta = 15  #难过
        self.statusDownDeta = 40  #闭嘴

        self.getMsgDetaTime = 1  #抓取消息间隔
        self.lastMsgTime = int(
            time.time() * 10000) * 1.0 / 10000  #上一次更新房间聊天记录时间
        self.lastEchoTime = tool.getNowTime()  #上次说话时间
        self.maxDetaTime = 1000 * 60 * 3  # 最大沉默时间
        self.lastMusicTime = tool.getNowTime()
        self.maxMusicTime = 1000 * 60 * 4  #音乐间隔 暂不解析音乐文件时长控制
        self.musicNow = {}
        self.musicPlayType = -1
        self.ifOnMusic = True
        self.tail = " の... "

    def out(self, obj):
        print(
            time.strftime("%Y%m%d %H:%M:%S", time.localtime()) + "." +
            self.name + "." + str(obj))
        return

    def login(self):
        # tool.line()
        self.out("访问主页 获取 token session")
        responce = self.http.doGet('http://drrr.com/')
        re = responce.read()
        soup = BeautifulSoup.BeautifulSoup(re)
        # self.out soup.prettify()
        nameList = soup.findAll('input', {'name': {'token'}})
        if (len(nameList) > 0):
            token = nameList[0]['data-value']
            token = tool.encode(token)
            self.out("抓取成功: ")
            self.out("token\t " + token)
            self.out("cookie\t " + tool.toString(self.http.getCookie()))

            # tool.line()
            self.out("模拟登录")
            responce = self.http.doPost(
                'http://drrr.com/', {
                    "name": self.name,
                    "login": "******",
                    "token": token,
                    "direct-join": "",
                    "language": "zh-CN",
                    "icon": "zaika-2x",
                })
        else:
            self.out("error! 没能抓取到token")

    def createRoom(self, room=""):
        # tool.line()
        self.out("创建房间")
        if (room == ""):
            room = {}
            room["name"] = self.name + "'s room"
        responce = self.http.doPost(
            "http://drrr.com/create_room/?", {
                "name": room.get("name", ""),
                "description": room.get("description", ""),
                "limit": room.get("limit", 10),
                "music": room.get("music", True),
                "submit": room.get("music", "创建房间"),
            })

    def help(self):
        self.out(dir(self))

    def showUser(self, user, show=True):
        userInfo = "U " + tool.fill(
            user.get("device", ""), ' ', 15) + " " + tool.fill(
                user.get("icon", ""), ' ', 15) + " " + user.get("name", "")
        if (show):
            self.out(userInfo)
        return userInfo

    def showRoom(self, roomId, show=True, i=0):
        room = self.roomIndex.get(roomId, "")
        if (room == ""):
            self.getRooms()
        room = self.roomIndex.get(roomId, "")
        info = ""
        if (room != ""):
            info = ("##" + tool.fill(str(i), '#', 40) + "\n--G " + tool.fill(
                room["id"], ' ', 15) + " " + tool.fill(
                    str(room["total"]) + "/" + str(room["limit"]), ' ', 15) +
                    " " + room["name"]) + "\n"
            info = info + "music: " + str(
                room.get("music", False)) + " language:" + room.get(
                    "language", ""
                ) + "\n"  # " 静态房间: " + str(room.get("staticRoom", "")) + ""
            # info = info + " hiddenRoom: " + str(room.get("staticRoom", "")) + " 游戏房间: " + str(room.get("gameRoom", "")) + " 成人房间: " + str(room.get("adultRoom", "")) + "\n"
            info = info + "Host:" + room.get("host", {}).get("name", "") + "\n"
            info = info + "Users: " + "\n"
            for item in room.get("users", []):
                info = info + "--" + self.showUser(item, False) + "\n"
        if (show):
            self.out(info)
        return info

    def showAllRoom(self):
        if (self.roomIndex is None or self.roomIndex == ""
                or self.roomIndex == {}):
            self.getRooms()
        tool.line()
        self.out("展示所有房间信息")
        i = 0
        for key in self.roomIndex:
            # room = self.roomIndex[key]
            self.showRoom(key, True, i)
            i = i + 1
        tool.line()

    # 获取当前房间人员列表
    def getRoomUsers(self, roomId=""):
        room = self.roomIndex.get(roomId, {})
        users = room.get("users", [])
        return users

    # 获取用户所在房间
    def getUserRoom(self,
                    userName="******",
                    userId="8f1b61e25098b0427f01d724716b70cb"):
        i = 0
        res = []
        for key in self.roomIndex:
            room = self.roomIndex[key]
            users = room.get("users", [])
            for user in users:
                if (user.get("name", "") == userName):
                    # self.showRoom(key, True, i)
                    res.append(room)
                if (user.get("id", "") == userId):
                    self.showRoom(key, True, i)
            i = i + 1
        if (len(res) <= 0):
            self.out("用户不在线" + userName)
        if (len(res) >= 2):
            self.out("该用户多次出现?????")
            for item in res:
                self.out(item)
            tool.line()
        return res

    def goRoomName(self, roomName):
        if (self.roomIndex is None or self.roomIndex == ""
                or self.roomIndex == {}):
            self.getRooms()
        tool.line()
        self.out("查找房间名字加入" + roomName)
        i = 0
        for key in self.roomIndex:
            room = self.roomIndex[key]
            name = room.get("name", "")
            if (re.search(roomName, name) != None):
                self.goRoom(key)
                break
            i = i + 1
        tool.line()

    def goRoom(self, roomId):
        # tool.line()
        self.out("加入房间:" + roomId)
        # self.showRoom(roomId)
        responce = self.http.doGet("http://drrr.com/room/?id=" + roomId)
        self.roomId = roomId
        # self.send("/me 大家好 我是暖手宝" + self.name + " 可以@ [点歌/turn/prev](*^_^*) @不一定会回 不@也不一定不会回(∩_∩) ")
        return

    def outRoom(self):
        self.out("离开房间:" + self.roomId)
        # self.send("/me " + self.name + "好无聊啊 "+self.name +"要出去溜达一会儿" + self.tail)
        # self.send("/me "+self.name+"一定会回来的" + self.tail)
        # self.send("/me 出去一下,马上回来" + self.tail)
        # self.showRoom(self.roomId)
        time.sleep(self.timeDetaMsgSend * len(self.listMsgQue) + 1)  #等待一会儿消息发送
        responce = self.http.doPost("http://drrr.com/room/?ajax=1", {
            "leave": "leave",
        })
        self.roomId = ""
        if (responce == "error"):
            return False
        return True

    def getRooms(self, detail=False):
        # tool.line()
        self.out("获取房间列表")
        responce = self.http.doGet("http://drrr.com/lounge?api=json")
        jsonObj = tool.makeObj(json.loads(responce.read()))
        rooms = jsonObj["rooms"]
        if (len(rooms) > 0):
            self.roomIndex.clear()
        count = 0
        userCount = 0
        for i in range(len(rooms)):
            room = rooms[i]
            self.roomIndex[room["id"]] = room
            count = count + 1
            userCount = userCount + int(room.get("total", 0))
            # self.out("#" + str(i) + "\t" + room["id"] + " " + str(room["total"]) + "/" + str(room["limit"]) + "\t " + room["name"])
        self.out("共计房间" + tool.fill(str(count), ' ', 5) + " 用户" +
                 tool.fill(str(userCount), ' ', 5))
        # self.out("解析完毕")
        return rooms

    # 定时消息发送队列
    def doHello(self):
        while (True):
            if (self.roomId != ""):
                self.out("开启消息发送队列 deta=" + str(self.timeDetaMsgSend) + "ms")
                # self.listMsgQue = []
            while (self.roomId != ""):
                try:
                    detaTime = tool.getNowTime() - self.lastEchoTime
                    if (detaTime > self.timeDetaMsgSend):  # 发送时差大于最小发送间隔
                        if (len(self.listMsgQue) > 0):
                            msg = self.listMsgQue.pop(0)
                            self.doSend(msg)
                    time.sleep(self.timeDetaMsgSend)
                except Exception as e:
                    self.out("消息发送异常 消息队列:")
                    self.out(self.listMsgQue)
                    self.out(traceback.format_exc())
            # self.out("当前房间roomId:" + self.roomId + " 未加入房间 暂时停止sayHello ")
            time.sleep(3)

    # 定时发送消息
    def sayHello(self):
        while (True):
            if (self.roomId != ""):
                self.out("开启定时发言,最大发言间隔" + str(self.maxDetaTime / 1000) + "s")
            dt = 0
            while (self.roomId != ""):
                try:
                    # message = "Now Time is "+ time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                    detaTime = tool.getNowTime() - self.lastEchoTime  # ms
                    if (detaTime > self.maxDetaTime):
                        message = "/me " + time.strftime("%Y%m%d %H:%M:%S")
                        self.send(message)
                        self.out(str(i) + "\t" + message)
                    detaTime = tool.getNowTime() - self.lastMusicTime  # ms
                    if (self.ifOnMusic and detaTime > self.maxMusicTime
                            and len(self.getRoomUsers(self.roomId)) >
                            1):  #音乐开启 且 太久没放歌曲 且当前房间有至少两个人(包括自己robot)
                        self.playMusic()

                    if (dt % 300 == 0):
                        self.getRooms()  #定时获取房间最新信息
                    time.sleep(10)
                    dt = dt + 10
                    dt = dt % 3600
                except Exception as e:
                    self.out(traceback.format_exc())
            # self.out("当前房间roomId:" + self.roomId + " 未加入房间 暂时停止sayHello ")
            time.sleep(3)

    # 定时抓取消息##########################
    def getHello(self):
        tt = self.getMsgDetaTime
        while (True):
            if (self.roomId != ""):
                self.out("开启抓取发言," + str(tt) + "s/次")
            while (self.roomId != ""):
                try:
                    obj = self.rece()
                    if (obj != ""):
                        self.makeHello(obj)
                except Exception as e:
                    self.out(traceback.format_exc())
                time.sleep(tt)
            # self.out("当前房间roomId:" + self.roomId + " 未加入房间 暂时停止getHello ")
            time.sleep(3)

    # 抓取发言    json Obj
    def rece(self):
        # 获取最新时间的消息1530004210 157 s秒
        res = ""
        url = "http://drrr.com/json.php?update=" + str(self.lastMsgTime)
        # self.out(url)
        responce = self.http.doGet(url)
        if (responce != "" and type(responce) != str):
            jsonStr = responce.read()
            if (jsonStr != ""):
                res = tool.makeObj(json.loads(jsonStr))
            else:
                res = ""
        else:
            self.out("请求异常:" + str(responce))
        return res

    # 发送消息-添加队列
    def send(self, message):
        if (message != None and message != ""):
            self.listMsgQue.append(message)
        return

    # 发送消息
    def doSend(self, message):
        if (message == ""):
            return
        self.out("Send." + message)
        responce = self.http.doPost(
            "http://drrr.com/room/?ajax=1",
            {
                "message": message,  # [0:self.musicPlayType * 4],
                "url": "",
            })
        # self.out("发送[" + message + "]" + re[0:66])
        self.lastEchoTime = tool.getNowTime()
        return

# 用户权限

    def getUserAuth(selfself, name=""):
        res = ""
        return res

    # 分享音乐
    def playMusic(self, url="", name="", fromName=""):
        self.musicPlayType = 0  #重置为随机播放

        if (url[0:4] != "http"):  #无地址url则是定向点播
            if (name == ""):  #无名字 则自动换
                music = self.robot.turnMusic(self.musicPlayType)
            else:
                self.send("/me 正在搜索歌曲[" + name + "]" + self.tail)
                music = self.robot.getMusic(name, fromName)
            url = music.get("url", "")
            name = music.get("name", "")
            fromName = music.get("fromName", "")
        if (fromName != ""):
            msg = ""
            rooms = self.getUserRoom(fromName)
            if (len(rooms) > 0):
                room = rooms[0]
                if (room.get("id", "") == self.roomId):  #在当前房间
                    pass
                    # msg = "/me 一首[" + name + "]送给" + fromName + "" + self.tail
                else:
                    pass
                    # msg = "/me Share " + room.get("name")[0:4] + "/" + fromName + "'s[" + name + "]" + "" + self.tail
            else:  #不在线
                pass
                # msg = "/me Then play" + fromName + " ordered [" + name + "]" + "" + self.tail
            self.send(msg)
        self.out("分享歌曲url=" + url + " name=" + name + " fromName=" + fromName)
        if (url == ""):
            # self.send("/me 怼不起,没有找到类似的歌曲,瑟瑟发抖"+self.tail)
            return
        responce = self.http.doPost("http://drrr.com/room/?ajax=1", {
            "music": "music",
            "name": name,
            "url": url,
        })
        self.musicNow = {"url": url, "name": name, "fromName": fromName}
        self.lastMusicTime = tool.getNowTime()
        return

    def listMusic(self):
        self.out(self.robot.listMusic)

    # 切歌控制 on/off/turn/prev/next/remove
    def music(self, cmd="on"):
        self.out("music:" + cmd)
        if (cmd == "on"):
            self.ifOnMusic = True
            self.send("/me 已经打开音乐点播" + self.tail)
        elif (cmd == "off"):
            self.ifOnMusic = False
            self.send("/me 已经关闭音乐点播" + self.tail)
        elif (cmd == "turn"):
            self.ifOnMusic = True
            self.musicPlayType = 0
            self.playMusic()
        elif (cmd == "prev"):
            self.ifOnMusic = True
            self.musicPlayType = -1
            self.playMusic()
        elif (cmd == "next"):
            self.ifOnMusic = True
            self.musicPlayType = 1
            self.playMusic()
        elif (cmd == "remove"):
            self.robot.removeMusic(self.musicNow.get("url", ""))
            self.send("/me 降低音乐" + self.musicNow.get("name") + "播放频率 " +
                      self.tail)

        return

    # 手动控制
    def inputHello(self):
        self.out("开启输入监控!")
        self.help()
        while (True):
            try:
                cmd = raw_input("")
                if (cmd != ""):
                    if (not self.doMethod(cmd.split(" "))):
                        self.out("手动发送:" + cmd)
                        self.send(cmd)
                        time.sleep(1)
            except Exception as e:
                self.out(traceback.format_exc())
        return

    # 抓取到消息的auto回复
    def makeHello(self, obj):
        res = ""
        try:
            # tool.line()
            # self.out("抓取到消息obj")
            # self.out(obj)
            newTime = obj.get("update", self.lastMsgTime)
            newTime = int(newTime)
            # print(newTime)
            self.lastMsgTime = newTime
            talks = obj.get('talks', "")
            users = obj.get('users', "")
            if (users != ""):
                room = self.roomIndex.get(self.roomId, "")
                if (room != ""):
                    self.roomIndex[self.roomId]['users'] = users
                else:
                    self.roomIndex[self.roomId] = obj
            if (talks != ""):
                onceDocount = 0
                for item in talks:
                    # self.out(item)
                    msgTime = item.get("time", tool.getNowTime())
                    msgId = item.get('id', " ")
                    msgType = item.get('type', 'message')
                    msgData = ""
                    msgFromName = item.get('from', {}).get('name', "")
                    if (msgFromName == ""):
                        msgFromName = item.get('user', {}).get('name', "")

                    if (msgType == 'me'):
                        msgData = item.get('content', "")
                    elif (msgType == 'message'):
                        msgData = item.get('message', "")
                    elif (msgType == 'join'):
                        # msgFromName = item.get('user', {}).get('name', "")
                        msgData = '欢迎' + msgFromName + self.tail
                    elif (msgType == 'leave'):
                        msgData = ' ' + msgFromName + ' 默默的离开了 ' + self.tail
                    elif (msgType == 'music'):
                        music = item.get('music', {})
                        name = music.get('name', '')
                        url = music.get('url', '')
                        # msgData = '悄悄的的把[' + name + ']给记在小本子上 '  + self.tail
######################################################## 不处理
                    if (self.roomMsg.get(msgId, "") !=
                            ""):  #已经处理过 或者是自己发送的 或者取出发送者失败
                        # self.out("旧消息 " + msgId + " type:" + msgType + " data:" + msgData)
                        break

                    if (msgType == "me" or msgType == "message"):  #只记录聊天消息
                        self.robot.addMsg(msgId, msgFromName, msgData, msgTime)
                    if (msgFromName == self.name or msgFromName == ""):
                        break


#############################################################

                    if (msgType == 'music'):
                        music = {
                            "name": name,
                            "url": url,
                            "fromName": msgFromName
                        }
                        res = self.robot.addMusic(music)  #添加用户分享记录
                        if (res == 1):  #更新则不提示
                            msgData = ""
                        self.musicNow = music
                        self.lastMusicTime = tool.getNowTime()

                    self.roomMsg[msgId] = item  #标记未已经处理 历史消息

                    if (self.status > self.statusMax):
                        self.status = self.statusMax
                    elif (self.status < self.statusMin):
                        self.status = self.statusMin

                    detaTime = tool.getNowTime() - self.lastEchoTime  # ms 60s
                    olRan = tool.getRandom(
                        0,
                        self.maxDetaTime) / 1000  #0-180 过于久没有发过消息了 权重高则可能自回复
                    weight = (self.maxDetaTime -
                              detaTime) / 1000  #多久没说话了 最大多长时间必须说话
                    ran = int(1.0 * olRan * (1 + 1.0 *
                                             (self.status - 60) / 100))

                    self.out("新消息 " + msgId + " 发言权" +
                             tool.fill(str(weight) + "", ' ', 6) + " 随机数" +
                             tool.fill(str(olRan) + "->" + str(ran), ' ', 6) +
                             " from:" + tool.fill(msgFromName, ' ', 12) +
                             " type:" + tool.fill(msgType, ' ', 6) + " data:" +
                             msgData)

                    flag = 0  #不回复
                    if (msgType == 'message' or msgType == 'me'):  #普通聊天消息
                        if (re.search('@' + self.name + " ", msgData) !=
                                None):  #有@自己 且权重不太低
                            msgData = re.sub('@' + self.name + " ", "",
                                             msgData)  #摘除@自己
                            ran = tool.getRandom(0, 100)
                            if (ran < self.status):
                                flag = 1
                            else:
                                self.out("@me 随机数=" + str(ran) + " 小于 说话欲望=" +
                                         str(self.status) + " ")
                                flag = 2
                                msg = "生气程度:" + str(
                                    100 - self.status) + "%,不想搭理" + self.tail
                        elif (ran > weight and re.search('@', msgData)
                              == None):  # 没有@ 且 权重高 主动搭话概率
                            flag = 1
                    else:  #事件
                        flag = 2

                    res = ""
                    if (self.filterFlag(msgData, msgFromName)):  #最高级 权限是否黑名单过滤
                        if (flag == 1):
                            if (self.robot.getUser(msgFromName).get(
                                    "flag", "0") != "0"):
                                self.out("不想搭理" + msgFromName)
                            else:
                                if (self.filterCmd(
                                        msgData,
                                        msgFromName)):  #若过滤器未处理 则继续交由下面处理
                                    robotRes = self.robot.do(
                                        msgData, self.name)
                                    code = str(robotRes.get("code", ""))
                                    if (code[0:1] != '4'):
                                        res = '@' + str(
                                            msgFromName) + " " + robotRes.get(
                                                "text", "")
                                    else:
                                        self.out("robot接口调用失败 code=" + code)
                        elif (flag == 2):
                            res = msg

                        if (res != "" and flag != 0
                                and onceDocount < 6):  # 最多一次抓取发送3个
                            res = '/me ' + res
                            onceDocount = onceDocount + 1
                            self.send(res)

        except Exception as e:
            self.out("Exception:" + str(e))
        # tool.line()
        return res

    # /do help   指令控制行为
    def filterCmd(self, msgData="", fromName=""):
        res = True
        msgData = msgData.strip()
        flag = False
        size = len(msgData)

        pr = ['放音乐', '播放音乐', '放歌', '开启放歌']
        if (not flag):
            for item in pr:
                if (msgData == item):
                    msgData = ""
                    self.music("on")
                    flag = True
                    break
        pr = ['不要放音乐', '停止放歌', '停止音乐', '别放歌', '关闭放歌', '关闭音乐', '别放了']
        if (not flag):
            for item in pr:
                if (msgData == item):
                    msgData = ""
                    self.music("off")
                    flag = True
                    break
        pr = ['prev', '上一曲', '上一首', '换回去']
        if (not flag):
            for item in pr:
                if (msgData == item):
                    msgData = ""
                    self.musicPlayType = -1
                    flag = True
                    break
        nnn = [
            '下一曲', '下一首', '切歌', '换', '换歌', '不好听', '难听', '难听死了', '换换换', '换一首',
            'next', 'turn'
        ]
        if (not flag):
            for item in nnn:
                if (msgData == item):
                    msgData = ""
                    flag = True
                    break
        ppp = [
            '点歌', 'music', '歌曲', '点播', '下面播放', '想听', '播放', '放', 'play', 'mp3'
        ]
        if (not flag):
            for item in ppp:
                itemLen = len(item)
                index = msgData.find(item)
                if (index == 0):  #头命中
                    msgData = msgData[itemLen:9999].strip()
                    flag = True
                    break
                elif (index > 0 and index == size - itemLen):  # 尾命中
                    msgData = msgData[0:size - itemLen].strip()
                    flag = True
                    break
        ooo = [
            ('一首', '献给大家'),
            ('一首', '送给大家'),
            ('点', '这首歌'),
        ]
        if (not flag):
            for before, after in ooo:
                index = msgData.find(before)
                if (index == 0):
                    index1 = msgData.find(after)
                    if (index1 + len(after) == size):
                        flag = True
                        msgData = msgData[len(before):index1].strip()
                        break
        if (flag):  #抽离点歌 名字
            self.out('filterCmd.' + str(flag) + "." + msgData)
            res = False
            self.playMusic(url="", name=msgData, fromName=fromName)
        elif (re.search('/do ', msgData) != None):
            res = False
            cmd = msgData[4:9999]
            cmd = cmd.strip()
            cmds = cmd.split(' ')
            if (len(cmds) > 0 and cmds[0] == ""):
                cmds.pop(0)

            if (not self.doMethod(cmds)):
                self.send("/me ########## @" + self.name +
                          " /do music <on/off/turn/prev/next> ########")

        return res

    # [methodName arg1 arg2]
    def filterFlag(self, msgData="", fromName=""):
        res = True
        msgData = msgData.strip()
        flag = False
        size = len(msgData)
        msg = ""
        keys = ["别说话", "你别说话", "闭嘴", "shutup"]
        statusOn = ['笨蛋', '傻逼', 'sb', 'SB', 'Sb', 'sB', '傻b', '傻']
        statusOff = [
            '开心一点', '开心点', '我错了', '求你了', '后悔', '收回', '我收回', '对不起', '悔恨', '不要生气'
        ]

        if (not flag):
            for item in statusOff:
                if (msgData == item):
                    self.robot.turnUser(fromName, "0")
                    self.status = self.status + self.statusOnDeta
                    if (self.status >= self.statusMax + self.statusOnDeta):
                        msg = self.name + "现在没有生气(╯▔皿▔)╯"
                    elif (self.status >= self.statusDefault):
                        msg = self.name + "心情好转了 不生气了﹏"
                    else:
                        msg = self.name + "气消了一点点,生气值-" + str(
                            self.statusOnDeta) + self.tail
                    flag = True
                    break
        if (self.robot.getUser(fromName).get("flag", "0") != "0"):  #限制黑名单只接受道歉
            res = True
            self.out("黑名单只接受道歉 不想搭理" + fromName)
            return res

        if (not flag):
            for item in keys:
                if (msgData == item):
                    self.status = self.status - self.statusDownDeta
                    msg = "好的" + ",生气值陡升" + str(
                        self.statusDownDeta) + ",当前" + str(100 -
                                                           self.status) + "% "
                    flag = True
                    break
        if (not flag):
            for item in statusOn:
                if (msgData == item):
                    self.robot.turnUser(fromName, "1")
                    self.status = self.status - self.statusOffDeta
                    if (self.status <= self.statusMin - self.statusOffDeta):
                        msg = self.name + "已经气死了 没这号robot 😕"
                    elif (self.status <= self.statusMin):
                        msg = self.name + "已经气炸了 不想再说话了 ε=( o`ω′)ノ "
                    else:
                        msg = self.name + "生气值暴涨" + str(
                            self.statusOffDeta
                        ) + ",不想再搭理" + fromName + "了" + self.tail
                    flag = True
                    break

        if (flag):  #状态控制
            self.out('filterFlag.' + str(flag) + "." + msgData)
            res = False
            self.send("/me " + msg)
        return res

    def doMethod(self, listArgs):
        size = len(listArgs)
        res = False
        if (size > 0):
            if (hasattr(self, listArgs[0])):
                method = getattr(self, listArgs[0])  #获取的是个对象
                if (callable(method)):
                    if (size == 2):
                        method(listArgs[1])
                    elif (size == 3):
                        method(listArgs[1], listArgs[2])
                    elif (size == 4):
                        method(listArgs[1], listArgs[2], listArgs[3])
                    elif (size == 5):
                        method(listArgs[1], listArgs[2], listArgs[3],
                               listArgs[4])
                    else:
                        method()
                    res = True
                else:
                    self.out(method)
        return res

    def test(self):
        self.login()
        self.getRooms()
        # self.goRoom("YfdWkQ1lEs")
        self.goRoomName("上帝")
        ThreadRun("DoSend." + str(self.count), self.doHello).start()
        ThreadRun("SayHello." + str(self.count), self.sayHello).start()
        ThreadRun("GetHello." + str(self.count), self.getHello).start()
        ThreadRun("InputHello." + str(self.count), self.inputHello).start()

        tool.wait()
        return

    def test2(self):
        self.login()
        self.getRooms()
        self.createRoom()
        # self.goRoom("YfdWkQ1lEs")
        # self.goRoomName("上帝")
        ThreadRun("DoSend." + str(self.count), self.doHello).start()
        ThreadRun("SayHello." + str(self.count), self.sayHello).start()
        ThreadRun("GetHello." + str(self.count), self.getHello).start()
        ThreadRun("InputHello." + str(self.count), self.inputHello).start()

        tool.wait()
Example #34
0
class Auto:
    def __init__(self, name="Test"):
        self.name = name

        self.http = Http()
        self.db = Database()
        self.db.execute(''' 
            create table if not exists auto(
                url         text,
                about        text,
                time        text,
                v1       text,
                v2       text,
                v3       text,
                v4       text,
                v5       text
            )
            ''')

        return

    # 日志输出
    def out(self, obj):
        print(
            time.strftime("%Y%m%d %H:%M:%S", time.localtime()) + "." +
            self.__module__ + self.name + "." + str(obj))
        # tools.out(obj)
        return

    # 实时控制帮助
    def help(self):
        self.out(dir(self))
        return

    # doMethod([methodName arg1 arg2]) -> methodName(arg1,arg2)
    def doMethod(self, listArgs):
        size = len(listArgs)
        res = None
        if (size > 0):
            if (hasattr(self, listArgs[0])):
                method = getattr(self, listArgs[0])
                if (callable(method)):
                    if (size == 2):
                        res = method(listArgs[1])
                    elif (size == 3):
                        res = method(listArgs[1], listArgs[2])
                    elif (size == 4):
                        res = method(listArgs[1], listArgs[2], listArgs[3])
                    elif (size == 5):
                        res = method(listArgs[1], listArgs[2], listArgs[3],
                                     listArgs[4])
                    else:
                        res = method()
                else:
                    self.out(method)
        return res

    # 手动命令监控
    def inputHello(self):
        self.out("开启输入监控!")
        self.help()
        while (True):
            try:
                cmd = raw_input("")
                if (cmd != ""):
                    if (not self.doMethod(cmd.split(" "))):
                        self.doCmd(cmd)
                        time.sleep(1)
            except Exception as e:
                self.out(repr(e))
        return

    # 测试用
    def test(self):
        self.login()
        # 输入监控线程
        ThreadRun("InputHello." + str(self.name), self.inputHello).start()

        tool.wait()
        return

    # 非函数调用 属性变量查看 其他的指令控制
    def doCmd(self, cmd):
        self.out("其他指令." + str(cmd))

        return

    # 认证登录
    def login(self):
        self.out("访问主页 获取 token session")
        responce = self.http.doGet('http://drrr.com/')
        re = responce.read()
        soup = BeautifulSoup.BeautifulSoup(re)
        nameList = soup.findAll('input', {'name': {'token'}})
        if (len(nameList) > 0):
            token = nameList[0]['data-value']
            token = tool.encode(token)
            self.out("抓取成功: ")
            self.out("token\t " + token)
            self.out("cookie\t " + tool.toString(self.http.getCookie()))
            self.out("模拟登录")
            responce = self.http.doPost(
                'http://drrr.com/', {
                    "name": name,
                    "login": "******",
                    "token": token,
                    "direct-join": "",
                    "language": "zh-CN",
                    "icon": icon,
                })
            if (responce != "error"):
                return True
            else:
                return False
        else:
            self.out("error! 没能抓取到token")
        return False
Example #35
0
# coding:utf-8
from http import Http
from chrome import Chrome

key = Http.get_key_new()
print key

if key == '':
    print "验证码错误"
else:
    print key

chrome = Chrome(key)
chrome.open_web_up()
input("wait....")
Example #36
0
class AutoCochat:
    def __init__(self, name="Test", id="18408249138", pwd="1234qwer"):
        reload(sys)
        sys.setdefaultencoding('utf8') #针对socket发送中文异常
        self.detaTime = 3600 * 1000 #推送延时 60min
        self.detaTimeMin = 1200 * 1000 #推送延时 20min

        self.id = id
        self.pwd = pwd
        self.name = name
        self.robot = Robot()
        self.http = Http()
        self.db = Database('sqlite_' + self.id + '.db')
        self.socket = Socket()
        self.onConnect = False
        self.ifOk = False
        # sendTime添加时间, type消息类型, msg发送消息体, deta间隔发送时间, preTime预期发送时间节点
        self.db.execute(
            ''' 
            create table if not exists cochat(
                id  text,
                sendTime    text,
                sendTimeT text,
                deta    text,
                preTime text,
                preTimeT text,
                type        text,
                msg    text,
                flag    text
            )
            ''' )
        self.sendList = [] #发送队列 (time, deta, type, data)
        return
    # 日志输出
    def out(self, obj):
        print(time.strftime("%Y%m%d %H:%M:%S", time.localtime()) + "." + self.name + "." + str(obj))
        return
    # 实时控制帮助
    def help(self):
        self.out(dir(self))
        return
    # doMethod([methodName arg1 arg2]) -> methodName(arg1,arg2)
    def doMethod(self, listArgs):
        size = len(listArgs)
        res = None
        if(size > 0):
            if(hasattr(self, listArgs[0])):
                method = getattr(self, listArgs[0])
                if(callable(method)):
                    if(size == 2):
                        res = method(listArgs[1])
                    elif(size == 3):
                        res = method(listArgs[1], listArgs[2])
                    elif(size == 4):
                        res = method(listArgs[1], listArgs[2], listArgs[3])
                    elif(size == 5):
                        res = method(listArgs[1], listArgs[2], listArgs[3], listArgs[4])
                    else:
                        res = method()
                else:
                    self.out(method)
        return res
    # 手动命令监控
    def inputHello(self):
        self.out("开启输入监控!")
        self.help()
        while(True):
            try:
                cmd=raw_input("")
                if(cmd != ""):
                    if(not self.doMethod(cmd.split(" "))):
                        # self.out("exm???")
                        # self.out(cmd)
                        pass
                    time.sleep(1)
            except Exception as e:
                self.out(traceback.format_exc())
        return
    def send(self, ttt, data, deta=-1):
        if(deta == -1):
            deta = tools.getRandom(self.detaTime, self.detaTimeMin)
        sendTime = tool.getNowTime()
        preTime = sendTime + deta
        sendTimeT = tool.parseTime(sendTime/1000, "%D %H:%M:%S")
        preTimeT = tool.parseTime(preTime/1000, "%D %H:%M:%S")

        # self.sendList1.append((sendTime, deta, preTime, type, data))
        # sendTime添加时间, type消息类型, msg发送消息体, deta间隔发送时间, preTime预期发送时间节点
        self.db.execute("insert into cochat values(?,?,?,?,?,?,?,?,?)", str(self.id), str(sendTime),str(sendTimeT), str(deta), str(preTime),str(preTimeT), str(ttt), str(data),'0')

        return
    # 定时任务
    def timeSend(self):
        self.out("开启定时任务 发送队列!")
        self.nowNight = 0
        while(True):
            time.sleep(5) #每分钟扫描 只对非凌晨时间处理 延时一小时发送
            timeNow = tool.getNowTime()
            hour = tool.parseTime(timeNow/1000, "%H:%M")
            if(hour >= "23:30" or hour <= "07:20" or self.ifOk == False):
                if(self.nowNight != 1):
                    self.out("不是白天 或者 没有登录 now:" + str(hour) )
                self.nowNight = 1
                continue
            self.nowNight = 0
            try:
                # self.sendList1.append((sendTime, deta, preTime, type, data))
                self.sendList = self.db.executeQuery("select * from cochat where preTime<=? and flag=0 and id=?", timeNow, str(self.id) )
                i = len(self.sendList) - 1
                while(i >= 0):
                    obj = self.sendList[i]
                    sendTime = int(obj.get("sendTime", 0))
                    deta = int(obj.get("deta", 0))
                    preTime = int(obj.get("preTime", 0))
                    type = str(obj.get("type", ""))
                    data = ast.literal_eval((str(obj.get("msg", ""))))
                    info = ""
                    hour = tool.parseTime(preTime/1000, "%D %H:%M:%S")
                    info = str(timeNow) + "->" + str(preTime) + " 推送时刻:" + str(hour)
                    if(timeNow >= preTime):
                        info += " 触发"
                        self.sendTrue(type, data)
                        # self.sendList.pop(i)
                    else:
                        info += " "
                    self.out(tool.parseTime(timeNow/1000, "%D %H:%M:%S") + "." + str(type) + "." + str(data) + "." + info)
                    i = i - 1
                self.db.execute("update cochat set flag='1' where preTime<=? and flag=0 and id=? ", timeNow, str(self.id))
            except Exception as e:
                self.out(traceback.format_exc())
        return

    # 定时任务
    def timeHello(self):
        self.out("开启定时任务!")
        self.help()
        while(True):
            time.sleep(3600 * 3)
            try:
                self.out("定时重新连接")
                self.login()
            except Exception as e:
                self.out(repr(e))
        return
    # 测试用
    def test(self):
        self.login()
        ThreadRun( "TimeHello." + str(self.name),  self.timeHello ).start()
        # ThreadRun( "TimeCtrl." + str(self.name),  self.inputHello ).start()
        ThreadRun( "TimeSend." + str(self.name),  self.timeSend ).start()
        self.socket.waitRead(self.onException)    #异常回调
        tool.wait()
        return
    # 监控执行
    def doCmd(self, cmd):
        self.send({"data":cmd})
        return
    def login(self):
        i = 0
        while(self.ifOk == False or i <= 0):
            try:
                self.whileLogin()
                i = i + 1
            except Exception as e:
                self.out(traceback.format_exc())
                self.out("登录异常,5s后重试 try:" + str(i))
            time.sleep(5)
        return

    # 认证登录
    def whileLogin(self):
        self.ifOk = False
        if(self.onConnect):
            self.out("已经在尝试登录")
            return
        self.socket.close()
        self.onConnect = True
        self.out("尝试登录:")
# {CONF_V   ARS: "*", ORG_VARS: true, logintype: "mobile", id: "18408249138", password: "******"}
# Request URL:http://picc.cochat.cn/SY_ORG_LOGIN.login.do?DESKTOP_OS=Win10&USER_LAST_BROWSER=Win32&USER_LAST_CLIENT=2.5.1&USER_LAST_OS=DESKTOP&USER_LAST_PCNAME=%7B%7D
# request Cookie:JSESSIONID=abcb0skaQYCGs6lvy9orw
        obj = self.http.doJson("http://picc.cochat.cn/SY_ORG_LOGIN.login.do?DESKTOP_OS=Win10&USER_LAST_BROWSER=Win32&USER_LAST_CLIENT=2.5.1&USER_LAST_OS=DESKTOP&USER_LAST_PCNAME=%7B%7D",{
            "CONF_VARS":"*",
            "ORG_VARS":"true",
            "logintype":"mobile",
            "id":self.id,
            "password":self.pwd
        })
        if(obj.get("error","") != ""):
            self.onConnect = False
            return
        self.loginUser = obj
        token = obj.get("USER_TOKEN", "")
        self.out("登录结果 token:" + token)
        urlWithPort = obj.get("CONF_VARS", {}).get("@C_SY_COMM_SOCKET_SERV_V1.0@", "http://cochat.cn:9091")
        uus = urlWithPort.split(':')
        port = int(uus[2])
        url = uus[1][2:999] #cochat.cn 不需要ws http 只需要ip 域名

        self.socketServerUrl = urlWithPort
        self.socketUrl = url
        self.socketPort = port
        self.showUser()

        self.config = {
            "transports":['websocket', 'polling'],  # websocket优先
            "timeout":5 * 1000, # 超时时间
            "forceNew": True,
            "reconnection" : False
        };
        self.out("socket开始")
        self.socket.connect(url,port) # , params=self.config)
        self.out("socket连接完成,开始初始化事件")

        socketMsgTypes = ("connect", "disconnect","error","connect_error","connect_timeout","connecting","reconnecting","message", "event")
        # socketMsgTypes = ("connect", "disconnect","message", "event")
        for item in socketMsgTypes:
            if(hasattr(self, item)):
                method = getattr(self, item)
                if(callable(method)):
                    self.socket.on(item, method)
                else:
                    self.out("变量而非方法" + item + "回调?")
            else:
                self.out("属性" + item + "不存在,是否写错了名字?")
        # self.socket.on("message", self.message)

        self.out("socket初始化事件完成,开始发送认证")
        self.data = {
            "userName":obj.get("USER_CODE", ""),
            "displayName": tool.encode(obj.get("ORG_VARS", {}).get("@USER_NAME@", "") ), #"ccc",#
            "odept":obj.get("ORG_VARS", {}).get("@ODEPT_CODE@", ""),
            "token":obj.get("USER_TOKEN", ""),
            "uuid":"" + str(uuid.uuid1()),
            "version":obj.get("USER_CODE", "") + "_LAST_MSG"
        }
        self.out(self.data)
        self.socket.emit('loginv17', self.data, self.onSocketLogin)
        self.out("已发送认证信息")
        self.ifOk = True
        self.onConnect = False
        return
    def connect(self, *args):
        print("connect")
        print(args)
        # self.login()
        return
    def disconnect(self, *args):
        print("disconnect")
        print(args)
        self.login()
        return
    def error(self, *args):
        print("error")
        print(args)
        self.login()
        return
    def connect_error(self, *args):
        print("connect_error")
        print(args)
        return
    def connect_timeout(self, *args):
        print("connect_timeout")
        print(args)
        return
    def connecting(self, *args):
        print("connecting")
        print(args)
        return
    def reconnect(self, *args):
        print("reconnect")
        print(args)
        return
    def reconnecting(self, *args):
        print("reconnecting")
        print(args)
        return
    def onException(self, *args):
        tool.line()
        self.out("onexception")
        print(args)
    def turnArray(self, args):
        if(len(args) == 1):
            args = args[0]
            reg = re.match(r'^\d+', args)         #25[xxxx] -> [xxxxx]
            if(reg is not None):
                start = reg.group()
                args = args[len(start):999999]
            # reg = re.match(r'^\["\w+",', args)         #["message",  {"to":{"id":" ->  {"to":xxxx
            # if(reg is not None):
            #     start = reg.group()
            #     args = args[len(start):999999]
            #     mtype = start[2:-2]
            res = tool.toJson(args)
        else:
            res = list(args)
            if(len(res) <= 1):
                res = ( 'null', res[0])
            elif(callable(res[1])):
                res = ( 'fun', res[0])

        return res
    def message(self, *args): # 普通消息
        try:
            # print("收到message ")
            # print(args)
            # tool.line()
            # print("转换")
            args = self.turnArray(args)
            # print(args[0])
            # print(args[1])
            if(len(args) <= 1):
                return

            data = args[1] #{}
            mtype = args[0] #message null fun
            if(mtype == 'message'):
                data = tool.toJson(data)
                fro = data.get("from", {})
                to = data.get("to", {})
                contact = data.get("contact", {})
                msg = data.get("body")
                fullId = contact.get("fullId")
                sessionName = contact.get("nickName", "")

                uid = self.data.get("uuid")
                tTag = data.get("timeMillis", tool.getNowTime())
                tool.line()
                self.out("Msg:" + fro.get("nickName","from") + ">>" + msg + ">>" + to.get("nickName","to") + " time:" + data.get("time"))
                # self.out(msg);

                # 自发消息不需要处理
                if(fro.get("nickName","from").find(self.loginUser.get("ORG_VARS", {}).get("@USER_NAME@", "")) >= 0):
                    return

                ttt = self.detaTime
                reg = re.match(r'^\d+$', str(msg))
                if(reg is not None):
                    ttt = int(msg) * 1000


                self.send("updateConversationStatus", {
                    'contactFullId': fullId,
                    'clientId': uid,
                    'timeTag': tTag
                }, ttt)
                self.send("updateMsgStatus", {
                    "messages":data.get("id","")
                }, ttt)


                # 自发言 且 只有自己auto回复
                if(self.id != "18408249138"):
                    return
                # 过滤
                ff = sessionName.find("陈鹏辉")
                hh = fro.get("nickName","from").find("许欢")
                zz = fro.get("nickName","from").find("赵振国")
                cdf = fro.get("nickName","from").find("迪")
                d1 = sessionName.find("迪")
                d2 = sessionName.find("祝")
                d3 = sessionName.find("纯")
                if(ff < 0 or d1 >= 0 or d2 >= 0 or d3 >= 0):
                    self.out("未命中自己title 命中特殊 不回复")
                    return
                point = 76
                if(hh >= 0 or zz >= 0):
                    point = 33
                    self.sendTrue("updateMsgStatus", {
                        "messages":data.get("id","")
                    })
                if(tool.getRandom(0,100) < point):
                    self.out("概率不自动回复" + str(point))
                    return

                # data["body"] = str(data["body"]) + "."
                # self.send("message", data)

                obj = {}
                # if(contact.get("type") == "GROUP"):
                # unicode(self.robot.do(msg, fro.get("nickName")))
                msg = self.robot.do(msg, fro.get("nickName"))
                msg = msg.get("text", '');
                if(msg == ''):
                    return
                obj["body"] = msg #"666" + str(tool.getNowTime())
                obj["bodyType"] = "text"
                obj["clientId"] = str(uuid.uuid1())
                obj["retry"] = 1
                obj["from"] = {}
                obj["from"]["fullId"] = "u__" + self.data.get("userName")
                obj["from"]["id"] = self.data.get("userName")
                obj["from"]["nickName"] = "fromnickname"
                obj["to"] = {}

                if(contact.get("type") == "GROUP"):
                    obj["to"]["fullId"] = contact.get("fullId")
                else:
                    obj["to"]["fullId"] = fro.get("fullId")
                obj["to"]["nickName"] = "tonickname"

                obj["from"]["nickName"] = self.loginUser["ORG_VARS"]["@USER_NAME@"]   # "from-nickName"
                obj["to"]["nickName"] = "to-nickName"

                self.sendTrue("message", obj)
            elif(str(mtype) == 'fun'):
                pass
            elif(str(mtype) == 'event'):
                pass
            else:
                self.out("其他:" + str(mtype))
                print(data)
                # print(args)
                # tool.line()
        except Exception as e:
            self.out(traceback.format_exc())

        return

    def event(self, *args): # 事件消息 群创建?
        print("event")
        print(args)
        return
    def onSocketLogin(self, *data):
        self.out("socket登录回调:")
        print(data)
        return


    def sendTrue(self, type, data):
        self.socket.send(type, data)
        return


    def showUser(self):
        tool.line()
        obj = self.loginUser
        user = obj.get("ORG_VARS", {})
        self.out(user.get("@USER_NAME@", ""))
        self.out(user.get("@USER_POST@", ""))
        self.out(user.get("@LOGIN_NAME@", ""))
        self.out("USER_CODE:" + obj.get("USER_CODE", ""))
        self.out("USER_TOKEN:" + user.get("UESR_TOKEN", ""))
        self.out("socketServerUrl:" + self.socketServerUrl)
        self.out("to url:" + self.socketUrl)
        self.out("to port:" + str(self.socketPort))

        tool.line()
        return
Example #37
0
 def get_ip(self):
     response = Http.get("http://ip.6655.com/ip.aspx")
     return response.text
Example #38
0
 def __init__(self,option={}):
     self.__http=Http(option)
     self.__tools=Tools()
Example #39
0
class Server:
    __http=()
    __requestHeader={}
    __tools=()
    def __init__(self,option={}):
        self.__http=Http(option)
        self.__tools=Tools()

    def run(self):

        while True:
            self.__http.request()
            self.dealRequest()
            res=self.dealResponse()
            self.__http.response(option=res['option'],content=res['content'])
            self.__http.close()

    def dealRequest(self):
        self.__requestHeader={}
        buf=self.__http.getBuf().splitlines()
        new_buf = [b.split(':',1) for b in buf]
        # print buf
        if len(new_buf)<=0:
            self.__requestHeader['resources']='404'
            return False

        header=new_buf[0][0].split(' ')
        new_buf.pop(0)

        self.__requestHeader['method']=header[0]
        self.__requestHeader['resources']=header[1].split('?')[0]
        if '?' in header[1]:
            self.__requestHeader['param']=header[1].split('?')[1]

        self.__requestHeader['protocol']=header[2]
        for b in new_buf:
            if  b[0].strip(' ') != '':
                self.__requestHeader[b[0].strip(' ').replace('-','_').lower()]=b[1].strip(' ')
        # print self.__requestHeader
        return new_buf

    def dealResponse(self):
        root='E:/users/huajie/documents/python/http/lightSnake/htdocs'
        defaultFile='index.html'
        path=root+self.__requestHeader['resources']
        if self.__requestHeader['resources'].strip('/')=='':
            path=path.strip('/')+'/'+defaultFile
        # print path
        defaultOption= copy.deepcopy(self.__http.getResponseOption())
        data={'option':defaultOption,'content':' '}
        print data
        # <h1>Hello World</h1>
        # (fileExtension,name)=mimetypes.guess_extension(path)
        (responseType,name)=mimetypes.guess_type(path)
        print os.path.exists(path)
        if os.path.exists(path):
            if 'text/' in responseType:
                file = open(path)
            else:
                file = open(path,'rb')
            try:
                fileText = file.read()
                data['content']= fileText
                data['option']['responseType']=responseType
                data['charset']=''
                # file.close()
            except IOError:
                print IOError.message
            finally:
                file.close()
            print "if"
        else:
            print "else"
            data['option']['status']='404 Not Found'

        return data

    def getFileType(self,fileName):
        return os.path.splitext(fileName)
Example #40
0
class AutoSophia:
    def __init__(self, name="0000000",flowName="", count = 0, makeRooms=[]):
        self.robot = Robot()
        self.http = Http()
        self.name = name
        self.flowName = flowName
        self.count = count   #编号

        self.listMsgQue = []    #消息发送队列
        self.timeDetaMsgSend = 1.5    #最小发送消息间隔s
        self.makeRooms = makeRooms
        self.userIndex = {} # 用户name -> 用户id
        self.userIndexRe = {} #id -> name
        self.roomIndex = {} #房间号 及其<用户>信息
        self.roomMsg = {}   #消息 记录
        self.roomId = ""  #当前房号
        self.ifWelcom = False #是否迎客
        self.ifTime = False #是否存货确认
        self.admins = {}
        self.tripcodeIndex = {} #上次房间记录 的 用户名 绑定的 tc code
        self.linkStart = 0 #链接状态

        self.init()
        self.tail = " の... "
    def init(self):
        ############### 心情模块
        self.statusMin = 5
        self.statusMax = 95
        self.statusDefault = 80
        self.status = 10     #说话欲望值 0-100
        self.statusOnDeta = 15      #开心
        self.statusOffDeta = 15     #难过
        self.statusDownDeta = 40    #闭嘴
        self.lastOtherSay = tool.getNowTime()   #上次其他人说话时间

        self.getMsgDetaTime = 1     #抓取消息间隔
        self.lastMsgTime = int(time.time() * 10000 ) * 1.0 / 10000  #上一次更新房间聊天记录时间
        self.lastEchoTime = tool.getNowTime()   #上次说话时间
        self.lastEchoTimeQuene = tool.getNowTime()

        self.maxDetaOtherSay = 1000 * 60 * 15 #最大没人说话时间 换房
        self.maxDetaTime = 1000 * 60 * 5   # 最大沉默时间
        self.lastMusicTime = tool.getNowTime() #上次放歌时间
        self.maxMusicTime = 1000 * 60 * 4 #音乐间隔 暂不解析音乐文件时长控制
        self.maxMusicTimeDefault = 1000 * 60 * 4 #默认时间
        self.musicNow = {}
        self.nextNames = [] #下一首序列
        self.musicPlayType = -1
        self.ifOnMusic = False
        self.notWait = True

        self.adminRes = ""
        self.adminDeta = 2
        self.adminDetaDefault = 2

        self.toIdNow = "" #当前处理消息
        self.toNameNow = "" #当前处理消息
        self.fromIdNow = "" #当前处理消息
        self.fromNameNow = "" #当前处理消息

    def out(self, obj):
        print(time.strftime("%Y%m%d %H:%M:%S", time.localtime()) + "." + self.name + "." + str(obj))
        return
    def login(self):
        # tool.line()
        self.out("访问主页 获取 token session")
        responce = self.http.doGet('http://drrr.com/')
        re = responce.read()
        soup =BeautifulSoup.BeautifulSoup(re)
        # self.out soup.prettify()
        nameList = soup.findAll('input',{'name':{'token'}})
        if(len(nameList) > 0):
            token = nameList[0]['data-value']
            token = tool.encode(token)
            self.out("抓取成功: ")
            self.out("token\t " + token)
            self.out("cookie\t " + tool.toString(self.http.getCookie()))

            # tool.line()
            self.out("模拟登录")
            responce=self.http.doPost('http://drrr.com/', {
                        "name":self.name,
                        "login":"******",
                        "token":token,
                        "direct-join":"",
                        "language":"zh-CN",
                        "icon":"tanaka",
                })
        else:
            self.out("error! 没能抓取到token")

    def showHelp(self):

        self.send("@" + self.name + " \n  0.help \n  0.play/next name \n  0.play music/stop music \n  1.del/rm xxx  \n  2.host \n  <0.admin> ")

        self.help()
    def nobody(self):
        self.showHelp()
    def showAdmin(self):
        res = "#Admins:"
        items = sorted(self.admins.items(), cmp=lambda x,y: cmp(y[1], x[1])   )
        i = 0
        for key,value in items: # id value
            res = res + "\na" + str(i) + " " + str(self.userIndexRe.get(key)) + " " + str(value)
            i = i+1
        self.send("" + res)
    def addAdmin(self, fromId, value=0):
        if(self.admins.get(fromId, 0) > 2**31):
            self.send(self.name + "被玩坏了orz" + self.tail)
            self.admins = {}
            return
        if(value>0):
            self.adminDeta = value
        self.admins[fromId] = int(self.admins.get(fromId,0)) + int(self.adminDeta) #认证加权
        if(self.admins[fromId] <= 0):
            self.admins.pop(fromId)
        self.adminRes = ""
        self.adminDeta = self.adminDetaDefault
        # self.showAdmin()

    def getAdmin(self, name=""):
        level = self.admins.get(self.userIndex.get(name, ""), 0)
        # self.adminRes = 0
        # self.adminDeta = 2
        # self.adminDetaDefault = 2
        # <2   <4    <8  <16  <32
        #i:1    2    3    4   5
        # +2   +4    +8  +16  +32
        i = 1
        weight = 1
        while(True):
            weight = weight * self.adminDetaDefault # *= 2
            if(level < weight):
                break
            i = i + 1
        # level=0-2 -> i=1 weight=2
        res = ""
        ranres = ""
        for j in range(i):
            ran = tool.getRandom(1000, 9999) # 2843 = 287 = 35 = 8
            ans = ran
            while(ans >= 10):
                ans = ans % 10 + ans / 10
            res = res + str(ans)
            ranres = ranres + str(ran) + " "
        self.adminRes = res
        self.adminDeta = weight
        # self.showAdmin()
        self.send("#Admin认证 lv." + str(i) + "\nF(" + str(ranres) + ") = ? "  )
    #管理员权限认证 10次
    def ifAdminName(self, name="", lev=0, ifRedu=True):
        return self.ifAdmin(self.userIndex.get(name, ""), lev, ifRedu)
    def ifAdmin(self, id="", lev=0, ifRedu=True):
        if(self.admins.get(id, 0) > 2**lev-1):
            if(ifRedu):
                self.admins[id] = self.admins[id] * 2 / 3 # 每次认证消减1/3生命值
            if(self.admins[id] <= 0):
                self.admins.pop(id)
            return True
        return False
    def host(self, name=""):
        # new_host:5a1da324d5e68e6712725a50046f4b75
        name = str(name)
        if(name == ""):
            return

        self.getRooms() # 刷新最新房间信息
        if(not self.ifHost):
            self.send("不是房主,没有权限")
            return

        userId = self.userIndex.get(name, "")
        if(self.ifAdmin(userId) ):
            if(self.getRoomUser(name).get("name","") != ""):
                self.send("转移房主权限给[" + name + "] ")
                responce=self.http.doPost('http://drrr.com/room/?ajax=1', {
                    "new_host":userId
                })
            else:
                self.send("用户[" + name + "]不在当前房间")
        else:
            self.send("用户[" + name + "]未认证admin权限")
            self.getAdmin(name)

    def rm(self, name="", pwd=""):
        name = str(name)
        if(name == ""):
            return

        self.getRooms() # 刷新最新房间信息
        if(not self.ifHost):
            self.send("不是房主,没有权限")
            return

        userId = self.userIndex.get(name,"")
        if(self.ifAdmin(userId) ):
            self.send("禁止踢出admin")
        else:
            if(self.getRoomUser(name).get("name","") != ""):
                self.send("踢出[" + name + "]" ) # id:" + str(self.userIndex.get(name, "")) + " tripcode:" + str(item.get("tripcode", "")) + " device:" + str(item.get("device", ""))
                responce=self.http.doPost('http://drrr.com/room/?ajax=1', {
                    "kick":userId
                })
            else:
                self.send("用户[" + name + "]不在当前房间")
        return
    def help(self):
        self.out(dir(self))
    def showUser(self, user, show=True):
        userInfo ="U " + user.get("device", "")[0:4] +  " " + user.get("icon", "")[0:4] + " "  + user.get("name", "")[0:6] + "  " + user.get("id", "")[0:4] + " "+ user.get("tripcode", "")[0:4]
        if(show):
            self.out(userInfo)
        return userInfo
    def showRoom(self, roomId="", show=True, i=0):
        if(roomId == ""):
            roomId = self.roomId
        room = self.roomIndex.get(roomId, "")
        if(room == ""):
            self.getRooms()
        room = self.roomIndex.get(roomId, "")
        info = ""
        if(room != ""):
            info = ("##" + tool.fill(str(i), '#', 10) + "\n--G " + tool.fill(room["id"], ' ', 10) + " " + tool.fill(str(room["total"]) + "/" + str(room["limit"]), ' ', 7) + " " + room["name"][0:10]) + "\n"
            info = info + "music: " + str(room.get("music", False)) + " language:" + room.get("language","")+" game:"+ str(room.get("gameRoom", "")) +" adult:"+ str(room.get("adultRoom", ""))+"\n"  # " 静态房间: " + str(room.get("staticRoom", "")) + ""
            # info = info + " hiddenRoom: " + str(room.get("staticRoom", "")) + " 游戏房间: " + str(room.get("gameRoom", "")) + " 成人房间: " + str(room.get("adultRoom", "")) + "\n"
            info = info + "Host:" + room.get("host", {}).get("name", "") + "\n"
            info = info + "Users: " + "\n"
            for item in room.get("users", []):
                # print(item)
                info = info + "--" + self.showUser(item, False) + "\n"
        if(show):
            self.out(info)
        return info
    def showRoomList(self, roomId=""):
        if(roomId == ""):
            rooms = self.roomIndex.values()
            rooms = sorted(rooms, cmp=lambda y,x: cmp(x.get("total",0), y.get("total", 0)))
            i = 0
            res = "#Rooms list:"
            for room in rooms:
                i = i + 1 #+ "" + room["id"]
                res = res + "\n" + tool.fill(str(i)," ",2) + "." + tool.fill(str(room["total"]) + "/" + str(room["limit"]), ' ', 4)  + " " + room["name"][0:6] + " " + room["id"]
        else:
            room = self.roomIndex.get(roomId, "")
            if(room != ""):
                res = "" #Rooms info:
                res = res + "-G." + tool.fill(str(room["total"]) + "/" + str(room["limit"]), ' ', 4) + " " + room["name"][0:6] + " " + room["id"]
                res = res + "\n-Music: " + str(room.get("Music", False)) + " " + room.get("language","") # +" game:"+ str(room.get("gameRoom", "")) +" adult:"+ str(room.get("adultRoom", ""))  # " 静态房间: " + str(room.get("staticRoom", "")) + ""
                # info = info + " hiddenRoom: " + str(room.get("staticRoom", "")) + " 游戏房间: " + str(room.get("gameRoom", "")) + " 成人房间: " + str(room.get("adultRoom", "")) + "\n"
                res = res + "\n-Host:" + room.get("host", {}).get("name", "")
                # res = res + "\n  Users: " + "\n"
                i = 0
                for item in room.get("users", []):
                    res = res + "\n -" + self.showUser(item, False) #  item.get("name", "")[0:6]
                    i = i + 1
        self.send(res)
    def showAllRoom(self):
        if(self.roomIndex is None or self.roomIndex == "" or self.roomIndex == {}):
            self.getRooms()
        tool.line()
        self.out("展示所有房间信息")
        i = 0
        for key in self.roomIndex:
            # room = self.roomIndex[key]
            self.showRoom(key, True, i)
            i = i+1
        tool.line()
    # 获取当前房间人员列表
    def getRoomUsers(self, roomId=""):
        if(roomId == ""):
            roomId = self.roomId
        room = self.roomIndex.get(roomId, {})
        users = room.get("users", [])
        return users
    # 按照名字获取当前房间用户
    def getRoomUser(self, name=""):
        users = self.getRoomUsers()
        for user in users:
            if(user.get("name", "") == name):
                return user
        return {}
    # 获取用户所在房间
    def getUserRoom(self, userName="******", userId="8f1b61e25098b0427f01d724716b70cb"):
        i=0
        res = []
        for key in self.roomIndex:
            room = self.roomIndex[key]
            users = room.get("users", [])
            for user in users:
                if(user.get("name", "") == userName):
                    # self.showRoom(key, True, i)
                    res.append(room)
                if(user.get("id", "") == userId):
                    self.showRoom(key, True, i)
            i = i+1
        if(len(res) <= 0):
            self.out("用户不在线"+userName)
        if(len(res) >= 2):
            self.out("该用户多次出现?????")
            for item in res:
                self.out(item)
            tool.line()
        return res
    def goRoomName(self, roomName):
        if(self.roomIndex is None or self.roomIndex == "" or self.roomIndex == {}):
            self.getRooms()
        tool.line()
        self.out("查找房间名字加入" + roomName)
        i = 0
        for key in self.roomIndex:
            room = self.roomIndex[key]
            name = room.get("name", "")
            if(re.search(roomName, name) != None):
                self.goRoom(key)
                break
            i = i+1
        tool.line()

    def  goRoom(self, roomId):
        if(self.roomId == roomId):
            self.out("已经处于当前房间")
            return
        if(self.roomId != ""):
            self.outRoom()
            time.sleep(10)
        # tool.line()
        self.out("加入房间:" + roomId)
        # self.showRoom(roomId)
        responce=self.http.doGet("http://drrr.com/room/?id=" + roomId)
        if(responce != "error"):
            self.roomId = roomId
            self.init()
            # self.send("大家好 我是暖手宝" + self.name + " 可以@ [点歌/turn/prev](*^_^*) @不一定会回 不@也不一定不会回(∩_∩) ")
            self.initRoom()
        return
    def initRoom(self, roomId=""):
        if(roomId == ""):
            roomId = self.roomId
        room = self.roomIndex.get(roomId, "")
        if(room != ""):
            for item in room.get("users", []):
                # print(item)
                id = item.get("id", "")
                if(id != ""):
                    self.userIndex[item.get("name", "")] = item.get("id", "")
                    self.userIndexRe[item.get("id")] = item.get("name", "")
                self.tripcodeIndex[item.get("name", "")] = item.get("tripcode", "")
        # self.out(str(self.tripcodeIndex))
    def outRoom(self):
        self.out("离开房间:" + self.roomId)
        # self.send("" + self.name + "好无聊啊 "+self.name +"要出去溜达一会儿" + self.tail)
        # self.send(""+self.name+"一定会回来的" + self.tail)
        # self.send("出去一下,马上回来" + self.tail)
        self.showRoom(self.roomId)
        time.sleep(self.timeDetaMsgSend *  len(self.listMsgQue) + 1)  #等待一会儿消息发送
        responce=self.http.doPost("http://drrr.com/room/?ajax=1", {
                        "leave":"leave", 
                })
        if(responce == "error"):
            return False
        self.roomId = ""
        time.sleep(1)
        return True
    def createRoom(self, room=""):
        # tool.line()
        self.out("创建房间")
        if(room == ""):
            room = {}
            room["name"] = self.name + "'s room"
        responce=self.http.doPost("http://drrr.com/create_room/?", {
            "name":room.get("name",""),
            "description":room.get("description",""),
            "limit":room.get("limit",10),
            "music":room.get("music",True),
            "submit":room.get("music","创建房间"),
        })
        if(responce == "error"):
            return False
        self.roomId = ""
        time.sleep(1)

    def getRooms(self, detail=False):
        tool.line()
        self.out("获取房间列表")
        responce=self.http.doGet("http://drrr.com/lounge?api=json")
        jsonObj = tool.makeObj(json.loads(responce.read()))
        rooms = jsonObj["rooms"]
        makeRooms = []
        if(len(rooms) > 0):
            self.roomIndex.clear()
            i = 0
            count = 0
            userCount = 0
            for room in rooms:
                id = room.get("id","")
                if(room.get("language","") == "zh-CN"):
                    # root.showRoom(id, show=True, i=i)
                    makeRooms.append(room)
                    self.roomIndex[room["id"]] = room
                    count = count + 1
                    userCount = userCount + int(room.get("total", 0))
                    self.out("#" + tool.fill(str(i),' ',4) + "" + room["id"] + " " + str(room["total"]) + "/" + str(room["limit"]) + "\t " + room["name"])

                    # for item in room.get("users", []):
                    #     if(item.get("id", "") != ""):
                    #         self.userIndex[item.get("name", "")] = item.get("id", "")
                    #         self.userIndexRe[item.get("id")] = item.get("name", "")

            i = i + 1

            self.out("共计房间" + tool.fill(str(count), ' ', 5) + " 用户" + tool.fill(str(userCount), ' ', 5) )
        self.out("解析完毕")
        roomId = self.roomId
        room = self.roomIndex.get(roomId, {})
        if(room.get("host", {}).get("name", "") == self.name):
            self.ifHost = True
        else:
            self.ifHost = False

        self.initRoom()
        return makeRooms

    # 太久没人发言 时 退出 并 进入一个新的 活跃的房间
    def goARoom(self):
        # self.out("#" + str(i) + "\t" + room["id"] + " " + str(room["total"]) + "/" + str(room["limit"]) + "\t " + room["name"])
        lastRoomId = self.roomId
        nowRoom = self.roomIndex.get(self.roomId, {})
        if(nowRoom.get("total", 0) > 1): #当前房间人数 还有其他人
            # self.send(self.name + "也无法忍受这样的寂静了 债见了各位" + self.tail)
            pass
        if(self.roomId != ""):
            self.outRoom()

        self.getRooms()
        self.out("选择最活跃房间")
        i = 0
        maxNum = 0
        maxKey = ""
        for key in self.roomIndex:
            exist = True
            room = self.roomIndex[key]
            total = room.get("total", 0)
            limit = room.get("limit", 0)
            music = room.get("music", False)
            for item in room.get("users", []):
                if(item.get("name", "") == self.name):
                    tool.line()
                    self.out("异常! 该房间存在同名用户 无法加入 ")
                    self.showRoom(room.get("id", ""))
                    exist = False
                    break
                if(item.get("name", "") == self.flowName): #跟随
                    self.out("跟随触发 增大权重选中")
                    maxNum = 99 + int(total)
                    maxKey = key
            i = i+1
        if(maxKey != ""):
            self.out("选中房间:")
            self.showRoom(maxKey)
            tool.line()
            self.goRoom(maxKey)
        else:
            tool.line()
            self.out("异常!!!!!!!!! 居然无可用房间?")
            time.sleep(2)
        return

    # 定时消息发送队列
    def doHello(self):
        while(True):
            if(self.roomId != ""):
                self.out("开启消息发送队列 deta=" + str(self.timeDetaMsgSend) + "ms")
                # self.listMsgQue = []
            while(self.roomId != ""):
                try:
                    detaTime = tool.getNowTime() - self.lastEchoTime
                    if(detaTime > self.timeDetaMsgSend): # 发送时差大于最小发送间隔
                        if(len(self.listMsgQue) > 0):
                            msg = self.listMsgQue.pop(0)
                            if(type(msg) == tuple):
                                self.doSendId(msg[0], msg[1])
                            else:
                                self.doSend(msg)
                    time.sleep(self.timeDetaMsgSend)
                except Exception as e:
                    self.out("消息发送异常 消息队列:")
                    self.out(self.listMsgQue)
                    self.out(traceback.format_exc())
            # self.out("当前房间roomId:" + self.roomId + " 未加入房间 暂时停止sayHello ")
            time.sleep(3)
    # 定时操作
    def sayHello(self):
        while(True):
            if(self.roomId != ""):
                self.out("开启定时发言,最大发言间隔" + str(self.maxDetaTime / 1000) + "s")
            sleepTime = 3
            dt = 0
            theI = 0
            self.lastEchoTimeQuene = tool.getNowTime()
            while(self.roomId != ""):
                try:
                    # message = "Now Time is "+ time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                    detaTime = tool.getNowTime() - self.lastEchoTime # ms
                    if(detaTime > self.maxDetaTime):
                        # message = "存活确认." + str(theI) + "." +
                        ttt = time.strftime("%H時%M分%S秒")
                        message = "現在時間是" + ttt + ",每隔5分鐘免費派送一座冰山:△,一間冰窟酒吧:♜,一棟冰窟豪宅:▌,一缸冰:۝,一缸涼水:۝,附加贈送一個月的南極大陸度假旅遊服務(可免費觀看地下冰花:✹✺✻✼✽✾✿❀❁❂❃❄❅❆❇❈❉❊❋。)。"
                        self.doSendId(message)
                        self.out(str(theI) + "\t" + message)
                        theI = theI + 1
                        self.lastEchoTime = tool.getNowTime()
                    detaTime = tool.getNowTime() - self.lastOtherSay # ms
                    if(detaTime > self.maxDetaOtherSay): #不不停留True
                        self.goARoom() #10分钟没处理过消息 互动 则换房间
                    if(detaTime > self.maxDetaOtherSay * 2): #若一小时没信息 则 是否掉线?
                        self.shutdown() #等待系统重启
                    if(dt % 600 == 0):
                        self.getRooms() #定时5分钟获取房间最新信息
                    if(dt % 120 == 0):
                        roomsAdmin = self.getUserRoom(self.flowName);
                        if(len(roomsAdmin) > 0):
                            self.out("跟随 触发")
                            self.goRoom(roomsAdmin[tool.getRandom(0, len(roomsAdmin))].get("id", ""))

                    time.sleep(sleepTime)
                    dt = dt + sleepTime
                    dt = dt % 3600
                except Exception as e:
                    self.out(traceback.format_exc())
            # self.out("当前房间roomId:" + self.roomId + " 未加入房间 暂时停止sayHello ")
            time.sleep(10)
            if(self.roomId == ""): #无房间则自动加入
                self.goARoom()
    # 定时抓取消息##########################
    def getHello(self):
        tt = self.getMsgDetaTime
        while(True):
            if(self.roomId != ""):
                self.out("开启抓取发言," + str(tt) + "s/次")
            while(self.roomId != ""):
                try:
                    obj = self.rece()
                    if(obj != ""):
                        self.makeHello(obj)
                except Exception as e:
                    self.out(traceback.format_exc())
                time.sleep(tt)
            # self.out("当前房间roomId:" + self.roomId + " 未加入房间 暂时停止getHello ")
            time.sleep(3)
    # 抓取发言    json Obj
    def rece(self):
        # 获取最新时间的消息1530004210 157 s秒
        res = ""
        url = ""
        if(self.linkStart == 0):     #正常
            url = "http://drrr.com/json.php?update="+str(self.lastMsgTime)
        else:
            url = "http://drrr.com/json.php?fast=1&update="+str(self.lastMsgTime)

        url = "http://drrr.com/json.php?update="+str(self.lastMsgTime)
        # self.out(url)
        responce=self.http.doGet(url)
        if(responce != "" and type(responce) != str ):
            jsonStr = responce.read()
            if(jsonStr != ""):
                res = tool.makeObj(json.loads(jsonStr))
            else:
                res = ""
            self.linkStart = 0
        else:
            self.out("请求异常:" + str(responce) ) 
            self.linkStart = 1
        return res

    # 发送消息-添加队列
    def send(self, message, id=""):
        if(message != None and message != ""):
            if(id == "" and self.toIdNow != ""): #若是别人发给自己
                id = self.fromIdNow
            msg = message
            # maxl = 131
            # while(len(msg) > maxl):
            #     sm = msg[0:maxl]
            #     msg = msg[maxl:99999]
            #     self.listMsgQue.append( (sm + "", id) )
            self.listMsgQue.append( (msg,id))
            self.lastEchoTimeQuene = tool.getNowTime()
        return
    # 发送消息
    def doSend(self, message=""):
        if(message == ""):
            return
        self.out("Send." + message)
        responce=self.http.doPost("http://drrr.com/room/?ajax=1", {
                        "message":message, # [0:4],
                        "url":"",
                        # to:5a1da324d5e68e6712725a50046f4b75 私聊
        })
        # self.out("发送[" + message + "]" + re[0:66])
        self.lastEchoTime = tool.getNowTime()
        return
    def doSendId(self, message="", id=""):
        if(message == ""):
            return
        if(id == ""):
            self.doSend(message)
            return
        self.out("SendTo." + self.userIndexRe.get(id,"") + "."+ message)
        responce=self.http.doPost("http://drrr.com/room/?ajax=1", {
                        "message":message, # [0:4],
                        "url":"",
                        "to":id
        })
        # self.out("发送[" + message + "]" + re[0:66])
        self.lastEchoTime = tool.getNowTime()
        return
    def addNextMusic(self, name="", fromName=""):
        if(fromName == ""):
            fromName = self.fromNameNow
        self.nextNames.append( (name,fromName) )
    def showNexts(self):
        res = ""
        if(len(self.nextNames) > 0):
            res = "#Play list: "
            i = 1
            for name,fromName in self.nextNames:
                res = res + "  \nNo." + str(i) + " " + str(name) + " by " + str(fromName)
                i = i+1
        else:
            res = "接下来随机播放"
        self.send(res)
    def play(self, name=""):
        self.playMusic("aaa", name)
    def playurl(self, url=""):
        self.playMusic(url)
    # 分享音乐
    def playMusic(self, url="", name="", fromName=""):
        if(self.roomIndex.get(self.roomId, {}).get("music", False) == False):
            self.send("当前房间禁止音乐播放" + self.tail)
            return
        duration = self.maxMusicTimeDefault
        music = {}
        if(url[0:4] != "http"): #无地址url则是定向点播
            if(name == ""): #无名字 则自动换 则考虑下一首序列 (name,fromName)
                while(len(self.nextNames) > 0):
                    (name,fromName) = self.nextNames.pop(0)
                    if(name != ""):
                        self.send("接下来播放歌曲[" + name + "]" + self.tail)
                        music = self.robot.getMusic(name, fromName)
                        if(music.get("url","") != ""):
                            break
                        else:
                            self.send("没有找到可播放歌曲[" + str(name) + "]")
                if(music.get("url", "") == ""):
                    music = self.robot.turnMusic(self.musicPlayType)
            else:
                self.send("正在搜索歌曲[" + name + "]" + self.tail)
                music = self.robot.getMusic(name, fromName)
            url = music.get("url", "")
            name = music.get("name", "")
            fromName = music.get("fromName", "")
            duration = int(music.get("duration", 0))
            if(duration < 100):
                duration = self.maxMusicTimeDefault
            self.musicPlayType = 0 #重置为随机播放

        if(fromName != ""):
            msg = ""
            rooms = self.getUserRoom(fromName)
            if(len(rooms) > 0):
                room = rooms[0]
                if(room.get("id","") == self.roomId): #在当前房间
                    msg = "一首[" + name + "]送给" + fromName + "" + self.tail
                else:
                    pass
                    # msg = "Share " + room.get("name")[0:4] + "/" + fromName + "'s[" + name + "]" + "" + self.tail
            else:   #不在线
                pass
                # msg = "Then play" + fromName + " ordered [" + name + "]" + "" + self.tail
            self.send(msg)
        self.out("分享歌曲url=" + url + " name=" + name + " fromName=" + fromName + " time=" + str(tool.calcTime(duration)) )
        if(url == ""):
            self.send("怼不起,没有找到类似的歌曲,瑟瑟发抖"+self.tail)
            return
        responce=self.http.doPost("http://drrr.com/room/?ajax=1", {
                        "music":"music",
                        "name":name,
                        "url":url,
                })
        self.musicNow = {"url":url, "name":name, "fromName":fromName, "duration":duration}
        self.maxMusicTime = duration - 6000
        self.lastMusicTime = tool.getNowTime()
        return
    def listMusic(self):
        self.showNexts()
    # 切歌控制 on/off/turn/prev/next/remove
    def music(self, cmd="on"):
        self.out("music:" + cmd)
        if(cmd == "on"):
            self.ifOnMusic = True
            self.send("已经打开音乐点播" + self.tail)
        elif(cmd == "off"):
            self.ifOnMusic = False
            self.send("已经关闭音乐点播" + self.tail)
        elif(cmd == "turn"):
            # self.ifOnMusic = True
            self.musicPlayType = 0
            self.playMusic()
        elif(cmd == "prev"):
            # self.ifOnMusic = True
            self.musicPlayType = -1
            self.playMusic()
        elif(cmd == "next"):
            # self.ifOnMusic = True
            self.musicPlayType = 1
            self.playMusic()
        elif(cmd == "remove"):
            self.robot.removeMusic(self.musicNow.get("url", ""))
            self.send("降低音乐" + self.musicNow.get("name") + "播放频率 " + self.tail)

        return 
    # 手动控制
    def inputHello(self):
        self.out("开启输入监控!")
        self.help()
        while(True):
            try:
                cmd=raw_input("")
                if(cmd != ""):
                    if(not self.doMethod(cmd)):
                        self.out("手动发送:" + cmd)
                        self.send(cmd)
                        time.sleep(1)
            except Exception as e:
                self.out(traceback.format_exc())
        return
    # 抓取到消息的auto回复
    def makeHello(self, obj):
        res = ""
        try:
            # tool.line()
            # self.out("抓取到消息obj")
            # self.out(obj)
            newTime = obj.get("update", self.lastMsgTime)
            newTime = int(newTime)
            # print(newTime)
            self.lastMsgTime = newTime
            talks = obj.get('talks', "")
            users = obj.get('users', "")
            if(users != ""):
                room = self.roomIndex.get(self.roomId, "")
                if(room != ""):
                    self.roomIndex[self.roomId]['users'] = users
                else:
                    self.roomIndex[self.roomId] = obj
            if(talks != ""):
                onceDocount = 0
                for item in talks:
                    # self.out(item)
                    msgTime = item.get("time", tool.getNowTime())
                    msgId = item.get('id', " ")
                    secret = item.get('secret', False)
                    toId = item.get('to', {}).get('id', '')
                    toName = item.get('to', {}).get('name', '')
                    msgType = item.get('type', 'message')
                    msgData = ""
                    msgFromName = item.get('from', {}).get('name', "")
                    fromId = item.get('from', {}).get('id', "")
                    fromCode = item.get('from', {}).get('tripcode', '')
                    if(msgFromName == ""):
                        msgFromName = item.get('user', {}).get('name', "")
                        fromId = item.get('user', {}).get('id', "")
                        fromCode = item.get('user', {}).get('tripcode', '')
                    turnFlag = 0
                    if(msgFromName != "" and fromId != "" and self.roomMsg.get(msgId, "") == ""):
                        self.userIndex.get(msgFromName)
                        # 处理同名 tripcode认证继承 异id问题 名字对应id不一样了 该房间里的cc不是原来记录的了 则删除原来的admin 顶替 n:id--1:名字
                        if(self.userIndex.get(msgFromName, fromId) != fromId): #非同id
                            oldId = self.userIndex.pop(msgFromName)
                            if(self.userIndexRe.get(oldId, "") != ""):
                                self.userIndexRe.pop(oldId)
                            # 判定和上次记录 的 zk#aa zk# 是否匹配 绑定用户名和code
                            lastCode = self.tripcodeIndex.get(msgFromName, "")
                            if(lastCode == fromCode): #但是 tc code 正常 则转移
                                if(self.admins.get(oldId,"") != ""): #若有admin则继承
                                    oldValue = self.admins.pop(oldId)
                                    self.addAdmin(fromId, int(oldValue))
                                turnFlag = 1 #欢迎回来
                            else: # 否则 没有tc 同名 覆盖 都有tc 但不同 则也覆盖
                                if(self.admins.get(oldId,"") != ""): #若有admin则继承
                                    oldValue = self.admins.pop(oldId)
                                self.tripcodeIndex[msgFromName] = fromCode
                                self.send("[" + msgFromName + "] tc变更[" + str(lastCode) + " - " + str(fromCode) )


                        self.userIndex[msgFromName] = fromId
                        self.userIndexRe[fromId] = msgFromName

                    if(msgType == 'me'):
                        msgData = item.get('content', "")
                    elif(msgType == 'message'):
                        msgData = item.get('message', "")
                    elif(msgType == 'join' and self.ifWelcom):
                        # msgFromName = item.get('user', {}).get('name', "")
                        if(turnFlag == 0):
                            msgData = '欢迎' + msgFromName + self.tail
                        else:
                            msgData = '欢迎回来 ' + msgFromName + self.tail
                    elif(msgType == 'leave'):
                        msgData = '' + msgFromName + '' + self.tail
                        msgData = ''
                    elif(msgType == 'music'):
                        music = item.get('music', {})
                        name = music.get('name', '')
                        url = music.get('url', '')
                        # msgData = '悄悄的的把[' + name + ']给记在小本子上 '  + self.tail
######################################################## 不处理
                    if( self.roomMsg.get(msgId, "") != ""): #已经处理过 或者是自己发送的 或者取出发送者失败
                        # self.out("旧消息 " + msgId + " type:" + msgType + " data:" + msgData)
                        continue
                    self.roomMsg[msgId] = item #标记未已经处理 历史消息
                    if( msgFromName == self.name or msgFromName == ""):
                        continue
                    if(msgType == "me" or msgType == "message"): #只记录聊天消息
                        self.robot.addMsg(msgId, msgFromName, msgData, msgTime)
#############################################################

                    #当前消息信息记录
                    self.fromNameNow = msgFromName
                    self.fromIdNow = fromId
                    self.fromNameNow = msgFromName
                    self.toIdNow = toId
                    self.toNameNow = toName

                    if(msgType == 'music'):
                        music = { "name":name, "url":url, "fromName":msgFromName }
                        res = self.robot.addMusic(music) #添加用户分享记录
                        if(res):
                            self.robot.addHistory(music)
                        self.musicNow = music
                        self.lastMusicTime = tool.getNowTime()

                    # self.roomMsg[msgId] = item #标记未已经处理 历史消息

                    if(self.status>self.statusMax):
                        self.status = self.statusMax
                    elif(self.status < self.statusMin):
                        self.status = self.statusMin

                    detaTime = tool.getNowTime() - self.lastEchoTimeQuene # ms 60s
                    olRan = tool.getRandom(0,self.maxDetaTime) / 1000    #0-180 过于久没有发过消息了 权重高则可能自回复
                    weight = (self.maxDetaTime - detaTime) / 1000   #多久没说话了 最大多长时间必须说话
                    ran = int(1.0 * olRan * (1+ 1.0 * (self.status-90) / 100) )

                    # self.out("Msg." + msgId[0:4] + "." + tool.fill(str(weight) + "" , ' ', 5) + " " + tool.fill(str(olRan) + "->" + str(ran),' ', 5) + "." + tool.fill(msgFromName,' ',8) + "."+tool.fill(msgType,' ',4) + "." + msgData + " ." + str(fromId))
                    self.out("Msg." + msgId[0:4] + " " + msgFromName[0:10] + "->" + toName[0:10]+ " "+msgType[0:4] + " " + msgData )
                    msgData = msgData.strip()
                    flag = 0 #不回复
                    if(msgType == 'message' or msgType == 'me' ):    #普通聊天消息
                        if( re.search('@' + self.name + " ", msgData) != None):    #有@自己 且权重不太低
                            msgData = re.sub('@' + self.name + "", "", msgData) #摘除@自己
                            flag = 1
                            msgData = msgData.strip()
                            # else:
                            #     self.out("@me 随机数=" + str(ran) + " 小于 说话欲望=" + str(self.status) + " ")
                            #     flag = 2
                            #     msg = "生气程度:" + str(100-self.status) + "%,不想搭理"+self.tail
                        elif(ran > weight and  re.search('@', msgData) == None): # 没有@ 且 权重高 主动搭话概率
                            flag = 1
                        elif(toId != ""): #私聊
                            flag = 1
                        else:
                            flag = 10

                        #admin权限认证
                        if(self.adminRes != "" and str(msgData) == str(self.adminRes)):
                            self.out("触发权限admin认证." + str(self.adminRes) + "=" + str(msgData) + "." + msgFromName + "." + fromId)
                            self.send("认证成功[" + str(msgFromName) + "]")
                            self.addAdmin(fromId)
                            flag = 0
                            msgData = ""
                    else: #事件
                        flag = 2

                    res = ""
                    self.lastOtherSay = tool.getNowTime()   #重置处理时间 黑名单消息不计入消息

                    if(self.filterFlag(msgData, msgFromName)):    #最高级 权限是否黑名单过滤

                        if(flag == 1 or flag == 10):
                            if(flag == 1 and self.robot.getUser(msgFromName).get("flag", "0") != "0"):
                                self.out("不想搭理" + msgFromName)
                            else:
                                if(flag == 1 and self.filterCmd(msgData, msgFromName)):    #若过滤器未处理 则继续交由下面处理
                                    pass
                                elif(flag == 10): #让普通消息也接入 cmd 不过没有后续处理
                                    self.filterCmd(msgData, msgFromName)
                                    res = ""
                        elif(flag == 2):
                            res = msgData

                        if(res != "" and flag != 0 and onceDocount < 6): # 最多一次抓取发送3个
                            res = '' + res
                            onceDocount = onceDocount + 1
                            # self.send(res)


                    #当前消息信息清空
                    self.fromNameNow = ""
                    self.fromIdNow = ""
                    self.fromNameNow = ""
                    self.toIdNow = ""
                    self.toNameNow = ""
        except Exception as e:
            self.out("Exception:" + str(e))
        # tool.line()
        return res
    # /do help   指令控制行为  /do send 你们好
    def filterCmd(self, msgData="", fromName=""):
        res = True
        msgData = msgData.strip()
        flag = False
        size = len(msgData)
        # self.out("filterCmd." + msgData + "." + fromName)

        if( re.search('/do', msgData) != None and self.toIdNow != "" ): # /do指令1阶 且只接受私聊控制
            if( self.ifAdminName(fromName, 0) ):
                res = False
                cmd = msgData[3:9999]
                self.out(" do method." + str(cmd))
                if(not self.doMethod(cmd)):
                    self.help()

        # res = self.doControl(res, msgData, ['管理员', 'admin', 'Admin'], self.getAdmin, fromName, False, 0)
        # res = self.doControl(res, msgData, ['help', '帮助'], self.showHelp, fromName, False, 0)
        # res = self.doControl(res, msgData, ['nexts', '歌单', '歌单列表'], self.showNexts, fromName, False, 0)
        # res = self.doControl(res, msgData, ['next', '接下来播放', '下一首播放'], self.addNextMusic, fromName, True, 0)
        #
        # res = self.doControl(res, msgData, ['rooms', '房间列表'], self.showRoomList, fromName, True, 0)
        #
        # res = self.doControl(res, msgData, ['管理员', 'admin', 'Admin'], self.getAdmin, fromName, False, 0)
        # res = self.doControl(res, msgData, ['admins', 'score', 'Admins'], self.showAdmin, fromName, False, 0)
        # res = self.doControl(res, msgData, ['踢出', 'kick', 'del', '删除','rm'], self.rm, fromName, True,0)
        # res = self.doControl(res, msgData, ['host', '房主'], self.host, fromName, True, 2)
        # res = self.doControl(res, msgData, ['out', 'leave'], self.outRoom, fromName, False, 0)
        #
        # # 295796671
        # res = self.doSetControl(res, msgData, ['wait', 'stay'], "notWait", False, echoStr="决定在这里住下来")
        # res = self.doSetControl(res, msgData, ['开始迎客', 'start hello'], "ifWelcom", True, echoStr="开始迎客")
        # res = self.doSetControl(res, msgData, ['停止迎客', 'stop hello'], "ifWelcom", False, echoStr="保持沉默")
        # res = self.doSetControl(res, msgData, ['开始存活确认', 'start live'], "ifTime", True, echoStr="开始存活确认")
        # res = self.doSetControl(res, msgData, ['停止存活确认', 'stop live'], "ifTime", False, echoStr="停止存活确认")


        return res
    #设置值类处理链
    def doSetControl(self, ifDo, msgData, cmds, attrName, value, echoStr=""):
        if(not ifDo): #False 则不处理 且继续返回False
            return ifDo
        res = True
        for item in cmds:
            if(msgData == item):
                self.out("命中:" + str(item) )
                res = False
                self.let(attrName, value)
                self.send("" + self.name + str(echoStr) + self.tail)
                break
        return res
    # 处理链
    def doControl(self, ifDo, msgData, cmds, callback, fromName, argType=False, adminLevel=0):
        if(not ifDo): #False 则不处理 且继续返回False
            return ifDo
        res = True
        if(argType):
            for item in cmds:
                itemLen = len(item)
                index = msgData.find(item)
                if(index == 0): #头命中
                    msgData = msgData[itemLen:9999].strip()
                    self.out("命中:" + str(item) + " 参数:" + str(msgData))

                    if(adminLevel > 0):
                        if(self.ifAdminName(fromName, adminLevel)):
                            callback(msgData)
                            res = False
                    else:
                        callback(msgData)
                        res = False
                    break
        else:
            for item in cmds:
                if(msgData == item):
                    self.out("命中:" + str(item) )
                    callback()
                    res = False
                    break
        return res

    def addBad(self, fromName):
        self.robot.turnUser(fromName, "1")

    # [methodName arg1 arg2]
    def filterFlag(self, msgData="", fromName=""):
        res = True
        msgData = msgData.strip()
        flag = False
        size = len(msgData)
        msg = ""
        keys = ["别说话", "你别说话", "闭嘴", "shutup"]
        statusOn = ['笨蛋', '傻逼', 'sb', 'SB', 'Sb','sB', '傻b', '傻', 'bad']
        statusOff = ['开心一点','开心点','我错了', '求你了', '后悔', '收回','我收回','对不起', '悔恨', '不要生气']


        if(not flag):
            for item in statusOff:
                if(msgData == item):
                    self.robot.turnUser(fromName, "0")
                    self.status = self.status + self.statusOnDeta
                    if(self.status >= self.statusMax + self.statusOnDeta):
                        msg = self.name + "现在没有生气(╯▔皿▔)╯"
                    elif(self.status >= self.statusDefault):
                        msg = self.name + "心情好转了 不生气了﹏"
                    else:
                        msg = self.name + "气消了一点点,生气值-" + str(self.statusOnDeta) + self.tail
                    flag = True
                    break
        if(self.robot.getUser(fromName).get("flag", "0") != "0"):   #限制黑名单只接受道歉
            self.out("黑名单只接受道歉 不想搭理" + fromName)
            return False

        if(not flag):
            for item in keys:
                if(msgData == item):
                    self.status = self.status - self.statusDownDeta
                    msg = "好的" + ",生气值陡升" + str(self.statusDownDeta) + ",当前" + str(100-self.status) + "% "
                    flag = True
                    break
        if(not flag):
            for item in statusOn:
                if(msgData == item):
                    self.robot.turnUser(fromName, "1")
                    self.status = self.status - self.statusOffDeta
                    if(self.status <= self.statusMin - self.statusOffDeta):
                        msg = self.name + "已经气死了 没这号robot 😕"
                    elif(self.status <= self.statusMin):
                        msg = self.name + "已经气炸了 不想再说话了 ε=( o`ω′)ノ "
                    else:
                        msg = self.name + "生气值暴涨" + str(self.statusOffDeta) + ",不想再搭理" + fromName + "了" + self.tail
                    flag = True
                    break

        if(flag):#状态控制
            self.out('filterFlag.' + str(flag) + "." + msgData)
            res = False
            self.send("" + msg)
        return res
    # methodName args eg: 'send aaaaa' 第一个空格分开函数名
    def doMethod(self, cmd):
        #music <on/off/turn/prev/next>
        cmd = cmd.strip()
        cmds = cmd.split(' ')
        if(len(cmds) > 0 and cmds[0] == ""):
            cmds.pop(0)
        listArgs = cmds
        size = len(listArgs)
        res = False
        if(size > 0):
            if(hasattr(self, listArgs[0])):
                method = getattr(self, listArgs[0])#获取的是个对象
                if(callable(method)):
                    if(size == 2):
                        method(listArgs[1]) 
                    elif(size == 3):
                        method(listArgs[1], listArgs[2])  
                    elif(size == 4):
                        method(listArgs[1], listArgs[2], listArgs[3]) 
                    elif(size == 5):
                        method(listArgs[1], listArgs[2], listArgs[3], listArgs[4]) 
                    else:
                        method()
                    res = True
                else:
                    res = True
                    self.out(method)
        return res
    def let(self, attrName="", value=""):
        self.out("变量赋值." + str(attrName) + "." + str(value))
        if(hasattr(self, attrName)):
            method = getattr(self, attrName)#获取的是个对象
            if(callable(method)):
                self.out("该属性为方法")
            else:
                setattr(self, attrName, value)
        else:
            self.out("该属性不存在")

    def shutdown(self):
        self.outRoom()
        self.out("3秒后关闭程序")
        # time.sleep(2)
        tool.line()
        # sys.exit()
        # os.kill()
        os._exit(0)
    def restart(self):
        # self.shutdown()
        # self.login()
        self.outRoom()
        tool.line()
        self.out("3秒后重启程序")
        # time.sleep(3)
        #重启程序
        python = sys.executable
        os.execl(python, python, * sys.argv)

    def test(self):
        self.login()
        self.getRooms()
        # self.goRoom("QGSNLntBvK")
        # self.goRoomName("深海")
        self.goARoom()
        ThreadRun( "DoSend." + str(self.count),  self.doHello ).start()
        ThreadRun( "SayHello." + str(self.count),  self.sayHello ).start()
        ThreadRun( "GetHello." + str(self.count),  self.getHello ).start()
        # ThreadRun( "InputHello." + str(self.count),  self.inputHello ).start()

        # for i in range(len(self.roomIndex.keys())):
        #     self.goRoom( self.roomIndex.keys()[i] )
        #     self.music("turn")
        #     time.sleep(7)
        #     self.outRoom()
        #     time.sleep(3)

        return
    def test2(self):
        self.login()
        self.getRooms()
        # self.goRoom("QGSNLntBvK")
        # self.goRoomName("深海")
        # self.goARoom()
        # ThreadRun( "DoSend." + str(self.count),  self.doHello ).start()
        ThreadRun( "SayHello." + str(self.count),  self.sayHello ).start()
        ThreadRun( "GetHello." + str(self.count),  self.getHello ).start()
        # ThreadRun( "InputHello." + str(self.count),  self.inputHello ).start()

        return
Example #41
0
 def __init__(self, name="0000000"):
     self.http = Http()
     self.name = name
Example #42
0
class MainWindow(QMainWindow):
    '''
    Describes main window of a client application.
    '''
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)

        self.mimes = {'team': 'application/x-team-item',
                      'event':  'application/x-calendar-event',
                      }
        self.rooms = []
        self.tree = []
        self.rfid_id = None

        self.http = Http(self)

        self.work_hours = (8, 24)
        self.schedule_quant = timedelta(minutes=30)

        self.menus = []
        self.create_menus()
        self.setup_views()

        settings = QSettings()
        settings.beginGroup('network')
        host = settings.value('addressHttpServer', QVariant('WrongHost'))
        settings.endGroup()

        if 'WrongHost' == host.toString():
            self.setupApp()

        self.baseTitle = _('Manager\'s interface')
        self.logoutTitle()
        self.statusBar().showMessage(_('Ready'), 2000)
        self.resize(640, 480)

    def loggedTitle(self, name):
        '''
        Appends name of a manager to basic title of main window. Indended to be
        called after successful L{log in<???>}.
        
        @type  name: string
        @param name: Name of a manager, that have logged in.
        '''
        self.setWindowTitle('%s : %s' % (self.baseTitle, name))

    def logoutTitle(self):
        '''
        Appends 'Log in to start session' to basic title of main window.
        Indended to be used on L{logout<>} and when application
        L{starts<__init__>}. 
        '''
        
        self.setWindowTitle('%s : %s' % (self.baseTitle, _('Login to start session')))

    def get_dynamic(self):
        '''
        Updates L{labels<create_views>} bpMonday and bpSunday, that show date
        of beginning and end of the week, that is currently displayed by
        L{QtSchedule} widget.
        '''
        
        self.bpMonday.setText(self.schedule.model().getMonday().strftime('%d/%m/%Y'))
        self.bpSunday.setText(self.schedule.model().getSunday().strftime('%d/%m/%Y'))

    def get_static(self):
        """
        Gets static information from server.
        
        First, all present rooms are L{retrieved<Http.request>}. They are
        returned as a dict in the following format::
            {'rows': [{'color': 'FFAAAA', 'text': 'red', 'id': 1},
                  {'color': 'AAFFAA', 'text': 'green', 'id': 2},
            ...]}
        
        Then, other static info is retrieved???
        """
        # get rooms
        if not self.http.request('/manager/get_rooms/', {}):
            QMessageBox.critical(self, _('Room info'), _('Unable to fetch: %s') % self.http.error_msg)
            return
        default_response = {'rows': []}
        response = self.http.parse(default_response)
        
        self.rooms = tuple( [ (a['title'], a['color'], a['id']) for a in response['rows'] ] )
        self.schedule.update_static( {'rooms': self.rooms} )

        # static info
        if not self.http.request('/manager/static/', {}):
            QMessageBox.critical(self, _('Static info'), _('Unable to fetch: %s') % self.http.error_msg)
            return
        response = self.http.parse()
        self.static = response
        print 'Static is', self.static.keys()
        #import pprint; pprint.pprint(self.static)

        #self.tree = TreeModel(self.static.get('styles', None))

    def update_interface(self):
        """ This method updates application's interface using static
        information obtained in previous method. """
        # rooms
        if self.rooms and len(self.rooms) > 0:
            for title, color, id in self.rooms:
                buttonFilter = QPushButton(title)
                buttonFilter.setCheckable(True)
                buttonFilter.setDisabled(True) # BUG #28
                self.panelRooms.addWidget(buttonFilter)
                self.connect(buttonFilter, SIGNAL('clicked()'),
                             self.prepare_filter(id, title))

    def prepare_filter(self, id, title):
        def handler():
            self.statusBar().showMessage(_('Filter: Room "%s" is changed its state') % title)
        return handler

    def setup_views(self):
        '''
        This method sets up layout of main window, except for dropdown menus.
        
        At the center of the window there is a custon L{QtSchedule} widget,
        which shows timetable of some week or of particular day.
        
        Under it there are widgets for navigation: two labels bpMonday and
        bpSunday display information on what date range is displayed in
        schedule widget, and buttons buttonPrev, buttonNext and buttonToday
        are used to tell schedule to show previous week, next week and current
        week respectively.
        '''
        self.panelRooms = QHBoxLayout()

        schedule_params = {
            'http': self.http,
            'work_hours': self.work_hours,
            'quant': self.schedule_quant,
            'rooms': self.rooms,
            }
        self.schedule = QtSchedule(self, schedule_params)

        self.bpMonday = QLabel('--/--/----')
        self.bpSunday = QLabel('--/--/----')
        self.buttonPrev = QPushButton(_('<<'))
        self.buttonNext = QPushButton(_('>>'))
        self.buttonToday = QPushButton(_('Today'))
        self.buttonPrev.setDisabled(True)
        self.buttonNext.setDisabled(True)
        self.buttonToday.setDisabled(True)

        # callback helper function
        def prev_week():
            week_range = self.schedule.model().showPrevWeek()
            self.showWeekRange(week_range)
        def next_week():
            week_range = self.schedule.model().showNextWeek()
            self.showWeekRange(week_range)
        def today():
            week_range = self.schedule.model().showCurrWeek()
            self.showWeekRange(week_range)

        self.connect(self.buttonPrev, SIGNAL('clicked()'), prev_week)
        self.connect(self.buttonNext, SIGNAL('clicked()'), next_week)
        self.connect(self.buttonToday, SIGNAL('clicked()'), today)

        bottomPanel = QHBoxLayout()
        bottomPanel.addWidget(QLabel(_('Week:')))
        bottomPanel.addWidget(self.bpMonday)
        bottomPanel.addWidget(QLabel('-'))
        bottomPanel.addWidget(self.bpSunday)
        bottomPanel.addStretch(1)
        bottomPanel.addWidget(self.buttonPrev)
        bottomPanel.addWidget(self.buttonToday)
        bottomPanel.addWidget(self.buttonNext)

        mainLayout = QVBoxLayout()
        mainLayout.addLayout(self.panelRooms)
        mainLayout.addWidget(self.schedule)
        mainLayout.addLayout(bottomPanel)

        mainWidget = QWidget()
        mainWidget.setLayout(mainLayout)

        self.setCentralWidget(mainWidget)

    def showWeekRange(self, week_range):
        if self.schedule.model().getShowMode() == 'week':
            monday, sunday = week_range
            self.bpMonday.setText(monday.strftime('%d/%m/%Y'))
            self.bpSunday.setText(sunday.strftime('%d/%m/%Y'))

    def getMime(self, name):
        return self.mimes.get(name, None)

    def create_menus(self):
        """
        This method generates the application dropdown menu.
        
        Menu items are specified in 'data' variable inside the method.
        Format is as follows:
        - data is list of tuples of form (menu_title, list_of_submenus), where
        menu_name is the name of a given menu (e.g. 'File') and
        list_of_submenus contains menu items, that drop down, when you click
        on menu_name.
        - submenu items are tuples (title, shortcut, handler function, comment)
        
        Current menu structure is as follows:
        - File.
            - L{Log in<login>}.
            - L{Log out<logout>}.
            - L{Application settings<setupApp>}.
            - Exit.
        - Client. 
            - L{New<client_new>}.
            - L{Search by RFID<client_search_rfid>}.
            - L{Search by name<client_search_name>}.
        - Renter.
            - L{New<renterNew>}.
            - L{Search by name<renterSearchName>}.
        - Calendar.
            - L{Fill week<fillWeek>}.
            
        @important: Style of naming of functions is mixed!!!
        """
        data = [
            (_('File'), [
                (_('Log in'), 'Ctrl+I',
                 'login', _('Start user session.')),
                (_('Log out'), '',
                 'logout', _('End user session.')),
                None,
                (_('Application settings'), 'Ctrl+G',
                 'setupApp', _('Manage the application settings.')),
                None,
                (_('Exit'), '',
                 'close', _('Close the application.')),
                ]
             ),
            (_('Client'), [
                (_('New'), 'Ctrl+N',
                 'client_new', _('Register new client.')),
                (_('Search by RFID'), 'Ctrl+D',
		     'client_search_rfid', _('Search a client with its RFID card.')),
                (_('Search by name'), 'Ctrl+F',
                 'client_search_name', _('Search a client with its name.')),
                ]
             ),
            (_('Renter'), [
                (_('New'), '',
                 'renterNew', _('Register new renter.')),
                (_('Search by name'), '',
                 'renterSearchName', _('Search a renter with its name.')),
                ]
             ),
            # 	    (_('Event'), [
            # 		    (_('Training'), 'Ctrl+T',
            # 		     'eventTraining', _('Assign a training event.')),
            # 		    (_('Rent'), 'Ctrl+R',
            # 		     'eventRent', _('Assign a rent event.')),
            #                     ]
            #              ),
            (_('Calendar'), [
                (_('Fill week'), 'Ctrl+L',
                 'fillWeek', _('Fill current week.')),
                # 		    (_('Copy week'), 'Ctrl+W',
                # 		     'copyWeek', _('Copy current week into other.')),
                ]
             ),
            # 	    (_('Accounting'), [
            # 		    (_('Add resources'), '',
            # 		     'addResources', _('Add new set of resources into accounting.')),
            #                     ]
            #              ),
            ]

        for topic, info in data:
            menu = self.menuBar().addMenu(topic)
            # Disable the following menu actions, until user will be authorized.
            if topic != _('File'):
                menu.setDisabled(True)
            for item in info:
                if item is None:
                    menu.addSeparator()
                    continue
                title, short, name, desc = item
                setattr(self, 'act_%s' % name, QAction(title, self))
                action = getattr(self, 'act_%s' % name)
                action.setShortcut(short)
                action.setStatusTip(desc)
                self.connect(action, SIGNAL('triggered()'), getattr(self, name))
                menu.addAction(action)
                self.menus.append(menu)

    def interface_disable(self, state): # True = disabled, False = enabled
        '''
        This method is to be invoked on L{log out<logout>} or when the
        application L{starts<__init__>}.
        
        It disables schedule navigation buttons and L{all dropdown menus except
        File<create_menus>}.
        '''
        # Enable menu's action
        for menu in self.menus:
            if menu.title() != _('File'):
                menu.setDisabled(state)
        # Enable the navigation buttons
        self.buttonPrev.setDisabled(state)
        self.buttonNext.setDisabled(state)
        self.buttonToday.setDisabled(state)

    def refresh_data(self):
        """
        This method gets current timetable from the server using
        L{update<QtSchedule.update>} method of L{QtSchedule} widget.
        
        It is called periodically using timer. Interaction with server only
        occurs if manager is logged in.
        """

        # Do nothing until user authoruized
        if not self.http.is_session_open():
            return
        # Just refresh the calendar's model
        self.schedule.model().update

    # Menu handlers: The begin

    def login(self):
        '''
        Shows log in dialog, where manager is asked to provide login/password
        pair.
        
        If 'Ok' button is clicked, authentication L{request<Http.request>} is
        made to the server, which is then L{parsed<Http.parse>}.
        
        On success:
        - information about schedule is retrieved from the server and
        and L{QtSchedule} widget is L{updated<update_interface>}.
        - controls are L{activated<interface_disable>}.
        - window title is L{updated<loggedTitle>}
        - schedule information is being L{refreshed<refresh_data>} from now on.
        
        In case of failure to authenticate a message is displayed.
        '''
         
        def callback(credentials):
            self.credentials = credentials

        self.dialog = DlgLogin(self)
        self.dialog.setCallback(callback)
        self.dialog.setModal(True)
        dlgStatus = self.dialog.exec_()

        if QDialog.Accepted == dlgStatus:
            if not self.http.request('/manager/login/', self.credentials):
                QMessageBox.critical(self, _('Login'), _('Unable to login: %s') % self.http.error_msg)
                return

            default_response = None
            response = self.http.parse(default_response)
            if response and 'user_info' in response:
                self.loggedTitle(response['user_info'])

                # update application's interface
                self.get_static()
                self.get_dynamic()
                self.update_interface()

                self.schedule.model().showCurrWeek()

                # run refresh timer
                self.refreshTimer = QTimer(self)
                from settings import SCHEDULE_REFRESH_TIMEOUT
                self.refreshTimer.setInterval(SCHEDULE_REFRESH_TIMEOUT)
                self.connect(self.refreshTimer, SIGNAL('timeout()'), self.refresh_data)
                self.refreshTimer.start()

                self.interface_disable(False)
            else:
                QMessageBox.warning(self, _('Login failed'),
                                    _('It seems you\'ve entered wrong login/password.'))

    def logout(self):
        '''
        Performs sequence of clean up actions when manager logs out:
        - L{disables controls<interface_disable>};
        - Deletes information about schedule and rooms, that are present.
        '''
        self.interface_disable(True)
        self.setWindowTitle('%s : %s' % (self.baseTitle, _('Login to start session')))
        self.schedule.model().storage_init()

        # clear rooms layout
        layout = self.panelRooms
        while layout.count() > 0:
            item = layout.takeAt(0)
            if not item:
                continue
            w = item.widget()
            if w:
                w.deleteLater()

    def setupApp(self):
        '''
        Displays dialog with settings for client application.
        
        After that date range, that is being displayed is refreshed and
        L{reconnect<Http.reconnect>} to server is performed (just in case network settings)
        had been altered.
        '''
        self.dialog = DlgSettings(self)
        self.dialog.setModal(True)
        self.dialog.exec_()
        self.get_dynamic()
        self.http.reconnect()

    def client_new(self):
        '''
        Opens empty client information L{dialog<ClientInfo>} for adding
        new client to the database.
        
        Class for L{accessing server<Http>} and static information (???) are
        passed as parameters.
        '''
        params = {
            'http': self.http,
            'static': self.static,
            }
        self.dialog = ClientInfo(self, params)
        self.dialog.setModal(True)
        self.dialog.exec_()

    def client_search_rfid(self):
        '''
        Search client in the database
        by RFID (Radio Frequency IDentificator).
        
        After RFID was successfully read from card, server is
        L{requested<Http.request>} client info.
        
        If user is found in database, L{dialog<ClientInfo>}
        with information about client is displayed.
        
        Otherwise, messageboxes with warnings are displayed.
        '''
        
        if not self.http or not self.http.is_session_open():
            return # login first

        def callback(rfid):
            self.rfid_id = rfid

        params = {
            'http': self.http,
            'static': self.static,
            'mode': 'client',
            'callback': callback,
            }
        dialog = WaitingRFID(self, params)
        dialog.setModal(True)
        dlgStatus = dialog.exec_()

        if QDialog.Accepted == dlgStatus and self.rfid_id is not None:
            params = {'rfid_code': self.rfid_id, 'mode': 'client'}
            if not self.http.request('/manager/get_client_info/', params):
                QMessageBox.critical(self, _('Client info'), _('Unable to fetch: %s') % self.http.error_msg)
                return
            default_response = None
            response = self.http.parse(default_response)

            if not response or response['info'] is None:
                QMessageBox.warning(self, _('Warning'),
                                    _('This RFID belongs to nobody.'))
            else:
                user_info = response['info']
                params = {
                    'http': self.http,
                    'static': self.static,
                    }
                self.dialog = ClientInfo(self, params)
                self.dialog.setModal(True)

                self.dialog.initData(user_info)
                self.dialog.exec_()
                self.rfid_id = None

    def client_search_name(self):
        '''
        Search client in the database by name.
        
        First it launches client search L{dialog<Searching>}, which
        tries to fetch unique user_id from the server based on information
        provided.
        
        If that succeeds, user_id-based search then Works analogously to
        L{RFID-based<client_search_rfid>} search.
        '''
        if not self.http or not self.http.is_session_open():
            return # login first

        def callback(user_id):
            self.user_id = user_id

        params = {
            'http': self.http,
            'static': self.static,
            'mode': 'client',
            'apply_title': _('Show'),
            }
        self.dialog = Searching(self, params)
        self.dialog.setModal(True)
        self.dialog.setCallback(callback)
        dlgStatus = self.dialog.exec_()

        if QDialog.Accepted == dlgStatus:
            if not self.http.request('/manager/get_client_info/',
                                     {'user_id': self.user_id,
                                      'mode': 'client'}):
                QMessageBox.critical(self, _('Client info'), _('Unable to fetch: %s') % self.http.error_msg)
                return
            default_response = None
            response = self.http.parse(default_response)
            if not response or response['info'] is None:
                QMessageBox.warning(self, _('Warning'),
                                    _('This RFID belongs to nobody.'))
            else:
                params = {
                    'http': self.http,
                    'static': self.static,
                    }
                self.dialog = ClientInfo(self, params)
                self.dialog.setModal(True)
                self.dialog.initData(response['info'])
                self.dialog.exec_()

    def renterNew(self):
        '''
        Adding new renter.
        '''
        self.dialog = DlgRenterInfo(self)
        self.dialog.setModal(True)
        self.dialog.exec_()

    def renterSearchName(self):
        '''
        Search renter by his name.
        
        @important: by some strange reason, HttpAjax class is used instead of
        Http to fetch information from the server.
        '''
        def callback(id):
            self.user_id = id

        params = {
            'http': self.http,
            'static': self.static,
            'mode': 'client',
            }
        self.dialog = Searching(self, params)
        self.dialog.setModal(True)
        self.dialog.setCallback(callback)
        dlgStatus = self.dialog.exec_()

        if QDialog.Accepted == dlgStatus:
            ajax = HttpAjax(self, '/manager/get_renter_info/',
                            {'user_id': self.user_id,
                             'mode': 'renter'}, self.session_id)
            response = ajax.parse_json()
            self.dialog = DlgRenterInfo(self)
            self.dialog.setModal(True)
            self.dialog.initData(response['info'])
            self.dialog.exec_()

    def eventTraining(self):
        def callback(e_date, e_time, room_tuple, team):
            room, ok = room_tuple
            title, team_id, count, price, coach, duration = team
            begin = datetime.combine(e_date, e_time)
            duration = timedelta(minutes=int(duration * 60))

            ajax = HttpAjax(self, '/manager/cal_event_add/',
                            {'event_id': team_id,
                             'room_id': room,
                             'begin': begin,
                             'ev_type': 0}, self.session_id)
            response = ajax.parse_json()
            id = int(response['saved_id'])
            event_info = {'id': id,
                          'title': title, 'price': price,
                          'count': count, 'coach': coach,
                          'duration': duration,
                          'groups': _('Waiting for update.')}
            eventObj = Event({}) # FIXME
            self.schedule.insertEvent(room, eventObj)

        self.dialog = DlgEventAssign('training', self)
        self.dialog.setModal(True)
        self.dialog.setCallback(callback)
        self.dialog.setModel(self.tree)
        self.dialog.setRooms(self.rooms)
        self.dialog.exec_()

    def eventRent(self):
        def callback(e_date, e_time, e_duration, room_tuple, rent):
            room, ok = room_tuple
            rent_id = rent['id']
            begin = datetime.combine(e_date, e_time)
            duration = timedelta(hours=e_duration.hour,
                                 minutes=e_duration.minute)
            params = {
                'event_id': rent_id,
                'room_id': room,
                'begin': begin,
                'ev_type': 1,
                'duration': float(duration.seconds) / 3600
                }
            ajax = HttpAjax(self, '/manager/cal_event_add/', params, self.session_id)
            response = ajax.parse_json()
            id = int(response['saved_id'])
            eventObj = Event({}) # FIXME
            self.schedule.insertEvent(room, eventObj)

        self.dialog = DlgEventAssign('rent', self)
        self.dialog.setModal(True)
        self.dialog.setCallback(callback)
        self.dialog.setRooms(self.rooms)
        self.dialog.exec_()

    def fillWeek(self):
        def callback(selected_date):
            model = self.schedule.model()
            from_range = model.weekRange
            to_range = model.date2range(selected_date)

            if not self.http.request('/manager/fill_week/', {'to_date': to_range[0]}):
                QMessageBox.critical(self, _('Fill week'), _('Unable to fill: %s') % self.http.error_msg)
                return
            default_response = None
            response = self.http.parse(default_response)
            if response and 'saved_id' in response:
                # inform user
                info = response['saved_id']
                msg = _('The week has been filled sucessfully. Copied: %(copied)i. Passed: %(passed)i.')
                self.statusBar().showMessage(msg % info, 3000)
                # FIXME: pause here, but not just sleep, use timer
                # update view
                self.schedule.model().update()

        self.dialog = DlgCopyWeek(self)
        self.dialog.setModal(True)
        self.dialog.setCallback(callback)
        self.dialog.exec_()

    def copyWeek(self):
        def callback(selected_date):
            model = self.scheduleModel
            from_range = model.weekRange
            to_range = model.date2range(selected_date)
            ajax = HttpAjax(self, '/manager/copy_week/',
                            {'from_date': from_range[0],
                             'to_date': to_range[0]}, self.session_id)
            response = ajax.parse_json()
            self.statusBar().showMessage(_('The week has been copied sucessfully.'))

        self.dialog = DlgCopyWeek(self)
        self.dialog.setModal(True)
        self.dialog.setCallback(callback)
        self.dialog.exec_()

    def addResources(self):
        def callback(count, price):
#             ajax = HttpAjax(self, '/manager/add_resource/',
#                             {'from_date': from_range[0],
#                              'to_date': to_range[0]}, self.session_id)
            response = ajax.parse_json()
            self.statusBar().showMessage(_('The week has been copied sucessfully.'))

        self.dialog = DlgAccounting(self)
        self.dialog.setModal(True)
        self.dialog.setCallback(callback)
        self.dialog.exec_()

    # Menu handlers: The end

#def getUserInfo(self, rfid):
# 	""" This method get user's information by its card's identifier. """
# 	ajax = HttpAjax(self, '/manager/get_client_info/',
# 			{'rfid_code': rfid, mode='client'})
# 	json_like = ajax.parse_json()
# 	print 'USER INFO:', json_like
# 	return json_like

    def showEventProperties(self, calendar_event, index): #, room_id):
        self.dialog = EventInfo(self, {'http': self.http})
        self.dialog.setModal(True)
        self.dialog.initData(calendar_event, index)
        self.dialog.exec_()

    # Drag'n'Drop section begins
    def mousePressEvent(self, event):
        if DEBUG:
            print 'press event', event.button()

    def mouseMoveEvent(self, event):
        if DEBUG:
            print 'move event', event.pos()
Example #43
0
class Auto163:
    def __init__(self, name="0000000"):
        self.http = Http()
        self.name = name

    def out(self, obj):
        print(self.__module__ + "." + self.name + "." + obj)
    def login(self):
        pass 
    def help(self):
        self.out(dir(self))
# [methodName arg1 arg2]
    def doMethod(self, listArgs):
        size = len(listArgs)
        res = False
        if(size > 0):
            if(hasattr(self, listArgs[0])):
                method = getattr(self, listArgs[0])#获取的是个对象
                if(callable(method)):
                    if(size == 2):
                        method(listArgs[1]) 
                    elif(size == 3):
                        method(listArgs[1], listArgs[2])  
                    elif(size == 4):
                        method(listArgs[1], listArgs[2], listArgs[3]) 
                    elif(size == 5):
                        method(listArgs[1], listArgs[2], listArgs[3], listArgs[4]) 
                    else:
                        method()
                    res = True
                else:
                    self.out(method)
        return res
    def getMusic(self, musicName="", fromName=""):
        tool.line()
        res = []
        self.out("歌曲名字[" + musicName + "] from:" + fromName)
        responce = self.http.do("http://music.163.com/api/search/get/web?csrf_token=", {
           "hlpretag":"",
           "hlposttag":"",
           "s":musicName,
           "type":1,
           "offset":0,
           "total":"true",
           "limit":5,
        })
        obj = tool.toJson(responce.read())
        songs = obj.get("result", {}).get("songs", [])
        self.out("抓取到音乐:")
        for item in songs:
            id = item.get("id", "")
            name = item.get("name", "")
            url = "http://link.hhtjim.com/163/" + str(id) + ".mp3"
            duration = item.get("duration", 0)
            music = {"url":url, "name":name, "fromName":fromName, "duration":duration}
            self.out("url:" + url + " name:" + name)
            res.append(music)

        return res
 # 手动控制
    def inputHello(self):
        self.out("开启输入监控!")
        self.help()
        while(True):
            try:
                cmd=raw_input("")
                if(cmd != ""):
                    if(not self.doMethod(cmd.split(" "))):
                        self.out("手动发送:" + cmd)
                        self.getMusic(cmd)
                        time.sleep(1)
            except Exception as e:
                self.out(repr(e))
        return
    def test(self):
        self.login()
        ThreadRun( "InputHello." + str(self.name),  self.inputHello ).start()

        tool.wait()
        return
 def __init__(self, server, port, auth_token):
     self.__server = server
     self.__http = Http(server)
     self.__http.set_port(port)
     self.__auth_token = auth_token