// ==UserScript== // @name Bilibili B站开播提醒 // @namespace http://tampermonkey.net/ // @version 0.6 // @description 请手动打开我的关注页面并放置在后台(https://link.bilibili.com/p/center/) 有主播开播时自动发送系统级浏览器提醒 // @author P // @include https://link.bilibili.com/p/center/* // @connect bilibili.com // @grant GM_xmlhttpRequest // @grant GM_openInTab // @grant GM_notification // @downloadURL none // ==/UserScript== console.log("开播提醒init") var baseURL = "https://live.bilibili.com/" var save={} var all = 0 shim_GM_notification () //Source: https://blog.csdn.net/dingwen_888/article/details/81977352 function difference(setA, setB) { var _difference = new Set(setA); for (var elem of setB) { _difference.delete(elem); } return _difference; } /*--- Cross-browser Shim code follows: Source: https://stackoverflow.com/questions/36779883/userscript-notifications-work-on-chrome-but-not-firefox */ function shim_GM_notification () { if (typeof GM_notification === "function") { return; } window.GM_notification = function (ntcOptions) { checkPermission (); function checkPermission () { if (Notification.permission === "granted") { fireNotice (); } else if (Notification.permission === "denied") { console.log ("User has denied notifications for this page/site!"); return; } else { Notification.requestPermission ( function (permission) { console.log ("New permission: ", permission); checkPermission (); } ); } } function fireNotice () { if ( ! ntcOptions.title) { console.log ("Title is required for notification"); return; } if (ntcOptions.text && !ntcOptions.body) { ntcOptions.body = ntcOptions.text; } var ntfctn = new Notification (ntcOptions.title, ntcOptions); if (ntcOptions.onclick) { ntfctn.onclick = ntcOptions.onclick; } if (ntcOptions.timeout) { setTimeout ( function() { ntfctn.close (); }, ntcOptions.timeout); } } } } function newSetFromDict(d){ var mem=new Set() for (var i in d){ mem.add(i) } return mem } const ON=1 function append_notify(mem,res,i){ var status; var done=0 var uid if(mem===null){ mem=newSetFromDict(save) //console.log(mem) //DEBUG } for(var each in res.data.list){ //console.log(res.data.list[each]) uid=res.data.list[each]["roomid"] status=res.data.list[each]["live_status"] if(status!=ON){ done=1 break } if (!(uid in save)){ save[uid] = status continue //DEBUG }else if (save[uid]==status){ continue } save[uid]=status mem.add(uid) var notificationDetails = function(){ var tempUrl = uid return { text: res.data.list[each]["title"], title: res.data.list[each]["uname"]+'开播了', image: res.data.list[each]["face"], timeout: 60000, onclick: function () { console.log ("Notice clicked."); GM_openInTab(baseURL+tempUrl,{active: true, insert: true}) //window.focus (); } } }() GM_notification (notificationDetails) } //Rem //console.log(done) if(done==0){ check(i+1,mem) }else{ for (var left in difference(newSetFromDict(save),mem)){save[left]=2} } } function check(i=1,mem=null){ console.log ('Interval Check Running.'); GM_xmlhttpRequest({ method: 'GET', url: `https://api.live.bilibili.com/i/api/following?page=`+i+`&pageSize=9`, onload: response => { var res=JSON.parse(response.responseText) append_notify(mem,res,i) } }); } check() function notifyTitle(s){ GM_notification ({ text: "嗷呜", title: s, timeout: 3000, image: "https://s1.hdslb.com/bfs/static/blive/live-web-center/static/img/progress-tv.e11a9bf.gif" }) } notifyTitle('Bilibili开播提醒启动了') //window.onbeforeunload = function(event){notifyTitle('Bilibili开播提醒已退出')} window.onunload = function(event) {notifyTitle('Bilibili开播提醒已退出')} window.setInterval(check,10000)