新版网易全套识别验证

认真往下看,保证这篇文章B格拉满!!!!

距离上次版本更新已经过去好久了,当时只做了滑块,后面朱哥发了一套网易完整版的给我,完事儿也没来得及去看就更新了。

先盘点一下这次更新都做了哪些操作。

1 :v2/getconf包多了个dt参数,这个在后期也会用到,pn值在生产d,b包的请求参数时也会用到。

2:v3/get包中fp,cb,ac_token值。一个一个来看

hock_fp:在事件监听断点下打上script断点先,然后hock执行下就很方便看了。

(function() {
    Object.defineProperty(window, 'gdxidpyhxde', {
		set: function(val) {
				debugger;
				return val;
		}
    });
})();

 fp的生产其实也有两个关键点: h为网站主域名,这个fp值也是不同的,wR方法下为生产逻辑。

 cb:都是32位字符串生产加密的,不过wV方法不同,这个的话自己跟进去看看就行。

cb的生产扣完也有点多。

function generate_cb(){
    window = global;

    function uuid(x, Z) {
        var J = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"['split']('');
        var v = [];
        var H = void 0;
        if (Z = Z || J["length"], x) {
            for (H = 0; H < x; H++) {
                v[H] = J[0 | Math["random"]() * Z];
            }
        } else {
            var h = void 0;
            for (v[8] = v[13] = v[18] = v[23] = '-', v[14] = '4', H = 0; H < 36; H++) {
                if (v[H]) {
                } else {
                    h = 0 | 16 * Math['random'](), v[H] = J[19 === H ? 3 & h | 8 : h];
                }
            }
        }
        return v["join"]('');
    }

    function toByte(C) {
        return C < -128 ? toByte(256 + C) : C > 127 ? toByte(C - 256) : C;
    }

    function stringToBytes(C) {
        C = window["encodeURIComponent"](C);
        for (var Q = [], I = 0, q = C['length']; I < q; I++) {
            if ('%' === C["charAt"](I)) {
                if (I + 2 < q) {
                    Q["push"](H('' + C["charAt"](++I) + C['charAt'](++I))[0]);
                }
            } else {
                Q["push"](toByte(C["charCodeAt"](I)));
            }
        }
        return Q;
    }

    let __SEED_KEY__ = 'fd6a43ae25f74398b61c03c83be37449';

    function K() {
        for (var nT = [], nm = 0; nm < 4; nm++) {
            nT[nm] = toByte(Math["floor"](256 * Math['random']()));
        }
        return nT;
    }

    function Q(nT) {
        var nm = [];
        if (!nT['length']) {
            return nb(64);
        }
        if (nT["length"] >= 64) {
            return nT["splice"](0, 64);
        }
        for (var nX = 0; nX < 64; nX++) {
            nm[nX] = nT[nX % nT["length"]];
        }
        return nm;
    }

    function xor(C, Q) {
        return toByte(toByte(C) ^ toByte(Q));
    }

    function xors() {
        for (var C = arguments["length"] > 0 && void 0 !== arguments[0] ? arguments[0] : [], Q = arguments['length'] > 1 && void 0 !== arguments[1] ? arguments[1] : [], I = [], q = Q['length'], W = 0, U = C["length"]; W < U; W++) {
            I[W] = xor(C[W], Q[W % q]);
        }
        return I;
    }

    function n8() {
        var nT = stringToBytes(__SEED_KEY__);
        var nm = K();
        nT = Q(nT);
        nT = xors(nT, Q(nm));
        nT = Q(nT);
        return [nT, nm];
    }

    var nr = function () {
        function nT(nm, nX) {
            var nC = [];
            var nQ = !0;
            var nI = !1;
            var nq = void 0;
            try {
                for (var nW, nl = nm[Symbol["iterator"]](); !(nQ = (nW = nl["next"]())['done']) && (nC['push'](nW["value"]), !nX || nC["length"] !== nX); nQ = !0) {
                    ;
                }
            } catch (ne) {
                nI = !0;
                nq = ne;
            } finally {
                try {
                    if (!nQ && nl["return"]) {
                        nl["return"]();
                    }
                } finally {
                    if (nI) {
                        throw nq;
                    }
                }
            }
            return nC;
        }

        return function (nm, nX) {
            if (Array["isArray"](nm)) {
                return nm;
            }
            if (Symbol["iterator"] in Object(nm)) {
                return nT(nm, nX);
            }
            throw new TypeError("Invalid attempt to destructure non-iterable instance");
        };
    }();

    function S(C) {
        return C['map'](function (Q) {
            return V(Q);
        })["join"]('');
    }

    function V(C) {
        var Q = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
        return '' + Q[C >>> 4 & 15] + Q[15 & C];
    }

    function intToBytes(C) {
        var Q = [];
        Q[0] = toByte(C >>> 24 & 255);
        Q[1] = toByte(C >>> 16 & 255);
        Q[2] = toByte(C >>> 8 & 255);
        Q[3] = toByte(255 & C);
        return Q;
    }

    function j(C) {
        return S(intToBytes(C));
    }

    function genCrc32(C) {
        for (var Q = [0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685, 2657392035, 249268274, 2044508324, 3772115230, 2547177864, 162941995, 2125561021, 3887607047, 2428444049, 498536548, 1789927666, 4089016648, 2227061214, 450548861, 1843258603, 4107580753, 2211677639, 325883990, 1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755, 2366115317, 997073096, 1281953886, 3579855332, 2724688242, 1006888145, 1258607687, 3524101629, 2768942443, 901097722, 1119000684, 3686517206, 2898065728, 853044451, 1172266101, 3705015759, 2882616665, 651767980, 1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705, 3099436303, 671266974, 1594198024, 3322730930, 2970347812, 795835527, 1483230225, 3244367275, 3060149565, 1994146192, 31158534, 2563907772, 4023717930, 1907459465, 112637215, 2680153253, 3904427059, 2013776290, 251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719, 3865271297, 1802195444, 476864866, 2238001368, 4066508878, 1812370925, 453092731, 2181625025, 4111451223, 1706088902, 314042704, 2344532202, 4240017532, 1658658271, 366619977, 2362670323, 4224994405, 1303535960, 984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733, 3554079995, 1131014506, 879679996, 2909243462, 3663771856, 1141124467, 855842277, 2852801631, 3708648649, 1342533948, 654459306, 3188396048, 3373015174, 1466479909, 544179635, 3110523913, 3462522015, 1591671054, 702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443, 3233442989, 3988292384, 2596254646, 62317068, 1957810842, 3939845945, 2647816111, 81470997, 1943803523, 3814918930, 2489596804, 225274430, 2053790376, 3826175755, 2466906013, 167816743, 2097651377, 4027552580, 2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225, 1852507879, 4275313526, 2312317920, 282753626, 1742555852, 4189708143, 2394877945, 397917763, 1622183637, 3604390888, 2714866558, 953729732, 1340076626, 3518719985, 2797360999, 1068828381, 1219638859, 3624741850, 2936675148, 906185462, 1090812512, 3747672003, 2825379669, 829329135, 1181335161, 3412177804, 3160834842, 628085408, 1382605366, 3423369109, 3138078467, 570562233, 1426400815, 3317316542, 2998733608, 733239954, 1555261956, 3268935591, 3050360625, 752459403, 1541320221, 2607071920, 3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877, 83908371, 2512341634, 3803740692, 2075208622, 213261112, 2463272603, 3855990285, 2094854071, 198958881, 2262029012, 4057260610, 1759359992, 534414190, 2176718541, 4139329115, 1873836001, 414664567, 2282248934, 4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795, 376229701, 2685067896, 3608007406, 1308918612, 956543938, 2808555105, 3495958263, 1231636301, 1047427035, 2932959818, 3654703836, 1088359270, 936918000, 2847714899, 3736837829, 1202900863, 817233897, 3183342108, 3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449, 601450431, 3009837614, 3294710456, 1567103746, 711928724, 3020668471, 3272380065, 1510334235, 755167117], I = 4294967295, q = 0, W = C['length']; q < W; q++) {
            I = I >>> 8 ^ Q[255 & (I ^ C[q])];
        }
        return j(4294967295 ^ I);
    }

    function copyToBytes(C, Q, I, q, W) {
        for (var U = 0, N = C["length"]; U < W; U++) {
            if (Q + U < N) {
                I[q + U] = C[Q + U];
            }
        }
        return I;
    }

    function q(nT) {
        if (!nT["length"]) {
            return nb(64);
        }
        var nm = [];
        var nX = nT["length"];
        var nC = nX % 64 <= 60 ? 64 - nX % 64 - 4 : 128 - nX % 64 - 4;
        copyToBytes(nT, 0, nm, 0, nX);
        for (var nQ = 0; nQ < nC; nQ++) {
            nm[nX + nQ] = 0;
        }
        copyToBytes(intToBytes(nX), 0, nm, nX + nC, 4);
        return nm;
    }

    function X(nT) {
        if (Array["isArray"](nT)) {
            for (var nm = 0, nX = Array(nT["length"]); nm < nT['length']; nm++) {
                nX[nm] = nT[nm];
            }
            return nX;
        }
        return Array["from"](nT);
    }

    function W(nT) {
        if (nT['length'] % 64 !== 0) {
            return [];
        }
        for (var nm = [], nX = nT['length'] / 64, nC = 0, nQ = 0; nC < nX; nC++) {
            nm[nC] = [];
            for (var nI = 0; nI < 64; nI++) {
                nm[nC][nI] = nT[nQ++];
            }
        }
        return nm;
    }

    function n0(nT, nm) {
        if (!nT["length"]) {
            return [];
        }
        nm = nJ(nm);
        for (var nX = [], nC = 0, nQ = nT["length"]; nC < nQ; nC++) {
            nX['push'](nv(nT[nC], nm));
        }
        return nX;
    }

    function n1(nT, nm) {
        if (!nT["length"]) {
            return [];
        }
        nm = toByte(nm);
        for (var nX = [], nC = 0, nQ = nT['length']; nC < nQ; nC++) {
            nX["push"](xor(nT[nC], nm++));
        }
        return nX;
    }

    function n2(nT, nm) {
        if (!nT["length"]) {
            return [];
        }
        nm = toByte(nm);
        for (var nX = [], nC = 0, nQ = nT['length']; nC < nQ; nC++) {
            nX['push'](xor(nT[nC], nm--));
        }
        return nX;
    }

    function n3(nT, nm) {
        if (!nT["length"]) {
            return [];
        }
        nm = toByte(nm);
        for (var nX = [], nC = 0, nQ = nT["length"]; nC < nQ; nC++) {
            nX["push"](shift(nT[nC], nm));
        }
        return nX;
    }

    function n4(nT, nm) {
        if (!nT['length']) {
            return [];
        }
        nm = nJ(nm);
        for (var nX = [], nC = 0, nQ = nT['length']; nC < nQ; nC++) {
            nX["push"](nP(nT[nC], nm++));
        }
        return nX;
    }

    function shift(C, Q) {
        return toByte(C + Q);
    }

    function n5(nT, nm) {
        if (!nT["length"]) {
            return [];
        }
        nm = toByte(nm);
        for (var nX = [], nC = 0, nQ = nT["length"]; nC < nQ; nC++) {
            nX["push"](shift(nT[nC], nm--));
        }
        return nX;
    }

    function n6(nT) {
        var nm = arguments["length"] > 1 && void 0 !== arguments[1] ? arguments[1] : 0;
        return nm + 256 >= 0 ? nT : [];
    }

    let __ROUND_KEY__ = "037606da0296055c";

    function hexToByte(C) {
        C = '' + C;
        var Q = parseInt(C['charAt'](0), 16) << 4;
        var I = parseInt(C["charAt"](1), 16);
        return toByte(Q + I);
    }

    function n7(nT) {
        for (var nm = [n6, n0, n3, n1, n4, n2, n5], nX = __ROUND_KEY__, nC = 0, nQ = nX['length']; nC < nQ;) {
            var nI = nX["substring"](nC, nC + 4);
            var nq = hexToByte(nI["substring"](0, 2));
            var nW = hexToByte(nI['substring'](2, 4));
            nT = nm[nq](nT, nW);
            nC += 4;
        }
        return nT;
    }

    function shifts() {
        for (var C = arguments["length"] > 0 && void 0 !== arguments[0] ? arguments[0] : [], Q = arguments["length"] > 1 && void 0 !== arguments[1] ? arguments[1] : [], I = [], q = Q["length"], W = 0, U = C["length"]; W < U; W++) {
            I[W] = shift(C[W], Q[W % q]);
        }
        return I;
    }

    function hexsToBytes(C) {
        C = '' + C;
        for (var Q = [], I = 0, q = 0, W = C["length"] / 2; I < W; I++) {
            var U = parseInt(C["charAt"](q++), 16) << 4;
            var N = parseInt(C["charAt"](q++), 16);
            Q[I] = toByte(U + N);
        }
        return Q;
    }

    let __SBOX__ = "a7be3f3933fa8c5fcf86c4b6908b569ba1e26c1a6d7cfbf60ae4b00e074a194dac4b73e7f898541159a39d08183b76eedee3ed341e6685d2357440158394b1ff03a9004cbbb5ca7dcb7f41489a16e03dcc9c71eb3c9796685b1d01b4d56193a6e1f1a2470445c191ae49c5d82765dc82c350f263387a24a502fcbf442e2dddaad0e936d9ea22b89275307b42518fbc3a626ba806d4ecd6d725f50cc8c72fefa4551ccd6fc9b2b7ab954f815c7264c6e51f4eaf99885a79892b1b60a0b3526e57ba5d178d370958847eb9fd28f9ce0bc023f4148a2adfe632126769057043d3bd8eda0df7872629f3809ef05310e83113216afe202c460fc23e789f77d1addb5e";

    function F(nT) {
        var nm = function (nI) {
            var nq = hexsToBytes(__SBOX__);
            return nq[16 * (nI >>> 4 & 15) + (15 & nI)];
        };
        if (!nT["length"]) {
            return [];
        }
        for (var nX = [], nC = 0, nQ = nT["length"]; nC < nQ; nC++) {
            nX[nC] = nm(nT[nC]);
        }
        return nX;
    }

    let __BASE64_ALPHABET__ = "MB.CfHUzEeJpsuGkgNwhqiSaI4Fd9L6jYKZAxn1/Vml0c5rbXRP+8tD3QTO2vWyo";
    let __BASE64_PADDING__ = '7';

    function D(V, z, S) {
        var j = void 0;
        var T = void 0;
        var m = void 0;
        var X = [];
        switch (V["length"]) {
            case 1:
                j = V[0];
                T = m = 0;
                X["push"](z[j >>> 2 & 63], z[(j << 4 & 48) + (T >>> 4 & 15)], S, S);
                break;
            case 2:
                j = V[0];
                T = V[1];
                m = 0;
                X["push"](z[j >>> 2 & 63], z[(j << 4 & 48) + (T >>> 4 & 15)], z[(T << 2 & 60) + (m >>> 6 & 3)], S);
                break;
            case 3:
                j = V[0];
                T = V[1];
                m = V[2];
                X["push"](z[j >>> 2 & 63], z[(j << 4 & 48) + (T >>> 4 & 15)], z[(T << 2 & 60) + (m >>> 6 & 3)], z[63 & m]);
                break;
            default:
                return '';
        }
        return X["join"]('');
    }

    function b(V, z, S) {
        if (!V || 0 === V["length"]) {
            return '';
        }
        try {
            for (var j = 0, T = []; j < V["length"];) {
                if (!(j + 3 <= V["length"])) {
                    var m = V["slice"](j);
                    T["push"](D(m, z, S));
                    break;
                }
                var X = V["slice"](j, j + 3);
                T["push"](D(X, z, S));
                j += 3;
            }
            return T['join']('');
        } catch (C) {
            return '';
        }
    }

    function base64EncodePrivate(V, z, S) {
        var j = void 0 !== z && null !== z ? z : __BASE64_ALPHABET__;
        var T = void 0 !== S && null !== S ? S : __BASE64_PADDING__;
        return b(V, j["split"](''), T);
    }

    function aes(nT) {
        let nm = stringToBytes(nT);
        let nX = n8();
        let nC = nr(nX, 2);
        let nQ = nC[0];
        let nI = nC[1];
        let nq = stringToBytes(genCrc32(nm));
        let nW = q([]["concat"](X(nm), X(nq)));
        let nl = W(nW);
        let ne = []["concat"](X(nI))
        let ns = nQ;
        let nN = nl["length"];
        for (let nU = 0; nU < nN; nU++) {
            var na = xors(n7(nl[nU]), nQ);
            var nA = shifts(na, ns);
            na = xors(nA, ns);
            ns = F(F(na));
            copyToBytes(ns, 0, ne, 64 * nU + 4, 64);
        }
        return base64EncodePrivate(ne);
    }

    function cb() {
        var nl = uuid(32);
        return aes(nl);
    }

    return cb()
}

