def get_current_user(self): sid = self.get_secure_cookie("sid") secret = self.get_secure_cookie("secret") if not sid or not secret: return None self.nsp_user = NSPClient(sid, secret) svc_user = self.nsp_user.service('nsp.user') ret = svc_user.getInfo(['user.uid', 'user.username']) if ret is None or 'user.uid' not in ret or ret['user.uid'] == '': return None self.uid = '%s' % (ret['user.uid']) self.username = '******' % (ret['user.username']) user = {'uid' : self.uid, 'username' : self.username} return user
def sendMsg(): nsp = NSPClient('2', '8e68aa485d4c2a3853e1fd9dd278847d') svc = nsp.service('nsp.event') message_type = 'nsp.cloudprint' uid = 1130703 cid = '00d41d8cd98f00b204e980091546ffe6' files = list() ''' name = '小说.txt' f0 = {'name' : name, 'size' : '3265', 'md5' : 'd0ee66c260ae39fb1efb4f69879c50d3', 'url' : createDownloadUrl('c0o6hcik3l', '1', name)} files.append(f0) name = 'bitcask-intro.pdf' f1 = {'name' : name, 'size' : '324579', 'md5' : '72fe4623357be8446ad673fb91077f00', 'url' : createDownloadUrl('c0kbn3obzv', '1', name)} files.append(f1) name = '2E0BDF62d01.pdf' f2 = {'name' : name, 'size' : '152336', 'md5' : '1231ca284634f7a225422d97afbacd8f', 'url' : createDownloadUrl('c0j743rkh8', '1', name)} files.append(f2) ''' name = 'Getting Started.pdf' f3 = {'name' : name, 'size' : '127748', 'md5' : '2d75da7f0406283193cf04c3886c8574', 'url' : createDownloadUrl('c0n3la0jvh', '1', name)} files.append(f3) ret = svc.send(message_type, {'nsp.event.cid' : cid, 'action' : 'print', 'files' : files, 'source.uid' : uid, 'printer' : 'hp_p2015dn'}) print ret
def __init__(self, printers, http_client): # client id self.client = None # client secret self.secret = None self.nsp_app = NSPClient(options.appid, options.appsecret) # local directory #self.dirname = os.path.dirname(os.path.realpath(__file__)) self.dirname = '/etc/cloudprint' self.conf_file = '%s/conf.ini' % (self.dirname) self.data_file = '%s/data.ini' % (self.dirname) # check if client already init self.check() self.nsp_push = NSPClient('%s@%s' % (self.client, options.appid), '%s@%s' % (self.secret, options.appsecret)) self.printer = printers.split(',') self.http_client = http_client
def sendMsg(): nsp = NSPClient('50033', 'test50033bba8df90acb8eb160a8087f') svc = nsp.service('nsp.push') token = '5f2dde08fb4a106760be7d4fb7d3ebf817828' message_type = 'nsp.cloudprint' uid = 2 cid = '00574bc1e0bff0828890136748ce8c0f' files = list() ''' name = '小说.txt' f0 = {'name' : name, 'size' : '3265', 'md5' : 'd0ee66c260ae39fb1efb4f69879c50d3', 'url' : createDownloadUrl('c0o6hcik3l', '1', name)} files.append(f0) name = 'bitcask-intro.pdf' f1 = {'name' : name, 'size' : '324579', 'md5' : '72fe4623357be8446ad673fb91077f00', 'url' : createDownloadUrl('c0kbn3obzv', '1', name)} files.append(f1) name = '2E0BDF62d01.pdf' f2 = {'name' : name, 'size' : '152336', 'md5' : '1231ca284634f7a225422d97afbacd8f', 'url' : createDownloadUrl('c0j743rkh8', '1', name)} files.append(f2) ''' name = 'Getting Started.pdf' f3 = {'name' : name, 'size' : '127748', 'md5' : '2d75da7f0406283193cf04c3886c8574', 'url' : createDownloadUrl('c0n3la0jvh', '1', name)} files.append(f3) ret = svc.send(token, {'title' : name, 'content' : '%s %s' % ('print', name), 'data' : {'msg_type' : message_type, 'param' : {'nsp.event.cid' : cid, 'action' : 'print', 'files' : files, 'source.uid' : uid, 'printer' : 'hp_p2015dn'}}}) print ret
class BaseHandler(tornado.web.RequestHandler): def get_current_user(self): sid = self.get_secure_cookie("sid") secret = self.get_secure_cookie("secret") if not sid or not secret: return None self.nsp_user = NSPClient(sid, secret) svc_user = self.nsp_user.service('nsp.user') ret = svc_user.getInfo(['user.uid', 'user.username']) if ret is None or 'user.uid' not in ret or ret['user.uid'] == '': return None self.uid = '%s' % (ret['user.uid']) self.username = '******' % (ret['user.username']) user = {'uid' : self.uid, 'username' : self.username} self.nsp_app = NSPClient(options.appid, options.appsecret) return user
def login(self, username, password): '''sign in dbank account''' if username is None or username == '' \ and password is None or password == '': return False url = 'http://login.dbank.com/accounts/loginAuth' params = urlencode({'userDomain.user.email' : username, 'userDomain.user.password' : password, 'ru' : 'http://www.dbank.com/ServiceLogin.action'}) self.cookie = cookielib.CookieJar() self.opener = build_opener(HTTPCookieProcessor(self.cookie)) self.opener.addheaders = [ ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'), ('Accept-Charset', 'GBK,utf-8;q=0.7,*;q=0.3'), ('Accept-Encoding', 'gzip,deflate,sdch'), ('Accept-Language', 'zh-CN,zh;q=0.8'), ('Connection', 'keep-alive'), ('Content-Type', 'application/x-www-form-urlencoded'), ('Host', 'http://login.dbank.com'), ('Origin', 'http://www.dbank.com'), ('Referer', 'http://www.dbank.com/'), ('User-Agent', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7') ] request = Request(url, params) response = self.opener.open(request) info = response.info() cookies = self.cookie.make_cookies(response, request) for cookie in cookies: if cookie.name == 'client': self.client = cookie.value elif cookie.name == 'secret': self.secret = cookie.value elif cookie.name == 'session': self.session = cookie.value if self.client is None or self.client == '' \ or self.secret is None or self.secret == '' \ or self.session is None or self.session == '': return False self.nsp = NSPClient(self.session, self.secret) self.svc_msg = self.nsp.service('nsp.user.push') return True
def __init__(self, printer_name): # client id self.client = None # client secret self.secret = None # session for login self.session = None self.nsp = NSPClient(appid, appsecret) self.svc_auth = self.nsp.service('nsp.auth') # local directory self.dirname = os.path.dirname(os.path.realpath(__file__)) # config info of client self.filename = '%s/client.conf' % (self.dirname) # check if client already init self.check() self.printer_name = printer_name
class Client(object): '''cloud printer client''' def __init__(self, printers, http_client): # client id self.client = None # client secret self.secret = None self.nsp_app = NSPClient(options.appid, options.appsecret) # local directory #self.dirname = os.path.dirname(os.path.realpath(__file__)) self.dirname = '/etc/cloudprint' self.conf_file = '%s/conf.ini' % (self.dirname) self.data_file = '%s/data.ini' % (self.dirname) # check if client already init self.check() self.nsp_push = NSPClient('%s@%s' % (self.client, options.appid), '%s@%s' % (self.secret, options.appsecret)) self.printer = printers.split(',') self.http_client = http_client def check(self): '''init client''' infos = dict() if not os.path.exists(self.conf_file): self.create() with open('%s' % (self.conf_file), 'r') as fp: for line in fp: k, v = line.strip().split('=') infos[k] = v if 'client' not in infos or 'secret' not in infos: self.create() self.__dict__.update(infos) users = dict() if not os.path.exists(self.data_file): with open(self.data_file, 'w') as fp: pass else: with open(self.data_file, 'r') as fp: for line in fp: uid, username, status, regdate = line.strip().split('\t') users[uid] = {'uid' : uid, 'username' : username, 'status' : status, 'regdate' : datetime.strptime(regdate, '%Y-%m-%d %H:%M:%S')} self.__dict__['users'] = users def create(self): '''create client''' svc_auth = self.nsp_app.service('nsp.auth') ret = svc_auth.createClient(1) if 'errCode' in ret or 'errMsg' in ret: raise RuntimeError, "create client failure: %s" % (ret) self.client = ret['client'] self.secret = ret['secret'] if self.client is None or self.client == '' \ or self.secret is None or self.secret == '': raise RuntimeError, "create client failure: %s" % (ret) with open('%s' % (self.conf_file), 'w+') as fp: fp.write('client=%s\n' % (self.client)) fp.write('secret=%s\n' % (self.secret)) def subscribe(self): '''subscribe message''' message_type = 'nsp.cloudprint' svc_push = self.nsp_push.service('nsp.user.push') ret = svc_push.subscribe(message_type) if ret is None or ret == '' \ or 'nsp.http.query.status' not in ret or ret['nsp.http.query.status'] != '200': raise RuntimeError, "subscribe message failure: %s" % (ret) interval = ret['nsp.http.query.interval'] url = ret['nsp.http.query.url'] return url def download(self, url, **headers): '''get method of http''' host = urlparse.urlparse(url).hostname opener = build_opener() opener.addheaders = [(k, headers[k]) for k in headers] opener.addheaders.append(('Host', host)) request = Request(url) response = opener.open(request) info = response.info() return response.read() def print_file(self, dirname, filename, printer): '''print file by ext''' ext = os.path.splitext(filename)[1] if ext == '.pdf': pdf_file = '%s/%s' % (dirname, filename) ps_file = '%s/%s.ps' % (dirname, filename) call(['/usr/bin/pdftops', pdf_file, ps_file]) if not os.path.exists(ps_file): return False call(['/usr/bin/lpr', '-P', printer, ps_file]) os.remove(ps_file) elif ext == '.txt': txt_file = '%s/%s' % (dirname, filename) call(['/usr/bin/lpr', '-P', printer, txt_file]) else: return False return True def handle_response(self, response): t = threading.Thread(target=self._handle, args=(response,)) t.start() def _handle(self, response): waittime = time.time() if response.error: logging.error('response error:\t%s' % (response.error)) url = self.subscribe() logging.info('push tunnel:\t%s' % (url)) waittime = waittime + 10 else: logging.info('response body:\t%s' % (response.body.decode('utf-8'))) json = json_decode(response.body.decode('utf-8')) header = json['header'] if 'nsp.http.query.status' not in header or header['nsp.http.query.status'] != '200': logging.error('response status error:\t%s' % (json)) url = self.subscribe() logging.info('push tunnel:\t%s' % (url)) waittime = waittime + 10 else: interval = header['nsp.http.query.interval'] url = header['nsp.http.query.url'] if interval != '0': waittime = waittime + float(interval) body = json['body'] if 'nsp.message.type' in header and 'nsp.event.type' in header and body is not None: source_uid = '%s' % (body['source.uid']) if 'source.uid' in body else '' if source_uid in self.users and self.users[source_uid]['status'] == '1': cid = body['nsp.event.cid'] action = body['action'] printer = body['printer'] files = body['files'] if action == 'print': for f in files: logging.info('downloading:\t%s\t%s\t%s' % (f['name'], f['size'], f['md5'])) headers = { 'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Charset' : 'GBK,utf-8;q=0.7,*;q=0.3', 'Accept-Encoding' : 'gzip,deflate,sdch', 'Accept-Language' : 'zh-CN,zh;q=0.8', 'Connection' : 'keep-alive', 'User-Agent' : 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7', 'Referer' : 'http://www.dbank.com' } content = self.download(f['url'], **headers) if len(content) != int(f['size']): logging.error('file size error:\t%s\t%s\t%s' % (f['name'], len(content), int(f['size']))) continue if not os.path.exists('%s/data/' % (self.dirname)): os.makedirs('%s/data/' % (self.dirname)) origin_file = '%s/data/%s' % (self.dirname, f['name']) file_md5 = '' with open(origin_file, 'w+') as fp: file_md5 = md5_for_data(content) if file_md5 != f['md5']: logging.error('file md5 error:\t%s\t%s\t%s' % (f['name'], file_md5, f['md5'])) continue fp.write(content) logging.info('download success:\t%s' % (f['name'])) logging.info('printing:\t%s' % (f['name'])) ret = self.print_file('%s/data/' % (self.dirname), f['name'], printer) os.remove(origin_file) if ret is False: logging.error('print error:\t%s' % (f['name'])) continue logging.info('print success:\t%s' % (f['name'])) elif action == 'config': pass tornado.ioloop.IOLoop.instance().add_timeout(waittime, lambda: self.http_client.fetch(url, callback=self.handle_response, request_timeout=300))
class Client(object): '''cloud printer client''' def __init__(self, printer_name): # client id self.client = None # client secret self.secret = None # session for login self.session = None self.nsp = NSPClient(appid, appsecret) self.svc_auth = self.nsp.service('nsp.auth') # local directory self.dirname = os.path.dirname(os.path.realpath(__file__)) # config info of client self.filename = '%s/client.conf' % (self.dirname) # check if client already init self.check() self.printer_name = printer_name def check(self): '''init client''' if not os.path.exists(self.filename): self.create() infos = dict() with open('%s' % (self.filename), 'r') as fp: for line in fp: k, v = line.strip().split('=') infos[k] = v self.__dict__.update(infos) def create(self): '''create client''' ret = self.svc_auth.createClient(1) if 'errCode' in ret or 'errMsg' in ret: raise RuntimeError, "create client failure: code=%s\tmsg=%s" % (ret['errCode'], ret['errMsg']) client = ret['client'] secret = ret['secret'] if client is None or client == '' \ or secret is None or secret != '': raise RuntimeError, "create client failure: client=%s\tsecret=%s" % (client, secret) with open('%s' % (self.filename), 'w+') as fp: fp.write('client=%s\n' % (client)) fp.write('secret=%s\n' % (secret)) def login(self, username, password): '''sign in dbank account''' if username is None or username == '' \ and password is None or password == '': return False url = 'http://login.dbank.com/accounts/loginAuth' params = urlencode({'userDomain.user.email' : username, 'userDomain.user.password' : password, 'ru' : 'http://www.dbank.com/ServiceLogin.action'}) self.cookie = cookielib.CookieJar() self.opener = build_opener(HTTPCookieProcessor(self.cookie)) self.opener.addheaders = [ ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'), ('Accept-Charset', 'GBK,utf-8;q=0.7,*;q=0.3'), ('Accept-Encoding', 'gzip,deflate,sdch'), ('Accept-Language', 'zh-CN,zh;q=0.8'), ('Connection', 'keep-alive'), ('Content-Type', 'application/x-www-form-urlencoded'), ('Host', 'http://login.dbank.com'), ('Origin', 'http://www.dbank.com'), ('Referer', 'http://www.dbank.com/'), ('User-Agent', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7') ] request = Request(url, params) response = self.opener.open(request) info = response.info() cookies = self.cookie.make_cookies(response, request) for cookie in cookies: if cookie.name == 'client': self.client = cookie.value elif cookie.name == 'secret': self.secret = cookie.value elif cookie.name == 'session': self.session = cookie.value if self.client is None or self.client == '' \ or self.secret is None or self.secret == '' \ or self.session is None or self.session == '': return False self.nsp = NSPClient(self.session, self.secret) self.svc_msg = self.nsp.service('nsp.user.push') return True def subscribe(self): '''subscribe message''' #self.message_type = 'nsp.cloudprint' self.message_type = 'nsp.push.resource' ret = self.svc_msg.subscribe(self.message_type) if ret is None or ret == '' \ or 'nsp.http.query.status' not in ret or ret['nsp.http.query.status'] != '200': return False interval = ret['nsp.http.query.interval'] url = ret['nsp.http.query.url'] return url def get(self, url, referer = ''): '''get method of http''' host = urlparse(url).hostname self.opener = build_opener() self.opener.addheaders = [ ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'), ('Accept-Charset', 'GBK,utf-8;q=0.7,*;q=0.3'), ('Accept-Encoding', 'gzip,deflate,sdch'), ('Accept-Language', 'zh-CN,zh;q=0.8'), ('Connection', 'keep-alive'), ('Host', host), ('User-Agent', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7') ] if referer is not None and referer != '': self.opener.addheaders.append(('Referer', referer)) request = Request(url) response = self.opener.open(request) info = response.info() return response.read() def print_file(self, dirname, filename): '''print file by ext''' ext = os.path.splitext(filename)[1] if ext == '.pdf': pdf_file = '%s/%s' % (dirname, filename) ps_file = '%s/%s.ps' % (dirname, filename) #call(['/usr/bin/pdftops', pdf_file, ps_file]) if not os.path.exists(ps_file): os.remove(pdf_file) return False #call(['/usr/bin/lpr', '-P', self.printer_name, ps_file]) os.remove(ps_file) elif ext == '.txt': txt_file = '%s/%s' % (dirname, filename) #call(['/usr/bin/lpr', '-P', self.printer_name, txt_file]) else: return False return True def createAuthUrl(self): machine = '%s@%s' % (getusername(), gethostname()) h = ('%s' % (time())).split('.')[0] v = md5('%s%s%s%s' % (self.client, machine, self.printer_name, h)).hexdigest()[0:8] return 'http://apps.dbank.com/cloudprint/register.php?cid=%s&machine=%s&printer=%s&h=%s&v=%s' % (self.client, machine, self.printer_name, h, v)