阿里云短信服务使用

2023-05-16

说明

这是用go语言实现的,但说实话,其实没啥影响,不管什么语言都是这个套路,所以无论你是学什么语言或者是用什么语言的都好,看看总不亏。

22年7.14下午14:38,我完成了第一版项目使用的阿里云短信包功能需求

但是呢!因为项目负责人和需求方对接问题,具体的短信模板并没有对接好,某种程度上可以说是只是我自己运行成功,发送短信成功,而暂时没有实际投入项目中(鬼知道一星期能不能对接好),所以这篇文档就是我的总结文档,会放在平台给大家作为借鉴学习。

一、准备阶段

准备阶段纯属废话,可以直接跳过

看了下时间,实际开始做,还不是真的做,只是要我先跑通测试的api。时间是7.12中午,其实是下午,毕竟中午要去吃饭睡觉了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EsowqQMp-1657790621605)(../my_images/image-20220714150110717.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vI0zrx5r-1657790621606)(../my_images/image-20220714150549343.png)]

然后是7.12晚上,开日会,豪哥说把accessKey放在服务器相关的那个文档里边了。所以从这一刻开始我可以真正的测试了。为什么说是真正的测试呢?

因为12日中午到晚上这段时间,我需要跑通阿里云测试短信,这个签名,其实就只能是验证码

准备测试:

https://dysms.console.aliyun.com/quickstart
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UEj8lLXW-1657790621607)(../my_images/image-20220714151315605.png)]

能做的就如图所示,太少了。

操作步骤:
  1. 我在我的阿里云主账号去申请一个accessKey

  2. 把阿里云给的短信代码下载或者复制粘贴后导入个包和依赖

  3. ok,改代码为如下:(任何代码还是每一行都要看,看不懂可以过)

    package main
    
    import (
    	openapi "github.com/alibabacloud-go/darabonba-openapi/client"
    	dysmsapi20170525 "github.com/alibabacloud-go/dysmsapi-20170525/v2/client"
    	util "github.com/alibabacloud-go/tea-utils/service"
    	"github.com/alibabacloud-go/tea/tea"
    	"os"
    )
    
    /**
     * 使用AK&SK初始化账号Client
     * @param accessKeyId
     * @param accessKeySecret
     * @return Client
     * @throws Exception
     */
    func CreateClient(accessKeyId *string, accessKeySecret *string) (_result *dysmsapi20170525.Client, _err error) {
        // 我多加的
        // 因为accessKeyId *string,传的是地址,所以有了如下四行
    	aki := "申请的accessKeyID"
    	aks := "申请的accessKeySecret"
    	accessKeyId = &aki
    	accessKeySecret = &aks
        // 我多加的
    	config := &openapi.Config{
    		// 您的 AccessKey ID
    		AccessKeyId: accessKeyId,
    		// 您的 AccessKey Secret
    		AccessKeySecret: accessKeySecret,
    	}
    	// 访问的域名dysmsapi.aliyuncs.com
    	config.Endpoint = tea.String("dysmsapi.aliyuncs.com")
    	_result = &dysmsapi20170525.Client{}
    	_result, _err = dysmsapi20170525.NewClient(config)
    	return _result, _err
    }
    
    func _main(args []*string) (_err error) {
    	client, _err := CreateClient(tea.String("accessKeyId"), tea.String("accessKeySecret"))
    	if _err != nil {
    		return _err
    	}
    	// 准备测试阶段,格式基本就是下边的,除了电话号码改改,code六位可以改改,别的动不了
    	sendSmsRequest := &dysmsapi20170525.SendSmsRequest{
    		SignName:      tea.String("阿里云短信测试"),
    		TemplateCode:  tea.String("SMS_154950909"),
    		PhoneNumbers:  tea.String("电话号码,拿自己的测试"),
    		TemplateParam: tea.String("{\"code\":\"3456\"}"),
    	}
    
    	runtime := &util.RuntimeOptions{}
    	tryErr := func() (_e error) {
    		defer func() {
    			if r := tea.Recover(recover()); r != nil {
    				_e = r
    			}
    		}()
    		// 复制代码运行请自行打印 API 的返回值
    		_, _err = client.SendSmsWithOptions(sendSmsRequest, runtime)
    		if _err != nil {
    			return _err
    		}
    
    		return nil
    	}()
    
    	if tryErr != nil {
    		var error = &tea.SDKError{}
    		if _t, ok := tryErr.(*tea.SDKError); ok {
    			error = _t
    		} else {
    			error.Message = tea.String(tryErr.Error())
    		}
    		// 如有需要,请打印 error
    		util.AssertAsString(error.Message)
    	}
    	return _err
    }
    
    func main() {
    	err := _main(tea.StringSlice(os.Args[1:]))
    	if err != nil {
    		panic(err)
    	}
    }
    
    
  4. 然后,嗯,运行它,然后你会发现失败(没有发送到你手机上)。然后就去线上:OpeanAPI调用,发现是因为余额为0,(那是当然的,因为咱们压根没买短信包,怎么可能有余额)

  5. 总结,测个der,还是得先买。