actoken: actoken的生产关联着d,b两个包,但是我只处理了d包。

具体的话就在这里,这个d值就是前面d包返回的第4个值,另一个字符随机生成的我就没管。

 v3/check:这个的话其实变化不大,跟原来对比的话就就只有滑块验证的时候多了一个f参数。

 滑块:

 文字:

图标:

拼图:

空间推理:

 至此完整的验证类型就弄完了,其实还差一个无感验证,那个几乎见不到就不管他了。

本想分享一下完整版的网易算法,奈何篇幅太长了,害怕影响大哥们的心情,就算了吧。 

 还没完,别着急划走,今天的主题不是玩算法!!!!!

重点是这个:图腾视觉-OCR识别平台

从今天开始图腾所有相关验证码识别都全部对外免费开放!!!!!是的免费,免费,免费。

国内所有常见的不常见的几乎都包含在内除去定制版之外》》》!

这般操作只是为了给大家提供福利,然后卷死自己,并不像群友所说的!

完事儿了哦,兄弟们。有问题可以给我留言。或者私信加我。15702312233

记得关注我们的作坊:图腾视觉开放平台-高速、稳定、易用的webapi接口调用 (现已合作大佬超乎你想象)图腾视觉-OCR识别平台

提示:仅仅为了分享,无其余商业用途,有问题的小伙伴可以私信讨论。

