一:创建一个springboot的maven项目包

新建:File–new–project
下载1.8jdk 以及 Maven 我这里下载的是 Maven 3.6.1

GroupID是项目组织唯一的标识符:一般书写格式:com.公司.项目名
ArtifactID就是项目的唯一的标识符:一般书写格式:项目名

需要提前配置maven 还要修改settings.xml文件 这里就不多说了

二:src里面写我们的去水印源码


这是我new好的文件 在这里我就不多做解释了
在JsonUtil这个java文件里代码内容如下

package com.rjt.common.util;
import org.springframework.util.StringUtils;
import com.alibaba.fastjson.JSON;
public class JsonUtil {/*** 将json格式化为字符串,然后根据key取值* @param jsonStr* @param key* @return*/public static String getJsonValue(String jsonStr,String key) {if(StringUtils.isEmpty(jsonStr) || StringUtils.isEmpty(key)) {return "";} if(key.indexOf(".")==-1) {if(key.indexOf("[")!=-1) {int num =Integer.parseInt(TextUtil.getSubString(key, "[", "]"));key=key.substring(0, key.indexOf("["));return  JSON.parseObject(jsonStr).getJSONArray(key).getString(num);}else {return JSON.parseObject(jsonStr).getString(key);}}else {String[] keys = key.split("\\.");for(int i=0;i<keys.length;i++) {String tempKey=keys[i];if(tempKey.indexOf("[")!=-1) {int num =Integer.parseInt(TextUtil.getSubString(tempKey, "[", "]"));tempKey=tempKey.substring(0, keys[i].indexOf("["));jsonStr=JSON.parseObject(jsonStr).getJSONArray(tempKey).getString(num);}else {jsonStr=JSON.parseObject(jsonStr).getString(tempKey);}}return jsonStr;}}
}

TextUtilde