二、真正的测试开始

嗯,到了这一步,咱们买了短信包:购买地址,欸,这就代表咱有余额了嘿嘿。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4NqlvqSp-1657790621607)(../my_images/image-20220714153504079.png)]

并且拿到了四个东西。就可以真正的测试了

四个东西

  1. accessKey,分为accessKeyID和accessKeySecret
  2. 短信签名
  3. 短信模板
  4. 以上四个

先来个分离测试

1、验证码测试操作步骤:

和上边代码一样

  1. 填入accessKey

  2. 填入短信签名和短信模板,

  3. ok,改代码为如下:(任何代码还是每一行都要看,看不懂可以过)

    package main
    
    import (
    	openapi "github.com/alibabacloud-go/darabonba-openapi/client"
    	dysmsapi20170525 "github.com/alibabacloud-go/dysmsapi-20170525/v2/client"
    	util "github.com/alibabacloud-go/tea-utils/service"
    	"github.com/alibabacloud-go/tea/tea"
    	"os"
    )
    
    /**
     * 使用AK&SK初始化账号Client
     * @param accessKeyId
     * @param accessKeySecret
     * @return Client
     * @throws Exception
     */
    func CreateClient(accessKeyId *string, accessKeySecret *string) (_result *dysmsapi20170525.Client, _err error) {
        // 我多加的
        // 因为accessKeyId *string,穿的是地址,所以有了如下四步
    	aki := "申请的accessKeyID"
    	aks := "申请的accessKeySecret"
    	accessKeyId = &aki
    	accessKeySecret = &aks
        // 我多加的
    	config := &openapi.Config{
    		// 您的 AccessKey ID
    		AccessKeyId: accessKeyId,
    		// 您的 AccessKey Secret
    		AccessKeySecret: accessKeySecret,
    	}
    	// 访问的域名dysmsapi.aliyuncs.com
    	config.Endpoint = tea.String("dysmsapi.aliyuncs.com")
    	_result = &dysmsapi20170525.Client{}
    	_result, _err = dysmsapi20170525.NewClient(config)
    	return _result, _err
    }
    
    func _main(args []*string) (_err error) {
    	client, _err := CreateClient(tea.String("accessKeyId"), tea.String("accessKeySecret"))
    	if _err != nil {
    		return _err
    	}
    	// 准备测试阶段,格式基本就是下边的,除了电话号码改改,code六位可以改改,别的动不了
    	sendSmsRequest := &dysmsapi20170525.SendSmsRequest{
    		SignName:      tea.String("阿里云短信测试"),
    		TemplateCode:  tea.String("SMS_154950909"),
    		PhoneNumbers:  tea.String("电话号码,拿自己的测试"),
    		TemplateParam: tea.String("{\"code\":\"98765\"}"),
    	}
    
    	runtime := &util.RuntimeOptions{}
    	tryErr := func() (_e error) {
    		defer func() {
    			if r := tea.Recover(recover()); r != nil {
    				_e = r
    			}
    		}()
    		// 复制代码运行请自行打印 API 的返回值
    		_, _err = client.SendSmsWithOptions(sendSmsRequest, runtime)
    		if _err != nil {
    			return _err
    		}
    
    		return nil
    	}()
    
    	if tryErr != nil {
    		var error = &tea.SDKError{}
    		if _t, ok := tryErr.(*tea.SDKError); ok {
    			error = _t
    		} else {
    			error.Message = tea.String(tryErr.Error())
    		}
    		// 如有需要,请打印 error
    		util.AssertAsString(error.Message)
    	}
    	return _err
    }
    
    func main() {
    	err := _main(tea.StringSlice(os.Args[1:]))
    	if err != nil {
    		panic(err)
    	}
    }
    
    
  4. 然后,嗯,运行它,你会发现欸,成了

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QHWzhl0g-1657790621608)(../my_images/image-20220714172145752.png)]

