题目链接:请点击

抓取到发布日热度的值,计算所有值的加和

1.分析网页

由于是动态Cookie,为了避免其他Cookie的影响,所以使用浏览器的无痕模式进行调试,按f12并选中【Preserve log】

我们点击页码进行翻页,发现数据来源于。

对其进行分析,又发现熟悉的参数 m.

这次我们使用fiddler抓包工具。

我们可以看到第一次请求中返回了一段混淆过的js代码,我们对其进行处理。

将其复制到 ob混淆专解测试版V0.1

需要注意不要

得到结果:

2.分析js代码:

我们发现关键函数:

   function W(Y, Z) {
document["cookie"] = "m" + M() + "=" + V(Y) + "|" + Y + "; path=/";
location["reload"]();
} function X(Y, Z) {
return Date["parse"](new Date());
} W(X());

w()函数定义了两个形参,而执行的函数w(x());是传一个参数的 ,这个参数就是x的返回值。

【 document["cookie"] 】,我想大家已经明白了,Cookie是如何被设置的了

而后面的【 location"reload"; 】,非常关键

这行代码的意思就是:刷新当前文档,也就是按了一下浏览器上的刷新页面按钮

现在我们重新理一下思路

  1. 发送请求返回了两个响应
  2. 第一个没有Cookie,而第二个有Cookie
  3. 第一个虽然没有Cookie,但是却执行了一段JS代码
  4. 这段JS代码给网页中的Cookie赋了值,接着刷新了整个页面
  5. 最后,呈现在我们眼前的网页,也就是reload的结果。

3.分析cookie如何生成

document["cookie"] = "m" + M() + "=" + V(Y) + "|" + Y + "; path=/";

可以看到这里使用了m函数

    function M(Y, Z) {
var a2 = B(this, function () {
var a5 = function () {
var a6 = a5["constructor"]("return /\" + this + \"/")()["compile"]("^([^ ]+( +[^ ]+)+)+[^ ]}");
return !a6["test"](a2);
}; return a5();
});
a2();
K();
qz = [10, 99, 111, 110, 115, 111, 108, 101, 32, 61, 32, 110, 101, 119, 32, 79, 98, 106, 101, 99, 116, 40, 41, 10, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 40, 115, 41, 32, 123, 10, 32, 32, 32, 32, 119, 104, 105, 108, 101, 32, 40, 49, 41, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 102, 111, 114, 40, 105, 61, 48, 59, 105, 60, 49, 49, 48, 48, 48, 48, 48, 59, 105, 43, 43, 41, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 104, 105, 115, 116, 111, 114, 121, 46, 112, 117, 115, 104, 83, 116, 97, 116, 101, 40, 48, 44, 48, 44, 105, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 125, 10, 10, 125, 10, 99, 111, 110, 115, 111, 108, 101, 46, 116, 111, 83, 116, 114, 105, 110, 103, 32, 61, 32, 39, 91, 111, 98, 106, 101, 99, 116, 32, 79, 98, 106, 101, 99, 116, 93, 39, 10, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 46, 116, 111, 83, 116, 114, 105, 110, 103, 32, 61, 32, 39, 402, 32, 116, 111, 83, 116, 114, 105, 110, 103, 40, 41, 32, 123, 32, 91, 110, 97, 116, 105, 118, 101, 32, 99, 111, 100, 101, 93, 32, 125, 39, 10];
eval(L(qz)); try {
if (global) {
console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
} else {
while (1) {
console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
debugger;
}
}
} catch (a5) {
return navigator["vendorSub"];
}
}

首先,我们可以看到函数里面还包含着两个函数分别是【 a4() 】和【 K() 】

而这个【 a4() 】函数,也定义在M()内,但是执行【 a4() 】函数的时候,并没有传入参数,所以说,这段代码是没用的

在分析K函数:

    function K(Y, Z) {
if (Z) {
return J(Y);
} return H(Y);
}

需要传入参数,而执行的时候,又没有传入,所有这段代码也是是没用的

我们简化一下M()函数

