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=2019052.部署教程
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
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。
没有评论:
发表评论