您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
由于mastodon.social站长封禁了所有来自pawoo.net媒体文件,导致在mastodon.social看不到那边的媒体文件。这个脚本就是为了解决这个问题而生的。P.S. 头像问题无解,别想了。
"use strict"; // ==UserScript== // @name 长毛象:显示被屏蔽的实例媒体文件 // @namespace http://tampermonkey.net/ // @version 0.6 // @description 由于mastodon.social站长封禁了所有来自pawoo.net媒体文件,导致在mastodon.social看不到那边的媒体文件。这个脚本就是为了解决这个问题而生的。P.S. 头像问题无解,别想了。 // @author https://mastodon.social/web/accounts/849118 // @include https://mastodon.social* // @grant none // ==/UserScript== /** * 如果需要在mastodon.social之外的实例使用该脚本,请在// @include https://mastodon.social* 下方再添加一个@include 网站名称请修改正你所在实例,别忘了最后有个星号。 */ (function () { 'use strict'; // 命名空间 var ajax_interceptor_qoweifjqon = { settings: { ajaxInterceptor_switchOn: false, ajaxInterceptor_rules: [] }, originalXHR: window.XMLHttpRequest, myXHR: function myXHR() { var _this = this; var modifyResponse = function modifyResponse() { if (_this.responseText.trim()) { try { var parseObject = eval(_this.responseText); // 如果检测到当前请求是用户主页的「嘟文和回复」发出的,那么移除响应中的所有转嘟数据。 // 比如:https://mastodon.social/api/v1/accounts/946408/statuses?exclude_replies=false&since_id=104012306590410838 if (/api\/v1\/accounts\/\d*?\/statuses\?exclude_replies=false/.test(_this.responseURL)) { parseObject = parseObject.filter(function (item) { return !item.reblog; }); } parseObject.forEach(function (toot) { if (toot.reblog) { // 先判断属性是否存在,因为有些接口不存在。 if (toot.reblog.media_attachments && toot.reblog.media_attachments.length) {} toot.reblog.media_attachments.forEach(function (media) { if (media.type === 'unknown') { // mastodon会将封禁media的实例的type设置为unknown // 手动修改 media.type = 'image'; media.preview_url = media.remote_url; media.url = media.remote_url; } }); } else if (toot.media_attachments && toot.media_attachments.length) { toot.media_attachments.forEach(function (media) { if (media.type === 'unknown') { // mastodon会将封禁media的实例的type设置为unknown // 手动修改 media.type = 'image'; media.preview_url = media.remote_url; media.url = media.remote_url; } }); } }); _this.responseText = JSON.stringify(parseObject); } catch (_) { console.log('error: parse filed: ', _); // 遇到解析不了的那也没办法。比如/context接口的参数无法解析,目测是里面包含html字符问题; } } }; var xhr = new ajax_interceptor_qoweifjqon.originalXHR(); var _loop = function _loop(attr) { if (attr === 'onreadystatechange') { xhr.onreadystatechange = function () { if (_this.readyState == 4) { modifyResponse(); } for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this.onreadystatechange && _this.onreadystatechange.apply(_this, args); }; return 'continue'; } else if (attr === 'onload') { xhr.onload = function () { modifyResponse(); for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } _this.onload && _this.onload.apply(_this, args); }; return 'continue'; } // 将函数原有内容全部拷贝到当前对象的属性上。 if (typeof xhr[attr] === 'function') { _this[attr] = xhr[attr].bind(xhr); } else { // responseText和response不是writeable的,但拦截时需要修改它,所以修改就存储在this[`_${attr}`]上 if (attr === 'responseText' || attr === 'response') { Object.defineProperty(_this, attr, { get: function get() { return _this['_'.concat(attr)] == undefined ? xhr[attr] : _this['_'.concat(attr)]; }, set: function set(val) { return _this['_'.concat(attr)] = val; }, enumerable: true }); } else { Object.defineProperty(_this, attr, { get: function get() { return xhr[attr]; }, set: function set(val) { return xhr[attr] = val; }, enumerable: true }); } } }; for (var attr in xhr) { var _ret = _loop(attr); if (_ret === 'continue') continue; } } }; window.XMLHttpRequest = ajax_interceptor_qoweifjqon.myXHR; })();