O gerenciamento de materiais e a postagem em massa do WeChat não são amigáveis ao Java. Este artigo apresenta apenas os novos materiais temporários e os novos materiais permanentes e adiciona o restante obtendo, excluindo e modificando -os.
Muitas vezes, existem cenários em que são necessários materiais multimídia temporários para contas oficiais. Por exemplo, ao usar interfaces, especialmente ao enviar mensagens, operações como obter e chamar arquivos multimídia, mensagens multimídia, são executadas através do Media_Id. A interface de gerenciamento de materiais está aberta a todos os números de assinatura certificados e números de serviço .
Limitações do material
Imagem: 2m, suporta o formato PNG/JPEG/JPG/GIF Voz: 2M, o comprimento da reprodução não excede os anos 60, suporta o formato AMR/MP3 Video (vídeo): 10MB, suporta o formato MP4 Thumbnails: 64KB, suporta formato JPG
1. Adicione materiais temporários
Interface: https://api.weixin.qq.com/cgi-bin/media/upload?access_token=access_token&type=type e depois passa um tipo de arquivo de mídia, que pode ser imagem (imagem), voz (voz), vídeo (vídeo) e tumbail (Thumb).
1. Contas de assinatura e serviço devem ser certificadas
2. Material temporário Media_id é reutilizável
3. O arquivo de mídia é armazenado no plano de fundo do WeChat por 3 dias, ou seja, media_id será inválido após 3 dias.
/ ** * Material temporário de upload (local) * * @param accessToken * @param tipo * Tipos de arquivos de mídia, incluindo imagem (imagem), voz (voz), vídeo (vídeo) e miniaturas (thumb) * @param path * imageadia * @return */ public static uploadmediassResult uploadtempmediafile (string Pathonky, string, string, string, string, string, tipo, stringstilysult). Treemap <string, string> params = new Treemap <> (); params.put ("access_token", accessToken); params.put ("type", tipo); tente {string json = httpsuploadmediafile (systemconfig.post_method, wechatconfig.upload_temp_media_type_url, params, path); resultado = jsonutil.FromjSonstring (json, uploadmediasResult.class); } catch (Exceção e) {e.printStackTrace (); } resultado de retorno; } / ** * Carregar material temporário (rede) * * @param accessToken * @param Tipo * Tipos de arquivos de mídia, incluindo imagem (imagem), voz (voz), vídeo (vídeo) e miniaturas (thumb) * @param path * imagen * @return * / public static upload) uploadtempmedia (string patken, string Pathonky, string, string, string, string, string, string, stringning, string, string, stringn; Treemap <string, string> params = new Treemap <> (); params.put ("access_token", accessToken); params.put ("type", tipo); tente {string json = httpsuploadmedia (systemconfig.post_method, wechatconfig.upload_temp_media_type_url, params, caminho, 0, 0); resultado = jsonutil.FromjSonstring (json, uploadmediasResult.class); } catch (Exceção e) {e.printStackTrace (); } resultado de retorno; }2. Adicione materiais permanentes
Interface: https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=access_token&type=type, tipos de arquivos de mídia, incluindo imagem (imagem), voz (voz), vídeo (vídeo, exceção) e Thumbnail (Thumb)
/ ** * Carregue material permanente (local) * * @param accessToken * @param tipo * Tipos de arquivos de mídia, incluindo imagem (imagem), voz (voz), vídeo (vídeo) e miniaturas (thumb) * @return */ public static uploadmedediaMediaSult paravermediaFile (string accessToken, string, string, patch) {uploads uploads), uplowmedMediaMedias uploadsr uploadsr uploadsr uploadsr uploadsr uploads. Treemap <string, string> params = new Treemap <> (); params.put ("access_token", accessToken); params.put ("type", tipo); tente {string json = httpsuploadmediafile (systemconfig.post_method, wechatconfig.upload_forever_media_type_url, params, path); resultado = jsonutil.FromjSonstring (json, uploadmediasResult.class); } catch (Exceção e) {e.printStackTrace (); } resultado de retorno; } / ** * Carregar material permanente (rede) * * @param accessToken * @param tipo * Tipos de arquivos de mídia, incluindo imagem (imagem), voz (voz), vídeo (vídeo) e miniaturas (thumb) * @return * / public static uploadmediaMediasResult upload paravermedia (string accessToken, string, string; Treemap <string, string> params = new Treemap <> (); params.put ("access_token", accessToken); params.put ("type", tipo); tente {string json = httpsuploadmedia (systemconfig.post_method, wechatconfig.upload_forever_media_type_url, params, caminho, 0, 0); resultado = jsonutil.FromjSonstring (json, uploadmediasResult.class); } catch (Exceção e) {e.printStackTrace (); } resultado de retorno; }Atenção especial deve ser dada à adição de materiais de vídeo permanentes. Ao fazer o upload de materiais de vídeo, você precisa postar outro formulário, com a descrição do ID, incluindo as informações de descrição do título e introdução do material, e o formato de conteúdo é JSON.
/ ** * Carregar material permanente (vídeo) * * @param accessToken * @return */ public static string uploadforevermediafile (string accessToken, título da string, string Introdução, string path) {Treemap <string, string> params = new Treemap <> (); params.put ("access_token", accessToken); params.put ("type", "vídeo"); String mediaId = null; tente {string json = httpsuploadvideomediafile (systemconfig.post_method, wechatconfig.upload_forever_media_type_url, params, caminho, título, introdução); MediaId = jsonutil.FromjSonstring (JSON, "Media_id"); } catch (Exceção e) {e.printStackTrace (); } retornar mediaId; } / ** * Carregar material permanente (vídeo, rede) * * @param accessToken * @return * / public static string uploadforevermedia (string accessToken, string title, string introdução, string path) {teeMap <string, string> params = new Treemap <> (); params.put ("access_token", accessToken); params.put ("type", "vídeo"); String mediaId = null; tente {string json = httpsuploadvideomedia (systemconfig.post_method, wechatconfig.upload_forever_media_type_url, params, caminho, título, introdução, 0, 0); MediaId = jsonutil.FromjSonstring (JSON, "Media_id"); } catch (Exceção e) {e.printStackTrace (); } retornar mediaId; }3. Adicione materiais gráficos permanentes
Interface: https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=access_token, consulte a classe de entidade do uploadNewsMedia para obter informações de postagem.
Para materiais comumente usados, os desenvolvedores podem carregá -los para o servidor WeChat por meio dessa interface e usá -los permanentemente.
1. Depois que o material permanente da imagem for adicionado, ele será devolvido ao desenvolvedor com um URL. O desenvolvedor pode usá -lo dentro do nome de domínio Tencent (use -o fora do nome do domínio tencent, e a imagem será bloqueada).
2. O número total de materiais salvos na conta oficial é limitada a: o limite superior de materiais de mensagem gráfico e de texto e materiais de imagem é de 5.000, e outros tipos são de 1.000.
3. No conteúdo específico das mensagens gráficas e de texto, o back -end do WeChat filtrará os links de imagem externa e o URL da imagem precisa ser carregado através da interface "Carregue a imagem nas mensagens gráficas e de texto para obter URL".
4. As imagens enviadas nas interface "Carregar as imagens nas mensagens de texto para obter URLs" não ocupam o limite de 5.000 imagens na biblioteca de materiais da conta oficial. As imagens suportam apenas o formato JPG/PNG, e o tamanho deve ser menor que 1 MB.
5. As mensagens gráficas e de texto suportam a capacidade de inserir sua própria conta e outras contas públicas no texto principal e publicaram links para o artigo.
/ ** * Material para fazer o upload de mensagens gráficas e de texto permanentes * * @param accessToken * Token autorizado * @param entidade * imagem e mensagem de texto objeto * @return */ public static uploadmediasResult uploadNewSmedia (string accessToken, list <ouploadNewsMedia> entidade) {uplouploadMediaSResResultsult; Treemap <string, string> params = new Treemap <> (); params.put ("access_token", accessToken); // POST Parâmetros enviados Treemap <string, list <uploadNewsMedia>> DataParams = new Treemap <String, List <UploadNewsMedia >> (); DataParams.put ("Artigos", entidade); Dados da String = jsonutil.tojSonstring (DataParams); String json = httprequtil.httpsdefaultExecute (SystemConfig.Post_Method, wechatconfig.upload_forever_news_media_url, params, dados); resultado = jsonutil.FromjSonstring (json, uploadmediasResult.class); resultado de retorno; }4. Carregue as imagens na mensagem de texto para obter o URL
Interface: https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=access_token
As imagens enviadas nessa interface não ocupam o limite de 5.000 imagens na biblioteca de materiais da conta oficial. As imagens suportam apenas o formato JPG/PNG, e o tamanho deve ser menor que 1 MB. O URL retornado por esta interface é o URL para fazer upload da imagem, que pode ser colocada em mensagens de texto.
/ ** * Faça o upload da imagem na mensagem de texto para obter o URL (local) * * @param accessToken * @param caminho * @return */ public static string uploadimgmediafile (string accessToken, string path) {Treemap <string, string> params = new Treemap <> (); params.put ("access_token", accessToken); String url = null; tente {string json = httpsuploadmediafile (systemconfig.post_method, wechatconfig.upload_img_media_url, params, path); url = jsonutil.fromjSonstring (json, "url"); } catch (Exceção e) {e.printStackTrace (); } retornar URL; } / ** * Carregue a imagem na mensagem de texto para obter o url (rede) * * @param accessToken * @param caminho * @return * / public static string uploadimgmedia (string accessToken, string path) {Treemap <string, string> params = new Treemap <string, string> (); params.put ("access_token", accessToken); String url = null; tente {string json = httpsuploadmedia (systemconfig.post_method, wechatconfig.upload_img_media_url, params, caminho, 0, 0); url = jsonutil.fromjSonstring (json, "url"); } catch (Exceção e) {e.printStackTrace (); } retornar URL; }V. Algumas ferramentas
Classe de configuração
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";
Carregar a classe de retorno de material gráfico e de mensagem de texto
pacote com.phil.wechat.msg.model.media; / *** Resultados retornados fazendo upload de materiais gráficos e de mensagem de texto* @author phil* @date 20 de setembro de 2017**/ public classe UPLOPLEMEDIASRESULT {private String Type; // Tipos de arquivos de mídia, incluindo imagem (imagem), voz (voz), vídeo (vídeo) e miniatura (polegar), o número de vezes é notícia, ou seja, private string media_id; // arquivo de mídia/identificador exclusivo obtido após o upload de mensagens gráficas e de texto private string criado_at; // Tempo de upload de arquivo de mídia}Carregar a classe de entidade de material gráfico e de mensagem de texto
pacote com.phil.wechat.msg.model.media; importar java.io.serializable; / *** Faça o upload da classe de entidade material de mensagem gráfica* @author phil* @date 20 de setembro de 2017*/ classe pública UPLOPLENWSMEDIA implementa serializável {private estático final serialversionUid = 6551817058101753854l; String privada Thumb_media_id; // media_id da miniatura da mensagem gráfica pode obter autor de string privado na interface de arquivo multimídia de suporte básico de suporte básico; // Autor do título da String Private Message Private; // título da mensagem gráfica private string content_source_url; // Clique no link para ler o conteúdo original da String Private String; // Conteúdo da página de mensagem gráfica suporta HTML Tag Private String Digest; // Descrição da mensagem gráfica Private int show_conver_pic; // Se é exibido como a tampa 1 significa que é exibida como a capa 0 não é exibida como capa}Método de upload
/** * Arquivo de mídia de upload (local) * * @param Método * Método de solicitação get/post * @param caminho * caminho da API * @param param * parâmetro API * @param mediapath * o caminho da imagem/música a ser upload * @return * @throws Exception */public static string httpSUPLOADIDIAFILE (String Method, Path Path, caminho Url url = novo url (setparmas (param, path, "" "); OutputStream Output = NULL; DatainputStream inputStream = null; tente {arquivo file = new File (MediaPath); if (! file.isfile () ||! file.exists ()) {lança a nova ioexception ("o arquivo não existe"); } HttpurlConnection con = (httpurlConnection) url.openconnection (); con.setDoinput (true); Con.SetdoOutput (true); con.setuseCaches (false); Con.SetRequestMethod (SystemConfig.Post_Method); // Definir informações do cabeçalho da solicitação Con.SetRequestProperty ("Connection", "Keep-Alive"); Con.SetRequestProperty ("charset", SystemConfig.Default_Character_Encoding); // Definir limite de limite limite = "---------" + System.currenttimemillis (); Con.SetRequestProperty ("Content-Type", "Multipart/Form-Data; limite =" + limite); // Solicitar informações de texto // Parte 1 output = new DataOutputStream (Con.getOutputStream ()); Ioutils.write (("-" + limite + "/r/n").getbytes(systemconfig.default_character_encoding), saída); Ioutils.write (("Content-Disposition: Form-Data; nome =/" Media/"; nome do arquivo =/" " + file.getName () +"/"/r/n") .getBytes (SystemConfig.Default_Character_Encoding), saída); Ioutils.write ("Tipo de conteúdo: aplicativo/octeto-stream/r/n/r/n" .getBytes (SystemConfig.Default_Character_Encoding), saída); // ioutils.write (("content-type:" + fileExt + "/r/n/r/n"). GetBytes (), saída); // File Body Part // Empurre o arquivo para o URL transmitindo o arquivo inputStream = new DatainputStream (new FileInputStream (FILE)); Ioutils.copy (inputStream, saída); // encerrar a parte ioutils.write (("/r/n--" + limite + "-/r/n"). GetBytes (SystemConfig.Default_Character_Encoding), saída); output.flush (); resultado = inputStreamToString (CON.GetInputStream ()); } catch (malformEdurlexception e) {e.printStackTrace (); } catch (protocolexception e) {e.printStackTrace (); } catch (ioexception e) {lança nova ioexception ("leia o erro de dados"); } finalmente {ioutils.closeQuietly (saída); Ioutils.closequietly (inputstream); } resultado de retorno; }/** * Faça o upload do arquivo de mídia (não pode ser local) * * @param método * Método de solicitação Get/post * @param caminho * caminho da API * @param param * parâmetro API * @param mediapath * O caminho da imagem/música a ser upload * a hora de leitura * @param Conntime * O tempo de conexão é padrão para 5000 * @param readtime * a hora de leitura é default para 5.000 * Httpsuploadmedia (método da string, caminho da string, mapa <string, string> param, string mediaPath, int ConnTime, int readtime) lança a exceção {string result = ""; Url url = novo url (setparmas (param, path, "" "); OutputStream Output = NULL; BufferInputStream inputStream = null; tente {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; limite =" + limite); output = Conn.getOutputStream (); Url mediaurl = new URL (MediaPath); if (mediaurl! = null) {httpurlConnection MediaConn = (httpurlConnection) mediaurl.openconnection (); MediaConn.SetDoOutput (true); MediaConn.setUseCaches (false); MediaConn.SetRequestMethod (SystemConfig.get_method); MediaConn.SetConnectTimeout (ConnTime == 0? Default_ConnTime: ConnTime); MediaConn.SetReadTimeout (ReadTime == 0? Default_upload_readTime: ReadTime); String Connntype = MediaConn.getContentType (); // Obter Extensão de Arquivo String fileExt = getFileExt (Connntype); Ioutils.write (("-" + limite + "/r/n"). GetBytes (), saída); Ioutils.write (("Content-Disposition: Form-Data; nome =/" Media/"; FileName =/" " + getFileName (MediaPath) +"/"/r/n"). GetBytes (), saída); Ioutils.write (("Content-type:" + fileExt + "/r/n/r/n"). GetBytes (), saída); inputStream = new bufferInputStream (MediaConn.getInputStream ()); Ioutils.copy (inputStream, saída); Ioutils.write (("/r/n ----" + limite + "-/r/n"). GetBytes (), saída); MediaConn.disconnect (); // obtenha resultado do fluxo de entrada = inputStreamToString (Conn.getInputStream ()); }} catch (malformedUrlexception e) {e.printStackTrace (); } catch (protocolexception e) {e.printStackTrace (); } catch (ioexception e) {e.printStackTrace (); } finalmente {ioutils.closeQuietly (saída); Ioutils.closequietly (inputstream); } resultado de retorno; }/** * Faça o upload de arquivo de mídia de vídeo (local) * * @param método * solicitação método get/post * @param caminho * caminho da api * @param param * parâmetro de api * @param mediapath * o caminho do voide a ser uploado * @param title title * @param introdução * video descrição * @return * @Throws */public strat * strat, ht ht, título do vídeo * @param * video descrição * @return * @Throws */public strac Mapa <string, string> param, string mediapath, string title, string introdução) lança exceção {string resultado = null; Url url = novo url (setparmas (param, path, "" "); OutputStream Output = NULL; DatainputStream inputStream = null; tente {arquivo file = new File (MediaPath); if (! file.isfile () ||! file.exists ()) {lança a nova ioexception ("o arquivo não existe"); } HttpurlConnection con = (httpurlConnection) url.openconnection (); con.setDoinput (true); Con.SetdoOutput (true); con.setuseCaches (false); Con.SetRequestMethod (SystemConfig.Post_Method); // Definir informações do cabeçalho da solicitação Con.SetRequestProperty ("Connection", "Keep-Alive"); Con.SetRequestProperty ("charset", SystemConfig.Default_Character_Encoding); // Definir limite de limite limite = "---------" + System.currenttimemillis (); Con.SetRequestProperty ("Content-Type", "Multipart/Form-Data; limite =" + limite); // solicita informações do corpo // Parte 1 output = new DataOutputStream (Con.getOutputStream ()); Ioutils.write (("-" + limite + "/r/n").getbytes(systemconfig.default_character_encoding), saída); Ioutils.write (("Content-Disposition: Form-Data; nome =/" Media/"; nome do arquivo =/" " + file.getName () +"/"/r/n") .getBytes (), saída); Ioutils.write ("Tipo de conteúdo: vídeo/mp4/r/n/r/n" .getBytes (), saída); // File Body Part // Empurre o arquivo para o URL transmitindo o arquivo inputStream = new DatainputStream (new FileInputStream (FILE)); Ioutils.copy (inputStream, saída); // encerrar a parte ioutils.write (("-" + limite + "/r/n").getbytes(systemconfig.default_character_encoding), saída); Ioutils.write ("Content-Disposition: Form-Data; nome =/" Descrição/";/r/n/r/n" .getBytes (SystemConfig.Default_Character_Encoding), saída); Ioutils.write (("{/" title/":/" "" title + "/",/"introdução/":/"" + introdução + "/"} ") .getBytes (SystemConfig.Default_Character_Encoding), saída); Ioutils.write ((("/r/n--" + limite + "-/r/n/r/n"). GetBytes (SystemConfig.Default_Character_Encoding), saída); output.flush (); resultado = inputStreamToString (CON.GetInputStream ()); } catch (malformEdurlexception e) {e.printStackTrace (); } catch (protocolexception e) {e.printStackTrace (); } catch (ioexception e) {lança nova ioexception ("leia o erro de dados"); } finalmente {ioutils.closeQuietly (saída); Ioutils.closequietly (inputstream); } resultado de retorno; } /** * Faça o upload de arquivo de mídia de vídeo (rede) * * @param método * solicitação método get /post * @param caminho * caminho da api * @param param * parâmetro de api * @param mediapath * o caminho do voide a ser carregado * o tempo de reading * @param title * title de vídeo * @param introdução * videoam * @throws Exception */ public static string httpsuploadvideomedia (método da string, caminho da string, mapa <string, string> param, string mediapath, título da string, introdução de string, int ConnTime, int readtime) lança exceção {string result = null; Url url = novo url (setparmas (param, path, "" "); OutputStream Output = NULL; BufferInputStream inputStream = null; tente {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; limite =" + limite); output = Conn.getOutputStream (); Url mediaurl = new URL (MediaPath); if (mediaurl! = null) {httpurlConnection MediaConn = (httpurlConnection) mediaurl.openconnection (); MediaConn.SetDoOutput (true); MediaConn.setUseCaches (false); MediaConn.SetRequestMethod (SystemConfig.get_method); MediaConn.SetConnectTimeout (ConnTime == 0? Default_ConnTime: ConnTime); MediaConn.SetReadTimeout (ReadTime == 0? Default_upload_readTime: ReadTime); Ioutils.write (("-" + limite + "/r/n"). GetBytes (), saída); Ioutils.write (("Content-Disposition: Form-Data; nome =/" Media/"; FileName =/" " + getFileName (MediaPath) +"/"/r/n"). GetBytes (), saída); Ioutils.write ("Tipo de conteúdo: vídeo/mp4/r/n/r/n" .getBytes (), saída); inputStream = new bufferInputStream (MediaConn.getInputStream ()); Ioutils.copy (inputStream, saída); // encerrar a parte ioutils.write (("-" + limite + "/r/n").getbytes(systemconfig.default_character_encoding), saída); Ioutils.write ("Content-Disposition: Form-Data; nome =/" Descrição/";/r/n/r/n" .getBytes (SystemConfig.Default_Character_Encoding), saída); Ioutils.write (("{/" title/":/" "" title + "/",/"introdução/":/"" + introdução + "/"} ") .getBytes (SystemConfig.Default_Character_Encoding), saída); Ioutils.write ((("/r/n--" + limite + "-/r/n/r/n"). GetBytes (SystemConfig.Default_Character_Encoding), saída); MediaConn.disconnect (); // obtenha resultado do fluxo de entrada = inputStreamToString (Conn.getInputStream ()); }} catch (malformedUrlexception e) {e.printStackTrace (); } catch (protocolexception e) {e.printStackTrace (); } catch (ioexception e) {lança nova ioexception ("leia o erro de dados"); } finalmente {ioutils.closeQuietly (saída); Ioutils.closequietly (inputstream); } resultado de retorno; }O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.