package com.rjt.common.util;
import blade.kit.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Random;
public class TextUtil {private static Logger logger = LoggerFactory.getLogger(TextUtil.class);/*** 取两个文本之间的文本值* * @param text* @param left* @param right* @return*/public static String getSubString(String text, String left, String right) {String result = "";int zLen;if (left == null || left.isEmpty()) {zLen = 0;} else {zLen = text.indexOf(left);if (zLen > -1) {zLen += left.length();} else {zLen = 0;}}int yLen = text.indexOf(right, zLen);if (yLen < 0 || right == null || right.isEmpty()) {yLen = text.length();}result = text.substring(zLen, yLen);return result;}/*** 获取ip* * @param request* @return*/public static String getRemortIP(HttpServletRequest request) {String ip = request.getHeader("x-forwarded-for"); if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {  // 多次反向代理后会有多个ip值,第一个ip才是真实ipif( ip.indexOf(",")!=-1 ){ip = ip.split(",")[0];}}  if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  ip = request.getHeader("Proxy-Client-IP");  }  if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  ip = request.getHeader("WL-Proxy-Client-IP");  }  if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  ip = request.getHeader("HTTP_CLIENT_IP");  }  if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  ip = request.getHeader("HTTP_X_FORWARDED_FOR");  }  if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  ip = request.getHeader("X-Real-IP");  }  if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  ip = request.getRemoteAddr();  } return ip;  }/*** 根据ip获取地址* * @param* @return* @throws UnsupportedEncodingException*/public static String getPlace(String ip) throws UnsupportedEncodingException {if (ip.indexOf(", ") != -1) {ip = ip.split(", ")[1];}String url = "https://ip.cn/index.php?ip=" + ip;HttpRequest request = HttpRequest.get(url, true).header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0");String res = request.body();String place = TextUtil.getSubString(res, "置:<code>", "</code></p><p>");request.disconnect();return place;}/*** 根据地址获取纬度* * @param* @return* @throws UnsupportedEncodingException*/public static String getWd(String place) throws UnsupportedEncodingException {String url = "http://apis.map.qq.com/jsapi?qt=poi&wd=" + URLEncoder.encode(place, "utf8");HttpRequest request = HttpRequest.get(url, true);String res = request.body();request.disconnect();return handResult(res);}/*** 处理数据* * @param res* @return*/private static String handResult(String res) {JSONObject json = JSON.parseObject(res);json = JSON.parseObject(json.get("detail").toString());JSONArray jsonArray = JSON.parseArray((json.get("pois").toString()));int ranNum = getRandomNumRang(jsonArray.size());json = JSON.parseObject(jsonArray.get(ranNum).toString());return json.get("pointx") + "," + json.get("pointy");}public static void main(String[] args) throws UnsupportedEncodingException {int a=0;for (int i=0;i<100;i++){String ee= getRandomNum(1);if(ee.equals("8")){System.out.println(a++);}}}/*** 根据ip获取维度和精度* @param* @return* @throws UnsupportedEncodingException*/public static String getWd(HttpServletRequest request) throws UnsupportedEncodingException {String remortIP = getRemortIP(request);logger.info("remortIP 为{}",remortIP);String place = getPlace(remortIP);logger.info("place 为{}",place);String wd="112.537170,37.874690";try {wd = getWd(place);} catch (Exception e) {// TODO: handle exceptionlogger.info("e 为{}",e);}logger.info("wd 为{}",wd);return wd;}/*** 取随机数字* * @param num* @return*/public static String getRandomNum(int num) {StringBuffer sb = new StringBuffer();for (int i = 0; i < num; i++) {Random rnd = new Random();sb.append(rnd.nextInt(9));}return sb.toString();}/*** 根据范围取随机数字* * @param* @return*/public static int getRandomNumRang(int end) {Random rnd = new Random();return rnd.nextInt(end);}public static String makeImei () {String imeiString=TextUtil.getRandomNum(14);char[] imeiChar=imeiString.toCharArray();int resultInt=0;for (int i = 0; i < imeiChar.length; i++) {int a=Integer.parseInt(String.valueOf(imeiChar[i]));i++;final int temp=Integer.parseInt(String.valueOf(imeiChar[i]))*2;final int b=temp<10?temp:temp-9;resultInt+=a+b;}resultInt%=10;resultInt=resultInt==0?0:10-resultInt;return imeiString+resultInt;}
}

VideoController

package com.rjt.video.controller;import java.util.Objects;import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import com.rjt.video.model.VideoModel;
import com.rjt.video.service.VideoService;
import com.rjt.video.service.impl.VideoFactory;/**
* @comment
* @author tanran
* @date 2019年6月14日
* @version 1.0
*/
@RestController
@RequestMapping("video")
@CrossOrigin
public class VideoController {@GetMapping(value = "parse")public VideoModel parse(String url) throws InstantiationException, IllegalAccessException, ClassNotFoundException {VideoService videoService = VideoFactory.getVideo(url);if(Objects.isNull(videoService)) {return new VideoModel();}return videoService.parseUrl(url);}
}

VideoModel

package com.rjt.video.model;
public class VideoModel {//视频名private String name;//视频背景private String cover;//无水印地址private String playAddr;/*** @return the name*/public String getName() {return name;}/*** @param name the name to set*/public void setName(String name) {this.name = name;}/*** @return the cover*/public String getCover() {return cover;}/*** @param cover the cover to set*/public void setCover(String cover) {this.cover = cover;}/*** @return the playAddr*/public String getPlayAddr() {return playAddr;}/*** @param playAddr the playAddr to set*/public void setPlayAddr(String playAddr) {this.playAddr = playAddr;}@Overridepublic String toString() {return "VideoModel [name=" + name + ", cover=" + cover + ", playAddr=" + playAddr + "]";}
}

service文件下的impl文件包含7个java文件:
DouyinServiceImpl

package com.rjt.video.service.impl;import org.springframework.stereotype.Service;import com.rjt.common.util.JsonUtil;
import com.rjt.common.util.TextUtil;
import com.rjt.video.model.VideoModel;
import com.rjt.video.service.VideoService;import blade.kit.http.HttpRequest;/**
* @comment
* @author tanran
* @date 2019年6月14日
* @version 1.0
*/
@Service
public class DouyinServiceImpl implements VideoService{@Overridepublic VideoModel parseUrl(String url) {// TODO Auto-generated method stubVideoModel videoModel=new VideoModel();HttpRequest request = HttpRequest.get(url);String res = request.body();String awemeId=TextUtil.getSubString(res, "https://www.iesdouyin.com/share/video/", "/?");url ="https://api-hl.amemv.com/aweme/v1/aweme/detail/?aid=1128&app_name=aweme&version_code=251&aweme_id="+awemeId;request=HttpRequest.get(url).header("User-Agent","Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1");res = request.body();System.out.println(res);String title = JsonUtil.getJsonValue(res, "aweme_detail.share_info.share_title");String playAddr = JsonUtil.getJsonValue(res, "aweme_detail.video.play_addr.url_list[0]");String cover = JsonUtil.getJsonValue(res, "aweme_detail.video.origin_cover.url_list[0]");videoModel.setName(title);videoModel.setPlayAddr(playAddr);videoModel.setCover(cover);return videoModel;}public static void main(String[] args) {System.out.println(new DouyinServiceImpl().parseUrl("http://v.douyin.com/r2w3sN/"));}
}

HuoShanServiceImpl

package com.rjt.video.service.impl;import org.springframework.stereotype.Service;import com.rjt.common.util.JsonUtil;
import com.rjt.common.util.TextUtil;
import com.rjt.video.model.VideoModel;
import com.rjt.video.service.VideoService;import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;/**
* @comment
* @author tanran
* @date 2019年6月14日
* @version 1.0
*/
@Service
public class HuoShanServiceImpl implements VideoService {@Overridepublic VideoModel parseUrl(String url) {// TODO Auto-generated method stubVideoModel videoModel=new VideoModel();/*HttpRequest request = HttpRequest.get(url);String res = request.body();System.out.println(res);*/try {OkHttpClient okHttpClient = new OkHttpClient();Request request = new Request.Builder().url(url).build();Response response = okHttpClient.newCall(request).execute();String result=response.body().string();System.out.println(result);result=TextUtil.getSubString(result, "create({d:", "});");String videoId=JsonUtil.getJsonValue(result, "video.uri");videoModel.setPlayAddr("http://hotsoon.snssdk.com/hotsoon/item/video/_playback/?video_id="+videoId);videoModel.setCover(JsonUtil.getJsonValue(result, "video.cover.url_list[0]"));} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}return videoModel;}public static void main(String[] args) {System.out.println(new HuoShanServiceImpl().parseUrl("https://reflow.huoshan.com/hotsoon/s/th01P3Eu700/"));}
}

KuaiShouServiceImpl

package com.rjt.video.service.impl;import org.springframework.stereotype.Service;import com.rjt.common.util.JsonUtil;
import com.rjt.common.util.TextUtil;
import com.rjt.video.model.VideoModel;
import com.rjt.video.service.VideoService;import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;/**
* @comment
* @author tanran
* @date 2019年6月14日
* @version 1.0
*/
@Service
public class KuaiShouServiceImpl implements VideoService {@Overridepublic VideoModel parseUrl(String url) {// TODO Auto-generated method stubVideoModel videoModel=new VideoModel();/*HttpRequest request = HttpRequest.get(url);String res = request.body();System.out.println(res);*/try {OkHttpClient okHttpClient = new OkHttpClient();Request request = new Request.Builder().url(url).build();Response response = okHttpClient.newCall(request).execute();String result=response.body().string();String photoId=TextUtil.getSubString(result, "\\\"photoId\\\":\\\"", "\\\"");System.out.println(photoId);url="https://api.kmovie.gifshow.com/rest/n/kmovie/app/photo/getPhotoById?WS&jjh_yqc&ws&photoId="+photoId;request=new Request.Builder().url(url).build();response=okHttpClient.newCall(request).execute();result=response.body().string();System.out.println(result);videoModel.setName(JsonUtil.getJsonValue(result, "photo.caption"));videoModel.setPlayAddr(JsonUtil.getJsonValue(result, "photo.mainUrl"));videoModel.setCover(JsonUtil.getJsonValue(result, "photo.coverUrl"));} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}return videoModel;}public static void main(String[] args) {System.out.println(new KuaiShouServiceImpl().parseUrl("http://m.chenzhongtech.com/s/mhn5haAq/"));}
}

PiPiXServiceImpl

package com.rjt.video.service.impl;import java.util.regex.Matcher;
import java.util.regex.Pattern;import org.springframework.stereotype.Service;import com.rjt.common.util.JsonUtil;
import com.rjt.video.model.VideoModel;
import com.rjt.video.service.VideoService;import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;/**
* @comment
* @author tanran
* @date 2019年6月14日
* @version 1.0
*/
@Service
public class PiPiXServiceImpl implements VideoService{@Overridepublic VideoModel parseUrl(String url) {// TODO Auto-generated method stubVideoModel videoModel=new VideoModel();try {Matcher matcher = Pattern.compile("\\d{19}").matcher(url);if(matcher.find()) {String itemId=matcher.group(0);url="https://is.snssdk.com/bds/item/detail/?app_name=super&aid=1319&item_id="+itemId;OkHttpClient okHttpClient = new OkHttpClient();Request request = new Request.Builder().url(url).build();Response response = okHttpClient.newCall(request).execute();String result=response.body().string();System.out.println(result);videoModel.setName(JsonUtil.getJsonValue(result, "data.data.share.title"));videoModel.setPlayAddr(JsonUtil.getJsonValue(result, "data.data.video.video_fallback.url_list[0].url"));videoModel.setCover(JsonUtil.getJsonValue(result, "data.data.video.video_fallback.cover_image.url_list[0].url"));}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}return videoModel;}public static void main(String[] args) {System.out.println(new PiPiXServiceImpl().parseUrl("https://h5.pipix.com/item/6677539389557446916"));}
}

VideoFactory

package com.rjt.video.service.impl;import com.rjt.video.service.VideoService;public class VideoFactory {public static VideoService getVideo(String type)throws InstantiationException, IllegalAccessException, ClassNotFoundException {if (type.indexOf("douyin.com") != -1 || type.indexOf("iesdouyin.com") != -1 ) {return DouyinServiceImpl.class.newInstance();} else if (type.indexOf("huoshan.com") != -1 )  {return HuoShanServiceImpl.class.newInstance();} else if (type.indexOf("kuaishou.com") != -1 || type.indexOf("gifshow.com") != -1 || type.indexOf("chenzhongtech.com") != -1) {return KuaiShouServiceImpl.class.newInstance();} else if (type.indexOf("pipix.com") != -1) {return PiPiXServiceImpl.class.newInstance();} else if (type.indexOf("weishi.qq.com")!= -1 ) {return WeiShiServiceImpl.class.newInstance();}else if (type.indexOf("izuiyou.com") != -1) {return ZuiYouServiceImpl.class.newInstance();} else {System.out.println("哎呀!找不到相应的实例化类啦!");return null;}}
}

WeiShiServiceImpl

package com.rjt.video.service.impl;import java.util.regex.Matcher;
import java.util.regex.Pattern;import org.springframework.stereotype.Service;import com.rjt.common.util.JsonUtil;
import com.rjt.video.model.VideoModel;
import com.rjt.video.service.VideoService;import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;/**
* @comment
* @author tanran
* @date 2019年6月14日
* @version 1.0
*/
@Service
public class WeiShiServiceImpl implements VideoService {@Overridepublic VideoModel parseUrl(String url) {// TODO Auto-generated method stubVideoModel videoModel=new VideoModel();try {Matcher matcher = Pattern.compile("\\w{17}").matcher(url);if(matcher.find()) {String feedId=matcher.group(0);url="https://h5.qzone.qq.com/webapp/json/weishi/WSH5GetPlayPage?feedid="+feedId;OkHttpClient okHttpClient = new OkHttpClient();Request request = new Request.Builder().url(url).build();Response response = okHttpClient.newCall(request).execute();String result=response.body().string();System.out.println(result);videoModel.setName(JsonUtil.getJsonValue(result, "data.feeds[0].material_desc"));videoModel.setPlayAddr(JsonUtil.getJsonValue(result, "data.feeds[0].video_url"));videoModel.setCover(JsonUtil.getJsonValue(result, "data.feeds[0].images[0].url"));}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}return videoModel;}public static void main(String[] args) {System.out.println(new WeiShiServiceImpl().parseUrl("https://h5.weishi.qq.com/weishi/feed/70hxLzG4U1HlJhtUj/wsfeed?_proxy=1&_wv=1&wxplay=1&id=70hxLzG4U1HlJhtUj&spid=h5&reqseq=311149196&cover=http%3A%2F%2Fpic640.weishi.qq.com%2Fab4595845793449cb17a6df26bb6cover.jpg&bgSize=cover&image=4595845793449cb17a6df26bb6cover.&chid=100000001&pkg=3670&attach=cp_reserves3_4001&qua=v1_ht5_qz_3.0.0_001_idc_new&xflag=2130706433a1685170850b1560498191"));}}

ZuiYouServiceImpl

package com.rjt.video.service.impl;import java.util.regex.Matcher;
import java.util.regex.Pattern;import org.springframework.stereotype.Service;import com.rjt.common.util.JsonUtil;
import com.rjt.video.model.VideoModel;
import com.rjt.video.service.VideoService;import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;/**
* @comment
* @author tanran
* @date 2019年6月14日
* @version 1.0
*/
@Service
public class ZuiYouServiceImpl implements VideoService {@Overridepublic VideoModel parseUrl(String url) {// TODO Auto-generated method stubVideoModel videoModel=new VideoModel();/*HttpRequest request = HttpRequest.get(url);String res = request.body();System.out.println(res);*/try {Matcher matcher = Pattern.compile("\\d{9}").matcher(url);if(matcher.find()) {String pid=matcher.group(0);url="https://share.izuiyou.com/api/post/detail";OkHttpClient okHttpClient = new OkHttpClient();RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), "{\"pid\":"+pid+"}");Request request = new Request.Builder().url(url).post(body).build();Response response = okHttpClient.newCall(request).execute();String result=response.body().string();System.out.println(result);String id=JsonUtil.getJsonValue(result, "data.post.imgs[0].id");videoModel.setName(JsonUtil.getJsonValue(result, "data.post.content"));videoModel.setCover(JsonUtil.getJsonValue(result, "data.post.videos."+id+".cover_urls[0]"));videoModel.setPlayAddr(JsonUtil.getJsonValue(result, "data.post.videos."+id+".url"));}     } catch (Exception e) {// TODO: handle exceptione.printStackTrace();}return videoModel;}public static void main(String[] args) {System.out.println(new ZuiYouServiceImpl().parseUrl("https://h5.izuiyou.com/detail/122595613?zy_to=applink&to=applink"));}
}

VideoService.java

package com.rjt.video.service;import com.rjt.video.model.VideoModel;/**
* @comment
* @author tanran
* @date 2019年7月24日
* @version 1.0
* vx:1661163785
*/
public interface VideoService {public VideoModel parseUrl(String url);
}

MainApplication

package com.rjt;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class MainApplication {public static void main(String[] args) {SpringApplication.run(MainApplication.class, args);}
}

在resources下的application.yml文件中我指定了程序运行的服务器端口80

yml配置文件的好处在于让配置更加富有层次感,在实际开发过程中通常都选择yml配置文件。
注意:
1、yml配置文件的:后面必须跟一个空格,否则这个配置就会报错
2、配置yml文件时,需要额外的注意属性的缩进,如果多缩进或者少缩进会改变配置信息的含义

接下来就是pom.xml 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!--  pom模型版本--><modelVersion>4.0.0</modelVersion>
<!--项目信息--><artifactId>rjt</artifactId>  <!-- 项目名字--><packaging>jar</packaging> <!-- 版本--><name>dyjx</name>  <!-- 项目名称,用于maven产生的文档--><!-- 父级项目--><parent><groupId>org.springframework.boot</groupId> <!-- 项目唯一标识--><artifactId>spring-boot-starter-parent</artifactId><version>1.5.6.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><!-- 属性设置--><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!-- 编译字符编码为utf-8--><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><!-- 输出字符编码为utf-8--><java.version>1.8</java.version><!-- jdk版本--></properties><!-- 依赖关系--><dependencies><!-- 测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 依赖配置,mavendependencies自动管理这些被引用的包--></dependency><!-- springmvc--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.bladejava</groupId><artifactId>blade-kit</artifactId><version>1.2.9-alpha</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.11.3</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.14.2</version></dependency></dependencies><!-- 编译--><build><finalName>${project.artifactId}</finalName><!-- 插件--><plugins><!-- maven插件--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

到这里项目代码已经完成 接下来运行 主程序类MainApplication
这里解释下:使用@SpringBootApplication来标注一个主程序类,表明这是一个SpringBoot应用,

Run一下 成功了

可以看到启动项目的端口为80

本地实现功能:
我这里用html+css已经写好了网页

接下来我们输入视频地址来实现解析

还可以部署到云服务器,目前还在调试 ,祝我成功吧 。。。。

基于springBoot框架开发短视频去水印源码项目+IntelliJ IDEA运行测试+本地实现功能相关推荐

