scifinder

获取的化学信息,用于科研学习研究.

当前为 2023-10-19 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name scifinder
  3. // @namespace https://origin-scifinder.cas.org
  4. // @version 2.6.4
  5. // @description 获取的化学信息,用于科研学习研究.
  6. // @author sparrow
  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. if($("#mainFrame").length>0){
  25. return false;
  26. }
  27. var css =GM_getResourceText("customCSS");
  28. GM_addStyle(css);
  29. /*创建页面的按钮*/
  30. 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>'
  31. $("body").append(modal)
  32. $("body").append('<div style="position: absolute;;right: 0;top: 350px;width:40px;"> <button type="button" id ="kj_addon" class="btn btn-primary">菜单</button></div></iframe>')
  33. $("body").append('<div id ="login_btn" style="position: absolute;cursor: move;;right: -12px;top: 314px;"><button type="button" id ="kj_login" class="btn btn-primary">打开登陆窗口</button></div>')
  34. $('body').append('<div id="draggable" style="position: absolute;cursor: move;;right: 40px;top: 250px;width:209px;margin:20px 5px;"> </div></iframe>')
  35.  
  36. var loginkey = localStorage.getItem("loginkey");
  37. console.log(loginkey)
  38. if(loginkey!=null){
  39. $('#draggable').html('<div id="kj_btns" ><button type="button" style="background-color:#da4f49;color:white;height: 45px;padding: 6px;float:right;" id="kj_selected">scifinder查看DOI的文献及物质</button><button type="button" style="background-color:#da4f49;color:white;height: 45px;padding: 6px;float:right;" id="kj_selected3">scifinder查看基本信息</button><button type="button" style="background-color:#da4f49;color:white;height: 45px;padding: 6px;float:right;" id="kj_selected4">scifinder查看合成路线</button><button type="button" style="background-color:#da4f49;color:white;height: 45px;padding: 6px;float:right;" id="kj_selected1">Scifinder-n查看基本信息</button><button type="button" style="background-color:#da4f49;color:white;height: 45px;padding: 6px;float:right;" id="kj_selected2">Scifinder-n查看合成路线及文献</button></div>')
  40. $('#login_btn').hide()
  41.  
  42. }else{
  43. /*登陆模态框*/
  44. $('#kj_login').on("click",function(event){
  45. /*登陆组件*/
  46. 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>'
  47. var login_button = '<button type="button" class="btn btn-primary" id="loginBtn">登陆</button><button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>'
  48.  
  49. $("div.modal-body").html(login)
  50. $("div.modal-footer").html(login_button)
  51. $('#myModal').modal("show")
  52. })
  53.  
  54. }
  55.  
  56.  
  57. // 点击登陆按钮,发送 AJAX 请求进行登陆操作
  58. $(document).on('click', '#loginBtn', function() {
  59. var username = $("#username").val();
  60. var password = $("#password").val();
  61. /*$('#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>')*/
  62. $("#loginMsg").html("登陆成功。");
  63. $('#myModal').modal("hide")
  64. GM_xmlhttpRequest({
  65. url:"http://120.55.59.217:8001/login/access-token",
  66. method :"POST",
  67. data:JSON.stringify({
  68. username: username,
  69. password: password
  70. }),
  71. headers: {
  72. "Content-type": "application/json"
  73. },
  74. onload:function(response){
  75. console.log(response.responseText)
  76. var resp = JSON.parse(response.responseText)
  77. if(resp.token!=null){
  78. var loginkey = localStorage.setItem("loginkey",resp.token);
  79. $("#loginMsg").html("登陆成功。");
  80. location.reload();
  81.  
  82. }else{
  83. alert('重新登陆')
  84. }
  85. }
  86. });
  87.  
  88. })
  89.  
  90. /*存储页面获取到的数据*/
  91. var data={}
  92. /*操作菜单显示出来*/
  93. $(document).on('click', '#kj_addon', function() {
  94. if($('#kj_btns').is(':hidden')){
  95. $("#kj_btns").show()
  96. }else{
  97. $("#kj_btns").hide()
  98. }
  99.  
  100.  
  101. })
  102. /*scifinder获取文献信息*/
  103. $(document).on('click', '#kj_selected', function() {
  104. $("div.modal-body").html('')
  105. var list=[]
  106. $('.substanceRN>a:nth-child(1)').each(function(){
  107.  
  108. var cas = $(this).text()
  109. list.push(cas)
  110. })
  111.  
  112. var list1=[]
  113. $('ol.citation li').each(function(){
  114.  
  115. var citiation = $(this).text()
  116. list1.push(citiation)
  117. })
  118. var doi=""
  119. var Doi = $('div#sideBar div.toolBox>div.toolBoxBody>div').text()
  120. Doi = Doi.split('\n')
  121. console.log(Doi)
  122. for(var i=0;i<Doi.length;i++){
  123. if(Doi[i].indexOf("DOI")!=-1){
  124. doi=Doi[i].split('DOI:')[1]
  125. }
  126. }
  127. /* var doi = $('li.breadcrumb:nth-child(1)>span.label').text()
  128. if(doi.indexOf('Document ID')!=-1){
  129. doi=doi
  130. }else{
  131. doi=''
  132. }
  133. doi = doi?doi.replaceAll('Document ID','').trim():''*/
  134. var item={
  135. casno:list?list:[],
  136. citiations:list1?list1:[],
  137. doi:doi?doi.trim():""
  138. }
  139.  
  140. console.log(item)
  141. if(item.doi){
  142. console.log(item)
  143. 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>'
  144.  
  145. $("div.modal-body").html(ff)
  146. $("div.modal-footer").html('<button type="button" id="refer" class="btn btn-primary">提交数据</button>')
  147.  
  148. $('#myModal').modal("show")
  149. /*------------------*/
  150. data=item
  151. }else{
  152. alert("确认是否为文献页面!")
  153. }
  154.  
  155. })
  156. /*scifinder基本信息*/
  157. $(document).on('click', '#kj_selected3', function() {
  158. $("div.modal-body").html('')
  159. var list=[]
  160. $('div.otherNames ul li').each(function(){
  161. var name = $(this).text()
  162. list.push(name)
  163. })
  164. var MolecularWeight=''
  165. $('dl.keyProperties dt').each(function(){
  166. if($(this).text()=='Molecular Weight'){
  167. MolecularWeight = $('dl.keyProperties dd:first()').text()
  168. console.log(MolecularWeight)
  169. }
  170. })
  171. /*相关casno*/
  172. var relate_Cas=[]
  173. if($('div.imgMapWrapper>div>div[data-rn]').length>0){
  174. $('div.imgMapWrapper>div>div[data-rn]').each(function(){
  175. casno = $(this).attr('data-rn')
  176. relate_Cas.push(casno)
  177. })
  178. }else if($('.componentNumber').length>0){
  179. var re_cas = $('.componentNumber').text()
  180. casno = re_cas.match(/\d{2,}-\d{2}-\d/)[0]
  181. relate_Cas.push(casno)
  182. }
  183. console.log(relate_Cas)
  184.  
  185.  
  186. var molecularFormula=$('div.molecularFormula').text()
  187. var enname = $('div.indexName').text()
  188. /*同结构casno*/
  189. var result_cas = $('li span.label.current').text().trim()
  190. var casno = $('li.breadcrumb span.label:first()').text()
  191. var canonical = $('div.canonical> div.smiles-text').text()
  192. var isomeric = $('div.isomeric> div.smiles-text').text()
  193. casno = casno.match(/\d{2,}-\d{2}-\d/)
  194. casno = casno?casno[0]:""
  195. var item={
  196. casno:casno?casno.match(/\d{2,}-\d{2}-\d/)[0].trim():"",
  197. ename: enname,
  198. canonical:"",
  199. isomeric:"",
  200. result_cas:result_cas,
  201. related_cas :relate_Cas,
  202. enbm:list,
  203. molecularFormula:molecularFormula?molecularFormula:"",
  204. MolecularWeigh:MolecularWeight?MolecularWeight:"",
  205. }
  206.  
  207. console.log(item)
  208. if(item.casno && item.result_cas && item.ename){
  209. console.log(item)
  210. 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>相关casno:</dt><dd>'+relate_Cas.join("<br>")+'</dd><dt>别名:</dt><dd>'+list.join("<br>")+'</dd><dt>molecularFormula:</dt><dd>'+item.molecularFormula+'</dd><dt>MolecularWeigh:</dt><dd>'+item.MolecularWeigh+'</dd><dt>canonical:</dt><dd>'+item.canonical+'</dd><dt>isomeric:</dt><dd>'+item.isomeric+'</dd></dl>'
  211.  
  212. $("div.modal-body").html(ff)
  213. $("div.modal-footer").html('<button type="button" id="baseinfo" class="btn btn-primary">提交数据</button>')
  214.  
  215. $('#myModal').modal("show")
  216. data=item
  217.  
  218. }else{
  219. alert("确认是否为基本信息页面!")
  220. }
  221.  
  222. })
  223. /*scifinder-n基本信息*/
  224. $(document).on('click', '#kj_selected1', function() {
  225. $("div.modal-body").html('')
  226. var list=[]
  227. $('ul.list-unstyled.list-striped li>span').each(function(){
  228. var name = $(this).text()
  229. list.push(name)
  230. })
  231.  
  232. var enname = $('.substance-name.ng-star-inserted').text()
  233. /*同结构casno*/
  234. var result_cas = ""
  235. if($('.row.preferred-rn.ng-star-inserted a').length>0){
  236. result_cas = $('.row.preferred-rn.ng-star-inserted a').text().trim()
  237. }
  238. /*相关casno*/
  239. var relate_Cas=[]
  240. var relate_cas = ""
  241. if($('div.ng-star-inserted sf-multi-image-component p.small.sub-component.substance-rn.ng-star-inserted').length>0){
  242. relate_cas = $('div.ng-star-inserted sf-multi-image-component p.small.sub-component.substance-rn.ng-star-inserted').text()
  243. relate_Cas.push(relate_cas)
  244. }
  245. $('.row.substance-withoutSafsUri.ng-star-inserted a').each(function(){
  246. var cas = $(this).text()
  247. if(cas){
  248. relate_Cas.push(cas)
  249. }
  250. })
  251.  
  252. var casno = $('title').text()
  253. var canonical = $('div.canonical> div.smiles-text').text()
  254. var isomeric = $('div.isomeric> div.smiles-text').text()
  255. casno = casno.match(/\d{2,}-\d{2}-\d/)
  256. casno = casno?casno[0]:""
  257. var item={
  258. casno:casno.trim(),
  259. ename: enname,
  260. canonical:canonical?canonical:"",
  261. isomeric:isomeric?isomeric:"",
  262. result_cas:result_cas?result_cas:casno.trim(),
  263. related_cas:relate_Cas?relate_Cas:[],
  264. enbm:list,
  265. molecularFormula:"",
  266. MolecularWeigh:"",
  267. }
  268.  
  269. console.log(item)
  270. if(item.casno && item.result_cas && item.ename){
  271. console.log(item)
  272. 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>相关casno:</dt><dd>'+relate_Cas.join("<br>")+'</dd><dt>别名:</dt><dd>'+list.join("<br>")+'</dd><dt>molecularFormula:</dt><dd>'+item.molecularFormula+'</dd><dt>MolecularWeigh:</dt><dd>'+item.MolecularWeigh+'</dd><dt>canonical:</dt><dd>'+item.canonical+'</dd><dt>isomeric:</dt><dd>'+item.isomeric+'</dd></dl>'
  273.  
  274. $("div.modal-body").html(ff)
  275. $("div.modal-footer").html('<button type="button" id="baseinfo" class="btn btn-primary">提交数据</button>')
  276.  
  277. $('#myModal').modal("show")
  278. data=item
  279.  
  280. }else{
  281. alert("确认是否为基本信息页面!")
  282. }
  283.  
  284. })
  285. /*scifinder合成路线及文献*/
  286. $(document).on('click', '#kj_selected4', function() {
  287. $("div.modal-body").html('')
  288. $('.dropdown-menu').remove()
  289. var list=[]
  290. var casno = $('li.breadcrumb span.label:first()').text()
  291. $('#listContent ol.results>li').each(function(){
  292. var patents=$('span.detailLinkWrapper a.patentPakLogo.patentPDFRelatedTriggerLink.noSaveOrdinal',this).text()
  293. console.log(patents)
  294. if(!patents){
  295.  
  296. var rel=[]
  297. $('.resultContent>div.scheme>div>img',this).each(function(){
  298. var name = $(this).attr('alt')
  299.  
  300. rel.push(name)
  301.  
  302. })
  303. var step=[]
  304. $('table.rxnstages tr',this).each(function(){
  305. var title = $(this).text()
  306. step.push(title)
  307.  
  308. })
  309. var title = $('dl.reference dt a[id]',this).text()
  310. var authors=$('dd.detailWho',this).text()
  311. var brief=$('dd.detailSource',this).text()
  312. var steps=$('.rxnNotes',this).text()
  313. steps = steps?steps.split('Steps:')[1].split(',')[0].trim():""
  314. var rate = $('.yield:last()',this).text()
  315. var dd = rel.join('')
  316. var cas_start = dd.split('->')[0].split('+')
  317. var cas_end = dd.split('->')[1].split('+')
  318. var item={
  319. cas_start:cas_start,
  320. cas_end:cas_end,
  321. rate:rate,
  322. relate:step,
  323. title:title,
  324. authors:authors,
  325. breif:brief?brief.trim():"",
  326. steps:steps,
  327. casno:casno?casno.match(/\d{2,}-\d{2}-\d/)[0]:""
  328. }
  329. list.push(item)
  330. console.log(list)
  331. }
  332.  
  333. })
  334. if(list.length>0){
  335. console.log(list)
  336. var content=''
  337. for(var j=0;j<list.length;j++){
  338. 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].steps+'</dd><dt>实验步骤:</dt><dd>'+list[j].relate.join('<br>').trim()+'</dd></dl><br>'
  339. content+=ff
  340. }
  341. $("div.modal-body").html('<dt>CasNo:</dt><dd>'+list[0].casno+'</dd> <br>'+content)
  342. $("div.modal-footer").html('<button type="button" id="compose" class="btn btn-primary">提交数据</button>')
  343. $('#myModal').modal("show")
  344.  
  345. data={"casno":list[0].casno,"compose":list}
  346.  
  347. }else{
  348. alert("确认是否为合成路线页面!")
  349. }
  350.  
  351. })
  352.  
  353. /*scifinder-n合成路线及文献*/
  354. $(document).on('click', '#kj_selected2', function() {
  355. $("div.modal-body").html('')
  356. $('.dropdown-menu').remove()
  357. var list=[]
  358. var casno =$(".toolbar-title span[class]:last-child").text()
  359. var reg=new RegExp(/\d{2,}-\d{2}-\d/)
  360. casno = reg.exec(casno)
  361. if(casno){
  362. casno=casno[0].trim()
  363. }
  364. var binname = $(".selected-bin-name").first().text()
  365. if(binname=="Product"){
  366. $('sf-reaction-result-page .reaction-result-answers').each(function(index){
  367.  
  368. var cas_start=[]
  369. $('.reaction-tile-reactant .rn-no-image.ng-star-inserted',this).each(function(){
  370. cas_start.push($(this).text().trim())
  371. })
  372. $('.reaction-tile-reactant img',this).each(function(){
  373. var cas = $(this).attr("alt").trim()
  374. cas_start.push(cas)
  375. })
  376. var cas_end=[]
  377. $('.reaction-tile-product .rn-no-image.ng-star-inserted',this).each(function(){
  378. cas_end.push($(this).text().trim())
  379. })
  380. $('.reaction-tile-product img',this).each(function(){
  381.  
  382. var cas = $(this).attr("alt")
  383. cas_end.push(cas)
  384. })
  385. $("div.summary",this).each(function(){
  386. var patent = $("span.patent-pak-logo-container.logo-container",this).length
  387. if(!patent){
  388. var authors = $("span.authors-text",this).text().trim()
  389. var title = $('h4>a',this).text().trim()
  390. var breif=$(".bibliography",this).text().trim()
  391.  
  392.  
  393. var relate=[]
  394. $('.summary-steps.ng-star-inserted div.summary-step.ng-star-inserted',this).each(function(){
  395. $('div.summary-stage.ng-star-inserted',this).each(function(){
  396. var step=$(this).text().trim()
  397. relate.push(step)
  398. })
  399.  
  400. })
  401. var rate = $('span.yield-value.ng-star-inserted',this).text()
  402. var item={title:title,authors:authors,breif:breif,cas_start:cas_start,cas_end:cas_end,relate:relate,rate:rate,casno:casno}
  403. list.push(item)
  404. }
  405. /专利结束*/
  406. })
  407.  
  408. })
  409. }else{
  410. alert("请先选择Product复选框!")
  411. }
  412. if(list.length>0){
  413. console.log(list)
  414. var content=''
  415. for(var j=0;j<list.length;j++){
  416. 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>'
  417. content+=ff
  418. }
  419. $("div.modal-body").html('<dt>CasNo:</dt><dd>'+list[0].casno+'</dd> <br>'+content)
  420. $("div.modal-footer").html('<button type="button" id="compose" class="btn btn-primary">提交数据</button>')
  421. $('#myModal').modal("show")
  422.  
  423. data={"casno":list[0].casno,"compose":list}
  424.  
  425. }else{
  426. alert("确认是否为合成路线页面!")
  427. }
  428.  
  429. })
  430. /*相关文献及casno信息*/
  431. $(document).on('click', '#refer', function() {
  432. GM_xmlhttpRequest({
  433. url:"http://120.55.59.217:8001/references/",
  434. method :"POST",
  435. data:JSON.stringify(data),
  436. headers: {
  437. "Content-type": "application/json",
  438. "token": loginkey
  439. },
  440. onload:function(response){
  441. console.log(response.responseText)
  442. var resp = JSON.parse(response.responseText)
  443. if(resp.code==400){
  444. localStorage.removeItem('loginkey')
  445. alert("请重新登录");
  446. }else{
  447. $("#loginMsg").html("发送成功。");
  448. alert("发送成功");}
  449. }
  450. });
  451.  
  452. });
  453. /*接口结束*/
  454. /*基本信息*/
  455. $(document).on('click', '#baseinfo', function() {
  456. GM_xmlhttpRequest({
  457. url:"http://120.55.59.217:8001/info/",
  458. method :"POST",
  459. data:JSON.stringify(data),
  460. headers: {
  461. "Content-type": "application/json",
  462. "token":loginkey
  463. },
  464. onload:function(response){
  465. console.log(response.responseText)
  466. var resp = JSON.parse(response.responseText)
  467. console.log(resp)
  468. if(resp.code==400){
  469. localStorage.removeItem('loginkey')
  470. alert("请重新登录");
  471. }else{
  472. $("#loginMsg").html("发送成功。");
  473. alert("发送成功");}
  474. }
  475. });
  476. });
  477. /*接口结束*/
  478. /*合成路线信息*/
  479. $(document).on('click', '#compose', function() {
  480. GM_xmlhttpRequest({
  481. url:"http://120.55.59.217:8001/composes/",
  482. method :"POST",
  483. data:JSON.stringify(data),
  484. headers: {
  485. "Content-type": "application/json",
  486. "token": loginkey
  487. },
  488. onload:function(response){
  489. console.log(response.responseText)
  490. var resp = JSON.parse(response.responseText)
  491. if(resp.code==400){
  492. localStorage.removeItem('loginkey')
  493. alert("请重新登录");
  494. }else{
  495. $("#loginMsg").html("发送成功。");
  496. alert("发送成功");}
  497. }
  498. });
  499. });
  500. /*接口结束*/
  501. // Your code here...
  502. })();