def search(query, offset, size): localResult = {'statusCode': 0, 'message': '', 'data': []} appKey = workflow().get_password(config.KC_OAUTH_TOKEN) log.info('appKey: %s' % (appKey)) # query the keyword from web server prefs = Preferences.current_prefs() session = requests.session() formData = {'keyword': query, 'from': offset, 'size': size} resp = session.post(url=config.LK_SEARCH_APP_URL, headers={ 'User-Agent': 'alfred/{0} workflow/{1}'.format( getAlfredVersion(workflow()), getWorkflowVersion()), 'Authorization': appKey, 'Content-Type': 'application/json; charset=UTF-8' }, data=json.dumps(formData), timeout=60) if resp.status_code == 200: log.info('search respond success') result = json.loads(resp.text) return result else: log.info('search respond failed') localResult['message'] = u'网络错误,请稍后重试' return localResult
def filter(args): util.workflow().add_item(u'需要更多查询次数?', u'立即前往我们的官方网站获取', arg=' '.join(args), valid=True, icon=icons.OPEN) util.workflow().add_item(u'取消', autocomplete=' ', icon=icons.CANCEL)
def commit(args, modifier=None): auth.deauthorize() util.workflow().clear_data() util.workflow().clear_cache() # print '您已经成功退出登录' # print 'Logout success' print '已退出登录'
def new_oauth_state(): import random import string state_length = 20 state = ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(state_length)) workflow().save_password(config.KC_OAUTH_STATE, state) return state
def filter(args): util.workflow().add_item( u'确定退出登录?', u'退出后您需要再次登录链刻账户才能正常使用workflow', arg=' '.join(args), valid=True, icon=icons.CHECKMARK ) util.workflow().add_item( u'取消', autocomplete=' ', icon=icons.CANCEL )
def alfred_is_dark(): # Formatted rgba(255,255,255,0.90) background_rgba = workflow().alfred_env['theme_background'] if background_rgba: rgb = [int(x) for x in background_rgba[5:-6].split(',')] return (0.299 * rgb[0] + 0.587 * rgb[1] + 0.114 * rgb[2]) / 255 < 0.5 return False
def filter(args): prefs = Preferences.current_prefs() # workflow().add_item( # u'查询结果个数', # u'设置服务器每页返回结果的最大个数', # autocomplete='-result_count ', # icon=icons.LIST # ) workflow().add_item(u'切换主题', u'在白色和黑色图标直接切换', arg='-pref retheme', valid=True, icon=icons.PAINTBRUSH) workflow().add_item(u'返回主菜单', autocomplete=' ', icon=icons.BACK)
def current_prefs(cls): if not cls._current_prefs: cls._current_prefs = Preferences( workflow().stored_data('links_prefs')) if not cls._current_prefs: cls._current_prefs = Preferences({}) log.info(cls._current_prefs) return cls._current_prefs
def authorize(): from multiprocessing import Process import urllib import webbrowser workflow().store_data('auth', 'started') state = new_oauth_state() data = urllib.urlencode({ 'client_id': config.LK_CLIENT_ID, 'redirect_uri': 'http://localhost:6311', 'state': state }) url = '%s?%s' % (config.LK_OAUTH_URL, data) # Start a server to await the redirect URL request after authorizing server = Process(target=await_token) server.start() # Open the authorization prompt in the default web browser webbrowser.open(url)
def commit(args, modifier=None): if 'update' in args: if workflow().start_update(): print 'workflow已经请求进行更新中' else: print '您已经升级到最新版本了' elif 'homepage' in args: import webbrowser webbrowser.open(config.LK_HOMEPAGE_URL) elif 'github' in args: import webbrowser webbrowser.open(config.LK_GITHUB_HOMEPAGE_URL)
def filter(args): workflow().add_item(u'访问官网', u'前往官方网站查看最新动态信息', arg='-about homepage', valid=True, icon=icons.INFO) workflow().add_item(u'您是开发者', u'前往我们Github主页', arg='-about github', valid=True, icon=icons.OPEN) workflow().add_item(u'更新版本', u'检测是否有新版本并进行更新', arg='-about update', valid=True, icon=icons.DOWNLOAD) workflow().add_item(u'返回主菜单', autocomplete=' ', icon=icons.BACK)
def filter(args): prefs = Preferences.current_prefs() icon = icons.TASK if prefs.maxResultCount == 7: icon = icons.TASK_COMPLETED workflow().add_item(u'设定最大值为 7', arg='-result_count max_7', valid=True, icon=icon) icon = icons.TASK if prefs.maxResultCount == 20: icon = icons.TASK_COMPLETED workflow().add_item(u'设定最大值为 20', u'VIP账户才能生效', arg='-result_count max_20', valid=True, icon=icon) workflow().add_item(u'返回主菜单', autocomplete=' ', icon=icons.BACK)
def filter(args): workflow().add_item( u'请先登录', u'使用您在链刻网注册的账号进行登录', arg=' '.join('login'), valid=True, icon=icons.ACCOUNT ) workflow().add_item( u'注册账号', u'没有账号?前往我们的官方网站进行免费注册', arg=' '.join('register'), valid=True, icon=icons.HASHTAG ) workflow().add_item( u'关于我们', u'查看我们的相关信息', autocomplete='-about ', icon=icons.INFO )
def filter(args): prefs = Preferences.current_prefs() log.info(args) queryWord = '' if len(args) >= 2: queryWord = '' for idx in range(1, len(args)): w = args[idx] queryWord = "%s %s" % (queryWord, w) queryWord = queryWord.strip() if not workflow().stored_data(config.KC_ENABLE_SEARCH): log.info('enable search false') log.info('store last time keyword: %s' % workflow().stored_data(config.KC_LAST_TIME_QUERY_WORD)) # the same keyword means this is page navigate action if queryWord != workflow().stored_data(config.KC_LAST_TIME_QUERY_WORD): workflow().add_item(u'需要先返回主菜单才能进行新的搜索', autocomplete=' ', icon=icons.BACK) workflow().store_data(config.KC_ENABLE_SEARCH, False) return workflow().add_item(u'返回主菜单', autocomplete=' ', icon=icons.BACK) log.info('begin to search') workflow().store_data(config.KC_ENABLE_SEARCH, False) # page index scmd = args[0] idx = scmd.find(':') if idx > 0: pidx = int(scmd[idx + 1:]) workflow().store_data(config.KC_CURRENT_PAGE_INDEX, pidx) else: workflow().store_data(config.KC_CURRENT_PAGE_INDEX, 0) # search log.info('begin to search %s' % (queryWord)) workflow().store_data(config.KC_LAST_TIME_QUERY_WORD, queryWord) result = search_api.search( queryWord, workflow().stored_data(config.KC_CURRENT_PAGE_INDEX) * prefs.maxResultCount, prefs.maxResultCount) if result['statusCode'] == 0: if 'data' in result and result['data'] != None and len( result['data']) > 0: # update query count statistic queryCount = result['data']['queryCount'] if 'max' in queryCount: workflow().store_data(config.KC_MAX_COUNT, queryCount['max']) if 'reserved' in queryCount: workflow().store_data(config.KC_RESERVED_COUNT, queryCount['reserved']) # vip if 'vip' in queryCount: log.info('vip = %s' % (queryCount['vip'])) workflow().store_data(config.KC_VIP_STATUS, queryCount['vip']) # download link item items = result['data']['items'] if items == None or len(items) == 0: workflow().add_item(u'没有查询到结果,更改关键词再试试吧') else: if len(items) > 1: cp = "" for item in items: cp = cp + item['name'] + '\n' cp = cp + pickDlLinks(item) + "\n" workflow().add_item(u'⌘+C 复制查询到的全部下载链接', copytext=cp, largetext=cp, icon=icons.COPY) for item in items: createDate = datetime.utcfromtimestamp( int(item['createDate'] / 1000)) ts = u'更新时间:{0}年{1}月{2}日'.format(createDate.year, createDate.month, createDate.day) dl = pickDlLinks(item) workflow().add_item(item['name'], ts, copytext=dl, largetext=item['name'] + '\n' + dl, icon=icons.APP) # next page has? if len(items) >= prefs.maxResultCount: workflow().add_item( u'下一页', autocomplete='-search:%s %s' % (workflow().stored_data(config.KC_CURRENT_PAGE_INDEX) + 1, queryWord), icon=icons.NEXT) else: workflow().add_item(u'没有查询到结果,更改关键词再试试吧') else: workflow().add_item(result['message'])
def oauth_token(): try: return workflow().get_password(config.KC_OAUTH_TOKEN) except PasswordNotFound: return None
def route(args): log.info(u'in route process') # debug # try: # workflow().delete_password(config.KC_OAUTH_TOKEN) # except PasswordNotFound as e: # log.error(e) handler = None command = [] command_string = '' action = 'none' if args: command_string = args[0] # log.info('route args') # for arg in args: # log.info(arg) else: log.info('route with empty args') command_string = re.sub(COMMAND_PATTERN, '', command_string) command = re.split(r' +', command_string) if command: action = re.sub(ACTION_PATTERN, '', command[0]) or 'none' if 'about'.find(action) == 0: from links.handlers import about handler = about elif not auth.is_authorized(): from links.handlers import login handler = login elif 'logout'.find(action) == 0: from links.handlers import logout handler = logout elif 'moreQuery'.find(action) == 0: from links.handlers import query_count handler = query_count elif 'pref'.find(action) == 0: from links.handlers import preferences handler = preferences elif 'result_count'.find(action) == 0: from links.handlers import result_count handler = result_count elif action.find('search') == 0: from links.handlers import search handler = search # If the command starts with a space (no special keywords), the workflow # creates a new task elif not command_string: from links.handlers import welcome handler = welcome else: from links.handlers import welcome handler = welcome if handler: if '--commit' in args: modifier = re.search(r'--(alt|cmd|ctrl|fn)\b', ' '.join(args)) if modifier: modifier = modifier.group(1) handler.commit(command, modifier) else: handler.filter(command) workflow().send_feedback()
def _set(self, key, value): if self._data.get(key) != value: self._data[key] = value workflow().store_data('links_prefs', self._data)
def deauthorize(): try: workflow().delete_password(config.KC_OAUTH_TOKEN) except PasswordNotFound: pass
def handle_authorization_url(url): import urlparse # Parse query data & params to find out what was passed parsed_url = urlparse.urlparse(url) params = urlparse.parse_qs(parsed_url.query) # request is either for a file to be served up or our test if 'appKey' in params and validate_oauth_state(params['state'][0]): workflow().save_password(config.KC_OAUTH_TOKEN, params['appKey'][0]) workflow().delete_password(config.KC_OAUTH_STATE) if 'maxCount' in params: workflow().store_data(config.KC_MAX_COUNT, params['maxCount'][0]) if 'reservedCount' in params: workflow().store_data(config.KC_RESERVED_COUNT, params['reservedCount'][0]) if 'userName' in params: workflow().store_data(config.KC_USER_NAME, params['userName'][0]) if 'vip' in params: workflow().store_data(config.KC_VIP_STATUS, params['vip'][0]) print '您已经成功登录' return True else: workflow().store_data('auth', 'login error') print '登录失败,请稍后重试' # Not a valid URL return False
import logging from logging.config import fileConfig import sys reload(sys) sys.setdefaultencoding('utf8') fileConfig('logging_config.ini') from links.util import workflow log = logging.getLogger('links') def main(wf): if len(wf.args) == 0: return outputString = wf.args[0] # log.info(outputString) if len(outputString) == 0: return if outputString.find('<?xml') == 0: # filter exception output return if outputString.find('-search-url') != 0: print outputString if __name__ == '__main__': log.info('begin notification filter') wf = workflow() sys.exit(wf.run(main, text_errors='--commit' in wf.args))
def filter(args): log.info(args) if len(args) >= 2: queryWord = '' for w in args: queryWord = "%s %s" % (queryWord, w) queryWord = queryWord.strip() prompt = u'根据您输入的关键词搜索软件的下载链接' if len(queryWord) > 0: prompt = u'搜索软件下载链接:%s' % (queryWord) workflow().add_item(u'搜索', prompt, arg='-search %s' % (queryWord), autocomplete='-search %s' % (queryWord), icon=icons.SEARCH) else: workflow().add_item(u'搜索', u'根据您输入的关键词搜索软件的下载链接', autocomplete=' ', icon=icons.SEARCH) else: workflow().add_item(u'搜索', u'根据您输入的关键词搜索软件的下载链接', autocomplete=' ', icon=icons.SEARCH) workflow().store_data(config.KC_ENABLE_SEARCH, True) workflow().store_data(config.KC_CURRENT_PAGE_INDEX, 0) reservedCount = u'%s: %s 次, %s: %s 次' % (u'本月剩余', workflow().stored_data( config.KC_RESERVED_COUNT), u'本月总共', workflow().stored_data( config.KC_MAX_COUNT)) workflow().add_item(u'获取更多查询次数', reservedCount, autocomplete='-moreQuery', icon=icons.LINK) workflow().add_item(u'精选应用', u'前往精选应用专区', arg='-jingxuan ', valid=True, icon=icons.STAR_REMOVE) workflow().add_item(u'我的收藏夹', u'查看网上收藏夹', arg='-favorite ', valid=True, icon=icons.HEART) workflow().add_item(u'帮助文档', u'前往我们的官方网站查看相关帮助文档', arg='-document ', valid=True, icon=icons.LIST) vipFlag = '' log.info(workflow().stored_data(config.KC_VIP_STATUS)) if workflow().stored_data(config.KC_VIP_STATUS): vipFlag = '(VIP)' logoutAccount = '%s: %s%s' % (u'退出您当前登录的账户', workflow().stored_data( config.KC_USER_NAME), vipFlag) workflow().add_item(u'退出登录', logoutAccount, autocomplete='-logout ', icon=icons.ACCOUNT) workflow().add_item(u'设置', autocomplete='-pref ', icon=icons.PREFERENCES) workflow().add_item(u'关于我们', u'查看我们的相关信息', autocomplete='-about ', icon=icons.INFO)
def oauth_state(): try: return workflow().get_password(config.KC_OAUTH_STATE) except PasswordNotFound: return None