  1. 微信程序短视频去水印源码 开源产品未加密未授权相关文章

    微信程序短视频去水印源码 开源产品未加密未授权相关文章 看到咸鱼上还有人卖这套源码,所以就把这套源码 免费分享出来 开源产品,未加密未授权,可调用别人的接口和自己的接口. PS:源码仅供技术学习参考, ...

  2. 【增强版短视频去水印源码】去水印微信小程序+去水印软件源码

    源码简介与安装说明: 2021增强版短视频去水印源码 去水印微信小程序源码网站 去水印软件源码 安装环境(需要材料):备案域名–服务器安装宝塔-安装 Nginx 或者 Apache php5.6 以上 ...

  3. (已更新)【增强版短视频去水印源码】去水印微信小程序+去水印软件源码

    源码简介与安装说明: 安装环境(需要材料):备案域名–服务器安装宝塔-安装 Nginx 或者 Apache php5.6 以上-安装 sg11 插件 小程序已自带解析接口,支持全网主流短视频平台,搭建 ...

  4. 官方教程之短视频app源码接入openinstall实现免填邀请码功能

    短视频app源码在上线后,为了实现大规模推广,会开发用户邀请的功能.用户邀请新用户进行注册,建立上下级关系后,邀请用户可以获得短视频app源码的奖励.为了防止新用户注册后,不填写邀请码,短视频app源 ...

  5. 云豹短视频app源码中关于php--thinkcmf配置语言包的说明

    云豹科技经常接到国外客户的单子,因此在语言模式设置上,需要实现灵活切换,以便不同语言的人员使用.云豹短视频app源码采用PHP做后台,Thinkcmf做框架,Thinkcmf本身是具有多语言模式的,默 ...

  6. Android短视频系统源码功能测试(个人总结完整版)

    Android短视频系统源码功能测试包含短视频系统源码的安装卸载测试,界面测试,业务功能测试,短视频系统源码特性测试,交叉事件测试,兼容性测试,升级更新测试,消息通知测试,功能键测试,手势测试等 1- ...

  7. 短视频app源码开发,短视频平台框架搭建

    科技发展,技术进步,音视频异军突起.无视频,不网络,短视频成为最重要的信息载体之一,是互联网核心组成部分.构建高效的短视频app源码,是慎之又慎的问题.从架构的角度,探讨短视频app源码的构建与技术选 ...

  8. 基于springboot框架开发的作业提交与批改系统

    此系统是基于springboot框架开发的作业提交与批改系统,系统项目是maven项目,项目层次分离,易于二次开发和学习, 系统功能 分为教师,学生两类用户,每一角色具有不同的功能权限. 教师功能权限 ...

