Aligenie语音开发平台(天猫精灵)的对接记录

首先找到阿里语音开发平台:

用自己的淘宝号登录,进入控制台:

添加新技能:

这里以智能家居接入为例,填写以下信息,填完点击下一步:

填写服务配置:

到此为止,语音开发平台的配置就差不多了,接下来是自己的项目的配置(基于Springboot)。

主要是编写一个Controller类(基于OAuth2认证流程,需引入相关依赖包,代码已经测过,自己按照官方文档,修改返回的JSONObject数据即可,这里的AligenieCommand类是我自己按照官网封装的,代码里面有些参数,不方便放出来,不懂的可以留言):

package com.zlkj.appiot.controller;import com.alibaba.fastjson.JSONObject;
import com.zlkj.appiot.entity.AligenieCommandAttribute;
import com.zlkj.appiot.service.AligenieDeviceService;
import com.zlkj.appiot.service.IotCommandService;
import com.zlkj.appiot.util.JsonUtil;
import com.zlkj.appiot.util.PropertiesUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.apache.oltu.oauth2.as.issuer.MD5Generator;
import org.apache.oltu.oauth2.as.issuer.OAuthIssuer;
import org.apache.oltu.oauth2.as.issuer.OAuthIssuerImpl;
import org.apache.oltu.oauth2.as.request.OAuthAuthzRequest;
import org.apache.oltu.oauth2.as.request.OAuthTokenRequest;
import org.apache.oltu.oauth2.as.response.OAuthASResponse;
import org.apache.oltu.oauth2.common.OAuth;
import org.apache.oltu.oauth2.common.exception.OAuthProblemException;
import org.apache.oltu.oauth2.common.exception.OAuthSystemException;
import org.apache.oltu.oauth2.common.message.OAuthResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutionException;/*** @Classname AligenieController* @Description  语音开发平台对接* @Date 2019/7/3 0003 14:07* @Created by zlkj*/@Controller
@RequestMapping(value = "aligenie")
public class AligenieController {private static final Logger log = Logger.getLogger(AligenieController.class);/*** OAuth2授权服务器发布的ip地址 或 域名*/private String baseURL = PropertiesUtil.getValue("local_ip");/*** 天猫精灵请求授权接口*/private String cutURL = baseURL + "/aligenie/OAuth2Page";/*** 登录成功后将code通过天猫回调地址返回给天猫*/private String oauthURL = baseURL + "/aligenie/responseCode";private static String username = "123456";private static String password = "123456";/*** 绑定 token令牌 与对应的 用户标识*/private static ConcurrentMap<String,String> token_username = new ConcurrentHashMap<>();/*** 截去参数的时候需要*/private int cutlength = cutURL.length();/*** 设置授权码*/private String authorizationCode = PropertiesUtil.getValue("authorizationCode");/*** 保存指令*/private HashMap<String,Object> cmdParams = new HashMap<>();@Autowired@Qualifier("IotCommandServiceImpl")private IotCommandService iotCommandService;@Autowired@Qualifier("DefaultAligenieDeviceService")private AligenieDeviceService deviceService;/*** OAuth2认证页面(第三方登录界面)* @param request* @return* @throws OAuthProblemException* @throws OAuthSystemException*/@RequestMapping("/OAuth2Page")public String getOAuthPage(HttpServletRequest request) {log.info("获取授权界面!");// AliGenie平台的回调地址,需要将参数补全,并进行进行urlEncode------https://open.bot.tmall.com/oauth/callback?skillId=36251&token=MjY0NjQ2NDM0OUFGRUhJTkZEVlE=return "/login.html";}/*** 登录操作* @param request* @return* @throws UnsupportedEncodingException*/@RequestMapping("/login")public void login(HttpServletRequest request, HttpServletResponse response) throws IOException {String outURL = request.getHeader("referer");outURL = java.net.URLDecoder.decode(outURL, "GBK");log.info("登錄login的referer地址:" + outURL);String username1 = request.getParameter("username");String password1 = request.getParameter("password");//获取用户标识,保存用作以后获取该用户下面绑定的设备if (username1.equalsIgnoreCase(username) && password1.equalsIgnoreCase(password)) {// 登录成功就重定向到获取授权码 拼接地址 解密后的请求参数长度int outlength = outURL.length();String responseURL = outURL.substring(cutlength, outlength);log.info("截取login的referer地址的参数:" + responseURL);String responseCodeUrl = oauthURL + responseURL;log.info("登錄成功,重定向到:" + responseCodeUrl);response.sendRedirect(responseCodeUrl);} else {//重新登录response.sendRedirect(cutURL);}}/*** 返回授权码* @param request* @return* @throws OAuthSystemException* @throws OAuthProblemException*/@RequestMapping("/responseCode")public String responeseCode(HttpServletRequest request) throws OAuthSystemException, OAuthProblemException {log.info("响应授权码......");String url = request.getHeader("referer");log.info("responseCode請求的referer地址:" + url);// 构建OAuth 授权请求OAuthAuthzRequest oauthRequest = new OAuthAuthzRequest(request);log.info("oauthRequest信息 :" + JSONObject.toJSONString(oauthRequest));//需要调用App后台的登录功能,暂时写死用户名和密码log.info("oauthRequest.getClientId():"+oauthRequest.getClientId());if (PropertiesUtil.getValue("clientId").equalsIgnoreCase(oauthRequest.getClientId())) {// 进行OAuth响应构建OAuthASResponse.OAuthAuthorizationResponseBuilder builder = OAuthASResponse.authorizationResponse(request,HttpServletResponse.SC_FOUND);// 设置授权码builder.setCode(authorizationCode);builder.setParam("token", oauthRequest.getParam("token"));log.info("設置 token......");// 得到到客户端重定向地址String redirectURI = oauthRequest.getParam(OAuth.OAUTH_REDIRECT_URI);log.info("客户端重定向地址:"+redirectURI);// 构建响应final OAuthResponse response = builder.location(redirectURI).buildQueryMessage();log.info("服务端/responseCode内,返回的回调路径:" + response.getLocationUri());log.info("----------------------------------服务端/responseCode---------------------------------------");String responceUri = response.getLocationUri();// 根据OAuthResponse返回ResponseEntity响应HttpHeaders headers = new HttpHeaders();try {headers.setLocation(new URI(response.getLocationUri()));} catch (URISyntaxException e) {e.printStackTrace();}return "redirect:" + responceUri;}log.error("客戶端id或密碼不正確!");return null;}/*** Aligenie语音开发平台用之前获取的code来获取放行token* @param request* @return* @throws OAuthSystemException*/@RequestMapping("/getToken")public Object getToken(HttpServletRequest request) throws OAuthSystemException {OAuthIssuer oauthIssuerImpl = null;OAuthResponse response = null;// 构建OAuth请求try {OAuthTokenRequest oauthRequest = new OAuthTokenRequest(request);String authCode = oauthRequest.getParam(OAuth.OAUTH_CODE);String clientSecret = oauthRequest.getClientSecret();log.info("authCode:" + authCode);if (!StringUtils.isEmpty(clientSecret)) {// 生成Access TokenoauthIssuerImpl = new OAuthIssuerImpl(new MD5Generator());final String accessToken = oauthIssuerImpl.accessToken();final String refreshToken = oauthIssuerImpl.refreshToken();// 生成OAuth响应response = OAuthASResponse.tokenResponse(HttpServletResponse.SC_OK).setAccessToken(accessToken).setRefreshToken(refreshToken).setParam("expires_in", "17600000").buildJSONMessage();try {// 这里可以将用户名和token绑定起来 ,在控制设备的时候,可以识别token对应的用户token_username.put(username,accessToken);} catch (Exception e) {log.info(e.getMessage());}}log.info("response.getBody:" + response.getBody());// 根据OAuthResponse生成ResponseEntityreturn new ResponseEntity(response.getBody(), HttpStatus.valueOf(response.getResponseStatus()));} catch (OAuthSystemException e) {response = OAuthASResponse.tokenResponse(HttpServletResponse.SC_OK).setParam("error", "101").setParam("error_description", "内部错误").buildJSONMessage();log.info("错误" + response.getBody());return new ResponseEntity(response.getBody(), HttpStatus.valueOf(response.getResponseStatus()));} catch (OAuthProblemException e) {response = OAuthASResponse.tokenResponse(HttpServletResponse.SC_OK).setParam("error", "102").setParam("error_description", "参数错误").buildJSONMessage();log.info("错误" + response.getBody());log.info(oauthURL);return new ResponseEntity(response.getBody(), HttpStatus.valueOf(response.getResponseStatus()));}}/*** 语音指令下发平台* @param request* @return*/@RequestMapping("/controlAction")@ResponseBodypublic JSONObject controlAction(HttpServletRequest request) throws ExecutionException, InterruptedException {log.info("准备进入开发者网关地址,先解析指令......");Enumeration<?> enum1 = request.getHeaderNames();while (enum1.hasMoreElements()) {String key = (String) enum1.nextElement();String value = request.getHeader(key);log.info(key + "\t" + value);}// body部分String inputLine;StringBuffer str = new StringBuffer();try {BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));while ((inputLine = br.readLine()) != null) {str.append(inputLine);}br.close();} catch (IOException e) {log.error("IOException: " + e);}log.info("接受来自天猫精灵的消息:" + str.toString());JSONObject recieveMsg = JsonUtil.str2Object(str.toString());String headStr = recieveMsg.getString("header");String payLoadStr = recieveMsg.getString("payload");//将header转化为对象JSONObject headerMsg = JsonUtil.str2Object(headStr);JSONObject payLoadMsg = JsonUtil.str2Object(payLoadStr);//设备发现 AliGenie.Iot.Device.Discoveryif(headerMsg.getString("namespace").trim().endsWith("Discovery")){log.info("编号为1用户 :绑定的设备列表信息......");Integer userId = 1;//返回设备列表return deviceService.getDeviceList(userId,headerMsg.getString("messageId"));}//设备控制指令  AliGenie.Iot.Device.Controlif(headerMsg.getString("namespace").trim().endsWith("Control")){String optionName = headerMsg.getString("name");//详细控制操作指令   开灯if(AligenieCommandAttribute.TurnOn.getOptionName().equalsIgnoreCase(optionName)){log.info(">>>>>>>>>>>>>>>>>>准备打开灯具>>>>>>>>>>>>>>>>");//需要打开的设备编号,和一开始上报的设备id一致//cmdParams.put("dev",payloadMsg.getString("deviceId"));//这里先将设备id写死cmdParams.put("dev",new int[]{0});//onoff:1-开 0-关cmdParams.put("onoff",0);JSONObject result = iotCommandService.query("TestLight",0,6,cmdParams);if(result.getString("ret").equalsIgnoreCase("0")){log.info(">>>>>>>>>>>>>>>>>>已成功打开灯具>>>>>>>>>>>>>>>>");}else if(result.getString("ret").equalsIgnoreCase("1")){log.info(">>>>>>>>>>>>>>>>>>灯具打开失败>>>>>>>>>>>>>>>>");}}else if(AligenieCommandAttribute.TurnOff.getOptionName().equalsIgnoreCase(optionName)){//需要打开的设备编号,和一开始上报的设备id一致//cmdParams.put("dev",payloadMsg.getString("deviceId"));cmdParams.put("dev",new int[]{0});//onoff:1-开 0-关cmdParams.put("onoff",1);JSONObject result = iotCommandService.query("TestLight",0,6,cmdParams);if(result.getString("ret").equalsIgnoreCase("0")){log.info(">>>>>>>>>>>>>>>>>>已成功打开灯具>>>>>>>>>>>>>>>>");}else if(result.getString("ret").equalsIgnoreCase("1")){log.info(">>>>>>>>>>>>>>>>>>灯具打开失败>>>>>>>>>>>>>>>>");}}else if(AligenieCommandAttribute.SetColorTemperature.getOptionName().equalsIgnoreCase(optionName)){log.info(">>>>>>>>>>>>>>>>>>>>>设置颜色>>>>>>>>>>>>>>>>>>>>>>>");//需要打开的设备编号,和一开始上报的设备id一致//cmdParams.put("dev",payloadMsg.getString("deviceId"));cmdParams.put("dev",new int[]{0});//W:亮度 Y:色温cmdParams.put("Y",80);JSONObject result = iotCommandService.query("TestLight",0, 5,cmdParams);return result;}else if(AligenieCommandAttribute.SetBrightness.getOptionName().equalsIgnoreCase(optionName)){log.info(">>>>>>>>>>>>>>>>>>>>>设置亮度>>>>>>>>>>>>>>>>>>>>>>>");//需要打开的设备编号,和一开始上报的设备id一致//cmdParams.put("dev",payloadMsg.getString("deviceId"));//需要传入设备id的list集合cmdParams.put("dev",new int[]{0});//W:亮度 Y:色温cmdParams.put("Y",80);JSONObject result = iotCommandService.query("TestLight",0, 5,cmdParams);//判断结果,组织天猫精灵响应消息}else{log.info("暂未支持该操作:" + headStr);}}//设备属性查询指令 AliGenie.Iot.Device.Queryif(headerMsg.getString("namespace").trim().endsWith("Query")){}return null;}
}

测试流程:返回语音开发平台,去测试:

点击新窗打开,再点击账户配置跳转到授权页面(即用户的登录页面)

输入自己定义的账户名密码,登录,开始获取token,通过token拿到授权码,开始获取该用户下的绑定的设备信息,后台返回按照协议返回设备信息,最后获取成功,呈现到页面上面:

在获取设备列表的时候,后台收到了来自天猫精灵的一条发现设备的指令:

然后按照协议返回对应的信息就好了,我这里是模拟一个假的设备数据返回了,封装类如下,可用作参考,主要是看官方文档:

/*** @Classname AligenieCommand* @Description TODO 语音开发指令* @Date 2019/7/10 0010 10:49* @Created by jtj*/
public class AligenieCommand {private JSONObject AliData = new JSONObject();private JSONObject headerData = new JSONObject();private JSONObject payLoadData = new JSONObject();//设备数组private JSONArray devicesArray = new JSONArray();public AligenieCommand(){}/*** 构建返回语音开发平台的消息体* @param messageId  接受消息的messageId,原封不动返回* @param objects 设备信息*/public AligenieCommand(String messageId, List<JSONObject> objects){//头信息headerData.put("namespace", "AliGenie.Iot.Device.Discovery");headerData.put("name", "DiscoveryDevicesResponse");headerData.put("messageId", messageId);headerData.put("payLoadVersion", "1");for(int i=0;i<objects.size();i++){Object deviceInfo = objects.get(i);//组织设备信息JSONObject deviceJson = new JSONObject();deviceJson.put("deviceId",i);  //设备IddeviceJson.put("deviceName","灯"); //名称deviceJson.put("deviceType","light");  //设备类型,具体参考AliGenie支持的品类列表deviceJson.put("zone","门口");    //位置  可选deviceJson.put("brand","RGB_LED_ZLKJ");   //牌子deviceJson.put("model","KongKong");  //型号deviceJson.put("icon","http://img0.imgtn.bdimg.com/it/u=1357034633,1383263005&fm=26&gp=0.jpg");  //产品icon(https协议的url链接),像素最好160*160 以免在app显示模糊JSONArray prop = new JSONArray();//电源属性JSONObject propVal1 = new JSONObject();propVal1.put("name", "powerstate");propVal1.put("name", "off");//颜色属性JSONObject propVal2 = new JSONObject();propVal2.put("name", "color");propVal2.put("name", "Red");deviceJson.put("properties",prop);//返回当前设备支持的属性状态列表,产品支持的属性列表参考deviceJson.put("actions",new String[]{"TurnOn","TurnOff","SetBrightness","AdjustBrightness","SetTemperature","Query"});  //产品支持的操作(注:包括支持的查询操作)deviceJson.put("extensions",null);  //产品扩展属性,为空返回null或者不返回该字段devicesArray.add(deviceJson);}payLoadData.put("devices",devicesArray);AliData.put("header",headerData);AliData.put("payload",payLoadData);}//返回该对象的JSON字符串@Overridepublic String toString() {return AliData.toJSONString();}//返回该构建对象的JSONObjectpublic JSONObject getAliData() {return AliData;}//测试入口public static void main(String[] args) {List<JSONObject> objects = new ArrayList<>();for(int i = 0;i<5;i++){objects.add(new JSONObject());}String result = new AligenieCommand(UUID.randomUUID().toString().replaceAll("-",""), objects).toString();System.out.println(result);}
}

也可以在天猫精灵APP上面,登录自己的淘宝号,也可以看见返回的设备信息。

最后就是将信息填写完整,把创建的技能发布,通过审核就好了,大概流程是这样。

程序员接单平台 :https://www.yungong.com/user/promote/eyJpdiI6IjVZekxGc2hGRExoUHo3ek1DbDd1VFE9PSIsInZhbHVlIjoiXC9VckY5VDN3QTVzYlBxK2p4anF0c2c9PSIsIm1hYyI6ImE3Mjc4MzYxMzJmMGZhZTFiMzA1ZjQ0OTg2MTlkNThlM2RlODliNTg0ZTNkZTZiMDhkZTM4ODljMjVkY2M3MjYifQ==

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

天猫精灵家居对接第三方设备(详细版)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言补充准备阶段&#xff08;内网映射到外网&#xff09;一、天猫精灵官网配置准备二、天猫精灵部分实现代码三、天猫精灵配置技能广场四、天猫精灵语音调试测试总…

如何让 ChatGPT 充当细致入微的 Java 代码优化工? | 得物技术

注&#xff1a;本文使用 New Bing&#xff08;GPT4.0&#xff09;演示 让他扮演一个 Java 软件开发者 第一步&#xff1a;我们让 ChatGPT 扮演一个 Java 软件开发者的角色 提示词插件&#xff1a;地址&#xff1a;ChatGPT BingChat GPT3 Prompt Generator App (Streamlit) - a…

低代码是行业毒瘤吗?ChatGPT这样回答

一、低代码现状 从2019年开始低代码领域备受资本市场关注&#xff0c;在争议中不断发展&#xff0c;至今仍存在诸多尚未厘清的概念有待探讨&#xff0c;比如低代码是行业毒瘤吗&#xff1f; 根据对行业近况的搜罗&#xff0c;总结以下现状&#xff1a;当前低代码行业在中国面…

万亿赛道大爆发,are you ready? “2022首届AIGC共创共建论坛”来了!

图片来源&#xff1a;由无界版图 AI 绘画工具生成 12月初的这个周末&#xff0c;ChatGPT在科技圈彻底火了&#xff0c;这是OpenAI新推出的AI聊天机器人&#xff0c;它就像科幻电影的智能助理&#xff0c;不管什么问题&#xff0c;它都能给出最优解。AIGC&#xff0c;人工智能内…

QQ 群聊美少女语音AI(ChatGLM 本地化版本)

QQ 群聊美少女语音AI&#xff08;ChatGLM 本地化版本&#xff09; ✨ 基于 go-cqhttp 以及 VITS-fast-fine-tuning ChatGLM 实现 ✨ Combination of ChatGLM and VITs anime girl AI voice and used in QQ robot 项目地址&#xff1a;https://github.com/Panzer-Jack/ChatGL…

谷歌、OpenAI 都白干,开源才是终极赢家!谷歌内部文件泄露:欲借开源打败 OpenAI...

&#xff09;省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2023年4月份热门报告合集 无需翻墙&#xff0c;ChatGPT直接使用 万字干货&#xff1a;ChatGPT的工作原理 2023年创业&#xff08;有创业想法&#xff09;必读手…

从零训练一个多模态LLM

本文尝试梳理一个完整的多模态LLM的训练流程。包括模型结构选择、数据预处理、模型预训练、指令微调、对齐、融合多模态以及链接外部系统等环节。 一、准备阶段 1 模型结构 目前主要有三种模型架构&#xff0c;基于Transformer解码器&#xff0c;基于General Language Model…

从零训练一个多模态LLM:预训练+指令微调+对齐+融合多模态+链接外部系统

深度学习自然语言处理 分享知乎&#xff1a;逃脱鱼子酱 进NLP群—>加入NLP交流群 本文尝试梳理一个完整的多模态LLM的训练流程。包括模型结构选择、数据预处理、模型预训练、指令微调、对齐、融合多模态以及链接外部系统等环节。 一、准备阶段 1 模型结构 目前主要有三种模型…

【LLM GPT】李宏毅大型语言模型课程

目录 1 概述1.1 发展历程1.2 预训练监督学习预训练的好处 1.3 增强式学习1.4 对训练数据的记忆1.5 更新参数1.6 AI内容检测1.7 保护隐私1.8 gpt和bert穷人怎么用gpt 2 生成式模型2.1 生成方式2.1.1 各个击破 Autoregressive2.1.2 一次到位 Non-autoregressive2.1.3 两者结合 2.…

GPT-4比人类更懂融资!AI企划书让VC疯狂打call

尚恩 发自 凹非寺量子位 | 公众号 QbitAI 你敢信&#xff0c;一份由AI写的融资企划书&#xff0c;竟然引发VC疯狂追捧&#xff01; 甚至有VC投资人当场承诺&#xff0c;愿意给这份由GPT-4生成的企划书直接投资。 又一个用GPT赚钱的小技能&#xff0c;Get。 对此咱真不得不感叹一…

微信小游戏个人开发者上架:从注册到上线的详细步骤

微信小游戏个人开发者上架&#xff1a;从注册到上线的详细步骤 一&#xff0c;注册小程序账号1.1 微信公众平台1.2 填写信息1.3 绑定管理 二&#xff0c;打包步骤2.1 工具准备2.2 关于Unity版本2.3 打包详解 三&#xff0c;提包步骤3.1 填写用户隐私3.2 完善开发者自查3.3 游戏…

对标GPT核心技术RLHF!港科大开源RAFT「木筏」,适用GPT扩散模型

梦晨 发自 凹非寺 量子位 | QbitAI 开源大模型火爆&#xff0c;已有大小羊驼LLaMA、Vicuna等很多可选。 但这些羊驼们玩起来经常没有ChatGPT效果好&#xff0c;比如总说自己只是一个语言模型、没有感情blabla&#xff0c;拒绝和用户交朋友。 归根结底&#xff0c;是这些模型没…

DDPM详解 AI绘画

话说DDPM DDPM模型&#xff0c;全称Denoising Diffusion Probabilistic Model&#xff0c;可以说是现阶段diffusion模型的开山鼻祖。不同于前辈GAN、VAE和flow等模型&#xff0c;diffusion模型的整体思路是通过一种偏向于优化的方式&#xff0c; 逐步从一个纯噪音的图片中生成图…

对抗生成网络GAN系列——DCGAN简介及人脸图像生成案例

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;往期回顾&#xff1a;对抗生成网络GAN系列——GAN原理及手写数字生成小案例 &#x1f34a;近期目标&#xff1a;写好专栏的每一篇文章 &#x1f34a;支持小苏&#xff1a;点赞…

用户画像·用户性别预测

文章目录 一、为什么进行性别预测二、特征数据选取三、算法选择四、代码示例1、使用朴素贝叶斯&#xff0c;进行建模2、使用支持向量机3、使用逻辑斯蒂回归 一、为什么进行性别预测 用户注册时&#xff0c;所填写的性别&#xff0c;存在大概率的随意性&#xff1b;不能完全作为…

云开发视频资源变现微信小程序源码

简介&#xff1a; 云开发视频资源变现微信小程序源码&#xff0c;带有流量主功能。获取视频&#xff0c;获取资源需先看广告&#xff0c;资源变现小程序全源码无删减&#xff0c;自己付费做的。 主要功能&#xff0c;就是用户想观看你的视频或者获取你的资源&#xff0c;就需…

拉伯证券|年报行情如火如荼 博弈“超预期”还须警惕“风险点

本周以来&#xff0c;在指数转入高位盘整的背景下&#xff0c;A股商场资金围绕年报头绪展开布局&#xff0c;“年报预增”一跃成为商场最强主线&#xff0c;不少成绩预增公司短期股价收获明显超额收益。 Choice数据显现&#xff0c;截至1月12日盘前&#xff0c;开年以来共136家…

基于上证金融数据的情感分析和走势预测 代码+数据

目录 情感分析结果&#xff1a; ​编辑 首先是获取 股票评论数据的网站&#xff1a; 程序&#xff1a; 数据展示&#xff1a; 情感分析结果&#xff1a; 首先是获取 股票评论数据的网站&#xff1a; 上证指数股吧_上证指数分析讨论社区-东方财富网 程序&#xff1a; im…

FTT暴雷加密熊市雪上加霜?如何对抗系统风险

11月加密领域&#xff0c;正在上演一场新的戏剧&#xff1a;CZ vs SBF。 行情及后续风险预判&#xff0c;这是一场亿万富翁之战。中心化交易所币安和FTX的首席执行官CZ和SBF正在对峙。 FTX事件到11月11日似乎进入了一个新的阶段&#xff0c;在过去的几天里发生的事情几乎可以确…

fastposter v2.9.3 简单易用的海报生成器

&#x1f525;&#x1f525;&#x1f525; fastposter海报生成器是一款快速开发海报的工具。只需上传一张背景图&#xff0c;在对应的位置放上组件&#xff08;文字、图片、二维&#x1f434;、头像&#xff09;即可生成海报。 点击代码直接生成各种语言的调用代码&#xff0c;…