重要的事儿说三遍 :若是侵权请联系作者删,若是侵权请联系作者删,若是侵权请联系作者删。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/329944.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker本地私有仓库搭建配置指导

一、说明 因内网主机需要拉取镜像进行Docker应用&#xff0c;因此需要一台带外主机作为内网私有仓库来提供内外其他docker业务主机使用。参考架构如下&#xff1a; 相关资源&#xff1a;加密、Distribution registry、Create and Configure Docker Registry、Registry部署、D…

LabVIEW图像识别检测机械零件故障

项目背景&#xff1a; 在工业生产中&#xff0c;零件尺寸的准确检测对保证产品质量至关重要。传统的人工测量方法不仅耗时费力&#xff0c;精度低&#xff0c;还容易导致零件的接触磨损。为了解决这些问题&#xff0c;开发了一套基于LabVIEW和机器视觉的机械零件检测系统。该系…

UML-活动图

提示&#xff1a;大家可以参考我的状态图博客 UML-活动图 一、活动图的基本概念1.开始状态和结束状态2.动作状态和活动状态&#xff08;活动&#xff09;3.分支与合并4.分叉与合并5.活动转换&#xff08;1&#xff09;转移&#xff08;2&#xff09;判定 6.泳道 二、活动图的例…

Django REST Framework入门之序列化器

