Skip to content

Commit

Permalink
🐛修复了特殊情况下,在作品页面里会移除这个作者自己的元素的 bug
Browse files Browse the repository at this point in the history
  • Loading branch information
xuejianxianzun committed Dec 28, 2024
1 parent 9e61ae7 commit 7257ca6
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 5 deletions.
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,25 @@ PS:这个记忆是非持久的,刷新页面就没了。

新的提示里把设置名字写出来了,可能会有所帮助。至少也更简洁和直接了。

### 🐛修复了特殊情况下,在作品页面里会移除这个作者自己的元素的 bug

下载器会移除“用户阻止名单”里的用户的作品,但不会在该用户自己的页面里移除他自己的作品(否则就全都移除了,没法看到他的主页是什么样了)。

但是在这个作品页面里发生了意外:
https://www.pixiv.net/artworks/123098863

下载器移除了这个作者自己的一些元素(虽然不是作品元素,但也不应该移除)。

原因是这个作品的简介里含有另一个作者的主页链接,而且在 body 里是第一个 /users/ 主页链接,先于这个作者自己的链接。

下载器在最早的几次检查里,会获取到简介里的错误的用户 ID,导致当前作者被认为是“另一个人”,从而移除了他的元素。

在之后的检查里,可以正确获取到当前作者的 ID,所以实际上不会移除他的作品。

现在下载器在这些页面类型里,会在 document complete 之后再执行检查,这样始终可以获取正确的作者 ID,修复了这个问题。

PS:`Tools.getCurrentPageUserID()` 是个不够可靠的 API,不过之前大多都是用户点击时才执行,所以不会受到这个特殊情况中的影响。这个情况里产生了问题是因为执行实际过早导致的。

## 17.3.0 2024/12/12

