3

1Password去重脚本

 1 year ago
source link: https://www.wyr.me/post/741
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

1Password去重脚本 - 轶哥

1Password去重脚本

随着时间的推移,1Password中的记录可能会出现重复(其实是1Password老版本的BUG导致的)。这些重复记录可能会导致混乱,并增加在查找需要的凭据时的困难。为了解决这个问题,我们创建了一个用于查找并删除重复项的Python脚本。

该脚本首先获取所有重复的title,然后提取相关的ID。接着,脚本通过比较Fields和URLs部分,找到重复的项目并将多余的项目ID添加到一个列表中。最后,根据需要,您可以选择删除多余的项目。

  1. 确保已安装Python 3,并确保1Password CLI(命令行界面)已经正确配置。
  2. 保存以下脚本到名为 1password_deduplicate.py 的文件中。
  3. 在终端中,导航到包含脚本的文件夹,然后运行 python 1password_deduplicate.py
  4. 脚本将显示需要删除的额外项目ID。如需删除这些项目,请取消脚本末尾相关行的注释,并重新运行脚本。

已同步到https://gist.github.com/yi-ge/7ac4563874f67d88140a8526a4ec2c82

import os
import re
import time
import pickle
import subprocess
from collections import defaultdict


def run_command(command, error_msg=None, show_output=True):
    try:
        output = subprocess.check_output(
            command, shell=True, text=True, stderr=subprocess.STDOUT)
        return output
    except subprocess.CalledProcessError as e:
        if error_msg:
            print(error_msg)
        if show_output:
            print(e.output)
        if ": EOF" in e.output:
            print('出错了,正在重试...')
            return run_command(command, error_msg, True)
        return e.output


def extract_fields_and_urls(detail):
    fields_start = detail.find("Fields:")
    urls_start = detail.find("URLs:")
    return detail[fields_start:urls_start]


# 获取重复的title列表
print("正在获取重复的title列表...")
command = "op item list | awk '{print $2}' | sort | uniq -d"
duplicated_titles = run_command(command).splitlines()

# 提取ID的正则表达式
id_pattern = re.compile(r'\b[a-zA-Z0-9]{26}\b')

# 存储每个title的详细信息
if os.path.exists('cache.pkl'):
    # 从文件中加载变量
    with open('cache.pkl', 'rb') as f:
        title_details = pickle.load(f)
else:
    # 计算新的变量title_details并将其写入文件
    title_details = defaultdict(list)
    with open('cache.pkl', 'wb') as f:
        pickle.dump(title_details, f)

times = 0

# 获取所有重复title的详细信息
print("正在获取所有重复title的详细信息...")
for title in duplicated_titles:
    error_msg = f"在尝试获取title \"{title}\" 的详细信息。"
    output = run_command(f"op item get {title}", error_msg, False)
    ids = id_pattern.findall(output)

    for item_id in ids:
        if any(d['id'] == item_id for d in title_details[title]):
            continue  # 如果已经存在该id对应的信息,则跳过
        error_msg = f"在尝试获取ID \"{item_id}\" 的详细信息时发生错误。。"
        item_info = run_command(f"op item get {item_id}", error_msg)
        print(item_info)
        title_details[title].append({'id': item_id, 'info': item_info})
        # 将变量title_details写入文件
        with open('cache.pkl', 'wb') as f:
            pickle.dump(title_details, f)

    times += 1
    if times % 10 == 0:
        print(f"已完成{times}个title的处理。")

# 检查重复项目并保留一条数据
extra_items = []

print("正在检查重复项目并保留一条数据...")
for title, details in title_details.items():
    unique_items = []

    for detail in details:
        fields_and_urls = extract_fields_and_urls(detail['info'])
        if fields_and_urls not in unique_items:
            unique_items.append(fields_and_urls)
        else:
            item_id = id_pattern.search(detail['info']).group()
            extra_items.append(item_id)

print("\n需要删除的额外项目ID:")
for item_id in extra_items:
    print(item_id)

# 根据需要,可以执行以下操作删除多余的项目
for item_id in extra_items:
    error_msg = f"删除 \"{item_id}\" 出现异常。"
    out = run_command(f"op item delete {item_id}", error_msg)
    print(out)

print('去重完成!')

正则表达式

在这个脚本中,我们使用正则表达式来匹配和提取项目ID。这种方法在处理文本数据时非常有效,可以帮助我们快速准确地找到所需信息。

  1. 在使用此脚本之前,请确保已经正确安装并配置了1Password CLI。具体信息和安装说明,请参阅官方文档
  2. 脚本默认仅显示需要删除的项目ID。如需实际删除这些项目,请在脚本末尾取消注释,然后重新运行脚本。请注意,删除操作不可逆,因此在执行之前,请确保您已备份相关数据。
  3. 请确保在使用此脚本时已登录1Password账户。如果尚未登录,请在命令行中运行 op signin 命令并按照提示进行操作。

本文介绍了一个名为《1Password去重脚本》的Python脚本。这个脚本可以帮助用户找出1Password中的重复项,并在确认后删除它们。通过使用这个脚本,您可以更轻松地管理1Password中的记录,从而提高工作效率和安全性。

注意: 代码由AI编写,人工测试及完善,脚本运行速度受限于1Password交互速度,整体比较慢。脚本会自动处理错误信息,出现网络错误提示不用担心会自动重试,如果不幸退出了脚本,再次执行脚本会自动执行未完成的任务。请执行删除前备份好数据,任何误删导致的数据丢失,本人及AI概不负责。(如果不幸直接删除了数据,30天内在GUI中的“最近删除”还有最后一次抢救机会)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK