这个方法的前提是了解 EndNote 的一个机制:使用 EndNote 打开 txt 或 pdf 文件时,EndNote 会自动解析并尝试将文件导入到 EndNote 中,而用 EndNote 打开文件的步骤在 Windows 中可以用 CMD 命令简化
D:
cd D:\Program Files (x86)\EndNote X9
EndNote.exe D:\ChromeDownload\CNKI-20221118000000000.txt
这段命令实现的效果就是切换到 EndNote 的安装目录,再调用 EndNote.exe 打开导出的 EndNote 格式的 txt 文件
而输入 CMD 命令这一步骤还可用程序简化,比如在 Python 中可以用下面的命令实现 CMD 同样的效果,注意在 Python 中想一次运行多行命令,需要用 && 连接
import os
cmd = "D: && cd D:\Program Files (x86)\EndNote X9 && EndNote.exe D:\ChromeDownload\CNKI-20221118000000000.txt"
os.system(cmd)
既然这个步骤可以用程序实现,那就可以直接用 Python 监控浏览器的下载目录,一旦发现有新的 "CNKI-xxx.txt" 格式的文件,就调用 EndNote 打开该文件,同样可以监控剪贴板,如果剪贴板新增内容符合 EndNote 格式,那么就将剪贴板内容存储到浏览器的下载目录
同样的道理,可以监控 Elsevier 导出的 ris 文件,全部代码如下:
import os
import time
import pyperclip
def get_file(path):
file_list = []
# 遍历D:\ChromeDownload目录下所有txt文件的文件名
for file in os.listdir(path):
# 如果文件以"CNKI-"开头,以".txt"结尾,或者以".ris"结尾
if (file.startswith('CNKI-') and file.endswith('.txt')) or file.endswith('.ris'):
# 将文件名和文件创建时间添加到file_list列表中
file_list.append(file)
return file_list
# 从settings.txt中读取第一行字符串,以":"分割,获取分割后的第2个字符串
download_path = open('settings.txt', 'r', encoding='utf-8').readlines()[0].split(':')[1].strip()
# 从settings.txt中读取第二行字符串,以":"分割,获取分割后的第2个字符串
end_note_path = open('settings.txt', 'r', encoding='utf-8').readlines()[1].split(':')[1].strip()
# 将end_note_path以':'分割,获取分割后的第1个字符串
end_note_disk = end_note_path.split(':')[0]
print("下载路径:", download_path)
print("EndNote路径:", end_note_path)
print("EndNote磁盘:", end_note_disk)
print("正在监控 " + download_path + " 文件夹及剪贴板")
file_array = get_file(download_path)
clip_text = pyperclip.paste()
# 每秒运行一次get_file()函数,对比文件名和文件创建时间是否有变化
while True:
tem_file_list = get_file(download_path)
clip_text_tem = pyperclip.paste()
if file_array != tem_file_list:
print('文件有变化')
# 获取不一样的文件
new_file = set(tem_file_list) ^ set(file_array)
print(new_file)
# 更新file_array
file_array = tem_file_list
cmd = end_note_disk + ": && cd " + end_note_path + " && EndNote.exe " + download_path + new_file.pop()
os.system(cmd)
if clip_text != clip_text_tem:
print('剪贴板有变化')
# 如果clip_text_tem以"%0 Journal Article"开头
if clip_text_tem.startswith('%0 Journal Article'):
# 将clip_text_tem写入文件"D:\ChromeDownload\CNKI-"+时间戳+".txt"
with open(download_path + "\CNKI-" + str(int(time.time())) + '.txt', 'w', encoding='utf-8') as f:
f.write(clip_text_tem)
# 更新clip_text
clip_text = clip_text_tem
time.sleep(0.5)
这样就可以实现,在浏览器下载 EndNote 文件、ris 文件或者剪贴板复制 EndNote 格式的文件后,自动导入到 EndNote
但这样操作还是差了一步,即将 PDF 文件也添加到 EndNote 中,这个功能要想实现有点复杂,这里暂且记录一下实现的方法
要想实现这一功能,要了解 EndNote 导入 PDF 的机制:通过抓包可以看到,EndNote 会在 PDF 文件的元数据中读取 DOI 链接,然后将"https://www.crossref.org/openurl/?pid=thomr:thomr922&noredirect=true&id=" 与 DOI 链接拼接,再访问这个链接即可得到包括文献的标题、作者、期刊等信息的 XML 文件,再解析该 XML 文件即可得到文献的相关信息
有些文献的 PDF 直接导入 EndNote 不能获取文献信息的原因也就有两个,一是 PDF 文件的元数据中没有包括 DOI 链接,二是 crossref.org 这个网站没有收录该文献,这样也会返回一个 XML 文件,但文件中没有相关信息
不管是哪个原因,我们都可以用程序解决这一问题,第一种情况可以给 PDF 元数据添加 DOI 链接,第二种情况稍微有点复杂,可以通过拦截 crossref.org 返回的 XML 文件,替换成有文献信息的 XML 文件即可,Python 抓包工具可以用 mitmproxy
复杂的地方在于分析知网提供的 EndNote 文件格式和 crossref.org 返回的 XML 文件格式,还要同时监控 PDF 文件和 EndNote 文件
先写到这,有时间再继续,有兴趣的朋友可以试试看