### ✨新功能:从页面上移除“用户阻止名单”里的用户的作品
Expand Down
23 changes: 22 additions & 1 deletion dist/js/content.js
Original file line number Diff line number Diff line change
Expand Up @@ -5127,6 +5127,8 @@ class PreviewWork {
this.workEL = el;
// 判断是插画还是动图,然后根据设置决定是否加载作品数据
// 动图有一个特定元素:circle,就是播放按钮的圆形背景
// 需要注意:在某些页面里没有这个元素,比如浏览历史里。
// 不过现在下载器也没有支持浏览历史页面,所以没有影响。
const ugoira = el.querySelector('circle');
const show = ugoira ? _setting_Settings__WEBPACK_IMPORTED_MODULE_3__.settings.previewUgoira : _setting_Settings__WEBPACK_IMPORTED_MODULE_3__.settings.PreviewWork;
show && this.readyShow();
Expand Down Expand Up @@ -5873,6 +5875,7 @@ class RemoveBlockedUsersWork {
constructor() {
// 当 Pixiv 语言设置为英语时,用户链接以 /en 开头,如
// href="/en/users/277602"
// 所以需要使用 *=
this.userLinkSelector = 'a[href*="/users/"]';
// 在用户主页和作品页面里,不屏蔽这个用户自己的作品
this.dontRemoveCurrentUser = [
Expand All @@ -5892,13 +5895,25 @@ class RemoveBlockedUsersWork {
}
let currentUserID = '';
if (this.dontRemoveCurrentUser.includes(_PageType__WEBPACK_IMPORTED_MODULE_3__.pageType.type)) {
// 在不移除当前页面的作者自己的作品时,等待页面资源加载完成后再检查
// 否则一开始 Tools.getCurrentPageUserID 可能会获取到错误的用户 ID
// 例如这个作品:
// https://www.pixiv.net/artworks/123098863
// 它的简介里含有另一个作者的主页链接
// 在 complete 之前执行 getCurrentPageUserID 时,正确的用户主页元素还不存在,
// 此时会获取到简介里的作者链接,也就是错误的 currentUserID
// 这会导致下载器移除当前页面作者自己的一些元素(虽然不是作品元素,但也不应该移除)
if (document.readyState !== 'complete') {
return;
}
currentUserID = _Tools__WEBPACK_IMPORTED_MODULE_2__.Tools.getCurrentPageUserID();
}
const allUserLink = document.body.querySelectorAll(this.userLinkSelector);
const removedUsers = new Map();
for (const link of allUserLink) {
// 在用户主页和作品页面里,不屏蔽这个用户本身的元素
const userID = _Tools__WEBPACK_IMPORTED_MODULE_2__.Tools.getUserID(link.href);
// console.log(userID, currentUserID)
if (userID === currentUserID) {
continue;
}
Expand Down Expand Up @@ -5938,6 +5953,12 @@ class RemoveBlockedUsersWork {
this.check();
}
});
// 当页面从不可见状态变为可见状态时,执行检查
window.addEventListener('visibilitychange', () => {
if (!document.hidden) {
this.check();
}
});
// 当页面内容变化时进行检查
this.startMutationObserver();
}
Expand Down Expand Up @@ -8664,7 +8685,7 @@ class Tools {
return test2[1];
}
// 最后从 body 里匹配
// Warning :这有可能会匹配到错误的(其他)用户 id
// Warning:这有可能会匹配到错误的(其他用户的)ID
const test3 = newRegExp.exec(document.body.innerHTML);
if (test3) {
return test3[1];
Expand Down
2 changes: 1 addition & 1 deletion dist/js/content.js.map

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions src/ts/PreviewWork.ts
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,8 @@ class PreviewWork {

// 判断是插画还是动图,然后根据设置决定是否加载作品数据
// 动图有一个特定元素:circle,就是播放按钮的圆形背景
// 需要注意:在某些页面里没有这个元素,比如浏览历史里。
// 不过现在下载器也没有支持浏览历史页面,所以没有影响。
const ugoira = el.querySelector('circle')
const show = ugoira ? settings.previewUgoira : settings.PreviewWork
show && this.readyShow()
Expand Down
23 changes: 21 additions & 2 deletions src/ts/RemoveBlockedUsersWork.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class RemoveBlockedUsersWork {

// 当 Pixiv 语言设置为英语时,用户链接以 /en 开头,如
// href="/en/users/277602"
// 所以需要使用 *=
private readonly userLinkSelector = 'a[href*="/users/"]'

private bindEvents() {
Expand All @@ -28,6 +29,13 @@ class RemoveBlockedUsersWork {
}
})

// 当页面从不可见状态变为可见状态时,执行检查
window.addEventListener('visibilitychange', () => {
if (!document.hidden) {
this.check()
}
})

// 当页面内容变化时进行检查
this.startMutationObserver()
}
Expand Down Expand Up @@ -56,7 +64,7 @@ class RemoveBlockedUsersWork {
})
}

// 在用户主页和作品页面里,不屏蔽这个用户自己的作品
// 在用户主页和作品页面里,不移除这个用户自己的作品
private dontRemoveCurrentUser = [
pageType.list.UserHome,
pageType.list.Bookmark,
Expand All @@ -78,6 +86,17 @@ class RemoveBlockedUsersWork {

let currentUserID = ''
if (this.dontRemoveCurrentUser.includes(pageType.type)) {
// 在不移除当前页面的作者自己的作品时,等待页面资源加载完成后再检查
// 否则一开始 Tools.getCurrentPageUserID 可能会获取到错误的用户 ID
// 例如这个作品:
// https://www.pixiv.net/artworks/123098863
// 它的简介里含有另一个作者的主页链接
// 在 complete 之前执行 getCurrentPageUserID 时,正确的用户主页元素还不存在,
// 此时会获取到简介里的作者链接,也就是错误的 currentUserID
// 这会导致下载器移除当前页面作者自己的一些元素(虽然不是作品元素,但也不应该移除)
if (document.readyState !== 'complete') {
return
}
currentUserID = Tools.getCurrentPageUserID()
}

Expand All @@ -86,7 +105,7 @@ class RemoveBlockedUsersWork {
) as NodeListOf<HTMLAnchorElement>
const removedUsers: Map<string, string> = new Map()
for (const link of allUserLink) {
// 在用户主页和作品页面里,不屏蔽这个用户本身的元素
// 在用户主页和作品页面里,不移除这个用户自己的元素
const userID = Tools.getUserID(link.href)
if (userID === currentUserID) {
continue
Expand Down
2 changes: 1 addition & 1 deletion src/ts/Tools.ts
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ class Tools {
}

// 最后从 body 里匹配
// Warning :这有可能会匹配到错误的(其他)用户 id
// Warning:这有可能会匹配到错误的(其他用户的)ID
const test3 = newRegExp.exec(document.body.innerHTML)
if (test3) {
return test3[1]
Expand Down

0 comments on commit 7257ca6

Please sign in to comment.