function M(Y, Z) {
qz = [10, 99, 111, 110, 115, 111, 108, 101, 32, 61, 32, 110, 101, 119, 32, 79, 98, 106, 101, 99, 116, 40, 41, 10, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 40, 115, 41, 32, 123, 10, 32, 32, 32, 32, 119, 104, 105, 108, 101, 32, 40, 49, 41, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 102, 111, 114, 40, 105, 61, 48, 59, 105, 60, 49, 49, 48, 48, 48, 48, 48, 59, 105, 43, 43, 41, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 104, 105, 115, 116, 111, 114, 121, 46, 112, 117, 115, 104, 83, 116, 97, 116, 101, 40, 48, 44, 48, 44, 105, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 125, 10, 10, 125, 10, 99, 111, 110, 115, 111, 108, 101, 46, 116, 111, 83, 116, 114, 105, 110, 103, 32, 61, 32, 39, 91, 111, 98, 106, 101, 99, 116, 32, 79, 98, 106, 101, 99, 116, 93, 39, 10, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 46, 116, 111, 83, 116, 114, 105, 110, 103, 32, 61, 32, 39, 402, 32, 116, 111, 83, 116, 114, 105, 110, 103, 40, 41, 32, 123, 32, 91, 110, 97, 116, 105, 118, 101, 32, 99, 111, 100, 101, 93, 32, 125, 39, 10];
eval(L(qz)); try {
if (global) {
console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
} else {
while (1) {
console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
debugger;
}
}
} catch (a5) {
return navigator["vendorSub"];
}
}

我们可以看到又出现了eval函数,做这第一道题的时候,我们知道eval可以间接的改变一些值。

L函数:

function L(Y, Z) {
let a0 = ""; for (let a1 = 0; a1 < Y["length"]; a1++) {
a0 += String["fromCharCode"](Y[a1]);
} return a0;
}

这个函数实际上并没什么用,挖坑操作。

继续往下看

        try {
if (global) {
console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
} else {
while (1) {
console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
debugger;
}
}
} catch (a5) {
return navigator["vendorSub"];
}

这段也是忽悠的东西global没有直接进入catch环节, return navigator["vendorSub"];

我们发现依旧是空值。

4.结果