2、实际需求短信测试。

到了这一步说明我们就要真的往项目实际需求走了。
还不能大意,因为这是短信需求最重要,也是最重要的一步(虽然整体难度不大)

那么先说需求背景-我们的这个项目就是给场所负责人发送提醒短信(如果有红码或者黄码或者未按时做核酸人员的话)

因为这是政府项目不便于向大家展示代码,我就尽可能把逻辑思路,注意点说清楚。

思路-业务逻辑

  1. 先在utils工具类包下新建一个short_message.go(或者AliSms.go)

  2. 引入阿里云代码

    import (
    	openapi "github.com/alibabacloud-go/darabonba-openapi/client"
    	dysmsapi20170525 "github.com/alibabacloud-go/dysmsapi-20170525/v2/client"
    	util "github.com/alibabacloud-go/tea-utils/service"
    	"github.com/alibabacloud-go/tea/tea"
    	"os"
    )
    func CreateClient(accessKeyId *string, accessKeySecret *string) (_result *dysmsapi20170525.Client, _err error) {
        // 我多加的
        // 因为accessKeyId *string,穿的是地址,所以有了如下四步
    	aki := "申请的accessKeyID"
    	aks := "申请的accessKeySecret"
    	accessKeyId = &aki
    	accessKeySecret = &aks
        // 我多加的
    	config := &openapi.Config{
    		// 您的 AccessKey ID
    		AccessKeyId: accessKeyId,
    		// 您的 AccessKey Secret
    		AccessKeySecret: accessKeySecret,
    	}
    	// 访问的域名dysmsapi.aliyuncs.com
    	config.Endpoint = tea.String("dysmsapi.aliyuncs.com")
    	_result = &dysmsapi20170525.Client{}
    	_result, _err = dysmsapi20170525.NewClient(config)
    	return _result, _err
    }
    
    func _main(args []*string) (_err error) {
    	client, _err := CreateClient(tea.String("accessKeyId"), tea.String("accessKeySecret"))
    	if _err != nil {
    		return _err
    	}
    	// 
        phone := 拿到电话号码变量
        m := make(map[string]interface{})
    	m["参数1"] = 参数1
    	m["参数2"] = 参数2
    	m["参数3"] = 参数3
    	mjson, _ := json.Marshal(m)
    	mString := string(mjson) // 把map型切片改为string
    	sendSmsRequest := &dysmsapi20170525.SendSmsRequest{
    		SignName:      tea.String("阿里云短信测试"),
    		TemplateCode:  tea.String("SMS_154950909"),
    		PhoneNumbers:  tea.String(phone),
    		TemplateParam: tea.String(mstring),
    	}
    
    	runtime := &util.RuntimeOptions{}
    	tryErr := func() (_e error) {
    		defer func() {
    			if r := tea.Recover(recover()); r != nil {
    				_e = r
    			}
    		}()
    		// 复制代码运行请自行打印 API 的返回值
    		_, _err = client.SendSmsWithOptions(sendSmsRequest, runtime)
    		if _err != nil {
    			return _err
    		}
    
    		return nil
    	}()
    
    	if tryErr != nil {
    		var error = &tea.SDKError{}
    		if _t, ok := tryErr.(*tea.SDKError); ok {
    			error = _t
    		} else {
    			error.Message = tea.String(tryErr.Error())
    		}
    		// 如有需要,请打印 error
    		util.AssertAsString(error.Message)
    	}
    	return _err
    }
    

    _mian改一个首字母大写的名字。例如AliSms(为了在别的包可见)

  3. 填入需要的签名和模板,以及这里实际需求的变量,例如电话号码变量。多个模板参数变量

  4. 注意这个mstring怎么来的,其他就好说

  5. 根据实际需求嵌入到查的函数代码里

  6. 在定时任务中调用这个查的函数代码就可以了

