Python开发流量代理工具(内网穿透)(内含源码)

Python开发流量代理工具(内网穿透)

C:\out>dnf.exe -h
██████╗ ███╗   ██╗███████╗     ██████╗███████╗
██╔══██╗████╗  ██║██╔════╝    ██╔════╝██╔════╝
██║  ██║██╔██╗ ██║█████╗█████╗██║     ███████╗
██║  ██║██║╚██╗██║██╔══╝╚════╝██║     ╚════██║
██████╔╝██║ ╚████║██║         ╚██████╗███████║
╚═════╝ ╚═╝  ╚═══╝╚═╝          ╚═════╝╚══════╝

-h 查看帮助                         by 0x6a0x71
-s 服务端模式
-c 客户端模式
usage: dnf.exe [-h] [-key KEY] [-s] [-c] [-srh SRH] [-srp SRP] [-slh SLH] [-slp SLP] [-crh CRH] [-crp CRP] [-clh CLH]
               [-clp CLP] [-llp1 LLP1] [-llp2 LLP2] [-cm {r,l}]

DNF流量代理工具

optional arguments:
  -h, --help  show this help message and exit
  -key KEY    自定义密钥,可以随机生成,注:服务端必须与客户端一致,密钥为16位【A-Za-z0-9+/=】字符【默认随机】
  -s          服务端模式
  -c          客户端模式

服务端:
  通常放置在服务器上,若以下端口都已开启,可直接x.exe -s【例如:代理内网3389,可直接在服务端连接127.0.0.1:8002访问】

  -srh SRH    远程连接地址【默认:0.0.0.0】
  -srp SRP    远程连接端口【默认:5050】
  -slh SLH    本地查看地址【默认:127.0.0.1】
  -slp SLP    本地查看端口【默认:8002】

客户端:
  通常放置在内网机器上(可出网)【例如:代理3389到服务器,可直接x.exe -c -crh x.x.x.x(服务器地址) -clp 3389-crh CRH    远程连接地址【默认:127.0.0.1】
  -crp CRP    远程连接端口【默认:5050】
  -clh CLH    本地代理地址【默认:127.0.0.1】
  -clp CLP    本地代理端口【默认:80】
  -llp1 LLP1  本地代理模式,本地原端口【默认:80】
  -llp2 LLP2  本地代理模式,映射端口【默认:5050】
  -cm {r,l}   代理类型,r:远程连接代理,l:本地端口代理【默认r】

这是工具的使用说明
现在的目标是把本地的80服务(http)代理到公网上进行访问
流量路径
127.0.0.1:80 -> xx.xx.xx.xx:5050 -> xx.xx.xx.xx:8002
在这里插入图片描述
本地80服务

服务端启动DNF流量代理工具
在这里插入图片描述

key值:0r+mS7C4UnH/zhG8

本地开启DNF工具
在这里插入图片描述

代理成功后本地访问外网服务端口(8002)
在这里插入图片描述
源代码如下

import argparse
import socket
BUFFSIZE = 1024
MAX_LISTEN = 32
CODING = "ISO-8859-1"
import base64
import random
key_num = 16
kill_sokcet_list =[]
max_out_time = 30
key_table = "0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm"
class My_lock:


    def OR_key(self):
		pass
    def encrypt_random(self,text,key):
        pass

    def decrypt_random(self,text,key):
        pass
        

def _recv_data(socketi):
    """
    接收服务端数据
    :return: 接收服务端数据-ERROR=None
    """
    global kill_sokcet_list
    data = b''
    while True:
        try:
            socketi.settimeout(10)  # 设置超时时间为10s超过10s判定为服务端没有返回状态,未收到数据
            recv_data = socketi.recv(BUFFSIZE)
            if len(recv_data) > 0:
                if len(recv_data) < BUFFSIZE:
                    data += recv_data
                    break
                else:
                    data += recv_data
            else:
                break
        except Exception as e:
            kill_sokcet_list.append(1)
            print(f"Loading... {str(e)}:{len(kill_sokcet_list)}")
            if len(kill_sokcet_list) == max_out_time:
                return None

            # print(e.__traceback__.tb_frame.f_globals["__file__"])  # 发生异常所在的文件
            # print(e.__traceback__.tb_lineno)  # 发生异常所在的行数
            return b""  # 出现异常返回None
    print(f"DATA::{data}")
    kill_sokcet_list.clear()
    if len(data) != 0:

        return data
    else:
        return b""  # 非异常无数据,返回空字符串