文章目录 一、概述二、安装三、序列化与反序列化介绍四、之前常用三种序列化方式jsonDjango内置Serializers模块Django内置JsonResponse模块 五、DRF序列化器序列化器工作流程序列化&#xff08;读数据&#xff09;反序列化&#xff08;写数据&#xff09; 序列化器常用方法与属…

flink 最后一个窗口一直没有新数据,窗口不关闭问题

flink 最后一个窗口一直没有新数据&#xff0c;窗口不关闭问题 自定义实现 WatermarkStrategy接口 自定义实现 WatermarkStrategy接口 代码&#xff1a; public static class WatermarkDemoFunction implements WatermarkStrategy<JSONObject>{private Tuple2<Long,B…

oracle篇—19c新特性自动索引介绍

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

【python】学习笔记01

一、基础语法 1. 字面量 - 什么是字面量&#xff1f; 在代码中&#xff0c;被写下来的的固定的值&#xff0c;称之为字面量。 - 常用的值类型 Python中常用的有6种值&#xff08;数据&#xff09;的类型。 666 13.14 "程序员"print(666) print(13.14) print(&qu…

前端面试题-html5新增特性有哪些

HTML html5新增特性有哪些 1.新增了语义化标签 标签用法header定义文档或区块的页眉&#xff0c;通常包含标题&#xff0c;导航和其他有关信息nav定义导航链接的容器&#xff0c;用于包裹网站的导航部分section定义文档的一个独立节或区块&#xff0c;用于组织相关的内容art…