(如果写的比较模糊,见谅见谅,有什么问题可以私信。)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bJCsq3HL-1657790621609)(../my_images/image-20220714172118473.png)]

这个使用比较多的是什么快递通知,以及注册验证码啥的。但是别的也可以用上,例如咱这个。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

阿里云短信服务使用 的相关文章

  • 最简单的markdown里面插入图片的办法 (用魔法打败魔法)

    这个问题困扰了我很久 xff1a 笔者非常喜欢用markdown 觉得他轻便 灵活 美观 xff0c 但是奈何 xff0c markdown里面插图片会显得有些棘手 xff0c 比方说最简单的用本地图片 markdown里面就是本机图片的路
  • c++面试必问:c++和c的8点不同

    前言 xff1a 最近发现很多面试题都会问到c 43 43 和c的不同 xff1b 总结一下 xff0c 发现遗漏的知识点还是挺多的 xff1b 比如c语言中 xff0c const关键字是个冒牌货 xff1b c 43 43 中struc
  • 01 - 树莓派简介以及烧录系统

    树莓派简介 指路B站 1 树莓派是什么 xff1f 树莓派就是计算机 xff0c 而计算机就是由运算器 控制器 I O设备等硬件部分以及由操作系统 应用程序组成的软件部分共同组成的整体 xff0c 即硬件和软件共同组成的整体就是计算机 xf
  • 上线啦,可以定时周期性提醒群成员的机器人

    这是站在巨人肩膀上的成果 啊 xff0c 有点夸张了 xff0c 总之简单地说 xff0c 熬了几个小时的探索和在洪振的小小帮助下实现了 xff0c 这个小小的但很有用的功能 实现钉钉机器人的自动周期性提醒群成员消息并可以选择是否 64 所
  • 如何在github上建立个人博客?

    如何在github上建立个人博客 xff1f Windows10 使用GitHub 43 Hexo 模板建立个人博客 前期准备 xff1a 1 git 2 node js 验证是否安装成功 xff1a win 43 r 输入 cmd 进入命
  • 用lvm为centos-root逻辑卷扩容

    在用linux进行开发的时候 xff0c 发现centos root下只有50G的空间 xff0c 不满足实际的需求 解决的方法有两种 xff0c 一种是外挂硬盘 xff0c 将其格式化并挂载在某目录下 xff08 如mnt xff09 x
  • STM32 IO模拟实现软件串口

    最近项目中STM32的串口资源紧张 xff0c 于是使用IO口进行模拟串口 xff0c 现进行整理记录 实现思路 IO口模拟串口的思路也比较简单 xff0c 一切按照串口协议进行操作即可 对于发送 xff0c 计算好不同波特率对应的延时时间
  • Linux命令大全(排版清晰!!持续更新!!非常详细)

    前言 最近在使用Linux的时候 xff0c 发现有很多命令不太会 在csdn查阅命令大全的时候 xff0c 发现很多文章都没有很好的排版 xff0c 于是写一篇文章 xff0c 希望能够帮助到大家 xff01 文章内容较多 xff0c 可
  • VScode 结合git的全面使用流程,再也不用记住git的命令了!

    前言 搭建 git 的环境 xff0c 能够方便的在服务器上管理好自己的代码 但是原始的git代码挺难记的 xff0c 而且会降低我们的工作效率 本文主要介绍如何使用vscode与git结合 xff0c 优雅的使用git git 介绍 这里
  • IntelliJ IDEA运行单个java类文件,并且不检查其他类的错误,通过编译

    IntelliJ IDEA运行单个java类文件 xff0c 并且不检查其他类的错误 xff0c 通过编译 前言 从Eclipse转换过来使用IDEA工具时执行java中的main方法块遇到一个问题 xff0c 当前java类的main方法
  • Java IO之:BufferedReader(超详细解析,使用方法说明)

    Java IO操作 BufferedReader 缓冲区读取内容 xff0c 避免中文乱码 要点 xff1a 掌握BufferedReader类的使用 掌握键盘输入的基本形式 Buffer xff1a 表示缓冲区的 之前的StringBuf
  • 一文搞定子网划分!子网掩码!超详细例题解析!

    子网划分理论基础 为什么进行子网划分 减少网络流量 xff0c 无论什么样的流量 xff0c 我们都希望它少些 xff0c 网络流量亦如此 如果没有可信赖的路由器 xff0c 网络流量可能导致整个网络停顿 xff0c 但有了路由器后 xff
  • javafx之webEngine超详细解析

    JavaFX WebEngine JavaFX教程 JavaFX WebEngine JavaFX 提供与 HTML5 内容互操作的功能 JavaFX 中的底层网页渲染引擎是名为 WebKit 的流行的开源API 此 API 用于 Appl
  • Java面试复习体系总结(2021版,持续更新)

    Java面试复习体系总结 xff08 2021版 xff09 感谢各位点赞 xff0c 收藏 xff0c 关注 xff01 文章会持续更新 xff0c 继续输出更多优质内容 xff0c 希望各位都能拿到好的offer 如果在准备算法题的话
  • Git学习_项目实战足够

    了解 本文章完全适用于github gitee以及coding等 xff0c 但是有几个点需要补充 无论是coding xff0c github还是gitee等 xff0c 基本的拉取分支 xff0c 创建自己的远程分支都得会吧 xff0c
  • Idea代码自动补全!插件推荐:Codota,再也不用担心写不出代码了。

    前言 最近 xff0c 有小伙伴推荐给D哥一款IDEA插件 xff0c 叫我一定得给大家分享一下 xff0c 简直太好用了 这款插件解决的痛点 xff1a 当你不知道一个类该怎么用的时候 xff0c 它能帮你快速找到想要的实例代码 群里有不
  • 使用Nginx部署Vue项目超详细图文教程!含踩坑步骤!

    Nginx部署Vue项目 很多小伙伴在做完Vue项目之后 xff0c 想要部署到服务器上自己运行试试 其实使用Nginx就可以轻松的做到 xff0c 并且实现请求转发等功能 下面来看看使用步骤吧 使用Nignx部署Vue项目步骤 1 打包V
  • 测试假数据构造一键构造方法,Python Faker包使用手册

    前言 当我们开发完成之后 xff0c 需要一些假数据来支持我们的系统 如果自己构造的话 xff0c 费时费力 xff0c 还不一定能够构造合适的数据 而用python的faker包 xff0c 构造假数据非常简单 xff01 安装工具 pi
  • Git修改commit信息方法大全,提交日志、姓名、邮箱都能改

    前言 如果提交的时候发现电脑的 git 配置有问题 xff0c 不要着急 xff0c 教你一招搞定 commit 信息 2 修改用户名 邮箱 全局修改 span class token function git span config gl