# 远程代理
def tcpServer3(ADDR,ADDR2,KEY):

    with socket.socket(socket.AF_INET, socket.SOCK_STREAM,proto=0) as rs:   #远程
        # 绑定服务器地址和端口
        while True:
            try:
                rs.connect(ADDR)
                print("等待远程请求回复...")
                rrec = _recv_data(rs)
                # rrec = rs.recv(BUFFSIZE)
                print(f"rrec={rrec}")
                dc_rrec = LOCK.decrypt_random(rrec.decode(),KEY)  # 解密远程回复  2:解密服务器返回的数据
                print(f"\ndc_rrec={dc_rrec}")
                with socket.socket(socket.AF_INET, socket.SOCK_STREAM,proto=0) as ls:   #本地
                    while True:
                        ls.connect(ADDR2)
                        ls.sendall(dc_rrec)
                        lrec = _recv_data(ls)
                        # lrec = ls.recv(BUFFSIZE)
                        print(f"lrec={lrec}")
                        # key = LOCK.out_key(lrec.decode(CODING))  # 加密本地回复
                        ec_lrec = LOCK.encrypt_random(lrec, KEY).encode() # 4
                        print(f"\nec_lrec={ec_lrec}")
                        ls.close()
                        rs.sendall(ec_lrec)   # 发送加密后给远程回复
            except Exception as e:
                print(e)
                print(e.__traceback__.tb_frame.f_globals["__file__"])  # 发生异常所在的文件
                print(e.__traceback__.tb_lineno)  # 发生异常所在的行数
                break
        rs.close()

# 本地代理
def tcpServer2(ADDR,ADDR2):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM,proto=0) as s:

        # 绑定服务器地址和端口
        s.bind(ADDR)
        # 启动服务监听
        s.listen(MAX_LISTEN)
        print('等待用户接入')
        while True:
            try:
                # 等待客户端连接请求,获取connSock
                conn, addr = s.accept()
                print('远端客户:{} 接入系统!!!'.format(addr))
                with conn:
                    while True:
                        print('接收请求信息')
                        # 接收请求信息
                        data = conn.recv(BUFFSIZE)
                        print('data=%s' % data)
                        with socket.socket(socket.AF_INET, socket.SOCK_STREAM,proto=0) as rs:
                            rs.connect(ADDR2)
                            rs.send(data)
                            rec = rs.recv(BUFFSIZE)
                            print(rec)
                            rs.close()
                            conn.send(rec)
                        # 发送请求数据
            except Exception as e:
                print(e)
                print(e.__traceback__.tb_frame.f_globals["__file__"])  # 发生异常所在的文件
                print(e.__traceback__.tb_lineno)  # 发生异常所在的行数
                break
        s.close()


def tcp1(ADDR2,ADDR,KEY):
    with socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM,proto=0) as rs:
        rs.bind(ADDR2)
        # 启动服务监听
        rs.listen(MAX_LISTEN)
        print('远程监听开启')
        while True:
            try:
                # 等待客户端连接请求,获取connSock
                rconn, raddr = rs.accept()
                print(f'远程服务接入成功!{raddr}')
                with rconn:
                    with socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM,proto=0) as ls:
                        ls.bind(ADDR)
                        ls.listen(MAX_LISTEN)
                        print('本地监听开启')
                        while True:
                            lconn, laddr = ls.accept()
                            print(f"本地服务接入成功!{laddr}")
                            with lconn:
                                print("等待本地用户请求...")
                                ldata = _recv_data(lconn)
                                # ldata = lconn.recv(BUFFSIZE)
                                print(f"ldata={ldata}")
                                # key = LOCK.out_key(ldata.decode(CODING))    # 加密本地请求
                                ec_ldata = LOCK.encrypt_random(ldata,KEY).encode() # 1 :服务请求
                                print(f"\nec_ldata={ec_ldata}")
                                rconn.sendall(ec_ldata)    # 加密后发送给远程
                                rdata =_recv_data(rconn)
                                # rdata = rconn.recv(BUFFSIZE)
                                print(f"rdata={rdata}")
                                dc_rdata = LOCK.decrypt_random(rdata.decode(),KEY)  # 解密远程回复 3
                                print(f"\ndc_rdatac={dc_rdata}")
                                lconn.sendall(dc_rdata)
                                lconn.close()
                        ls.close()
                rconn.close()
            except Exception as e:
                print(e)
                print(e.__traceback__.tb_frame.f_globals["__file__"])  # 发生异常所在的文件
                print(e.__traceback__.tb_lineno)  # 发生异常所在的行数
                break
        rs.close()


def mx_key(key):
    global key_table
    if key == "Random":
        ikey = LOCK.OR_key()
    else:
        okl = False
        for i in key:
            if i not in key_table:
                okl = True
        if len(set(key))!=len(key):
            okl = True
        if okl or len(key) != key_num:
            print("密钥不符合规定16位(不同字符) 【A-Za-z0-9】已自动生成KEY")
            ikey = 'ABCD12345678abcd'
        else:
            ikey = args.key
    return ikey


if __name__ == '__main__':
    print('''██████╗ ███╗   ██╗███████╗     ██████╗███████╗
██╔══██╗████╗  ██║██╔════╝    ██╔════╝██╔════╝
██║  ██║██╔██╗ ██║█████╗█████╗██║     ███████╗
██║  ██║██║╚██╗██║██╔══╝╚════╝██║     ╚════██║
██████╔╝██║ ╚████║██║         ╚██████╗███████║
╚═════╝ ╚═╝  ╚═══╝╚═╝          ╚═════╝╚══════╝

-h 查看帮助                         by 0x6a0x71
-s 服务端模式
-c 客户端模式''')
    parser = argparse.ArgumentParser(description='DNF流量代理工具')
    parser.add_argument('-key', type=str, default="Random",
                        help='自定义密钥,可以随机生成,注:服务端必须与客户端一致,密钥为16位(不同字符)【A-Za-z0-9】【默认:随机】')
    parser.add_argument('-s', action="store_true", help='服务端模式')
    parser.add_argument('-c', action="store_true", help='客户端模式')
    parser.add_argument('-tt1', type=str,default="30", help='超时次数(每次10s)【默认:30】')
    group_s = parser.add_argument_group('服务端', '通常放置在服务器上,若以下端口都已开启,可直接x.exe -s【例如:代理内网3389,可直接在服务端连接127.0.0.1:8002访问】')
    group_s.add_argument('-srh', type=str, default="0.0.0.0", help='远程连接地址【默认:0.0.0.0】')
    group_s.add_argument('-srp', type=str, default="5050", help='远程连接端口【默认:5050】')
    group_s.add_argument('-slh', type=str, default="127.0.0.1", help='本地查看地址【默认:127.0.0.1】')
    group_s.add_argument('-slp', type=str, default="8002", help='本地查看端口【默认:8002】')
    group_c = parser.add_argument_group('客户端',
                                        '通常放置在内网机器上(可出网)【例如:代理3389到服务器,可直接x.exe -c -crh x.x.x.x(服务器地址) -clp 3389】')
    group_c.add_argument('-crh', type=str, default="127.0.0.1", help='远程连接地址【默认:127.0.0.1】')
    group_c.add_argument('-crp', type=str, default="5050", help='远程连接端口【默认:5050】')
    group_c.add_argument('-clh', type=str, default="127.0.0.1", help='本地代理地址【默认:127.0.0.1】')
    group_c.add_argument('-clp', type=str, default="80", help='本地代理端口【默认:80】')
    group_c.add_argument('-llp1', type=str, default="80", help='本地代理模式,本地原端口【默认:80】')
    group_c.add_argument('-llp2', type=str, default="5050", help='本地代理模式,映射端口【默认:5050】')
    group_c.add_argument('-cm', type=str, choices=["r", "l"], default="r", help='代理类型:(r:远程连接代理)(l:本地端口代理)【默认:r】')
    args = parser.parse_args()
    if int(args.tt1)<0:
        print("设置超时次数无效")
    else:
        max_out_time = int(args.tt1)
        print(f"【TimeOut】:{int(args.tt1)}")
    LOCK = My_lock()
    if args.s:
        args.key = mx_key(args.key)
        print(f"【KEY】:{args.key}")
        lADDR = (args.slh, int(args.slp))
        rADDR = (args.srh, int(args.srp))
        A = tcp1(rADDR, lADDR, args.key)
    else:
        pass
    if args.c:
        args.key = mx_key(args.key)
        print(f"【KEY】:{args.key}")
        if args.cm == "r":
            lADDR = (args.clh, int(args.clp))
            rADDR = (args.crh, int(args.crp))
            A = tcpServer3(rADDR, lADDR, args.key)
        elif args.cm == "l":
            ADDR = ("127.0.0.1", int(args.llp1))
            ADDR2 = ("127.0.0.1", int(args.llp2))
            B = tcpServer2(ADDR, ADDR)
    else:
        pass