var navigator = {};
var B = function () {
var Y = true;
return function (Z, a0) {
var a1 = Y ?
function () {
if (a0) {
var a2 = a0["apply"](Z, arguments);
a0 = null;
return a2;
}
}
: function () {};
Y = false;
return a1;
};
}
(); function C(Y, Z) {
var a0 = (65535 & Y) + (65535 & Z);
return (Y >> 16) + (Z >> 16) + (a0 >> 16) << 16 | 65535 & a0;
} function D(Y, Z) {
return Y << Z | Y >>> 32 - Z;
} function E(Y, Z, a0, a1, a2, a3) {
return C(D(C(C(Z, Y), C(a1, a3)), a2), a0);
} function F(Y, Z, a0, a1, a2, a3, a4) {
return E(Z & a0 | ~Z & a1, Y, Z, a2, a3, a4);
} function G(Y, Z, a0, a1, a2, a3, a4) {
return E(Z & a1 | a0 & ~a1, Y, Z, a2, a3, a4);
} function H(Y, Z) {
let a0 = [99, 111, 110, 115, 111, 108, 101];
let a1 = ""; for (let a2 = 0; a2 < a0["length"]; a2++) {
a1 += String["fromCharCode"](a0[a2]);
} return a1;
} function I(Y, Z, a0, a1, a2, a3, a4) {
return E(Z ^ a0 ^ a1, Y, Z, a2, a3, a4);
} function J(Y, Z, a0, a1, a2, a3, a4) {
return E(a0 ^ (Z | ~a1), Y, Z, a2, a3, a4);
} function K(Y, Z) {
if (Z) {
return J(Y);
} return H(Y);
} function L(Y, Z) {
let a0 = ""; for (let a1 = 0; a1 < Y["length"]; a1++) {
a0 += String["fromCharCode"](Y[a1]);
} return a0;
} function M(Y, Z) {
qz = [10, 99, 111, 110, 115, 111, 108, 101, 32, 61, 32, 110, 101, 119, 32, 79, 98, 106, 101, 99, 116, 40, 41, 10, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 40, 115, 41, 32, 123, 10, 32, 32, 32, 32, 119, 104, 105, 108, 101, 32, 40, 49, 41, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 102, 111, 114, 40, 105, 61, 48, 59, 105, 60, 49, 49, 48, 48, 48, 48, 48, 59, 105, 43, 43, 41, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 104, 105, 115, 116, 111, 114, 121, 46, 112, 117, 115, 104, 83, 116, 97, 116, 101, 40, 48, 44, 48, 44, 105, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 125, 10, 10, 125, 10, 99, 111, 110, 115, 111, 108, 101, 46, 116, 111, 83, 116, 114, 105, 110, 103, 32, 61, 32, 39, 91, 111, 98, 106, 101, 99, 116, 32, 79, 98, 106, 101, 99, 116, 93, 39, 10, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 46, 116, 111, 83, 116, 114, 105, 110, 103, 32, 61, 32, 39, 402, 32, 116, 111, 83, 116, 114, 105, 110, 103, 40, 41, 32, 123, 32, 91, 110, 97, 116, 105, 118, 101, 32, 99, 111, 100, 101, 93, 32, 125, 39, 10];
eval(L(qz)); try {
if (global) {
console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
} else {
while (1) {
console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
debugger;
}
}
} catch (a5) {
return navigator["vendorSub"];
}
} function N(Y, Z) {
Y[Z >> 5] |= 128 << Z % 32,
Y[14 + (Z + 64 >>> 9 << 4)] = Z; if (qz) {
var a0,
a1,
a2,
a3,
a4,
a5 = 1732584193,
a6 = -271733879,
a7 = -1732584194,
a8 = 271733878;
} else {
var a0,
a1,
a2,
a3,
a4,
a5 = 0,
a6 = -0,
a7 = -0,
a8 = 0;
} for (a0 = 0; a0 < Y["length"]; a0 += 16)
a1 = a5,
a2 = a6,
a3 = a7,
a4 = a8,
a5 = F(a5, a6, a7, a8, Y[a0], 7, -680876936),
a8 = F(a8, a5, a6, a7, Y[a0 + 1], 12, -389564586),
a7 = F(a7, a8, a5, a6, Y[a0 + 2], 17, 606105819),
a6 = F(a6, a7, a8, a5, Y[a0 + 3], 22, -1044525330),
a5 = F(a5, a6, a7, a8, Y[a0 + 4], 7, -176418897),
a8 = F(a8, a5, a6, a7, Y[a0 + 5], 12, 1200080426),
a7 = F(a7, a8, a5, a6, Y[a0 + 6], 17, -1473231341),
a6 = F(a6, a7, a8, a5, Y[a0 + 7], 22, -45705983),
a5 = F(a5, a6, a7, a8, Y[a0 + 8], 7, 1770010416),
a8 = F(a8, a5, a6, a7, Y[a0 + 9], 12, -1958414417),
a7 = F(a7, a8, a5, a6, Y[a0 + 10], 17, -42063),
a6 = F(a6, a7, a8, a5, Y[a0 + 11], 22, -1990404162),
a5 = F(a5, a6, a7, a8, Y[a0 + 12], 7, 1804603682),
a8 = F(a8, a5, a6, a7, Y[a0 + 13], 12, -40341101),
a7 = F(a7, a8, a5, a6, Y[a0 + 14], 17, -1502882290),
a6 = F(a6, a7, a8, a5, Y[a0 + 15], 22, 1236535329),
a5 = G(a5, a6, a7, a8, Y[a0 + 1], 5, -165796510),
a8 = G(a8, a5, a6, a7, Y[a0 + 6], 9, -1069501632),
a7 = G(a7, a8, a5, a6, Y[a0 + 11], 14, 643717713),
a6 = G(a6, a7, a8, a5, Y[a0], 20, -373897302),
a5 = G(a5, a6, a7, a8, Y[a0 + 5], 5, -701558691),
a8 = G(a8, a5, a6, a7, Y[a0 + 10], 9, 38016083),
a7 = G(a7, a8, a5, a6, Y[a0 + 15], 14, -660478335),
a6 = G(a6, a7, a8, a5, Y[a0 + 4], 20, -405537848),
a5 = G(a5, a6, a7, a8, Y[a0 + 9], 5, 568446438),
a8 = G(a8, a5, a6, a7, Y[a0 + 14], 9, -1019803690),
a7 = G(a7, a8, a5, a6, Y[a0 + 3], 14, -187363961),
a6 = G(a6, a7, a8, a5, Y[a0 + 8], 20, 1163531501),
a5 = G(a5, a6, a7, a8, Y[a0 + 13], 5, -1444681467),
a8 = G(a8, a5, a6, a7, Y[a0 + 2], 9, -51403784),
a7 = G(a7, a8, a5, a6, Y[a0 + 7], 14, 1735328473),
a6 = G(a6, a7, a8, a5, Y[a0 + 12], 20, -1926607734),
a5 = I(a5, a6, a7, a8, Y[a0 + 5], 4, -378558),
a8 = I(a8, a5, a6, a7, Y[a0 + 8], 11, -2022574463),
a7 = I(a7, a8, a5, a6, Y[a0 + 11], 16, 1839030562),
a6 = I(a6, a7, a8, a5, Y[a0 + 14], 23, -35309556),
a5 = I(a5, a6, a7, a8, Y[a0 + 1], 4, -1530992060),
a8 = I(a8, a5, a6, a7, Y[a0 + 4], 11, 1272893353),
a7 = I(a7, a8, a5, a6, Y[a0 + 7], 16, -155497632),
a6 = I(a6, a7, a8, a5, Y[a0 + 10], 23, -1094730640),
a5 = I(a5, a6, a7, a8, Y[a0 + 13], 4, 681279174),
a8 = I(a8, a5, a6, a7, Y[a0], 11, -358537222),
a7 = I(a7, a8, a5, a6, Y[a0 + 3], 16, -722521979),
a6 = I(a6, a7, a8, a5, Y[a0 + 6], 23, 76029189),
a5 = I(a5, a6, a7, a8, Y[a0 + 9], 4, -640364487),
a8 = I(a8, a5, a6, a7, Y[a0 + 12], 11, -421815835),
a7 = I(a7, a8, a5, a6, Y[a0 + 15], 16, 530742520),
a6 = I(a6, a7, a8, a5, Y[a0 + 2], 23, -995338651),
a5 = J(a5, a6, a7, a8, Y[a0], 6, -198630844),
a8 = J(a8, a5, a6, a7, Y[a0 + 7], 10, 1126891415),
a7 = J(a7, a8, a5, a6, Y[a0 + 14], 15, -1416354905),
a6 = J(a6, a7, a8, a5, Y[a0 + 5], 21, -57434055),
a5 = J(a5, a6, a7, a8, Y[a0 + 12], 6, 1700485571),
a8 = J(a8, a5, a6, a7, Y[a0 + 3], 10, -1894986606),
a7 = J(a7, a8, a5, a6, Y[a0 + 10], 15, -1051523),
a6 = J(a6, a7, a8, a5, Y[a0 + 1], 21, -2054922799),
a5 = J(a5, a6, a7, a8, Y[a0 + 8], 6, 1873313359),
a8 = J(a8, a5, a6, a7, Y[a0 + 15], 10, -30611744),
a7 = J(a7, a8, a5, a6, Y[a0 + 6], 15, -1560198380),
a6 = J(a6, a7, a8, a5, Y[a0 + 13], 21, 1309151649),
a5 = J(a5, a6, a7, a8, Y[a0 + 4], 6, -145523070),
a8 = J(a8, a5, a6, a7, Y[a0 + 11], 10, -1120210379),
a7 = J(a7, a8, a5, a6, Y[a0 + 2], 15, 718787259),
a6 = J(a6, a7, a8, a5, Y[a0 + 9], 21, -343485441),
a5 = C(a5, a1),
a6 = C(a6, a2),
a7 = C(a7, a3),
a8 = C(a8, a4); return [a5, a6, a7, a8];
} function O(Y) {
var Z,
a0 = "",
a1 = 32 * Y["length"]; for (Z = 0; Z < a1; Z += 8)
a0 += String["fromCharCode"](Y[Z >> 5] >>> Z % 32 & 255); return a0;
} function P(Y) {
var a2,
a3 = []; for (a3[(Y["length"] >> 2) - 1] = undefined, a2 = 0; a2 < a3["length"]; a2 += 1)
a3[a2] = 0; var a1 = 8 * Y["length"]; for (a2 = 0; a2 < a1; a2 += 8)
a3[a2 >> 5] |= (255 & Y["charCodeAt"](a2 / 8)) << a2 % 32; return a3;
} function Q(Y) {
return O(N(P(Y), 8 * Y["length"]));
} function R(Y) {
var Z,
a0,
a1 = "0123456789abcdef",
a2 = ""; for (a0 = 0; a0 < Y["length"]; a0 += 1)
Z = Y["charCodeAt"](a0),
a2 += a1["charAt"](Z >>> 4 & 15) + a1["charAt"](15 & Z); return a2;
} function S(Y) {
return unescape(encodeURIComponent(Y));
} function T(Y) {
return Q(S(Y));
} function U(Y) {
return R(T(Y));
} function V(Y, Z, a0) {
M();
return Z ? a0 ? H(Z, Y) : y(Z, Y) : a0 ? T(Y) : U(Y);
} function W(Y, Z) {
var cookie = "m" + "=" + V(Y) + "|" + Y;
return cookie;
} function X(Y, Z) {
return Date["parse"](new Date());
} function get_cipher() {
return W(X());
}
# -*- coding: utf-8 -*-
'''
@Time : 2021/2/1 20:57
@Author : 水一RAR
''' import requests
import execjs
import time def get_cipher_value():
# 导入JS,读取需要的js文件
with open(r'js代码/02.js',encoding='utf-8',mode='r') as f:
JsData = f.read()
# 加载js文件,使用call()函数执行,传入需要执行函数即可获取返回值
psd = execjs.compile(JsData).call('get_cipher')
return psd def get_data(page_num,cipher):
url = f'http://match.yuanrenxue.com/api/match/2?page={page_num}'
headers = {
'Host': 'match.yuanrenxue.com',
'User-Agent':'yuanrenxue.project',
'Cookie':cipher
}
print(f'加密密文--->{cipher}')
response = requests.get(url,headers = headers)
return response.json() if __name__ == '__main__': sum_num = 0 for page_num in range(1, 6):
info = get_data(page_num, get_cipher_value())
price_list = [i['value'] for i in info['data']]
print(f'第{page_num}页发布日热度的值:{price_list}')
sum_num += sum(price_list)
time.sleep(1) print(f'发布日热度值总和:{sum_num}')

