Beispiel #1
0
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
Beispiel #2
0
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)
Beispiel #3
0
def commit(args, modifier=None):
    auth.deauthorize()
    util.workflow().clear_data()
    util.workflow().clear_cache()

    # print '您已经成功退出登录'
    # print 'Logout success'
    print '已退出登录'
Beispiel #4
0
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
Beispiel #5
0
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
    )
Beispiel #6
0
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
Beispiel #7
0
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
Beispiel #9
0
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)
Beispiel #10
0
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)
Beispiel #11
0
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)
Beispiel #12
0
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)
Beispiel #13
0
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
    )
Beispiel #14
0
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'])
Beispiel #15
0
def oauth_token():
    try:
        return workflow().get_password(config.KC_OAUTH_TOKEN)
    except PasswordNotFound:
        return None
Beispiel #16
0
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)
Beispiel #18
0
def deauthorize():
    try:
        workflow().delete_password(config.KC_OAUTH_TOKEN)
    except PasswordNotFound:
        pass
Beispiel #19
0
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)
Beispiel #22
0
def oauth_state():
    try:
        return workflow().get_password(config.KC_OAUTH_STATE)
    except PasswordNotFound:
        return None