这篇文章的脚本已发布到 Greasy Fork(油叉)平台,你可以前往 知网 参考文献 bibtex 天津大学 (greasyfork.org)  进行下载安装。后续脚本更新将在该平台更新。230511
   最近不是开始写毕业论文了嘛,使用到 LaTeX 进行写作。其中,导入参考文献部分需要以 BibTeX 格式写进模板中。
 Google Scholar 网站上存在兼容 BibTeX 的参考文献信息,但是知网里没有这种格式的导出,这时就可以借助脚本实现这个功能。
 这里分享我的魔改推导步骤,不想看过程的直接复制后文源码(DIFF 文件,记得删前面的 ± 号)。
    本文仅适用于天津大学校内登录用户,代码并不具有普遍性。各位读者可以根据思路自行改动。
    在介绍使用脚本方法之前先简要说明我之前的解决方案。
 通过以下几个步骤,可以轻松完成参考文献的生成。
  在谷歌学术搜索中,点击学术搜索设置。  页面打开之后,在文献管理软件选项中选择显示导入 BibTeX 的链接,单击保存设置,退出。  在谷歌学术搜索中检索到文献后,在文献条目区域单击导入 BibTeX 选项,页面中出现文献的引用信息。    格式是这样的:
 1 2 3 4 5 6 7 8 9 @article{刘娟2020基于,   title={基于 Python 爬虫的职位信息数据分析和可视化系统实现},   author={刘娟 and 管希东},   journal={Software Engineering and Applications},   volume={9},   pages={317},   year={2020},   publisher={中文学术期刊, 汉斯出版社, Hans Publishers} } 
知网没有直接导出 BibTeX 文献导出格式的功能,但是有一个格式跟它很像。
   在文章介绍页面点击导出参考文献
 
    选择“更多引用格式”
 
    选择 NoteExpress
 
     对应着 BibTeX 的格式,你就可以自己写咯。
 使用浏览器插件 Tampermonkey,在 Greasy Fork 中搜索脚本:
 
  读图片的介绍,知道该脚本的原理就是把知网 NodeExpress 格式进行转换,理解这一点方便我们进行后续的魔改
   安装后,在知网文章介绍页面中会多出按钮,点击后 BibTeX 格式的参考文献会自动复制到粘贴板中。如果你试过了没有问题,那么本篇文章到此结束。
 
 由于我使用的是学校账号打开的知网,知网的网址与相关接口都不一样,这个脚本就不会起作用。那么接下来就是魔改时刻。
 这个脚本只有在特定的地址才发挥作用,不然你会看不到上文图中多出的按钮。
 因为我的知网文章首页地址是这样的:
 1 https://<一堆字符>.eds.tju.edu.cn/kcms2/article/abstract<后面省略参数> 
所以我就想办法增加这条规则:
 1 https://<一堆字符>.eds.tju.edu.cn/kcms2/article/abstract* 
 添加的 URL 规则根据你的具体情况进行设计
   在源代码中增加这一行规则,ctrl+s 保存即可。
 
 打开 TamperMonkey 脚本管理界面,点击设置选项卡增加用户匹配:
 
 保存后重新访问文章简介页试试看,出现 BibTex 按钮此部分就成功了。
 经过上一步后,虽然出现了按钮,但不起作用。打开控制台会出现报错信息:
 
 看了一下脚本的源码,它发送的 POST 请求地址为:
 1 https://kns.cnki.net/kns8/manage/APIGetExport 
 这里的接口地址我们可以改一下。之前我们提到脚本原理就是读取知网 NoteExpress 格式进行 BibTeX 的转换。这里我通过抓包,得到接口的地址:
 
 那么我们就可以把这串地址粗暴的写进去。(注意配合通配符使用)
 改对了 POST 请求发送的地址还不够,该脚本不能正确解析返回数据。
 返回的数据是字符串:
 1 2 3 4 5 6 7 8 9 10 11 12 <ul class='literature-list'> <li> 	{Reference Type}: Journal Article<br> 	{Title}: Flask框架在数据可视化的应用<br> 	{Author}: 陈嘉发;黄宇靖;<br> 	{Author Address}: 惠州卫生职业技术学院教育技术与信息中心;<br> 	{Journal}: 福建电脑<br> 	... 	{Database Provider}: CNKI<br> </li> </ul> <input id="traceid" type="hidden" value="cf4aca8f33f5471f9c383ebf93578d2f.227.16837969341201267"> 