分开的程序:客户端:

import argparse
import socket
BUFFSIZE = 262144
MAX_LISTEN = 32
import lock
CODING = "ISO-8859-1"


# 远程代理
def tcpServer3(ADDR,ADDR2,KEY):

    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as rs:   #远程
        # 绑定服务器地址和端口

        rs.connect(ADDR)

        while True:
            try:
                print("等待远程请求回复...")
                rrec = rs.recv(BUFFSIZE)
                print(f"rrec={rrec}")
                dc_rrec = LOCK.decrypt_random(rrec.decode(CODING),KEY).encode(CODING)   # 解密远程回复
                print(f"\ndc_rrec={dc_rrec}")
                with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as ls:   #本地
                    ls.connect(ADDR2)
                    ls.send(dc_rrec)
                    lrec = ls.recv(BUFFSIZE)
                    print(f"lrec={lrec}")
                    # key = LOCK.out_key(lrec.decode(CODING))  # 加密本地回复
                    ec_lrec = LOCK.encrypt_random(lrec.decode(CODING), KEY).encode(CODING)
                    print(f"\nec_lrec={ec_lrec}")
                    ls.close()
                    rs.send(ec_lrec)   # 发送加密后给远程回复
            except Exception as e:
                print(e)
                break
        rs.close()

# 本地代理
def tcpServer2(ADDR,ADDR2,KEY):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:

        # 绑定服务器地址和端口
        s.bind(ADDR)
        # 启动服务监听
        s.listen(MAX_LISTEN)
        print('等待用户接入')
        while True:
            # 等待客户端连接请求,获取connSock
            conn, addr = s.accept()
            print('远端客户:{} 接入系统!!!'.format(addr))
            with conn:
                while True:
                    print('接收请求信息。。。。。')
                    # 接收请求信息
                    data = conn.recv(BUFFSIZE)
                    print('data=%s' % data)
                    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as rs:
                        rs.connect(ADDR2)
                        rs.send(data)
                        rec = rs.recv(BUFFSIZE)
                        print(rec)
                        rs.close()
                        conn.send(rec)
                    # 发送请求数据
            s.close()


