scifinder

从scifinder和scifinder-n中获取所需要的化学信息

当前为 2023-06-14 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name scifinder
  3. // @namespace https://origin-scifinder.cas.org
  4. // @version 2.3.9
  5. // @description 从scifinder和scifinder-n中获取所需要的化学信息
  6. // @author zhaomeng
  7. // @match https://*/*
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net
  9. // @grant unsafeWindow
  10. // @grant GM_getResourceText
  11. // @grant GM_addStyle
  12. // @grant GM_xmlhttpRequest
  13. // @resource customCSS https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css
  14. // @require https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js
  15. // @require https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js
  16. // @require https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js
  17. // @license MIT
  18. // ==/UserScript==
  19.  
  20. (function() {
  21. 'use strict';
  22. /*将以下的js脚本注入浏览器页面,实现页面元素点选,获取页面的css*/
  23. /* globals jQuery, $, waitForKeyElements */
  24. var css =GM_getResourceText("customCSS");
  25. GM_addStyle(css);
  26. /*创建页面的按钮*/
  27. var modal = '<div class="modal fade in" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"><div class="modal-dialog"><div class="modal-content" style="width:800px;"><div class="modal-header"><button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button><h4 class="modal-title" id="myModalLabel">Scifinder数据</h4></div><div class="modal-body"></div><div class="modal-footer"><button type="button" class="btn btn-primary">提交数据</button></div></div><!-- /.modal-content --> </div><!-- /.modal --></div>'
  28. $("body").append(modal)
  29. $('body').append('<div id="draggable" style="position: absolute;cursor: move;;left: 0;top: 250px;width:209px;background-color:white;padding-top:30px;margin:20px;"> <button type="button" id ="kj_login" class="btn btn-primary">打开登陆窗口</button></div></iframe>')
  30.  
  31.  
  32. var loginkey = localStorage.getItem("loginkey");
  33. console.log('11111111111111111')
  34. console.log(loginkey)
  35. if(loginkey!=null){
  36. $('#draggable').html('<button type="button" style="background-color:#da4f49;color:white;height: 45px;padding: 6px;" id="kj_selected">查看DOI的文献及物质</button><button type="button" style="background-color:#da4f49;color:white;height: 45px;padding: 6px;" id="kj_selected1">查看Scifinder-n基本信息</button><button type="button" style="background-color:#da4f49;color:white;height: 45px;padding: 6px;" id="kj_selected2">查看Scifinder-n合成路线及文献</button>')
  37.  
  38. }else{
  39. /*登陆模态框*/
  40. $('#kj_login').on("click",function(event){
  41. /*登陆组件*/
  42. var login = '<form><div class="form-group"><label for="username">用户名:</label><input type="text" class="form-control" id="username" placeholder="请输入用户名"></div><div class="form-group"><label for="password">密码:</label><input type="password" class="form-control" id="password" placeholder="请输入密码"></div></form><div id="loginMsg"></div>'
  43. var login_button = '<button type="button" class="btn btn-primary" id="loginBtn">登陆</button><button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>'
  44.  
  45. $("div.modal-body").html(login)
  46. $("div.modal-footer").html(login_button)
  47. $('#myModal').modal("show")
  48. })
  49.  
  50. }
  51.  
  52.  
  53. // 点击登陆按钮,发送 AJAX 请求进行登陆操作
  54. $(document).on('click', '#loginBtn', function() {
  55. var username = $("#username").val();
  56. var password = $("#password").val();
  57. /*$('#draggable').html('<button type="button" style="background-color:#da4f49;color:white;height: 45px;padding: 6px;" id="kj_selected">查看DOI的文献及物质</button><button type="button" style="background-color:#da4f49;color:white;height: 45px;padding: 6px;" id="kj_selected1">查看Scifinder-n基本信息</button><button type="button" style="background-color:#da4f49;color:white;height: 45px;padding: 6px;" id="kj_selected2">查看Scifinder-n合成路线及文献</button>')*/
  58. $("#loginMsg").html("登陆成功。");
  59. $('#myModal').modal("hide")
  60. GM_xmlhttpRequest({
  61. url:"http://120.55.59.217:8001/login/access-token",
  62. method :"POST",
  63. data:JSON.stringify({
  64. username: username,
  65. password: password
  66. }),
  67. headers: {
  68. "Content-type": "application/json"
  69. },
  70. onload:function(response){
  71. console.log(response.responseText)
  72. var resp = JSON.parse(response.responseText)
  73. if(resp.token!=null){
  74. var loginkey = localStorage.setItem("loginkey",resp.token);
  75. $("#loginMsg").html("登陆成功。");
  76. location.reload();
  77. }else{
  78. alert('重新登陆')
  79. }
  80. }
  81. });
  82.  
  83. })
  84.  
  85.  
  86. //获取需要拖动的元素
  87. var draggableElement = document.getElementById("draggable");
  88.  
  89. //记录拖动状态的变量
  90. var isDragging = false;
  91.  
  92. //记录鼠标位置和元素位置的变量
  93. var currentX;
  94. var currentY;
  95. var initialX;
  96. var initialY;
  97. var xOffset = 0;
  98. var yOffset = 0;
  99.  
  100. //添加鼠标按下事件监听器
  101. draggableElement.addEventListener("mousedown", dragStart);
  102.  
  103. //添加鼠标移动事件监听器
  104. draggableElement.addEventListener("mousemove", drag);
  105.  
  106. //添加鼠标释放事件监听器
  107. draggableElement.addEventListener("mouseup", dragEnd);
  108.  
  109. //添加鼠标离开事件监听器
  110. draggableElement.addEventListener("mouseleave", dragEnd);
  111.  
  112. //鼠标按下时触发
  113. function dragStart(e) {
  114. initialX = e.clientX - xOffset;
  115. initialY = e.clientY - yOffset;
  116.  
  117. if (e.target === draggableElement) {
  118. isDragging = true;
  119. }
  120. }
  121.  
  122. //鼠标移动时触发
  123. function drag(e) {
  124. if (isDragging) {
  125. e.preventDefault();
  126.  
  127. currentX = e.clientX - initialX;
  128. currentY = e.clientY - initialY;
  129.  
  130. xOffset = currentX;
  131. yOffset = currentY;
  132.  
  133. setTranslate(currentX, currentY, draggableElement);
  134. }
  135. }
  136.  
  137. //鼠标释放时触发
  138. function dragEnd(e) {
  139. initialX = currentX;
  140. initialY = currentY;
  141.  
  142. isDragging = false;
  143. }
  144.  
  145. //设置元素位置的函数
  146. function setTranslate(xPos, yPos, el) {
  147. el.style.transform = "translate3d(" + xPos + "px, " + yPos + "px, 0)";
  148. }
  149. /*存储页面获取到的数据*/
  150. var data={}
  151.  
  152. /*获取文献信息*/
  153. $(document).on('click', '#kj_selected', function() {
  154. $("div.modal-body").html('')
  155. var list=[]
  156. $('.substanceRN>a:nth-child(1)').each(function(){
  157.  
  158. var cas = $(this).text()
  159. list.push(cas)
  160. })
  161.  
  162. var list1=[]
  163. $('ol.citation li a:nth-child(1)').each(function(){
  164.  
  165. var citiation = $(this).text()
  166. list1.push(citiation)
  167. })
  168. var doi = $('li.breadcrumb:nth-child(1)>span.label').text()
  169. doi = doi?doi.replaceAll('Document ID','').trim():''
  170. var item={
  171. casno:list,
  172. citiations:list1,
  173. doi:doi
  174. }
  175.  
  176. console.log(item)
  177. if(item.casno && item.citiations&& item.doi){
  178. console.log(item)
  179. var ff = '<dl><dt>DOI:</dt><dd>'+item.doi+'</dd><dt>CASNO:</dt><dd>'+list.join("<br>")+'</dd><dt>Citiations:</dt><dd>'+list1.join("<br>")+'</dd></dl>'
  180.  
  181. $("div.modal-body").html(ff)
  182. $("div.modal-footer").html('<button type="button" id="refer" class="btn btn-primary">提交数据</button>')
  183.  
  184. $('#myModal').modal("show")
  185. /*------------------*/
  186. data=item
  187. }else{
  188. alert("确认是否为文献页面!")
  189. }
  190.  
  191. })
  192.  
  193. /*scifinder-n基本信息*/
  194. $(document).on('click', '#kj_selected1', function() {
  195. $("div.modal-body").html('')
  196. var list=[]
  197. $('ul.list-unstyled.list-striped li span').each(function(){
  198. var name = $(this).text()
  199. list.push(name)
  200. })
  201.  
  202. var enname = $('.substance-name.ng-star-inserted').text()
  203. var result_cas = $('span>mark').text().trim()
  204. var casno = $('title').text()
  205. var canonical = $('div.canonical> div.smiles-text').text()
  206. var isomeric = $('div.isomeric> div.smiles-text').text()
  207. casno = casno.match(/\d{2,}-\d{2}-\d/)
  208. casno = casno?casno[0]:""
  209. var item={
  210. casno:casno.trim(),
  211. ename: enname,
  212. canonical:canonical?canonical:"",
  213. isomeric:isomeric?isomeric:"",
  214. result_cas:result_cas,
  215. enbm:list,
  216. }
  217.  
  218. console.log(item)
  219. if(item.casno && item.result_cas && item.ename){
  220. console.log(item)
  221. var ff = '<dl><dt>搜索CasNo:</dt><dd>'+item.casno+'</dd><dt>英文名:</dt><dd>'+item.ename+'</dd><dt>结果CasNo:</dt><dd>'+item.result_cas+'</dd><dt>别名:</dt><dd>'+list.join("<br>")+'</dd><dt>canonical:</dt><dd>'+item.canonical+'</dd><dt>isomeric:</dt><dd>'+item.isomeric+'</dd></dl>'
  222.  
  223. $("div.modal-body").html(ff)
  224. $("div.modal-footer").html('<button type="button" id="baseinfo" class="btn btn-primary">提交数据</button>')
  225.  
  226. $('#myModal').modal("show")
  227. data=item
  228.  
  229. }else{
  230. alert("确认是否为基本信息页面!")
  231. }
  232.  
  233. })
  234.  
  235. /*合成路线及文献*/
  236. $(document).on('click', '#kj_selected2', function() {
  237. $("div.modal-body").html('')
  238. $('.dropdown-menu').remove()
  239. var list=[]
  240. var casno =$(".toolbar-title span[class]:last-child").text()
  241. casno = casno?casno.trim():''
  242. $('sf-reaction-result-page .reaction-result-answers').each(function(index){
  243. var authors = $("span.authors-text",this).text().trim()
  244. var title = $('h4>a',this).text().trim()
  245. var breif=$(".bibliography",this).text().trim()
  246. var cas_start=[]
  247. $('.reaction-tile-reactant .rn-no-image.ng-star-inserted',this).each(function(){
  248. cas_start.push($(this).text().trim())
  249. })
  250. $('.reaction-tile-reactant img',this).each(function(){
  251. var cas = $(this).attr("alt").trim()
  252. cas_start.push(cas)
  253. })
  254. var cas_end=[]
  255. $('.reaction-tile-product .rn-no-image.ng-star-inserted',this).each(function(){
  256. cas_end.push($(this).text().trim())
  257. })
  258. $('.reaction-tile-product img',this).each(function(){
  259.  
  260. var cas = $(this).attr("alt")
  261. cas_end.push(cas)
  262. })
  263. var relate=[]
  264. $('.summary-steps.ng-star-inserted div.summary-step.ng-star-inserted',this).each(function(){
  265. $('div.summary-stage.ng-star-inserted',this).each(function(){
  266. var step=$(this).text().trim()
  267. relate.push(step)
  268. })
  269.  
  270. })
  271. var rate = $('.yield-value',this).text()
  272. var item={title:title,authors:authors,breif:breif,cas_start:cas_start,cas_end:cas_end,relate:relate,rate:rate,casno:casno}
  273. list.push(item)
  274. })
  275. if(list.length>0){
  276. console.log(list)
  277. var content=''
  278. for(var j=0;j<list.length;j++){
  279. var ff = '<dl><dt>'+(j+1)+'.标题:</dt><dd>'+list[j].title+'</dd><dt>作者:</dt><dd>'+list[j].authors+'</dd><dt>简介:</dt><dd>'+list[j].breif+'</dd><dt>合成路线:</dt><dd>'+list[j].cas_start.join("+")+'->'+list[j].cas_end.join("+")+'</dd><dt>产率:</dt><dd>'+list[j].rate+'</dd><dt>实验步骤:</dt><dd>'+list[j].relate.join('<br>').trim()+'</dd></dl><br>'
  280. content+=ff
  281. }
  282. $("div.modal-body").html('<dt>CasNo:</dt><dd>'+list[0].casno+'</dd> <br>'+content)
  283. $("div.modal-footer").html('<button type="button" id="compose" class="btn btn-primary">提交数据</button>')
  284. $('#myModal').modal("show")
  285.  
  286. data={"casno":list[0].casno,"compose":list}
  287.  
  288. }else{
  289. alert("确认是否为合成路线页面!")
  290. }
  291.  
  292. })
  293. /*相关文献及casno信息*/
  294. $(document).on('click', '#refer', function() {
  295. GM_xmlhttpRequest({
  296. url:"http://120.55.59.217:8001/references/",
  297. method :"POST",
  298. data:JSON.stringify(data),
  299. headers: {
  300. "Content-type": "application/json",
  301. "token": loginkey
  302. },
  303. onload:function(response){
  304. console.log(response.responseText)
  305. var resp = JSON.parse(response.responseText)
  306. if(resp.code==400){
  307. localStorage.removeItem('loginkey')
  308. alert("请重新登录");
  309. }else{
  310. $("#loginMsg").html("发送成功。");
  311. alert("发送成功");}
  312. }
  313. });
  314.  
  315. });
  316. /*接口结束*/
  317. /*基本信息*/
  318. $(document).on('click', '#baseinfo', function() {
  319. GM_xmlhttpRequest({
  320. url:"http://120.55.59.217:8001/info/",
  321. method :"POST",
  322. data:JSON.stringify(data),
  323. headers: {
  324. "Content-type": "application/json",
  325. "token":loginkey
  326. },
  327. onload:function(response){
  328. console.log(response.responseText)
  329. var resp = JSON.parse(response.responseText)
  330. if(resp.code==400){
  331. localStorage.removeItem('loginkey')
  332. alert("请重新登录");
  333. }else{
  334. $("#loginMsg").html("发送成功。");
  335. alert("发送成功");}
  336. }
  337. });
  338. });
  339. /*接口结束*/
  340. /*合成路线信息*/
  341. $(document).on('click', '#compose', function() {
  342. GM_xmlhttpRequest({
  343. url:"http://120.55.59.217:8001/composes/",
  344. method :"POST",
  345. data:JSON.stringify(data),
  346. headers: {
  347. "Content-type": "application/json",
  348. "token": loginkey
  349. },
  350. onload:function(response){
  351. console.log(response.responseText)
  352. var resp = JSON.parse(response.responseText)
  353. if(resp.code==400){
  354. localStorage.removeItem('loginkey')
  355. alert("请重新登录");
  356. }else{
  357. $("#loginMsg").html("发送成功。");
  358. alert("发送成功");}
  359. }
  360. });
  361. });
  362. /*接口结束*/
  363. // Your code here...
  364. })();