前端框架前置学习Webpack(1) 常用webpack配置

什么是Webpack? 定义 本质上,Webpack是用于现代JavaScript应用程序的静态模块打包工具.当webpack处理应用程序时,它会在内部从一个或多个入口点构建一个依赖图(dependency graph),然后将你项目中所需的每一个模块组合成一个或多个bundles,它们均为静态资源,用于展示你的内容.…

web开发学习笔记(6.element ui)

1.安装 2.在app.vue中引入ElementView中的内容 3.表格控件&#xff0c;当页大小发生变化&#xff0c;当当前页发生变化 4.对话框组件 5.将form表单中的数据打印出来 6.当遇到日期选择器得到的数据为昨日时&#xff0c;应该加入 value-format"yyyy-MM-dd"即可避免这个…

子类的构造函数和析构函数调用顺序

看代码&#xff1a; class A { public:A() { cout << __FUNCTION__ << endl; }~A() { cout << __FUNCTION__ << endl; } };class B { public:B() { cout << __FUNCTION__ << endl; }~B() { cout << __FUNCTION__ << endl; …

vue 指定区域可拖拽的限定拖拽区域的div(如仅弹窗标题可拖拽的弹窗)

<template><div class"container" ref"container"><div class"drag-box" v-drag><div class"win_head">弹窗标题</div><div class"win_content">弹窗内容</div></div><…

