【效率工具】Mac上Alfred 实现查询 360/Chrome浏览器 历史记录+书签

利用Mac上的Alfred软件+Python实现兼容360和谷歌浏览器历史记录和书签的插件,便于我们随时随地跳转指定的网页

效果展示

搜索关键词nba相关的书签和历史记录,回车跳转对应链接


原理篇

找到浏览器书签和历史记录文件的数据存储位置和数据格式,并用python进行解析,再结合Alfred进行展示和使用

"""
浏览器书签是json文件存储
360浏览器书签位置:/Users/xxx/Library/Application Support/360Chrome/Default/360UID2547290641_V8/Bookmarks
谷歌浏览器:/Users/xxx/Library/Application Support/Google/Chrome/Default/Bookmarks

历史记录是sqlite文件存储
360浏览器历史记录位置:/Users/xxx/Library/Application Support/360Chrome/Default/History -- urls表
谷歌浏览器历史记录位置: /Users/xxx/Library/Application Support/Google/Chrome/Default/History -- urls表
"""

利用navicat查看sqlite

直接指定数据库文件建立链接

查看表结构

解决database is locked

360浏览器在使用时,直接访问它的History sqlite数据库文件会报错database is locked,推测是360会始终维持着排它锁,导致其他线程无法访问,解决方法是直接实时cp一份源文件出来进行read操作

Alfred插件核心代码

import copy
import json
import sqlite3
import os
import sys
from urllib import parse

# 书签存在位置
booksDir = '/Users/xxx/Library/Application Support/360Chrome/Default/360UID2547290641_V8/Bookmarks'
bookList = []

# 历史记录存在位置
historyDir = '/Users/xxx/Library/Application\ Support/360Chrome/Default/History'
# 指定一个历史记录缓存位置 避免database is locked
tempDir = '/Users/cxy/360History'
historyList = []

# 关键词查找逻辑
def AddList(allList, url , name, keylist):
    flag1 = 0
    flag2 = 0
    # 多个关键词同时在名称中包含 或者 多个关键词同时在url中包含
    for j in keylist:
        if j.lower() in name.lower():
            flag1 += 1
        # url中的url编码部门也要参与搜索
        if parse.quote(j).lower() in url.lower():
            flag2 += 1
    if flag1 == len(keylist):
        allList.append({'name': name, 'url': url, 'type':1})
    elif flag2 == len(keylist):
        allList.append({'name': name, 'url': url, 'type': 2})

# 加载json文件
def loadJsonFile(route):
    with open(route, 'r', encoding='utf8')as fp:
        json_data = json.load(fp)
    return json_data


# json递归
def getUrlsInBookmarks(root, keylist):
    for i in root:
        if i['type'] != 'folder':
            url = i['url']
            name = i['name']
            AddList(bookList,url,name,keylist)
        else:
            getUrlsInBookmarks(i['children'], keylist)


def getBooks(keylist):
    bookmarks = loadJsonFile(booksDir)
    getUrlsInBookmarks(bookmarks['roots']['bookmark_bar']['children'], keylist)

def getHistory(keylist):
    # sqlite文件拷贝后使用 防止浏览器线程给文件加锁无法访问
    os.system('cp '+historyDir+' '+tempDir)
    conn = sqlite3.connect(tempDir)
    cursor = conn.cursor()
    SQL = """SELECT DISTINCT(url), title, datetime((last_visit_time/1000000)-11644473600, 'unixepoch', 'localtime') 
                                        AS last_visit_time FROM urls ORDER BY last_visit_time DESC """
    cursor.execute(SQL)
    query_result = cursor.fetchall()
    cursor.close()
    conn.close()
    nameList = []
    for i in query_result:
        name = i[1]
        url = i[0]
        # 去重
        if name != '' and name in nameList:
            continue
        else:
            nameList.append(name)
        AddList(historyList, url, name, keylist)

def printResult(historyList, bookList):
    items = {"items": []}
    template = {
        "title": "",
        "subtitle": "",
        "arg": "",
        "icon": {
            "path": ""
        }
    }
    for i in bookList:
        template["arg"] = i['url']
        template["icon"]['path'] = 'mark.png'
        if i['type'] == 1:
            template["title"] = i['name']
            template["subtitle"] = i['url']
        if i['type'] == 2:
            template["title"] = parse.unquote(i['url'])
            template["subtitle"] = i['name']
        items["items"].append(copy.deepcopy(template))
    for i in historyList:
        template["arg"] = i['url']
        template["icon"]['path'] = 'history.png'
        if i['type'] == 1:
            template["title"] = i['name']
            template["subtitle"] = i['url']
        if i['type'] == 2:
            template["title"] = parse.unquote(i['url'])
            template["subtitle"] = i['name']
        items["items"].append(copy.deepcopy(template))
    print(json.dumps(items,ensure_ascii=False))

if __name__ == '__main__':
    keylist = sys.argv[1:]
    getBooks(keylist)
    getHistory(keylist)
    printResult(historyList, bookList)

workflow文件下载和使用

链接: https://pan.baidu.com/s/1hm1S51zb_mHOi6ADbuunow 提取码: m0lw

下载完成后,修改插件代码中历史记录和书签的存储位置即可使用

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在Mac上,有两款常用的剪贴板历史记录工具:Paste和Alfred。Paste是一款运行在Mac OS平台上的剪切板小工具,拥有华丽的界面效果,可以记录最近指定条数的剪切板信息,方便用户随时调用,是一款非常实用的剪贴板工具。而Alfred是一款全能型的助手工具,其中包含了剪贴板历史记录功能。当你在进行复制操作时,Alfred会自动记录剪贴板的内容,包括文本、图片和文件,并且可以指定条目的过期时间。你可以通过热键或关键字来打开Alfred的剪贴板历史记录,方便回忆之前所操作的复制剪切记录,并知道是从哪个程序进行复制的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Paste for Mac(剪切板历史管理工具)](https://blog.csdn.net/Mac_mimi/article/details/115488416)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Mac效率神器Alfred系列教程---剪切板历史记录](https://blog.csdn.net/Macdidiwei/article/details/119632867)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值