1.购买服务器阿里云:服务器购买地址https://t.aliyun.com/U/PfsP97若失效,可用地址
阿里云:
服务器购买地址
https://t.aliyun.com/U/PfsP97
若失效,可用地址
https://www.aliyun.com/activity/wuying/dj?source=5176.29345612&userCode=49hts92d
腾讯云:
https://curl.qcloud.com/wJpWmSfU
若失效,可用地址
https://cloud.tencent.com/act/cps/redirect?redirect=2446&cps_key=ad201ee2ef3b771157f72ee5464b1fea&from=console
华为云
https://activity.huaweicloud.com/cps.html?fromacct=64b5cf7cc11b4840bb4ed2ea0b2f4468&utm_source=V1g3MDY4NTY=&utm_medium=cps&utm_campaign=201905
2.部署教程
3.代码如下
function reload() {
setTimeout(function () {
alert('关注+转发+评论+点赞完成');
location.reload(true);
}, 2000);
}
function getCsrf() {
const cookieName = 'bili_jct';
const cookieArray = document.cookie.split(';');
for (const cookie of cookieArray) {
const [name, value] = cookie.trim().split('=');
if (name === cookieName) {
return value;
}
}
return null;
}
function randomComment() {
const comments = [
"这个活动好有趣,一定要参加!",
"真心期待能中奖,哈哈哈。",
"加油加油,希望好运能降临到我身上。",
"有缘一定能中奖,大家一起努力!",
"这次抽奖福利不错,大家一起来试试手气。",
"看到这个抽奖活动,马上就被吸引了,转发支持!",
"转发支持一下,希望能中个大奖。",
"感谢主办方提供这么好的机会,一定要参与一下。",
"这个活动看起来不错,快来一起参加吧!",
"希望能中奖,给生活增添一些惊喜。",
"为了梦想,冲鸭,转发转发!",
"好运马上到,抽中大奖就在眼前!",
"这次中奖的概率一定很高,一定要试试!",
"转发一下,祝愿大家都有好运。",
"每次抽奖都充满期待,这次也不例外。",
"中奖了就发财了,加油加油!",
"谢谢主办方,希望能中到喜欢的奖品。",
"期待这次能有好运,中个大奖回家。",
"转发送福利,中奖了请吃糖!",
"这个活动真是太棒了,一定要参与一下。",
];
const randomIndex = Math.floor(Math.random() * comments.length);
return comments[randomIndex];
}
function followV1(uid, flag) {
const act = flag ? 1 : 2;
const data = `fid=${uid}&act=${act}&re_src=11&gaia_source=web_main&spmid=333.999.0.0&extend_content=%7B%22entity%22%3A%22user%22%2C%22entity_id%22%3A${uid}%2C%22fp%22%3A%220%5Cu00011920%2C%2C1080%5Cu0001Win32%5Cu000112%5Cu00018%5Cu000124%5Cu00011%5Cu0001zh-CN%5Cu00010%5Cu00010%2C%2C0%2C%2C0%5Cu0001Mozilla%2F5.0%2B(Windows%2BNT%2B10.0%3B%2BWin64%3B%2Bx64)%2BAppleWebKit%2F537.36%2B(KHTML%2C%2Blike%2BGecko)%2BChrome%2F119.0.0.0%2BSafari%2F537.36%2BEdg%2F119.0.0.0%22%7D&csrf=${getCsrf()}`;
GM.xmlHttpRequest({
method: "POST",
url: "https://api.bilibili.com/x/relation/modify",
data: data,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
onload: function ({responseText}) {
console.log("关注结果:" + responseText);
},
});
}
function dynamicLike(dynamic_id, flag) {
const up = flag ? 1 : 2;
const data = `dynamic_id=${dynamic_id}&up=${up}&csrf=${getCsrf()}`;
GM.xmlHttpRequest({
method: "POST",
url: "https://api.vc.bilibili.com/dynamic_like/v1/dynamic_like/thumb",
data: data,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
onload: function ({responseText}) {
console.log("点赞结果:" + responseText);
},
})
}
function comment(oid, type, message) {
const data = `oid=${oid}&type=11&message=${encodeURIComponent(message)}&plat=1&at_name_to_mid=%7B%7D`
GM.xmlHttpRequest({
method: "POST",
url: `https://api.bilibili.com/x/v2/reply/add?csrf=${getCsrf()}`,
data: data,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
onload: function ({responseText}) {
console.log("评论结果:" + responseText);
},
})
}
function reply(dynamic_id, message) {
const data = JSON.stringify({
"dyn_req": {
"content": {
"contents": [
{
"raw_text": message,
"type": 1, //纯文本1
"biz_id": ""
}
]
},
"scene": 4, // 纯文本1, 带图2
"attach_card": null,
"upload_id": `${unsafeWindow.UserStatus.userInfo.mid}_${Math.floor(Date.now() / 1000)}_${Math.floor(Math.random() * 9000) + 1000}`,
"meta": {"app_meta": {"from": "create.dynamic.web", "mobi_app": "web"}}
},
"web_repost_src": {"dyn_id_str": `${dynamic_id}`}
});
GM_xmlhttpRequest({
method: "POST",
url: `https://api.bilibili.com/x/dynamic/feed/create/dyn?csrf=${getCsrf()}`,
headers: {
"content-type": "application/json",
},
data: data,
onload: function ({responseText}) {
console.log("转发结果:" + responseText);
},
});
}
jQuery($ => {
'use strict';
const dynamic_id = location.href.match(/www\.bilibili\.com\/opus\/([^\/?]+)/)[1];
if (dynamic_id) {
const $btn = $('<div class="side-toolbar__btn">关转评赞</div>');
$btn.on('click', function () {
const basic = unsafeWindow.__INITIAL_STATE__.detail.basic;
const uid = basic.uid;
const oid = basic.comment_id_str;
const type = basic.comment_type;
let message = $('.reply-box-warp textarea.reply-box-textarea').val();
if (!message) {
message = randomComment();
}
followV1(uid, true);
dynamicLike(dynamic_id, true);
comment(oid, type, message);
reply(dynamic_id, message)
reload();
});
$(".side-toolbar__btn:eq(0)").after($btn);
}
$('.bili-dyn-card-reserve__action button.uncheck').click();
});
解析
该脚本为Bilibili 自动抽奖脚本,主要作用包括:
在动态页
https://www.bilibili.com/opus/*
注入一个按钮【关转评赞】。一键完成关注作者、点赞该动态、评论、转发四连操作;操作完成后弹窗提示并强制刷新页面。
若未在评论框手输内容,会随机生成一条预置评论文案再提交。
关键方法与职责
reload()
2 秒后弹出"完成"提示并刷新页面,用于收尾与状态刷新。
getCsrf()
从 Cookie 中读取
bili_jct
值,作为所有写操作接口需要的 CSRF token。randomComment()
从内置评论语料数组随机返回一条评论文本,供自动评论/转发使用。
followV1(uid, flag)
调用
https://api.bilibili.com/x/relation/modify
(POST)实现关注/取关。flag=true
为关注(act=1
),false
为取关(act=2
)。通过
application/x-www-form-urlencoded
传参并带上csrf
。dynamicLike(dynamic_id, flag)
调用
https://api.vc.bilibili.com/dynamic_like/v1/dynamic_like/thumb
(POST)实现点赞/取消点赞。flag=true
为点赞(up=1
),false
为取消(up=2
)。comment(oid, type, message)
调用
https://api.bilibili.com/x/v2/reply/add
(POST)对目标动态进行评论。这里固定
type=11
(对应动态评论),oid
为评论对象 ID,message
为评论内容,附带csrf
。reply(dynamic_id, message)
调用
https://api.bilibili.com/x/dynamic/feed/create/dyn
(POST,JSON)实现转发动态(纯文本)。组装动态发布 payload(含
dyn_req.content.contents
等字段、web_repost_src
),并带csrf
。jQuery($ => { ... })
(脚本主流程)点击后依次执行:
followV1(uid, true)
→dynamicLike(dynamic_id, true)
→comment(oid, type, message)
→reply(dynamic_id, message)
→reload()
。评论
message
优先取页面评论框内容,若为空则用randomComment()
。uid
(作者 UID)、oid
(评论对象 ID)、type
(评论类型)。根据当前 URL 解析
dynamic_id
,从页面全局unsafeWindow.__INITIAL_STATE__.detail.basic
读取:在右侧工具栏插入一个按钮【关转评赞】:
还尝试点击
.bili-dyn-card-reserve__action button.uncheck
(看起来用于自动预约/打勾,具体依界面而定)。
元信息与依赖
匹配页面:
http*://www.bilibili.com/opus/*
权限:
unsafeWindow
、GM.xmlHttpRequest/GM_xmlhttpRequest
依赖:jQuery 2.2.4 与 GM4 polyfill
执行时机:
document-end
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。
没有评论:
发表评论