微信企业号开发之access_token接口调用示例(一)

article/2025/8/20 6:54:25

摘要:在微信企业号开发中,首先需要调用access_token的接口,具体请看官网文档,地址为:https://work.weixin.qq.com/api/doc#10013

第一步:创建企业应用

登录企业管理后台进入“企业应用”页面,通讯录管理是企业微信默认集成的应用,可以直接开启,如果企业需要开发自定义的应用,可点击“添加应用”完成应用的添加和配置,详细步骤请参见应用概述。

第二步:开启接收消息模式

开启接收消息模式并不是必须步骤,但是如果在你的企业应用中需要用到如下功能时需提前开启接收消息模式

  • 获取企业成员的地理位置信息
  • 动态调整企业应用的信息
  • 获取企业成员点击事件类型的应用菜单行为
  • 获取企业成员通过应用给企业后台发送的消息

关于如何开启接收消息模式,请阅读接收消息模式设置章节。

第三步:获取access_token

请求方式:GET(HTTPS
请求URL:https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=id&corpsecret=secrect

参数说明:

参数必须说明
corpid企业ID
corpsecret应用的凭证密钥

权限说明:

每个应用有独立的secret,所以每个应用的access_token应该分开来获取

返回结果:

  1. {
  2. "errcode":0
  3. "errmsg":""
  4. "access_token":"accesstoken000001",
  5. "expires_in":7200
  6. }
参数说明
access_token获取到的凭证,最长为512字节
expires_in凭证的有效时间(秒)

出错返回示例:

  1. {
  2. "errcode":40091,
  3. "errmsg":"provider_secret is invalid"
  4. }

上面都是微信企业号官网文档里面的描述,下面附上我写的代码:

1.HttpClient调用工具类:JHttpUtils.java

package com.eqiao.bidata.common.util;import com.google.common.collect.Maps;
import net.sf.json.JSONObject;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.charset.Charset;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;/*** 网页处理工具** @author cc**/
public class JHttpUtils {private static Logger logger = LoggerFactory.getLogger(JHttpUtils.class);private static PoolingHttpClientConnectionManager connMgr;private static RequestConfig requestConfig;private static final int MAX_TIMEOUT = 7000;static {// 设置连接池connMgr = new PoolingHttpClientConnectionManager();// 设置连接池大小connMgr.setMaxTotal(100);connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal());RequestConfig.Builder configBuilder = RequestConfig.custom();// 设置连接超时configBuilder.setConnectTimeout(MAX_TIMEOUT);// 设置读取超时configBuilder.setSocketTimeout(MAX_TIMEOUT);// 设置从连接池获取连接实例的超时configBuilder.setConnectionRequestTimeout(MAX_TIMEOUT);requestConfig = configBuilder.build();}/*** 发送 GET 请求(HTTP),不带输入数据** @param url* @return*/public static String doGet(String url) {return doGet(url, "UTF-8", Maps.newHashMap());}/*** 发送 GET 请求(HTTP),K-V形式** @param url* @param params* @return*/public static String doGet(String url, String charset,Map<Object, Object> params){StringBuffer param = new StringBuffer();int i = 0;for (Object key : params.keySet()) {if (i == 0)param.append("?");elseparam.append("&");param.append(key).append("=").append(params.get(key));i++;}url += param;String result = null;HttpClient httpClient = HttpClients.createSystem();/*HttpClient httpClient = HttpsClient.newHttpsClient();*/try {HttpGet httpGet = new HttpGet(url);HttpResponse response = httpClient.execute(httpGet);HttpEntity entity = response.getEntity();if (entity != null) {InputStream instream = entity.getContent();result = IOUtils.toString(instream, charset);}} catch (IOException e) {e.printStackTrace();logger.error("http get error: " + e.getMessage().toString());}return result;}/*** 发送 POST 请求(HTTP),不带输入数据** @param url* @return*/public static String doPost(String url) {return doPost(url, "UTF-8", Maps.newHashMap());}/*** 发送 POST 请求(HTTP),K-V形式** @param url*            API接口URL* @param params*            参数map* @return*/public static String doPost(String url, String charset,Map<Object, Object> params) {CloseableHttpClient httpClient = HttpClients.createDefault();String httpStr = null;HttpPost httpPost = new HttpPost(url);CloseableHttpResponse response = null;try {httpPost.setConfig(requestConfig);List<NameValuePair> pairList = new ArrayList<NameValuePair>(params.size());for (Map.Entry<Object, Object> entry : params.entrySet()) {NameValuePair pair = new BasicNameValuePair(entry.getKey().toString(), entry.getValue().toString());pairList.add(pair);}httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName(charset)));response = httpClient.execute(httpPost);HttpEntity entity = response.getEntity();httpStr = EntityUtils.toString(entity, charset);} catch (IOException e) {e.printStackTrace();} finally {if (response != null) {try {EntityUtils.consume(response.getEntity());} catch (IOException e) {e.printStackTrace();}}}return httpStr;}
}

2.加载database.properties文件的工具类:PropertyUtil.java

package com.eqiao.bidata.common.util;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.*;
import java.util.Properties;/*** @author zhaoxinguo on 2017/7/14.*/
public class PropertyUtil {private static final Logger logger = LoggerFactory.getLogger(PropertyUtil.class);private static Properties props;static{loadProps();}synchronized static private void loadProps(){logger.info("开始加载properties文件内容.......");props = new Properties();InputStream in = null;try {in = PropertyUtil.class.getClassLoader().getResourceAsStream("bidata/properties/database.properties");props.load(in);} catch (FileNotFoundException e) {logger.error("jdbc.properties文件未找到");} catch (IOException e) {logger.error("出现IOException");} finally {try {if(null != in) {in.close();}} catch (IOException e) {logger.error("jdbc.properties文件流关闭出现异常");}}logger.info("加载properties文件内容完成...........");
//        logger.info("properties文件内容:" + props);}public static String getProperty(String key){if(null == props) {loadProps();}return props.getProperty(key);}public static String getProperty(String key, String defaultValue) {if(null == props) {loadProps();}return props.getProperty(key, defaultValue);}}

3.database.properties文件:

#--weixin --
weixin.agentid=1000003
weixin.corpid=wx01ee8f220c82c2b3
weixin.corpsecret=uLQ3YxRHohuhKVM1EK5ahKTzucxuntKoj8i-fPmIXJU

4.存放微信接口地址的常量类:WeiXinQiYeConstants.java

package com.eqiao.bidata.common.weixin;/*** Created by zhaoxinguo on 2017/7/11.*/
public class WeiXinQiYeConstants {// 获取access_token的urlpublic static final String ACCESS_TOKER_URL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken";// 根据code获取成员信息的urlpublic static final String GET_OAUTH2_URL = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE&agentid=AGENTID";}

5.AccessToken.java

package com.eqiao.bidata.common.weixin;/*** Created by zhaoxinguo on 2017/7/11.*/
public class AccessToken {// 错误codeprivate String errcode;// 错误msgprivate String errmsg;// 获取到的凭证private String access_token;// 凭证有效时间,单位:秒private Long expires_in;public String getErrcode() {return errcode;}public void setErrcode(String errcode) {this.errcode = errcode;}public String getErrmsg() {return errmsg;}public void setErrmsg(String errmsg) {this.errmsg = errmsg;}public String getAccess_token() {return access_token;}public void setAccess_token(String access_token) {this.access_token = access_token;}public Long getExpires_in() {return expires_in;}public void setExpires_in(Long expires_in) {this.expires_in = expires_in;}@Overridepublic String toString() {return "AccessToken{" +"errcode='" + errcode + '\'' +", errmsg='" + errmsg + '\'' +", access_token='" + access_token + '\'' +", expires_in=" + expires_in +'}';}
}

6.JsonMapper.java

package com.eqiao.bidata.common.util;import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser.Feature;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.util.JSONPObject;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.IOException;
import java.util.TimeZone;/*** 简单封装Jackson,实现JSON String<->Java Object的Mapper.* 封装不同的输出风格, 使用不同的builder函数创建实例.* @author cc*/
public class JsonMapper extends ObjectMapper {private static final long serialVersionUID = 1L;private static Logger logger = LoggerFactory.getLogger(JsonMapper.class);private static JsonMapper mapper;public JsonMapper() {this(Include.NON_EMPTY);}public JsonMapper(Include include) {// 设置输出时包含属性的风格if (include != null) {this.setSerializationInclusion(include);}// 允许单引号、允许不带引号的字段名称this.enableSimple();// 设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性this.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);// 空值处理为空串this.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>(){@Overridepublic void serialize(Object value, JsonGenerator jgen,SerializerProvider provider) throws IOException,JsonProcessingException {jgen.writeString("");}});// 进行HTML解码。this.registerModule(new SimpleModule().addSerializer(String.class, new JsonSerializer<String>(){@Overridepublic void serialize(String value, JsonGenerator jgen,SerializerProvider provider) throws IOException,JsonProcessingException {jgen.writeString(StringEscapeUtils.unescapeHtml4(value));}}));// 设置时区this.setTimeZone(TimeZone.getDefault());//getTimeZone("GMT+8:00")}/*** 创建只输出非Null且非Empty(如List.isEmpty)的属性到Json字符串的Mapper,建议在外部接口中使用.*/public static JsonMapper getInstance() {if (mapper == null){mapper = new JsonMapper().enableSimple();}return mapper;}/*** 创建只输出初始值被改变的属性到Json字符串的Mapper, 最节约的存储方式,建议在内部接口中使用。*/public static JsonMapper nonDefaultMapper() {if (mapper == null){mapper = new JsonMapper(Include.NON_DEFAULT);}return mapper;}/*** Object可以是POJO,也可以是Collection或数组。* 如果对象为Null, 返回"null".* 如果集合为空集合, 返回"[]".*/public String toJson(Object object) {try {return this.writeValueAsString(object);} catch (IOException e) {logger.warn("write to json string error:" + object, e);return null;}}/*** 反序列化POJO或简单Collection如List<String>.* * 如果JSON字符串为Null或"null"字符串, 返回Null.* 如果JSON字符串为"[]", 返回空集合.* * 如需反序列化复杂Collection如List<MyBean>, 请使用fromJson(String,JavaType)* @see #fromJson(String, JavaType)*/public <T> T fromJson(String jsonString, Class<T> clazz) {if (StringUtils.isEmpty(jsonString)) {return null;}try {return this.readValue(jsonString, clazz);} catch (IOException e) {logger.warn("parse json string error:" + jsonString, e);return null;}}/*** 反序列化复杂Collection如List<Bean>, 先使用函數createCollectionType构造类型,然后调用本函数.* @see #createCollectionType(Class, Class...)*/@SuppressWarnings("unchecked")public <T> T fromJson(String jsonString, JavaType javaType) {if (StringUtils.isEmpty(jsonString)) {return null;}try {return (T) this.readValue(jsonString, javaType);} catch (IOException e) {logger.warn("parse json string error:" + jsonString, e);return null;}}/*** 構造泛型的Collection Type如:* ArrayList<MyBean>, 则调用constructCollectionType(ArrayList.class,MyBean.class)* HashMap<String,MyBean>, 则调用(HashMap.class,String.class, MyBean.class)*/public JavaType createCollectionType(Class<?> collectionClass, Class<?>... elementClasses) {return this.getTypeFactory().constructParametricType(collectionClass, elementClasses);}/*** 當JSON裡只含有Bean的部分屬性時,更新一個已存在Bean,只覆蓋該部分的屬性.*/@SuppressWarnings("unchecked")public <T> T update(String jsonString, T object) {try {return (T) this.readerForUpdating(object).readValue(jsonString);} catch (JsonProcessingException e) {logger.warn("update json string:" + jsonString + " to object:" + object + " error.", e);} catch (IOException e) {logger.warn("update json string:" + jsonString + " to object:" + object + " error.", e);}return null;}/*** 輸出JSONP格式數據.*/public String toJsonP(String functionName, Object object) {return toJson(new JSONPObject(functionName, object));}/*** 設定是否使用Enum的toString函數來讀寫Enum,* 為False時時使用Enum的name()函數來讀寫Enum, 默認為False.* 注意本函數一定要在Mapper創建後, 所有的讀寫動作之前調用.*/public JsonMapper enableEnumUseToString() {this.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);this.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);return this;}/*** 支持使用Jaxb的Annotation,使得POJO上的annotation不用与Jackson耦合。* 默认会先查找jaxb的annotation,如果找不到再找jackson的。*/public JsonMapper enableJaxbAnnotation() {JaxbAnnotationModule module = new JaxbAnnotationModule();this.registerModule(module);return this;}/*** 允许单引号* 允许不带引号的字段名称*/public JsonMapper enableSimple() {this.configure(Feature.ALLOW_SINGLE_QUOTES, true);this.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);return this;}/*** 取出Mapper做进一步的设置或使用其他序列化API.*/public ObjectMapper getMapper() {return this;}/*** 对象转换为JSON字符串* @param object* @return*/public static String toJsonString(Object object){return JsonMapper.getInstance().toJson(object);}/*** JSON字符串转换为对象* @param jsonString* @param clazz* @return*/public static Object fromJsonString(String jsonString, Class<?> clazz){return JsonMapper.getInstance().fromJson(jsonString, clazz);}}

7.调用获取access_token的接口工具类:WeiXinQiYeUtil.java

package com.eqiao.bidata.common.weixin;import com.eqiao.bidata.common.util.JHttpUtils;
import com.eqiao.bidata.common.util.JsonMapper;
import com.eqiao.bidata.common.util.PropertyUtil;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;import java.util.HashMap;
import java.util.Map;/*** 微信企业号调用类 {"errcode":0,"errmsg":"ok"} 此结果表示调用方法成功返回* Created by zhaoxinguo on 2017/7/11.*/
public class WeiXinQiYeUtil{private static Logger logger = LoggerFactory.getLogger(WeiXinQiYeUtil.class);/*** 获取access_token** @return access_token*/public static AccessToken access_token(){AccessToken accessToken = null;// https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=id&corpsecret=secrectMap<Object, Object> params = new HashMap<>();params.put("corpid", PropertyUtil.getProperty("weixin.corpid"));params.put("corpsecret",PropertyUtil.getProperty("weixin.corpsecret"));String access_token = JHttpUtils.doGet(WeiXinQiYeConstants.ACCESS_TOKER_URL, "UTF-8", params);logger.info("return access_token: " + access_token);accessToken = (AccessToken)JsonMapper.fromJsonString(access_token,AccessToken.class);/*logger.info("accessToken: " + accessToken);*/if(accessToken != null){return accessToken;}return null;}
}

8.验证接口的单元测试类:WeiXinQiYeTest.java

package com.eqiao.bidata.test;import com.eqiao.bidata.common.weixin.AccessToken;
import com.eqiao.bidata.common.weixin.WeiXinQiYeUtil;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** Created by zhaoxinguo on 2017/7/11.*/
public class WeiXinQiYeTest {private Logger logger = LoggerFactory.getLogger(this.getClass());@Testpublic void access_token(){AccessToken accessToken = WeiXinQiYeUtil.access_token();logger.info("accessToken " + accessToken.toString());}}

9.接口调用结果:

2017-07-2521:02:35 CST INFO  com.eqiao.bidata.common.util.PropertyUtil 21 loadProps - 开始加载properties文件内容.......
2017-07-2521:02:35 CST INFO  com.eqiao.bidata.common.util.PropertyUtil 40 loadProps - 加载properties文件内容完成...........
2017-07-2521:02:37 CST INFO  com.eqiao.bidata.common.weixin.WeiXinQiYeUtil 34 access_token - return access_token: {"errcode":0,"errmsg":"ok","access_token":"Tur3OdBNDF5ek9mnaU3APIYV9V8dIgYem3ulStRS3NIBIdWOfeCTVymT_5eAcdINYAeu0TafJOzxt-XYSHLjn_s94tOlWb8dw2XmEp6mOUqYpGrOWnlvnW3A4Yonc-wt_o6OmPaiUHi7MxtzUL-4oCKvYTHg9P7ciqx-G4DNUlpiWL5uAQczjIBxRYRacALm2-nkWK_QtvvIuKUctjoabP6vT7iGfCiS7g7DcUc6iSIruAvNzPWHJhnC4G84v5Kf7Qk2wN-l8PtGioPCTSGHBX_Vxd-cLatl7CLbaqZ8cwE","expires_in":7200}
2017-07-2521:02:37 CST INFO  com.eqiao.bidata.test.WeiXinQiYeTest 19 access_token - accessToken AccessToken{errcode='0', errmsg='ok', access_token='Tur3OdBNDF5ek9mnaU3APIYV9V8dIgYem3ulStRS3NIBIdWOfeCTVymT_5eAcdINYAeu0TafJOzxt-XYSHLjn_s94tOlWb8dw2XmEp6mOUqYpGrOWnlvnW3A4Yonc-wt_o6OmPaiUHi7MxtzUL-4oCKvYTHg9P7ciqx-G4DNUlpiWL5uAQczjIBxRYRacALm2-nkWK_QtvvIuKUctjoabP6vT7iGfCiS7g7DcUc6iSIruAvNzPWHJhnC4G84v5Kf7Qk2wN-l8PtGioPCTSGHBX_Vxd-cLatl7CLbaqZ8cwE', expires_in=7200}Process finished with exit code 0

以上就是调用access_token接口的全部过程。

10.源码下载地址:https://gitee.com/micai-code/weixin-qiye

11.如果还是有问题可以加群讨论解决:


http://chatgpt.dhexx.cn/article/rKZrWOmS.shtml

相关文章

我和8个程序员聊了一下午,攒齐这些了观点...

十多年前&#xff0c;所有的企业都在想办法互联网化&#xff0c;如今&#xff0c;所有的互联网企业都在试图 AI 化&#xff0c;众所周知&#xff0c;技术的竞争归根结底表现为人才的竞争&#xff0c;所以说到底&#xff0c;还是人才供需不平衡。 未解决这一现状&#xff0c;虽…

想做AI工程师?这个案例必须掌握!(附完整代码Keras实现CNN)

有人说,2018年人工智能已经进入了全球爆发的时刻。个性化信息推送、人脸识别、语音操控等人工智能技术,已“入侵”日常生活的细枝末节。 十多年前,所有的企业都在想办法互联网化,如今,所有的互联网企业都在试图AI化,据数据统计,平均每 10.9 个小时会诞生一家 AI 企业。…

震惊!让90%的程序员一看就会的入门级AI项目!

随着AI的发展,美国橡树岭国家实验室的一些专家预测,到2040年,AI技术将会强大到足以替代程序员。AI技术将会强大到足以替代程序员,AI编写软件将比人类程序员更好、更快。换句话说,软件编写的软件比人类编写的更好。 这是怎么发生的?AI能真正学会如何做需要高度创造性的智…

Building your Deep Neural Network - Step by Step v5 作业 - Neural Networks and Deep Learning

终于做完了&#xff0c;放在这里。。。复习用 Building your Deep Neural Network: Step by Step Welcome to your week 4 assignment (part 1 of 2)! You have previously trained a 2-layer Neural Network (with a single hidden layer). This week, you will build a dee…

html聊天界面

先看效果图 参考网址&#xff1a;https://desk.v5kf.com/desk/kehu_zh.html html代码 html lang"zh"> <head> <meta charset"utf-8"> <meta http-equiv"X-UA-Compatible" content"IEedge"> <me…

PCIE体系结构基础和Linux PCI设备注册过程的实现

根据百度百科的解释,PCIE(peripheral component interconnect express)是一种高速串行计算机扩展总线标准,它原来的名称为“3GIO”,是由英特尔在2001年提出的,旨在替代旧的PCI,PCI-X和AGP总线标准。PCIe属于高速串行点对点双通道高带宽传输,所连接的设备分配独享通道带宽…

krita windows编译源码

Qt系列文章目录 文章目录 Qt系列文章目录前言一、krita二、krita源码编译1. Windows下编译1.编译准备2. 相关命令 使用CMake编译krita 重新编译使用CMkae bash&#xff1a;find_package(Zug REQUIRED) 前言 最近使用Qt处理图像&#xff0c;要实现一些Photoshop的功能&#xff…

Yolov5-Lite + Sort算法实现边缘目标跟踪

文章目录 前言项目结构Sort算法实现卡尔曼跟踪器工具类多目标跟踪器整合前言 昨天挖了个坑,那么今天的话把坑填上,只要是实现Sort算法和Yolov5-Lite的一个整合。当然先前的话,我们在Yolov3–Tiny的时候,也做了一个,不过当时的话,有几个问题没有解决。第一就是当时以中心…

如何用剪映翻译英文字幕?

需要借助第三方工具。 这次是小编在上个版本的基础上进行升级&#xff0c;支持并兼容剪映最新版本3.3。 之前小编方包的那款只支持2.3.0以下的。这次剪映pc端所有版本都兼容。可以翻译国外的英文的视频&#xff01;比如&#xff1a;tik~、某管的视频~ 工具如下图 使用教程&am…

英文字幕视频翻译成中文字幕

参考 教程 https://www.bilibili.com/read/cv2223816/ https://www.bilibili.com/video/av34725774 1、下载英文视频 例如下面这个视频 QGIS提取DSM数据中房屋的屋顶类型和高度 2、导出英文字幕并重命名为bcc格式 参考 https://www.bilibili.com/read/cv2223816/ 3、bcc格…

不限网站的视频字幕实时翻译工具(视频只要有声音就可以翻译)

一个实时中英互译的软件 问题 经常在网上搜索一些我们需要的学习资源&#xff0c;会遇到一些非常好的视频资源&#xff0c;可惜是英文的&#xff0c;这时&#xff0c;像我这样英文不是很好的同学就该犯难了。再找别的资源会很麻烦。 像有一些网站会自带自动字母和自动翻译功…

python自动翻译视频字幕_音视频自动字幕生成(翻译)—[autosub]

国外有些视频无中文字幕找字幕也不方便 此工具可生成*.srt格式字幕和json autosub依赖ffmpeg 安装环境:VUlTR Ubuntu 18.04系统 地域:日本 充值10刀送10刀 安装ffmpeg [sudo] apt-get install ffmpeg 安装python [sudo] apt-get install python-pip 安装autosub pip…

体验SDL Trados 2021 翻译视频字幕

对于视频字幕翻译以往多采用的是以下几种方式&#xff1a; 直接打开翻译ASS, SRT等字幕文件 文本文件直接操作有风险可能会破坏时间轴或样式使用字幕工具&#xff0c;人人译世界&#xff0c;字幕通等第三方工具打开编辑字幕 不能使用到翻译记忆库的优势第三方工具结合SDL Trad…

工具-python实现电影字幕的自动翻译

文章目录 前言思路效果如图实现第二种方案第一种方案第一种方案 中英文翻译想白嫖中英文翻译&#xff1f;如何将ocr识别到的没有空格文本正确分割&#xff1f;python截屏 前言 看一些电影&#xff0c;发现只是标注了字幕而没有中文翻译&#xff0c;当然也没有字幕文件&#xf…

如何让纯英文字幕的视屏 实时翻译

情景&#xff1a; 你有一个视屏&#xff0c;只有英文字幕&#xff0c;恰好像我一样英文不怎么样&#xff0c;可以试着用下面的方法。当然&#xff0c;对应的翻译是机翻的&#xff0c;接受不了请忽略。 步骤&#xff1a; 需要将原视频下载下来&#xff1b;有的时候&#xff0c…

剪映PC版英文字幕翻译最新方法(中英互译)

原文地址 剪映PC版英文字幕翻译最新方法&#xff08;中英互译&#xff09; – 方包博客 – java|python|前端开发|运维|电商|ui设计剪映PC版英文字幕翻译最新方法&#xff08;中英互译&#xff09;https://www.fang1688.cn/ziyuan/3431.html 我的是剪映 v3.3.0版本。旧版不支持…

推荐一款自己开发的剪映字幕翻译工具

点击上方"优派编程"选择“加入星标”&#xff0c;第一时间关注原创干货 最新的剪映英文转中文字幕翻译工具 https://www.fang1688.cn/python/3259.html 小编方包今天介绍剪映翻译工具的教程 之前的那款剪映字幕翻译工具不是方包我本人写的。听各位神通广大的网友们反…

字幕翻译,如何合并和拆分过分断句

我时常会接到字幕翻译项目&#xff0c;大多是英到中。如果字数比较多&#xff0c;我通常会问客户能不能增加一两个小时的预算&#xff0c;原因很简单&#xff1a;过分断句(over-segmentation)对译员很不友好&#xff0c;特别是在使用CAT (computer-aided translation)的情况下…

视频字幕翻译

字幕是指以文字形式显示电视、电影、舞台作品中的对话等非影像内容&#xff0c;也泛指影视作品后期加工的文字。在电影银幕或电视机荧光屏下方出现的解说文字以及种种文字&#xff0c;如影片的片名、演职员表、唱词、对白、说明词以有人物介绍、地名和年代等都称为字幕。 近年来…

英文视频实时字幕翻译

本视频是基于livecaption这个软件&#xff08;免安装&#xff09;来实现的。软件下载地址阅读后面可见。 使用阿里云进行语音识别&#xff0c;使用腾讯云进行实时翻译。 一、阿里云 阿里云官网&#xff1a;https://www.aliyun.com/ 没有注册和实名认证的&#xff0c;请注册…