if __name__ == '__main__':

    # ADDR = ('127.0.0.1', 5000)
    # ADDR2 = ('127.0.0.1', 80)
    # a = tcpServer3(ADDR,ADDR2)
    parser = argparse.ArgumentParser(
        description='DNF流量代理工具')
    parser.add_argument('-rh',type=str,default="127.0.0.1", help='远程连接地址,默认:127.0.0.1')
    parser.add_argument('-rp',type=str,default="5050", help='远程连接端口,默认:5050')
    parser.add_argument('-lh',type=str,default="127.0.0.1", help='本地代理地址,默认:127.0.0.1')
    parser.add_argument('-lp',type=str,default="80", help='本地代理端口,默认:80')
    parser.add_argument('-llp1', type=str, default="80", help='本地代理模式,本地原端口,默认:80')
    parser.add_argument('-llp2', type=str, default="5050", help='本地代理模式,映射端口,默认:5050')
    parser.add_argument('-m', type=str,choices=["r","l"],default="r",help='代理类型,r:远程回连代理,l:本地端口代理,默认r')
    parser.add_argument('-key', type=str, default="Random", help='自定义密钥,可以随机生成,注:服务端必须与客户端一致,密钥为10位,ASCII(48-90)区间字符【默认随机】')
    args = parser.parse_args()
    LOCK = lock.My_lock()
    if args.key == "Random":

        args.key = LOCK.OR_key()
    else:
        okl = False
        for i in args.key:
            if ord(i)>90 or ord(i)<48:
                okl = True
        if okl or len(args.key)<10:
            print("密钥不符合规定【10位,ASCII(48-90)区间字符")
    if args.m == "r":
        lADDR = (args.lh,int(args.lp))
        rADDR = (args.rh,int(args.rp))
        A = tcpServer3(rADDR,lADDR,args.key)
    elif args.m == "l":
        ADDR = ("127.0.0.1", int(args.llp1))
        ADDR2 = ("127.0.0.1", int(args.llp2))
        B = tcpServer3(ADDR, ADDR,args.key)

服务端:

import argparse
import socket
import lock
CODING = "ISO-8859-1"
BUFFSIZE = 262144
MAX_LISTEN = 32

def tcp1(ADDR2,ADDR,KEY):
    with socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM) as rs:
        rs.bind(ADDR2)
        # 启动服务监听
        rs.listen(MAX_LISTEN)
        print('远程监听开启')
        while True:
            try:
                # 等待客户端连接请求,获取connSock
                rconn, raddr = rs.accept()
                print(f'远程服务接入成功!{raddr}')
                with rconn:
                    while True:
                        # LOCK = lock.My_lock()
                        with socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM) as ls:
                            ls.bind(ADDR)
                            ls.listen(MAX_LISTEN)
                            print('本地监听开启')

                            lconn, laddr = ls.accept()
                            print(f"本地服务接入成功!{laddr}")
                            with lconn:
                                print("等待本地用户请求...")

                                ldata = lconn.recv(BUFFSIZE)
                                print(f"ldata={ldata}")
                                # key = LOCK.out_key(ldata.decode(CODING))    # 加密本地请求
                                ec_ldata = LOCK.encrypt_random(ldata.decode(CODING),KEY).encode(CODING)
                                print(f"\nec_ldata={ec_ldata}")
                                rconn.send(ec_ldata)    # 加密后发送给远程
                                rdata = rconn.recv(BUFFSIZE)
                                print(f"rdata={rdata}")
                                dc_rdata = LOCK.decrypt_random(rdata.decode(CODING),KEY).encode(CODING)  # 解密远程回复
                                print(f"\ndc_rdatac={dc_rdata}")
                                lconn.send(dc_rdata)
                                lconn.close()
                            ls.close()
                    rconn.close()
            except Exception as e:
                print(e)
                break

        rs.close()