系统配置dns主从服务器

一、准备两台主机&#xff0c;区分主从 二、完全区域传送 1、主DNS服务器配置 #安装相关的包 [rootoula1 ~]# yum install bind -y#关闭防火墙 [rootoula1 ~]# systemctl stop firewalld [rootoula1 ~]# setenforce 0#修改配置主文件 [rootoula1 ~]# vim /etc/named.conf opt…

java大数据hadoop2.9.2 Java编写Hadoop分析平均成绩

1、准备文件&#xff0c;例如score.txt&#xff0c;内容如下&#xff1a; zs k1 88 ls k1 98 ww k1 78 zs k2 88 ls k2 98 ww k2 78 zs k3 88 ls k3 98 ww k3 78 2、创建maven项目 <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common --><d…

【软件测试】学习笔记-精准测试

软件测试行业从最开始的手工测试到自动化测试&#xff0c;从黑盒测试到白盒测试&#xff0c;测试理念和技术都发生了日新月异的变化。现如今&#xff0c;几乎所有的软件公司都有一套强大且复杂的自动化测试用例&#xff0c;用来夜以继日地保证产品的正确性和稳定性。 然而&…

web前端项目-贪吃蛇小游戏【附源码】

web前端项目-贪吃蛇小游戏 【贪吃蛇】是一款经典的小游戏&#xff0c;采用HTML、CSS和JavaScript技术进行开发&#xff0c;玩家通过控制一条蛇在地图上移动&#xff0c;蛇的目的是吃掉地图上的食物&#xff0c;并且让自己变得更长。游戏的核心玩法是控制蛇的移动方向和长度&am…

深度学习记录--梯度检验

数值逼近 为了对梯度进行检验&#xff0c;需要计算近似误差值来接近梯度 对于单边误差和双边误差公式&#xff0c;其中双边误差与真实梯度相差更小&#xff0c;故一般采用双边误差公式 双边误差 公式&#xff1a; 梯度检验(gradient checking) 对于成本函数&#xff0c;求出…

微信小程序之组件和API

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

S/MIME电子邮件证书申请指南

近年来&#xff0c;邮件安全问题日益突出&#xff0c;电子邮件成为诈骗、勒索软件攻击的重灾区。恶意邮件的占比屡创新高&#xff0c;邮件泄密事件更是比比皆是。在如此严峻的网络安全形势下&#xff0c;使用S/MIME电子邮件证书进行邮件收发是当今最佳的邮件安全解决方案之一。…

RT-Thread 15. list_timer与软定时器

1. 代码 void rt_thread_usr1_entry(void *parameter) {/* set LED2 pin mode to output */rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT);while (1){rt_pin_write(LED2_PIN, PIN_HIGH);rt_thread_mdelay(2000);rt_pin_write(LED2_PIN, PIN_LOW);rt_thread_mdelay(3000);} }int ma…