  9. 如何开发仿抖音短视频APP源码?

    如何开发仿抖音短视频APP源码? 流程列表 开发一个短视频最主要的流程分为 3 个,下面我将分步教你实现这 3 个流程下的各个功能点,功能点 API 可按需调用: 视频拍摄 a.启动拍摄 b.给拍摄添 ...

最新文章

  1. More than one file was found with OS independent path 'META-INF/rxjava.properties
  2. 我是这样给阿里面试官吹 ConcurrentHashMap的
  3. 用WSDL定义Web服务
  4. 广州.NET俱乐部活动通知(11月17日)
  5. 【数字信号处理】序列分类 ( 单边序列和双边序列 | 左边序列 | 右边序列 | 有限序列和无限序列 | 稳定序列和不稳定序列 )
  6. BZOJ3879: SvT【后缀数组+单调栈】
  7. Servlet拦截器
  8. android 源码中的单例,Android源码中的一种单例实现
  9. 造兵三国的服务器要维护多久,FAQ_造兵三国_九游手机游戏
  10. 为何MAC的JDK/JRE大小这么小?
  11. 解决libc.so.6: version `GLIBC_2.14#39; not found问题
  12. 关于渗透测试以及网络安全法
  13. c语言多位数除法,大数除法 C语言
  14. 查询计算机端口状态是否开启,如何查看自己的电脑3389端口是否是处于开启状态?...
  15. 浅谈Struts2拦截器的原理与实现
  16. geo差异表达分析_GEO2R差异表达分析软件
  17. educoder——面向对象程序设计java——第三阶段-Java 高级特性——Java 集合框架
  18. python使用requests库爬取淘宝食品信息,包含sign参数破解
  19. 全球及中国电动汽车电池市场产能规划及投资份额预测报告2021-2027年版
  20. Android 读取外接储存设备的数据(如挂载的U盘,SD卡等)

热门文章

  1. zabbix 5.4 添加监控主机
  2. @关于大学生的挣学时问题
  3. 【囧词典】中国网络用语日语都怎么说(1)
  4. 汇编语言Test指令
  5. 一起实现RPC,超详细~~~ 第一篇
  6. 报修系统哪家强?如何做好企业设备仪器维护?
  7. 使用可控硅对市电斩波降压(调光)
  8. linux下Android Monitor启动失败问题
  9. USB接口定义 颜色
  10. 基于ubuntu-20.04.3的snort+Barnyard2+BASE的入侵检测系统安装时Barnyard2反编译时出错解决