2.猿人学爬虫攻防第二题 JS 混淆 动态cookie的更多相关文章

  1. hook 无限debugger(猿人学第十四题)

    猿人学第十四题 检测太多了,debugger  fiddler替换无法实现.置空也不行.推荐使用hook  Function原生的构造 var func_ = Function.prototype.c ...

  2. python爬虫之快速对js内容进行破解

    python爬虫之快速对js内容进行破解 今天介绍下数据被js加密后的破解方法.距离上次发文已经过去半个多月了,我写文章的主要目的是把从其它地方学到的东西做个记录顺便分享给大家,我承认自己是个懒猪.不 ...

  3. 常见面试第二题之什么是Context

    今天的面试题,也就是我们常见面试题系列的第二题,我们来讲一讲android中的context.我相信大家android开发者一定对于这个context非常熟悉,肯定都有使用过,肯定没有没使用过的.但是 ...

  4. Python爬虫教程-16-破解js加密实例(有道在线翻译)

    python爬虫教程-16-破解js加密实例(有道在线翻译) 在爬虫爬取网站的时候,经常遇到一些反爬虫技术,比如: 加cookie,身份验证UserAgent 图形验证,还有很难破解的滑动验证 js签 ...

  5. Python爬虫—破解JS加密的Cookie

    前言 在GitHub上维护了一个代理池的项目,代理来源是抓取一些免费的代理发布网站.上午有个小哥告诉我说有个代理抓取接口不能用了,返回状态521.抱着帮人解决问题的心态去跑了一遍代码.发现果真是这样. ...

  6. 从0开始学爬虫3之xpath的介绍和使用

    从0开始学爬虫3之xpath的介绍和使用 Xpath:一种HTML和XML的查询语言,它能在XML和HTML的树状结构中寻找节点 安装xpath: pip install lxml HTML 超文本标 ...

  7. 第十四章 web前端开发小白学爬虫

    老猿从事IT开发快三十年了,接触互联网也很久了,但自己没有做过web前端开发,只知道与前端开发相关的一些基本概念,如B/S架构.html标签.js脚本.css样式.xml解析.cookies.http ...

  8. 猿人学web爬虫攻防大战

    这里有1.2.3.4.12.13.15题 1.第一题 import execjs import requests def get_response(): js_code = ""& ...

  9. 05:统计单词数【NOIP2011复赛普及组第二题】

    05:统计单词数 总时间限制:  1000ms 内存限制:  65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次 ...

  10. 《学习OpenCV》练习题第五章第二题abc

    代码: #include <stdio.h> #include <opencv/highgui.h> #include <opencv/cv.h> #include ...

