La gestión de materiales de WeChat y la publicación de masas no son amigables con Java. Este artículo solo presenta los nuevos materiales temporales y los nuevos materiales permanentes, y agrega el resto al obtenerlos, eliminarlos y modificarlos.
A menudo hay escenarios en los que se necesitan materiales multimedia temporales para cuentas oficiales. Por ejemplo, cuando se usa interfaces, especialmente cuando se envían mensajes, las operaciones como obtener y llamar a archivos multimedia, mensajes multimedia, se realizan a través de Media_ID. La interfaz de gestión de materiales está abierta a todos los números de suscripción certificados y números de servicio .
Limitaciones materiales
Imagen: 2m, admite PNG/JPEG/JPG/GIF Formato Voice: 2m, la longitud de reproducción no excede los 60S, admite el video de formato AMR/MP3 (video): 10mb, admite miniaturas de formato MP4: 64KB, admite formato JPG
1. Agregar materiales temporales
Interfaz: https://api.weixin.qq.com/cgi-bin/media/upload?access_token=access_token&type=type, y luego pasar un tipo de archivo de medios, que puede ser imagen (imagen), voz (voz), video (video) y compleja (thumbe).
1. Las cuentas de suscripción y servicio deben estar certificadas
2. Material temporal Media_ID es reutilizable
3. El archivo de medios se almacena en el fondo de WeChat durante 3 días, es decir, Media_ID no será válido después de 3 días.
/ ** * cargar material temporal (local) * * @param accesstoken * @param types * tipos de archivos de medios, incluyendo imagen (imagen), voz (voz), video (video) y pulgarails (pulgar) * @param ruta * ruta de la imagen * @return */ public static staticsultResult uploadTempmPmediaFile (string accessToken, type de cadena, cadena) {uploadadedyessopLesult; Treemap <String, String> Params = new Treemap <> (); params.put ("access_token", accessToken); params.put ("type", type); Pruebe {String json = httpsuploadmediafile (systemconfig.post_method, wechatconfig.upload_temp_media_type_url, params, ruta); resultado = jsonutil.FromJSonstring (json, uploadMediasResult.class); } catch (Exception e) {E.PrintStackTrace (); } resultado de retorno; } / ** * Cargar material temporal (red) * * @param accesstoken * @param types * tipos de archivos de medios, incluyendo imagen (imagen), voz (voz), video (video) y muletas (pulgar) * @param ruta * ruta de imagen * @return * / public static endiaSresUlsResUlt omottempmedia (string accessTourking, type de cadena) {upcurn de @return * @retgue de carga estática. Treemap <String, String> Params = new Treemap <> (); params.put ("access_token", accessToken); params.put ("type", type); Pruebe {String json = httpsuploadmedia (systemConfig.post_method, wechatconfig.upload_temp_media_type_url, params, ruta, 0, 0, resultado = jsonutil.FromJSonstring (json, uploadMediasResult.class); } catch (Exception e) {E.PrintStackTrace (); } resultado de retorno; }2. Agregar materiales permanentes
Interfaz: https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=access_token&type=type, tipos de archivos de medios, incluida la imagen (imagen), la voz (voz), el video (video, excepción) y la pulgar (pulgar)
/ ** * Cargar material permanente (local) * * @param accesstoken * @param tipos de archivos multimedia, incluidos la imagen (imagen), la voz (voz), el video (video) y las miniaturas (pulgar) * @return */ public static uploadDiasResult uploadForeverMediaFile (string accessToken, string type, string rath) {uploadediasResUrt súbd = null; Treemap <String, String> Params = new Treemap <> (); params.put ("access_token", accessToken); params.put ("type", type); Pruebe {String json = httpsuploadmediafile (systemconfig.post_method, wechatconfig.upload_forever_media_type_url, params, ruta); resultado = jsonutil.FromJSonstring (json, uploadMediasResult.class); } catch (Exception e) {E.PrintStackTrace (); } resultado de retorno; } / ** * cargar material permanente (red) * * @param accesstoken * @param tipo * tipos de archivos de medios, incluyendo imagen (imagen), voz (voz), video (video) y miniaturas (pulgar) * @return * / public static uploadDiasResult uploadForeverMedia (string accessToken, string type, string stath) {uploadediaRestRULT = result = nulLull uploadForeververMedia Treemap <String, String> Params = new Treemap <> (); params.put ("access_token", accessToken); params.put ("type", type); Pruebe {string json = httpsuploadmedia (systemconfig.post_method, wechatconfig.upload_forever_media_type_url, params, ruta, 0, 0, resultado = jsonutil.FromJSonstring (json, uploadMediasResult.class); } catch (Exception e) {E.PrintStackTrace (); } resultado de retorno; }Se debe prestar especial atención a agregar materiales de video permanentes. Al cargar materiales de video, debe publicar otro formulario, con la descripción de ID, incluida la información de descripción del título e introducción del material, y el formato de contenido es JSON.
/ ** * cargar material permanente (video) * * @param accesstoken * @return */ public static string uploadForeververMediaFile (string accessToken, title de cadena, introducción de cadena, string ruta) {TreeMap <String, String> Params = new Treemap <> (); params.put ("access_token", accessToken); params.put ("type", "video"); String MediaID = nulo; Pruebe {String json = httpsuploadvideomediafile (systemconfig.post_method, wechatconfig.upload_forever_media_type_url, params, ruta, título, introducción); MediaID = jsonutil.FromJSonstring (JSON, "Media_id"); } catch (Exception e) {E.PrintStackTrace (); } return MedialId; } / ** * Cargar material permanente (video, red) * * @param accesstoken * @return * / public static string uploadForeververMedia (string accessToken, string title, string introduction, string ruta) {Treemap <String, String> params = new Treemap <> (); params.put ("access_token", accessToken); params.put ("type", "video"); String MediaID = nulo; Pruebe {String json = httpsuploadvideomedia (systemconfig.post_method, wechatconfig.upload_forever_media_type_url, params, ruta, título, introducción, 0, 0, 0); MediaID = jsonutil.FromJSonstring (JSON, "Media_id"); } catch (Exception e) {E.PrintStackTrace (); } return MedialId; }3. Agregar materiales gráficos permanentes
Interfaz: https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=access_token, consulte la clase de entidad subaLoadNewsMedia para obtener información publicación.
Para los materiales de uso común, los desarrolladores pueden cargarlos en el servidor WeChat a través de esta interfaz y usarlos de forma permanente.
1. Después de agregar el material de imagen permanente, se devolverá al desarrollador con una URL. El desarrollador puede usarlo dentro del nombre de dominio Tencent (úselo fuera del nombre de dominio Tencent y la imagen se bloqueará).
2. El número total de materiales guardados en la cuenta oficial se limita a: El límite superior de los materiales de mensajes gráficos y de texto y materiales de imagen es de 5,000, y otros tipos son de 1,000.
3. En el contenido específico de los mensajes gráficos y de texto, el backend de WeChat filtrará enlaces de imagen externos, y la URL de la imagen debe cargarse a través de la interfaz "Cargue la imagen en el gráfico y los mensajes de texto para obtener la interfaz URL".
4. Las imágenes cargadas en la interfaz "Subir imágenes en los mensajes de texto para obtener URL" no ocupan el límite de 5,000 imágenes en la biblioteca de material de la cuenta oficial. Las imágenes solo admiten formato JPG/PNG, y el tamaño debe ser inferior a 1 MB.
5. Los mensajes gráficos y de texto admiten la capacidad de insertar su propia cuenta y otras cuentas públicas en el texto principal y han publicado enlaces al artículo.
/ ** * Material para cargar mensajes gráficos y de texto permanentes * * @param Accesstoken * Token autorizado * @param Entity * Image and Text Message Object * @return */ public static uploadMediasResult uploadNewsMedia (String AccessToken, List <uploadNewsMedia> entidad) {UploadDiasResult Result = NULL; Treemap <String, String> Params = new Treemap <> (); params.put ("access_token", accessToken); // Publicar parámetros enviados TreeMap <String, List <uploadNewsMedia>> dataParams = new TreeMap <String, list <uploadNewsMedia>> (); dataparams.put ("artículos", entidad); String data = jsonutil.tojSonstring (dataparams); String json = httprequtil.httpsdefaultExeCute (SystemConfig.post_method, wechatconfig.upload_forever_news_media_url, params, data); resultado = jsonutil.FromJSonstring (json, uploadMediasResult.class); resultado de retorno; }4. Sube las imágenes en el mensaje de texto para obtener la URL
Interfaz: https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=access_token
Las imágenes cargadas en esta interfaz no ocupan el límite de 5,000 imágenes en la biblioteca de material de la cuenta oficial. Las imágenes solo admiten formato JPG/PNG, y el tamaño debe ser inferior a 1 MB. La URL devuelta por esta interfaz es la URL para cargar la imagen, que se puede colocar en mensajes de texto.
/ ** * Cargue la imagen en el mensaje de texto para obtener la URL (local) * * @param accesstoken * @param ruta * @return */ public static string uploadImgMediaFile (string accessToken, string ruta) {Treemap <String, String> params = new Treemap <> (); params.put ("access_token", accessToken); Cadena url = nulo; Pruebe {String json = httpsuploadmediafile (systemconfig.post_method, wechatconfig.upload_img_media_url, params, ruta); url = jsonutil.FromJSonstring (json, "url"); } catch (Exception e) {E.PrintStackTrace (); } URL de retorno; } / ** * Cargue la imagen en el mensaje de texto para obtener la URL (network) * * @param accesstoken * @param ruta * @return * / public static string uploadImgMedia (string accessToken, string ruta) {Treemap <String, String> params = new Treemap <String, String> (); params.put ("access_token", accessToken); Cadena url = nulo; Pruebe {String json = httpsuploadmedia (systemconfig.post_method, wechatconfig.upload_img_media_url, params, ruta, 0, 0); url = jsonutil.FromJSonstring (json, "url"); } catch (Exception e) {E.PrintStackTrace (); } URL de retorno; }V. Algunas herramientas
Clase de configuración
public static final String upload_img_media_url = "https://api.weixin.qq.com/cgi-bin/media/uploadimg"; public static final String upload_forever_news_media_url = "https://api.weixin.qq.com/cgi-bin/material/add_news"; public static final String upload_temp_media_type_url = "https://api.weixin.qq.com/cgi-bin/media/upload"; public static final String upload_forever_media_type_url = "https://api.weixin.qq.com/cgi-bin/material/add_material";
Subir la clase de retorno de material gráfico y de mensaje de texto
paquete com.phil.wechat.msg.model.media; / *** Resultados devueltos mediante la carga de materiales de mensajes gráficos y de texto* @author Phil* @Date 20 de septiembre de 2017**/ public class uploadMediasResult {private String Type; // tipos de archivos multimedia, incluyendo imagen (imagen), voz (voz), video (video) y miniatura (pulgar), el número de veces es noticias, es decir, string private string media_id; // Archivo de medios/identificador único obtenido después de cargar mensajes gráficos y de texto String privado creado_at; // Tiempo de carga de archivos multimedia}Subir clase de entidad de material gráfico y de mensaje de texto
paquete com.phil.wechat.msg.model.media; import java.io.serializable; / *** Sube la clase de entidad de material de mensaje gráfico* @author Phil* @Date 20 de septiembre de 2017*/ public class uploadNeWsmedia implementa serializable {private static final long SerialVersionUid = 6551817058101753854l; cadena privada thumb_media_id; // Media_id de la miniatura del mensaje gráfico puede obtener un autor de cadena privada en la interfaz de archivo multimedia de soporte básico; // Autor del mensaje de cadena privada del mensaje gráfico; // Título del mensaje gráfico Cadena privada Content_source_url; // Haga clic en el enlace para leer el contenido de cadena privada de texto original; // El contenido de la página de mensajes gráficos admite HTML Tag Private String Digest; // Descripción del mensaje gráfico privado int show_conver_pic; // si se muestra como cubierta 1 significa que se muestra como la cubierta 0 no se muestra como cubierta}Método de carga
/** * Cargar el archivo de medios (local) * * @Param Método * Método de solicitud Get/Post * @param Path * API Path * @Param Param * API Parámetro * @param MediaPath * La ruta de la imagen/música para estar cargada * @return * @throws Exception */public static string httpsupPloadiaFile (string string string <string> string param, string mioception {string string string string {string stringsUppLoUnfile nulo; Url url = nueva url (setParmas (param, ruta, "")); OutputStream output = null; DataInputStream inputStream = null; intente {archivo archivo = nuevo archivo (MediaPath); if (! file.isfile () || } Httpurlconnection con = (httpurlconnection) url.openconnection (); con.setDoInput (verdadero); con.setDoOutput (verdadero); con.setUsecaches (falso); con.setRequestMethod (SystemConfig.post_method); // establecer la información del encabezado de solicitud Con.setRequestProperty ("Connection", "Keep-Alive"); con.setRequestProperty ("Charset", SystemConfig.Default_Character_Encoding); // establecer una cadena de límite límite = "-----------" + System.CurrentTimemillis (); con.setRequestProperty ("Content-type", "multipart/form-data; boundary =" + boundary); // Solicitar información de texto // Salida de la Parte 1 = nuevo DataOutputStream (con.getOutputStream ()); Ioutils.write ((("-" + límite + "/r/n").getbytes(SystemConfig.default_character_encoding), salida); Ioutils.write (("Content-Disposition: Form-Data; name =/" Media/"; filename =/" " + file.getName () +"/"/r/n") .getBytes (systemconfig.default_character_encoding), salida); Ioutils.write ("Content-type: Application/Octet-Stream/R/N/R/N" .getBytes (SystemConfig.default_character_encoding), salida); // ioutils.write (("Content-type:" + fileext + "/r/n/r/n"). GetBytes (), salida); // Part de cuerpo del archivo // presione el archivo en la URL transmitiendo el archivo inputStream = new DataInputStream (nuevo FileInputStream (archivo)); Ioutils.copy (inputStream, salida); // Part ioutils.write (("/r/n--" + límite + "-/r/n"). GetBytes (systemConfig.default_character_encoding), salida); salida.flush (); resultado = inputStreamToString (con.getInputStream ()); } catch (malformedurexception e) {E.PrintStackTrace (); } catch (Protocolexception e) {E.PrintStackTrace (); } catch (ioException e) {lanzar nueva IOException ("leer error de datos"); } finalmente {ioutils.closequiety (salida); Ioutils.closequietty (inputStream); } resultado de retorno; }/** * Subiendo el archivo de medios (no se puede ser local) * * * @param Método * Método de solicitud Get/post * @param Path * API Path * @param Param * API Parámetro * @param MediaPath * La ruta de imagen/música se descarta * @param Conntime * La conexión de conexión es predeterminada a 5000 * @param Read Time * El tiempo de lectura de lectura está predeterminado a 5000 * @return * @throws Exception Stret Httpsuploadmedia (método de cadena, string ruta, map <string, string> param, string MediaPath, int conntime, int littime) lanza la excepción {string dult = ""; Url url = nueva url (setParmas (param, ruta, "")); OutputStream output = null; BufferedInputStream inputStream = null; intente {String Boundary = "----"; Httpurlconnection conn = getConnection (método, url); conn.setConnectTimeOut (conntime == 0? Default_conntime: conntime); Conn.setReadtimeOut (Readtime == 0? Default_upload_readtime: Readtime); conn.setRequestProperty ("Content-type", "multipart/form-data; boundary =" + boundary); salida = conn.getOutputStream (); URL MEDIOURL = nueva URL (MediaPath); if (mediaUrl! = null) {httpurlconnection mediaconn = (httpurlconnection) mediasUrl.openconnection (); MediaConn.SetDoOutput (verdadero); MediaConn.SetUsecaches (falso); MediaConn.SetRequestMethod (SystemConfig.get_method); MediaConn.SetConnectTimeOut (conntime == 0? Default_conntime: conntime); MediaConn.SetReadtimeout (Readtime == 0? Default_upload_readtime: Readtime); String conntype = MediaConn.getContentType (); // Get File Extension String fileext = getFileExt (conntype); Ioutils.write ((("-" + límite + "/r/n"). GetBytes (), salida); Ioutils.write (("Content-Disposition: Form-Data; name =/" Media/"; FileName =/" " + getFileName (MediaPath) +"/"/r/n"). GetBytes (), salida); Ioutils.write (("Content-type:" + fileext + "/r/n/r/n"). GetBytes (), salida); inputStream = new BufferedInputStream (MediaConn.getInputStream ()); Ioutils.copy (inputStream, salida); Ioutils.write (("/r/n ----" + límite + "-/r/n"). GetBytes (), salida); MediaConn.Disconnect (); // Get Input Stream Result = inputStreamToString (conn.getInputStream ()); }} Catch (MalFormedUrLeCeption e) {E.PrintStackTrace (); } catch (Protocolexception e) {E.PrintStackTrace (); } catch (ioException e) {E.PrintStackTrace (); } finalmente {ioutils.closequiety (salida); Ioutils.closequietty (inputStream); } resultado de retorno; }/** * Sube el archivo de medios de video (local) * * @param Método * Método de solicitud Get/Post * @param Path * API Path * @param Param * API Parámetro * @param MediaPath * La ruta de la voz a cargar * @param Title * Video Title * @Param * Video Descripción * @return * @throws Exception */Public Statats String HttpSupLoadvide MAP <String, String> Param, String MediaPath, Title String, String Introducción) lanza la excepción {String result = null; Url url = nueva url (setParmas (param, ruta, "")); OutputStream output = null; DataInputStream inputStream = null; intente {archivo archivo = nuevo archivo (MediaPath); if (! file.isfile () || } Httpurlconnection con = (httpurlconnection) url.openconnection (); con.setDoInput (verdadero); con.setDoOutput (verdadero); con.setUsecaches (falso); con.setRequestMethod (SystemConfig.post_method); // establecer la información del encabezado de solicitud Con.setRequestProperty ("Connection", "Keep-Alive"); con.setRequestProperty ("Charset", SystemConfig.Default_Character_Encoding); // establecer una cadena de límite límite = "-----------" + System.CurrentTimemillis (); con.setRequestProperty ("Content-type", "multipart/form-data; boundary =" + boundary); // Solicitar información del cuerpo // Salida de la Parte 1 = nuevo DataOutputStream (con.getOutputStream ()); Ioutils.write ((("-" + límite + "/r/n").getbytes(SystemConfig.default_character_encoding), salida); Ioutils.write (("Content-Disposition: Form-Data; name =/" Media/"; filename =/" " + file.getName () +"/"/r/n") .getBytes (), salida); Ioutils.write ("Content-type: video/mp4/r/n/r/n" .getBytes (), salida); // Part de cuerpo del archivo // presione el archivo en la URL transmitiendo el archivo inputStream = new DataInputStream (nuevo FileInputStream (archivo)); Ioutils.copy (inputStream, salida); // Part ioutils.write (("-" + límite + "/r/n").getBytes(SystemConfig.default_character_encoding), salida); Ioutils.write ("Content-Disposition: Form-Data; name =/" Descripción/";/r/n/r/n" .getBytes (SystemConfig.default_character_encoding), salida); Ioutils.write (("{/" title/":/" " + title +"/",/" introduction/":/" " + introducción +"/"}") .getBytes (systemconfig.default_character_encoding), salida); Ioutils.write (("/r/n--" + límite + "-/r/n/r/n"). GetBytes (SystemConfig.default_character_encoding), salida); salida.flush (); resultado = inputStreamToString (con.getInputStream ()); } catch (malformedurexception e) {E.PrintStackTrace (); } catch (Protocolexception e) {E.PrintStackTrace (); } catch (ioException e) {lanzar nueva IOException ("leer error de datos"); } finalmente {ioutils.closequiety (salida); Ioutils.closequietty (inputStream); } resultado de retorno; } /** * Subir el archivo de medios de video (red) * * @param Método * Método de solicitud Get /Post * @param Path * API Path * @param Param * API Parámetro * @param MediaPath * La ruta de la ruta de la voz a la voz * @param Título * Título de video * @Param * Video Descripción * @param Conntime * El tiempo de conexión de la conexión * Excepción */ public static String httpsuploadVideomedia (método de cadena, string ruta, map <string> param, string mediaPath, title de cadena, introducción de cadena, int conntime, int Url url = nueva url (setParmas (param, ruta, "")); OutputStream output = null; BufferedInputStream inputStream = null; intente {String Boundary = "----"; Httpurlconnection conn = getConnection (método, url); conn.setConnectTimeOut (conntime == 0? Default_conntime: conntime); Conn.setReadtimeOut (Readtime == 0? Default_upload_readtime: Readtime); conn.setRequestProperty ("Content-type", "multipart/form-data; boundary =" + boundary); salida = conn.getOutputStream (); URL MEDIOURL = nueva URL (MediaPath); if (mediaUrl! = null) {httpurlconnection mediaconn = (httpurlconnection) mediasUrl.openconnection (); MediaConn.SetDoOutput (verdadero); MediaConn.SetUsecaches (falso); MediaConn.SetRequestMethod (SystemConfig.get_method); MediaConn.SetConnectTimeOut (conntime == 0? Default_conntime: conntime); MediaConn.SetReadtimeout (Readtime == 0? Default_upload_readtime: Readtime); Ioutils.write ((("-" + límite + "/r/n"). GetBytes (), salida); Ioutils.write (("Content-Disposition: Form-Data; name =/" Media/"; FileName =/" " + getFileName (MediaPath) +"/"/r/n"). GetBytes (), salida); Ioutils.write ("Content-type: video/mp4/r/n/r/n" .getBytes (), salida); inputStream = new BufferedInputStream (MediaConn.getInputStream ()); Ioutils.copy (inputStream, salida); // Part ioutils.write (("-" + límite + "/r/n").getBytes(SystemConfig.default_character_encoding), salida); Ioutils.write ("Content-Disposition: Form-Data; name =/" Descripción/";/r/n/r/n" .getBytes (SystemConfig.default_character_encoding), salida); Ioutils.write (("{/" title/":/" " + title +"/",/" introduction/":/" " + introducción +"/"}") .getBytes (systemconfig.default_character_encoding), salida); Ioutils.write (("/r/n--" + límite + "-/r/n/r/n"). GetBytes (SystemConfig.default_character_encoding), salida); MediaConn.Disconnect (); // Get Input Stream Result = inputStreamToString (conn.getInputStream ()); }} Catch (MalFormedUrLeCeption e) {E.PrintStackTrace (); } catch (Protocolexception e) {E.PrintStackTrace (); } catch (ioException e) {lanzar nueva IOException ("leer error de datos"); } finalmente {ioutils.closequiety (salida); Ioutils.closequietty (inputStream); } resultado de retorno; }Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.