点击上方“前端教程”,选择“星标”
每晚后端开发干货第一时间送达!
这篇文章述说的一些很通用简单的后端技术,但却是实现个别黑色产业的关键技术,其实我只实现一些很简单的思路和方式,尽量写得简单明了,希望能举一反三,一起探求后端技术的各类无限可能。我在几年前也写过几篇这方面的文章,前面因为个别关系删节了不少,有兴趣的可以去找回瞧瞧
相信我们常常看直播或则电视剧还会留心到有好多的弹幕,有时侯弹幕比电视剧或则直播的游戏更有意思,悉心的同学会发觉有时侯弹幕会出现一致的相同,之后不断的循环,有时侯还是出自同一个用户发送的,这么这个用户如何做到在短时间内循环不断的发送同一个消息或则不同的消息的呢。
26
虽然很简单,以网页版的桂皮直播作为反例,任何的评论都肯定有输入框,倘若人为的输入文字再发送实在是太低效了,作为灰产专业户,肯定不会自己自动输入的。
这么最直接暴力的方法是把任务交给开发者去手动实现,假如你是后端开发者,你可以使用选择器获取到该输入框的节点。
25
那节点十分容易,直接对着输入框右键查看即可,我们可以看见它本质是下边代码实现的。
<input name="message" class="tt-type-msg" placeholder="说点什么" />
这么你拿这个节点方法能够多种多样了,只要保证领到是惟一的节点即可:
下边三行似乎都可以:
document.querySelector('[name="message"]');
document.querySelector(".tt-type-msg");
document.querySelector('[placeholder="说点什么"]');
领到节点我们下一步应当就是模拟我们的用户操作,输入弹幕的文字,可以看见我们在浏览器的控制台输入以下代码的敲回车运行的时侯,我们的666和牛逼手动的写入到输入框,懂后端的朋友一看就明白这代码的意思:
23
无非就是改写输入框的value,之后赋上输入的值。
document.querySelector('[placeholder="说点什么"]').value = "Wscats 666";
其实输入的值这样是写死的,我们还可以使用辞典去生成随机的弹幕或则评论,具体复杂的评论可以线上找字典生成,你若果不想麻烦,可以使用一个简单的字段,把你想要发送的话定做好,之后配合随机函数来发送。
const offset = parseInt(Math.random() * 7);
const word = ["厉害", "牛逼", "666", "佩服", "真实", "下饭", "菜"];
document.querySelector('[placeholder="说点什么"]').value = word[offset];
手动输入是完成了,我们还差最后一步,手动点击发送,虽然模拟就是滑鼠点击发送按键或则按键敲回车键,那这都好办,我们还是刚刚哪个理念,模拟操作那种页面位置,就要找寻哪个位置背后的代码节点,我们同样把滑鼠放在黑色的发送按键右键查看,在控制台北就可以看见这个节点的信息。
因为这个节点没哪些好多属性,我们直接按照class做惟一标记检索即可。
document.querySelector(".tt-type-submit").click();
同样根据前面的方式把代码输入到控制台敲回车,就可以看见输入框的文字被手动发送出去。
21
然而这儿还差一点不完美,我们整个代码只是模拟了一次操作,这么如何实现循环发呢,不要忘了,浏览器拥有定时器和延时器这些插口,所以我们可以去借助setInterval函数去实现按规定的时间评率发送消息,这么我们就可以解放右手安心去欣赏美眉主播,哦,不,是游戏主播精彩的对局了是吧,游戏主播还不时线上截屏中奖,挂着脚本在里面白嫖这不是甜滋滋。
setInterval(() => {
document.querySelector('[placeholder="说点什么"]').value = "一楼牛逼";
document.querySelector(".tt-type-submit").click();
}, 2000);
这是我们实现的疗效,其实这个只是最基本最入门的基础,我们可以还可以改变好多玩法,举个反例,假如我是一个主播,我会安排机器人帮我手动刷礼物,手动帮我回复用户,手动帮我点赞。
其实这儿篇幅有限,我就简单写点,例如我们可以接入第三方给我们实现的图灵机器人插口,key是我自己注册的,每晚有使用次数限制,想测试的朋友最好去官网自己注册一个哈:
http://www.tuling123.com/openapi/api?key=c75ba576f50ddaa5fd2a87615d144ecf&info=你好
这个插口只要改变info的参数,去恳求图灵机器人就可以得到机器人的回复,例如你可以跟他说,讲个笑话我听,张学友是谁等等,我们自己就不花时间去实现这些AI机器人了,直接调用插口即可,具体你还可以去官网订制。
我们可以获取最后回复用户的内容,之后回复他的内容,其实假如你足够无趣,你还可以实现两个机器人相互聊天的功能,在直播室顿时热闹上去,只要水军够多,直播间就可以有多热闹,在直播带货中尤为有用。
但这儿还是使用桂皮直播作为反例,欣赏下美眉动人的歌声嘛。还是之前的思路,你若果想回复最后一个弹幕,你就须要获取这个弹幕背后所在的节点:
19
console.log("最后的一条评论为:" + $(
$(".tt-msg-content-h5.tt-msg-content-h5-chat")[
$(".tt-msg-content-h5.tt-msg-content-h5-chat").length - 1
]
)
.text()
.replace(/(^\s*)|(\s*$)/g, ""));
这段代码不复杂,虽然就是做了几件事,把直播室聊天记录的最后一条内容的纯文本获取下来,之后删掉上面的空格,具体你还可以做一下其他的处理,我这儿就不弄复杂了。
领到最后的回复,只要交给图灵插口去发送即可,其实好多直播网站就会防一手脚本刷的,首先倘若网站是http合同,图灵插口注意就使用http合同,倘若是https的话,就直接改成https即可,不然可能会报合同错误。
image
这儿直接放代码,就不写原生了,用桂皮直播做事例试了下是支持jQuery,这么直接上$符号,我们发送一个ajax恳求,恳求的服务端地址就是图灵插口,恳求的info参数就是最后一个用户回复的内容。
$.ajax({
type: "GET",
url:
"https://www.tuling123.com/openapi/api?key=c75ba576f50ddaa5fd2a87615d144ecf&info=" +
$(
$(".tt-msg-content-h5.tt-msg-content-h5-chat")[
$(".tt-msg-content-h5.tt-msg-content-h5-chat").length - 1
]
)
.text()
.replace(/(^\s*)|(\s*$)/g, ""),
success: function (data) {
console.log(data);
$(".tt-type-msg").val(data.text);
$(".tt-type-submit").click();
},
});
当我们在控制台输入以下代码敲回车的时侯,发觉请求是发送成功的,而且桂皮这儿做了些信息的判定,恐怕是避免小白刷留言,然而这如何能莫非我呢,想把我们卡在控制台,不能操作,这还是太嫩了。
我们只须要做一下骚操作即可,学过后端都晓得断点是如何打的,直接展开源码,加一个条件断点,输入false把这个错误忽视掉吧,让它顺利往下执行。
17
如今我们就顺利调通了机器手动回复最后一个用户,控制台出现的黑色报错不影响我们的手动回复,其实这儿我就不浪费时间继续写下去了,懂得朋友都懂,只要加一些其他的处理即可,例如加定时器即可在里面看着机器人自言自语,加id判定即可只回复其他用户不回复自己的话,都可以发散思路去实现。
16
在一些黑色行业,这些技术是大行其道的,例如微博点赞,热搜控评,天猫让利券批量获取,商品秒杀等等,一切即可交给各类机器人水军去完成,其实这种通常不会在顾客端实现,会把她们搬进服务器上,有后台专门去处理...
说了这么多,我们还是纯粹点用在技术领域吧,虽然其他领域我不感兴趣,之前在一些技术简历上见到有些人的鹈鹕,Github,博客等粉丝,等级,递交数和阅读数甚微,这儿也是可以做四肢的,这儿还是指出只针对技术,我就不用鹈鹕做反例了,用Github那些作为反例吧,例如Github我们的递交量虽然可以任意修改时间段,范围和数目。
15
例如这些精典的递交记录,看起来很有意思,有的开发者是自己渐渐用真实递交数叠的,并且可以轻易人为的,虽然实现上去思路也是很简单,直接交给后端技术吧,思路跟刚刚里面的代码类似。
首先每位commit虽然如同刚刚的直播发送评论,因为昨天是纯顾客端的后端技术实现,如今我们换个口味用纯服务端的后端技术实现吧,扩充下思路。
我们通常在Github的库房上面递交代码都是使用这些命令形式的,这也是Github官网提供的方法:
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/wscats/test.git
git push -u origin main
这些递交方法会以当前本地端的时间为准,所以假如不想改动任何代码,你可以简单粗鲁的修改系统时间,之后再执行前面的命令,这些方法适宜菜鸟,错过递交,想补回一些递交去画对应的纹样:
14
并且作为具备一定后端技术的开发者,肯定不希望用这些方法,实在太低效了,每次都得在可视化界面操作一次时间,这如何能忍。
那我们可以利用node来实现以下,为了能在服务端批量执行git命令,我们可以使用child_process的插口,熟悉shell脚本的朋友,虽然可以直接用shell来实现,我们使用exec技巧,他可以使用子进程执行命令,缓存子进程的输出,并将子进程的输出以反弹函数参数的方式返回。
const exec = require("child_process").exec;
module.exports = (cmd) => {
return new Promise((resolve, reject) => {
exec(cmd, function (error, stdout, stderr) {
if (error) {
console.log(error);
reject(stderr);
} else {
resolve(stdout);
}
});
});
};
我们再曝露一个写入代码的插口,我们可以新建一个message.txt文件,记录每一个代码片断,最简单粗鲁就是直接生成一个随机数或则日期写入进去,每次写入代表着每一个commit,后期你更可以改良成把一份完整的代码按AST句型树等,劈成有规律的代码块,之后附上真实的递交记录,来进行每一次代码递交。
const fs = require("fs");
module.exports = (message) => {
return new Promise((resolve, reject) => {
fs.appendFile("message.txt", `${message}\n`, (err) => {
err ? reject() : resolve();
});
});
};
最后就是核心的代码了,这儿最关键的虽然gitcommit\-m"${commitTime}"\--no-edit\--date="${commitTime}"这一段,--date参数可以改成其他的时间(没记错的通常最早是1970的1月1号到2038年的1月19号),具体缘由是由于这是时间戳的范围,我也没去试过如此前和如此后的时间了,有兴趣的朋友可以自己试试。
const cmd = require("./cmd");
const file = require("./file");
let day = 10;
const random = (lower, upper) => {
return Math.floor(Math.random() * (upper - lower + 1)) + lower;
};
const commit = async () => {
const today = new Date();
today.setTime(
today.getTime() - 0 * 24 * 60 * 60 * 1000 - day * 24 * 60 * 60 * 1000
);
let commitTime = `${today.getFullYear()}.${
today.getMonth() + 1
}.${today.getDate()}`;
if (today.getFullYear() > 2019) {
return;
}
let commitNumber = random(1, 10);
let dayNumber = random(1, 3);
while (commitNumber) {
await file(commitTime);
await cmd("git status");
await cmd("git add .");
await cmd(`git commit -m "${commitTime}" --no-edit --date="${commitTime}"`);
commitNumber--;
}
if (day >= 10) {
day -= dayNumber;
commit();
} else {
// await cmd('git push origin master');
}
};
commit();
里面的代码执行成功后,才会手动递交,之后帮你布满Contributions的时间表,这远远比你的自动修改面板效率高多了。
13
为了观赏性,你可以用随机函数去制造每晚的commit量,也可以随机制造出隔日递交的操作,其实也可以随机递交commit的信息,例如接入前面提及的图灵机器人就可以实现递交信息的自言自语,其实我自己牺牲一下,拿我自己的Github做一次小白鼠吧,诸位朋友就谨慎娱乐了,万一最后只学会打满条纹,不会删掉条纹就难堪了,至于怎样删掉那些条纹,虽然多补点Git知识就懂了,就不展开说了,放一下实现后的疗效,具体可以去我Github瞧瞧。
12
这么这儿代码实现可以告诉我们,好多时侯看技术文章不要只看表面的量化数据,例如一些阅读量,点赞量和递交量都是我们参考的一部份而已,更多的是看那位作者呈现内容的质量。
我搜了下Github,还是有不少此类骚操作的,具体都有好多开源代码的实现,你们都可以参考下,作为程序员日常可以用来娱乐下,切忌就千万不要用来吓唬人了。
11
前面这个反例就点到即止,它的应用面似乎很广,例如各类排名榜上的名次,在好多的榜单里面一定要掂量细看,通常用户可能会无法发觉使用了这些技术,时间还有不少,我就再续点吧,还是照样,我们拿技术社区做实验,我们用谷歌VSCode的插件排名榜上做实验,原本想用微博或则鹈鹕做实验,但想想这可能要负后果啊,要讲武德,我们还是使用技术社区纯粹点,没太多的矫饰性。
10
这儿都是为我们开发者提供便利的插件,这些榜单本质上是流行榜单,具有一定的参考意义,而且我们更多是要理智的去剖析,由于进榜可能分分钟背后是一种"技术"在推进。
我们此次后端技术顾客端和服务端都试一下,是否可行,我们尝试帮我们把一款插件的下载量提高上来,我们发觉网页端虽然是有下载按键,这么按照前面介绍的技术就早已足够实现了,思路很简单。
9
找到该按键背后的节点代码,之后按频度触发点击下载即可,这个下载完全模拟了人在顾客端的基本操作,这么这个下载会成功发出恳求,并被完全记录到后台,之后最后更新呈现到下载量上面。
8
其实这些方式简单粗鲁可以快速达到目的,并且有没有比这些方法更迅速有效呢?答案肯定是有的,而且还有好多好多的方案,具体参考这个插件,方案和源码都写在了上面。
7
执行后直接在三天内步入下载量第一梯队了,其实可以直接把它拉满,步入下载量第一,可是这样娱乐娱乐就够了,若果只是为了处处争第一,太过了就违反技术的本意了,提供一个插件的本质是为更多的开发者提供服务,年青人还是要讲武德的,我实验了部份插件,发觉这儿是没有任何限制的,据我观察大部份靠前的插件都是官方插件,其中有些下载量是有点微妙的,这儿我也希望谷歌在后续能修补这些漏洞,如同国产的Hbuilder那样,插件是帐号绑定能够下载的。
这儿我顺便讲下原理,由于插件不仅在网页下载也支持在顾客端下载,所以同样我们只要窃听顾客端的下载,就可以模拟整个下载流程,之后循环执行即可,有点像大号刷天猫的好评一样,而且通常商业化项目这种入口就会有防范,没这么容易给你执行这种脚本。
6
这儿可以十分灵活,既可以使用后端技术去动态执行下载,也可以挟持下载的恳求去循环发送达到误导服务器的疗效,就是我们可以在node端去伪造这个恳求的颈部和恳求体,之后发送过去服务器。
这些方案稍为做改变可能用于暴力破解(wifi,服务器密码),中间人功击等。
6.1
在网路世界虽然每天都有这类人跳着这种脚本去扫描漏洞的,之后伪造恳求去达到目的,我的服务器就常常被那些人光顾,难过啊。
其实不仅node,能实现这些能力的工具还有好多,这儿就不一一列出,我们只围绕后端范围去剖析。
5
所以我们为何有时侯登陆注册须要如此多重的验证,还不是开发者为了保护我们跟恶势力抵抗嘛,对于一些榜单,例如热搜和热评,我们可作为一个参考,不能过度迷信。
这儿顺便一提的不管手机还是笔记本,虽然应用和插件窃听系统的形式有好多,就如前面的插件,尽量还是使有用稳定代码源的比较稳当,由于她们虽然可以轻易在本地对系统进行操作,例如使用简单的代码去窃听你的按键输入,轻易去读写你的本地文件等等。这种代码有时侯甚至很简单,它可以离我们很远,也可以离我们很近。
4
就如下边这些简单的代码,在不合适的场景它将会是一段可怕的代码,配合一些手段可以悄悄步入你的系统,然杂记录你输入的点点嘀嘀,包括输入的密码,输入习惯,句型习惯,助词虚词分布,常用字词和语言组织能力等,配合一些隐蔽的上报,能做到对你用户精确的剖析,只要用户输入的足够多,它对你就越了解,由于每位人都是生长在一个独一无二的环境和时代,这些环境对用户语言的影响是极其的深远,就如曹雪晴和高鹗两位红楼梦的作者都不在了,而且留下的珍稀文学,通过数据剖析,足够证明这本书拥有前后不一样的风格。
const inputs = document.querySelectorAll("input");
[].forEach.call(inputs, (input) => {
input.addEventListener("input", (e) => {
console.log(e.target);
});
});
这种恶意代码可能会伴随着插件等方法植入到你的笔记本,形式多种多样,例如套壳,"颜色"网站引导,魔改的山寨系统或则浏览器等...
3
技术是一把双刃剑,本质应当是向善的,小时候背弟子规,印象最深刻的一句话是人之初,性本善,同样我也觉得,技术之初,本质也是善的,换句话来说,技术的本意是为用户带来价值,而非损失。
2
我十分乐此不疲的挖掘和探求技术的价值和乐趣,近来我就喜欢在陌陌中写点简单的脚本去手动回复下同学家人,工作在外可能一句晚安和早安都是温暖的。
定时提醒下奶奶家喝水午睡,准点给同学发送生日快乐,对方还是蛮开心的,这是上面其中一些关键的代码,其实你自己可以赋于它更多的功能。
setInterval(function () {
$(".edit_area").html("微信需要发送的文字");
$(".edit_area").trigger($.Event("keydown", { keyCode: 13, ctrlKey: true }));
$(".btn_send").click();
}, 3000);
其实作为程序员也得有生活追求嘛,打工人的生活都是相像的,抽空去瞧瞧美丽的世界,帮我刷刷让利券哈哈,让浏览器帮我手动完成些事情吧,程序员的世界可能注定如此平平无奇
1
let y = 0;
let num = 0;
let imgArr = [];
setInterval(() => {
let imgs = document.querySelectorAll("img");
let length = imgs.length;
if (num !== length) {
num = length;
imgArr = imgs;
console.log(length, imgArr);
}
y = y + 1;
scrollTo(0, y);
}, 1);
希望自己之后能有更多的时间去贡献更多有意思的代码,开源不易,且行且珍视。
最后
里面所有的代码虽然本质都很简单,单纯的分享和交流,仅供你们娱乐,如有不足请多多包涵。
实际好多场景还有好多的门槛等待着我们去解决的,例如验证码的辨识,用户行为和调用链剖析,木马植入等,之后假如有机会再找时间写写,作为开发者我们也应该有义务和意识,在用户操作的每位入口去把好关和提醒用户。
0
其实技术的乐趣在于探求,而非作恶,最后附上我心爱的小提琴,与君共乐:
往期的文章可以移步这儿:
你的支持(Star和Fork)是我前进的最大动力~
谢谢音乐和编程的陪伴!也致敬诸位拼搏于996/007的代码家,音乐不曾辜负任何人,正如LeehomWang歌曲中唱到:
假如世界太危险,只有音乐最安全,带着我进梦上面,让歌词都实现!——《我们的歌》