if __name__ == '__main__':

    parser = argparse.ArgumentParser(
        description='DNF流量代理工具')
    parser.add_argument('-rh',type=str,default="0.0.0.0", help='远程回连地址,默认:0.0.0.0')
    parser.add_argument('-rp',type=str,default="5050", help='远程回连端口,默认:5050')
    parser.add_argument('-lh',type=str,default="127.0.0.1", help='本地查看地址,默认:127.0.0.1')
    parser.add_argument('-lp',type=str,default="8002", help='本地查看端口,默认:8002')
    parser.add_argument('-key', type=str, default="Random", help='自定义密钥,可以随机生成,注:服务端必须与客户端一致,密钥为10位,ASCII(48-90)区间字符【默认随机】')
    args = parser.parse_args()
    LOCK = lock.My_lock()
    if args.key == "Random":
        args.key = LOCK.OR_key()
    else:
        okl = False
        for i in args.key:
            if ord(i)>90 or ord(i)<48:
                okl = True
        if okl or len(args.key)<10:
            print("密钥不符合规定【10位,ASCII(48-90)区间字符")
    print(f"【KEY】:{args.key}")
    lADDR = (args.lh,int(args.lp))
    rADDR = (args.rh,int(args.rp))
    A = tcp1(rADDR,lADDR,args.key)
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
【资源说明】 基于原生前端和Python Flask后端的文件服务器源码+使用说明+详细注释.zip 一、简介 基于原生前端和 Python Flask 后端的文件服务器,可远程访问、下载和上传文件,可用于某一设备向其他设备开放的文件访问。局域网搭配内网穿透可实现公网访问。<br> (2023.04.09 更新:本项目仅推荐在 windows 环境下使用。读取硬盘分区的代码不是跨平台的,在其他系统可能出现未知问题。另外,本项目我没有继续更新的意愿,但如果你遇到了 bug 或者提交 pull requests,我会第一时间响应) 二、说明 最开始是想着,实现电脑不在身边的时候直接访问、操作电脑文件。等到做完了才想起来用 ftp 协议配置也更方便,也更稳定;但既然都做完了(;′⌒`)...也就权当一个练手项目吧。<br> 使用 http 实现确实麻烦了,但正好也能用最近学的前端知识做一做交互界面。使用 Windows 自带的 ftp 服务或网上的其他 ftp 客户端 UI 也就那样,自己从零设计 ftp 服务客户端又太麻烦了,选择前端 http 实现正好可以满足 UI 这个需求。<br> 同时不同设备访问只需要浏览器就可以了。~~当然移动端体验可能不太好,因为我没做移动端网页(懒),但是用还是能用的...~~ (2021.09.15 更新:增加了移动端适配,移动端使用体验大幅提升) 三、功能 (1)~~炫酷、人性化使用界面,赏心悦目(划掉)~~<br><br> (2)类似 ftp 服务的文件访问、下载和上传功能,没有删除(没这个需求) 四、使用 (1)安装依赖: ```cmd pip install flask ``` (2)[app.py](app.py) 中设置 SECRET_KEY 值,关于该值 flask 官方的说明: > SECRET_KEY 配置变量是通用密钥,可在 Flask 和多个第三方扩展中使用,如其名所示,加密的强度取决于变量值的随机密度。<br> > 不同的程序要使用不同的密钥,而且要保证其他人不知道你所用的字符串,其主要作用应该是在各种加密过程中加盐以增加安全性。在实际应用中最好将这个参数存储为系统环境变量。 建议通过随机方法获取值,采用系统变量方式存储,然后使用 `os.getenv('SECRET_KEY')` 读取<br><br> (3)定义登录用户名和密码:给 [app.py](app.py) 中的 `SPECIFY_UNAME` `SPECIFY_UPWD` 常量赋值<br><br> (4)运行 [app.py](app.py) 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
# frp-python > frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 frp-python是基于frp原理实现的轻量级python版frp,frp-python具有非常简洁的设计,在速度方面甚至优于frp。如果你愿意,只需稍加修改frpc的代码,甚至可以在esp-32上部署一个frpc客户端! 关于frp原理,可以参考[内网穿透工具frp核心架构原理分析] ### frp-python 使用方法示例 假设服务端ip是110.110.110.1,要穿透本机的远程桌面端口3389,则分别在服务端和本机如下启动: **服务端** ```shell frps.py 7000 8001 ``` **客户端** ``` frpc.py 110.110.110.1 7000 localhost 3389 ``` 然后通过110.110.110.1:8001就可以远程访问本机了! -------- 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我重来不说话

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值