随机推荐

  1. /proc/zoneinfo

    root@pita2_mr813_tina35:/# cat /proc/zoneinfo Node 0, zone DMA per-node stats nr_inactive_anon 4749 ...

  2. 数据库故障处理优质文章汇总(含Oracle、MySQL、MogDB等)

    数据库告警.紧急问题处理这些项目对于大多数朋友来讲应该不陌生了.从墨天轮社区整理的"最受DBA欢迎的技术文档合辑"系列中可以发现,大家对"故障诊断专题"的热情居 ...

  3. 墨天轮国产数据库沙龙 | 张晓庆:GoldenDB分布式数据库的自动安装与备份恢复

    在共同推进国产化生态发展的进程下,墨天轮正式推出"墨天轮国产数据库沙龙"系列直播活动,将定期邀请各国产数据库产品专家.掌门人,共同探讨如何达成技术"自主可控"的 ...

  4. .NET高级调试 - 3.8线程操作

    简介 高级调试过程中,与线程与线程栈是打交道特别多的.因此如何查看线程与线程栈就显得至关重要了 查看线程 !Threads 使用 !t/!Threads 命令获取所有托管线程 含义 ThreadCou ...

  5. MySQL数据的导入

    我们在帖子MySQL数据的导出 - brucexia - 博客园 (cnblogs.com)中讲了MySQL数据的导出,本文讲讲解MySQL数据的导入. MySQL数据的导入包括使用LOAD DATA ...

  6. KubeSphere 后端源码深度解析

    这篇文章我们将学习在 vscode 上的 ssh remote 插件基础上,尝试 debug 和学习 KubeSphere 后端模块架构. 前提 安装好 vscode 以及 ssh remote co ...

  7. 容器部署DNS你会吗?

    docker快速部署DNS,实现快速上线 概念 环境介绍 部署DNS 下载相关镜像 创建并启动DNS容器 简单介绍三种创建方式 容器启动停止 创建dns交互式容器 配置DNS容器相关配置 测试 修改客 ...

  8. Redis的发布订阅Pub/Sub

    发布订阅 Redis 发布订阅(publish/subscribe)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 ...

  9. 从0.1开始学java(2)

    string串池 现在都在堆中 "=="号的比较 字符串比较一般调用equals或者equalsignoreCase API来比较(后者忽略大小写) StringBuilder 可 ...

  10. Bulk-Crap-Uninstaller:一个高效卸载,轻松管理你的应用程序的.Net开源工具

    我们在工作中,经常需要安装大量的软件,随着应用程序的不断增多,管理这些软件变得非常困难. 下面介绍一款具备高效.简洁的特点,可以帮助我们快速卸载大量不需要的应用程序,让电脑管理变得更加轻松. 01 项 ...