经过调试与源码推测我们需要的是 <li> 标签中的内容。
 对应的正则表达式为:(附工具:正则表达式在线测试 | 菜鸟工具 (runoob.com) )
 对应的 js 语句(多了个转义符 \):
 1 var  ss = data.match (/(?<=<li>).*(?=<\/li>)/g )
一顿编辑源码与 BUG 修复就 OK 了(具体编辑看 DIFF 文件)!
 使用效果:
 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 @article{cite_ label,    title={flask框架在数据可视化的应用},    author={陈嘉发;黄宇靖;},    authoraddress={惠州卫生职业技术学院教育技术与信息中心;},    journal={福建电脑},    year={2022},    volume={38},    number={12},    pages={44-48},    keywords={flask框架;python爬虫;数据可视化图表库},    abstract={我就省略了,一大串的},    isbn/issn={1673-2782},    notes={35-1115/tp},    doi={10.16707/j.cnki.fjpc.2022.12.009},    databaseprovider={cnki}, } 
 提一点,在我的模板中,cite_label 不能是中文,否则编译出错。我使用的是天津大学毕业论文模板:嵌入式软件工程实验室/天津大学本科毕业论文 Latex 模板 - 码云 - 开源中国 (gitee.com) 
    此处不再更新,新版本请前往 Greasy Fork 平台进行下载安装。DIFF 文件进提供修改参考。
   diff 文件。把减号行删除,删除加号行的加号即可得目的源文件。
 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 // ==UserScript== // @name         知网 参考文献 bibtex // @namespace    https://github.com/HawkTom // @require      https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js // @version      1.1.1 // @description  从知网文献中直接复制bibtex - // @author       Hao + // @author       Hao, uuanqin // @match        https://kns.cnki.net/kcms/detail/detail.aspx?dbcode=* // @match        http://kns.cnki.net/kcms/detail/detail.aspx?dbcode=* + // @match        https://*.eds.tju.edu.cn/kcms2/article/abstract* // @grant        none // ==/UserScript== (function() {     'use strict';     jQuery(document).ready(function($) {         window.onload = function(){             var a = document.getElementById("paramdbname")             var b = document.getElementById("paramfilename")             var fileid = a.getAttribute("value") + '!' + b.getAttribute("value") +'!1!0'             var x = document.getElementsByClassName("btn-tool")             var input = document.createElement('li')             input.setAttribute("id", "bibbtn")             input.setAttribute("class", "btn-quote")             //input.setAttribute("type", "button")             input.setAttribute("title", "Bibtex")             //input.setAttribute("onclick", "func(this)") href=\"javascript:void(0)\" onclick=\"getBib()\             input.innerHTML = "<a><i></i>Bibtex</a>"             x[0].children[0].append(input)             $("#bibbtn").click(function(){ +           	var url = window.location.hostname; // 得到 *.eds.tju.edu.cn -            	$.post("https://kns.cnki.net/kns8/manage/APIGetExport", +               $.post(`https://${url}/kns8/manage/ShowExport`,                 {                   filename:fileid,                   displaymode:"NoteExpress"                 },                 function(data){                     console.log(data);                     var bibtext = "" -                   var ss = data.data[0].value[0] -                   var ssl = ss.split("<br>") +                   var ss = data.match(/(?<=<li>).*(?=<\/li>)/g) // .data[0].value[0] +                   console.log(ss); // 输出调试而已 +                   var ssl = ss[0].split("<br>")                     for (var i=0; i<ssl.length-1; i++){                         var k = ssl[i].toLocaleLowerCase().split(" ").join("").split(":")                         var item = k[0]                         var detail = k[1]                         if (item == "{referencetype}"){                             if (detail == "journalarticle"){                                 bibtext = "@article{cite_label ,\n"                             }                             else if(detail == "conferenceproceedings"){                                 bibtext = "@inproceedings{cite_label ,\n"                             }                         }                         else if(item == "{issue}"){ -                           bibtext = bibtext + "   {number}={" + detail + "},\n" +                           bibtext = bibtext + "   number={" + detail + "},\n" // 不明白这里的number为什么要括起来                         }                         else {                             bibtext = bibtext + "   " + item.substr(1, item.length-2) + "={" + detail + "},\n"                         }                     }                     bibtext += "}"                     //console.log(bibtext)                     const copad = document.createElement('textarea')                     copad.value = bibtext                     document.body.appendChild(copad)                     copad.select()                     document.execCommand('Copy')                     document.body.removeChild(copad)                 });             })         };     }) })(); 
作者本人已顺利从天大毕业,相关校园网账号已封禁,因此无法再对此脚本进行测试与维护。欢迎天大大佬们继续改进与维护脚本。