随机推荐

  • Go 中 Gzip 与 json 搭配使用压缩数据,减少数据传输量

    Go 中 Gzip 与 json 搭配使用压缩数据 前言 在日常工作中 xff0c 如果遇到数据量大的情况 xff0c 在 db 中是不能直接存储某些字段的 xff0c 一般会用 json 进行marshal 为 byte 再存入 但是如果
  • 形参的种类及其能否改变实参

    形参的种类及其能否改变实参 函数的形参主要可分为地址和非地址 xff0c 每种可再分为有无取地址符 amp 取地址符 amp 的作用是让函数运行时不开辟新的空间 xff0c 不产生新的形参 xff0c 而是根据地址直接到函数外找到传入的实参
  • Ubuntu18.04.4 安装XRDP远程桌面终极、最简方案

    Ubuntu18 04 4 安装XRDP远程桌面终极 最简方案 本机系统 xff1a WIN10 远程主机OS xff1a ubuntu 18 04 4 desktop amd64 最近因为工作需要 xff0c 想通过WIN 10的远程桌面
  • Neo4j 构建简单农业知识图谱(Agriculture KnowledgeGraph)

    quad 我们来看一个基于开源语料的简单农业知识图谱 xff0c 由于过程比较繁杂 xff0c 数据和知识图谱数据预处理过程这里不详细叙述 我们重点看基于 Neo4j 来创建知识图谱的过程 项目地址见 xff1a https github
  • 图数据库neo4j导入csv数据

    1 安装环境 quad 执行以下命令安装需要的库 xff1a pip install py2neo pip install neo4j 2 准备数据 quad 在关系抽取中 xff0c 我们会形成SPO三元组即 xff1a 实体
  • win10环境下python3安装pdfminer

    一 安装 1 首先下载源文件包 http pypi python org pypi pdfminer xff0c 解压 xff0c 然后命令行安装 xff1a python setup py install 2 下载pdfminer six
  • 杨辉三角形—省赛java

    十二届蓝桥杯省赛真题H题 杨辉三角形 题比较简单 xff0c 野路子直接干他 span class token keyword import span span class token namespace java span class t
  • C# 界面开发-登陆窗体(包括欢迎界面)

    我们在开发一个需要身份验证系统软件的时候 xff0c 一个必不可少的界面便是登陆界面 xff0c 只有我们在登陆界面中输入正确的用户名和密码 xff0c 才能登陆到主界面 xff0c 有时候可能还会加载系统资源 xff0c 所以还会增加一个
  • ROS系统中编写多个C++文件时,主文件调用其它文件函数或类时出现:对“xxxxxx“未定义的引用问题记录

    问题描述 主文件对其它文件内容调用时 xff0c 明明已经正确引用相关头文件 xff0c 并确保类和函数已被定义 xff0c 仍然出现下面问题 CMakeFiles span class token operator span robot
  • 使用sklearn学习决策树(Decision Tree)

    决策树模型 决策树 xff08 decision tree xff09 是一种基本的分类与回归方法 分类决策树模型是一种描述对实例进行分类的树形结构 决策树由结点 xff08 node xff09 和有向边 xff08 directed e
  • CTeX安装及使用

    1 关于 LaTeX和CTeX quad LaTeX是一种基于 的排版系统 xff0c 由美国计算机学家莱斯利 兰伯特 xff08 Leslie Lamport xff09 在20世纪80年代初期开发 xff0c 利用这种格式 xff0c
  • 深度强化学习(7)深度确定性策略梯度(DDPG)

    深度确定性策略梯度 xff08 DDPG xff09 1 从随机策略到确定性策略 首先 xff0c 我们先了解一下随机策略和确定性策略 随机策略的公式为 xff1a a
  • 强化学习(1)马尔科夫决策过程(MDP)

    强化学习 开始强化学习之前先来了解强化学习 深度学习 深度强化学习 监督学习 无监督学习 机器学习和人工智能之间的关系 如下图 xff1a 强化学习是机器学习的一个重要分支 xff0c 它试图解决决策优化的问题 所谓决策优化 xff0c 是
  • 深度强化学习(3)Prioritized Replay DQN

    Prioritized Replay DQN 在深度强化学习 xff08 2 xff09 Double DQN 中 xff0c 我们讲到了DDQN使用两个Q网络 xff0c 用当前Q网络计算最大Q值对应的动作 xff0c 用目标Q网络计算这
  • 封装使用axios进行接口请求

    一 安装axios npm install axios在main js引入 import axios from 34 axios 34 Vue use axios vue3使用createApp App config globalPrope
  • VMware+Ubuntu20.04安装指南

    1 首先下载VMware Workstation Player 16 xff0c 下载链接为 https customerconnect vmware com en downloads all products 2 下载完成后 xff0c
  • Java8流式操作——中间操作

    文章目录 什么是中间操作 xff1f 方法实践说明一 前提条件Person类Data类 二 操作filter 过滤distinct 去重 xff08 去除集合中重复的元素 xff09 sorted 排序 sorted 无参构造 sorted
  • 数据挖掘(Data Mining)扫盲笔记

    知识框架来源 xff1a 人工智能之数据挖掘 其他补充来源 xff1a 拿下Offer 数据分析师求职面试指南 数据分析实战45讲 Data Mining 概述篇基础认知挖掘对象常见任务 xff1a 模型分类问题与挑战十大经典算法 C4 5
  • 信息论笔记(需要编辑格式)

    主要来源 xff1a 吴军 信息论40讲 信息论介绍 世界上任何一个探索者都需要清楚三件事 我们现在的位置 我们的目标 以及通向目标的道路 哲学是一门生活的艺术 它帮助我们认清自己 它回答了第一个问题 至于每一个人的目标 我相信大家比我更清
  • 阿里云短信服务使用

    说明 这是用go语言实现的 xff0c 但说实话 xff0c 其实没啥影响 xff0c 不管什么语言都是这个套路 xff0c 所以无论你是学什么语言或者是用什么语言的都好 xff0c 看看总不亏 22年7 14下午14 xff1a 38 x