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

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

【效率工具】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

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5436532.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存