>  기사  >  백엔드 개발  >  PHP가 여러 사진이 포함된 그래픽 메시지를 WeChat 공개 플랫폼에 업로드할 때 콘텐츠 손실 문제를 어떻게 해결합니까?

PHP가 여러 사진이 포함된 그래픽 메시지를 WeChat 공개 플랫폼에 업로드할 때 콘텐츠 손실 문제를 어떻게 해결합니까?

WBOY
WBOY원래의
2016-08-08 09:06:381691검색

1. 질문:
WordPress의 기사를 WeChat에 영구 자료로 업로드합니다.
기사에 사진이 하나만 있는 경우 정상적으로 업로드할 수 있으며, WeChat 공개 플랫폼에서 이 자료를 볼 때 , 텍스트 내용과 그림을 완전히 표시할 수 있습니다.
기사에 다른 사진을 추가하세요(기사 사진이 1보다 큰 경우). WeChat 배경에서 이 자료를 볼 때 기사가 불완전한 것으로 확인됩니다. 첫 번째 사진부터 시작하는 모든 내용이 손실됩니다.
추가 참고사항:
(1) 저는 WordPress 기사를 WeChat 자료 라이브러리에 업로드하기 위한 플러그인을 작성했습니다.
주요 프로세스: 컬은 기사의 이미지를 가져와 WeChat 자료 라이브러리에 업로드하고, URL을 얻은 다음 이에 따라 wordpress 기사의 이미지 src를 바꿉니다.
그런 다음 이미지와 문자 메시지의 json 문자열을 구성하여 WeChat에 업로드하세요.
(2) WordPress 기사에는 스타일이 추가되지 않으며

, 태그만 추가됩니다.
2, 코드:

<code>// 上传图文消息代码
$raw = Curl::curl_post_wx( 'https://api.weixin.qq.com/cgi-bin/material/add_news?access_token='
    . $token, self::json_article( $post_ids, $token ), false );

/**
 * 将文章内容构造成json字符串
 *
 * @param array $post_ids
 * @param string $token
 * @return string json
 */
private function json_article( $post_ids, $token ) {
    $mp_article = '{"articles":[';
    foreach ( $post_ids as $post_id ) {
        $post = get_post( $post_id );
        $post_urls = self::preg_match_src( $post->post_content );
        if ( $post_urls ) {
            // 如果文章中有图片,将文章中的图片上传至微信素材库
            foreach ( $post_urls as $post_url ) {
                if ( strpos( $post_url, 'qpic.cn' ) === false ) {
                    // 如果图片没有上传到微信服务器
                    $res = Curl::curl_post_wx( 'https://api.weixin.qq.com/cgi-bin/material/add_material?'
                        . 'access_token=' . $token . '&type=image', false, Curl::curl_get_img( $post_url ) );
                    //替换文章内容img中的src地址
                    $post->post_content = str_replace( $post_url, $res['url'], $post->post_content );
                }
                $post->post_content = str_replace( '"', '\"', $post->post_content );
            }
        }

        // 获取缩略图并上传
        // 相应的code省略

        // 构造json
        $mp_article .= '{
            "title": "' . $post->post_title . '",
            "content_source_url": "' . get_permalink( $post_id, false ) . '",
            "thumb_media_id": "' . $thumb_res['media_id'] . '",
            "content": "' . htmlspecialchars_decode( $post->post_content ) . '",
            "show_cover_pic": 0,
        ';
        if ( !empty($post->post_excerpt ) ) {
            $mp_article .= '"digest": "' . $post->post_excerpt . '",';
        }
        $mp_article .= '},';
    }

    return rtrim($mp_article, ',') . ']}';
}</code>

3. 오류 메시지: WeChat이 오류 메시지를 반환하지 않았습니다.
4, 스크린샷: 없음.
5, 기타 참고 자료:
CSDN에서 tilun_099가 비슷한 문제에 직면한 것을 보았습니다: http://bbs.csdn.net/topics/39....
tilun_099의 문제점은 다음과 같습니다. "다중 이미지 및 텍스트 자료를 업로드할 때 콘텐츠 내용이 일반 텍스트이면 업로드에 성공할 수 있고 media_id를 얻을 수 있으며 그룹 전송 인터페이스를 통해 휴대폰에서는 다중 이미지 및 텍스트 정보를 올바르게 얻을 수 있습니다. 그러나 콘텐츠에

,

등과 같은 html 태그가 포함된 경우 media_id는 업로드 후에 얻을 수 있습니다. , 대량 전송 후 휴대폰에는 단일 이미지와 텍스트가 포함되며, 이 단일 이미지와 텍스트에는 사진과 제목이 포함됩니다. 즉, 내용이 비어 있습니다. 그의 문제: "아무도 대답하지 않았지만 콘텐츠에 html 태그가 포함되어 있으면 마침내 문제를 해결했습니다. 그렇다면 콘텐츠를 이스케이프해야 합니다. 콘텐츠에 style=".." 및 ""가 포함된 콘텐츠가 있으면 비용을 지불해야 합니다. 그것에 더 많은 관심을 기울이십시오.

urlencoding을 수행할 때 태그가 영향을 받지 않도록 html의 "" 따옴표를 먼저 작은따옴표로 변환한 다음 이를 html 엔터티로 변환해야 합니다.
<code>foreach ($news as &$item){
    foreach ($item as $k=>$v){
        if($k =='content'){
            $item[$k] = urlencode(htmlspecialchars(str_replace("\"","'",$v)));
            }else{
                $item[$k] = urlencode($v);
            }
        }
    }</code>

업로드하기 전에 콘텐츠를 urldecode하고 html 엔터티를 html 태그로 변환하면 괜찮습니다.
<code>$data=array("articles"=>$news);
    $data=json_encode($data);
    $end_data= urldecode($data);
    $end_data= htmlspecialchars_decode($end_data);</code>
테스트 완료! ”


그와 내가 직면한 문제는 다소 유사하지만 json을 직접 구성한 것과 완전히 똑같지는 않습니다.

답글 내용:

1. 질문:

WordPress의 기사를 WeChat에 영구 자료로 업로드합니다.

기사에 사진이 하나만 있는 경우 정상적으로 업로드할 수 있으며, WeChat 공개 플랫폼에서 이 자료를 볼 때 , 텍스트 내용과 그림을 완전히 표시할 수 있습니다.
기사에 다른 사진을 추가하세요(기사 사진이 1보다 큰 경우). WeChat 배경에서 이 자료를 볼 때 기사가 불완전한 것으로 확인됩니다. 첫 번째 사진부터 시작하는 모든 내용이 손실됩니다.
추가 참고사항:
(1) 저는 WordPress 기사를 WeChat 자료 라이브러리에 업로드하기 위한 플러그인을 작성했습니다.
주요 프로세스: 컬은 기사의 이미지를 가져와 WeChat 자료 라이브러리에 업로드하고, URL을 얻은 다음 이에 따라 wordpress 기사의 이미지 src를 바꿉니다.
그런 다음 이미지와 문자 메시지의 json 문자열을 구성하여 WeChat에 업로드하세요.
(2) WordPress 기사에는 스타일이 추가되지 않으며

, 태그만 추가됩니다.
2, 코드:

3. 오류 메시지: WeChat이 오류 메시지를 반환하지 않았습니다.
<code>// 上传图文消息代码
$raw = Curl::curl_post_wx( 'https://api.weixin.qq.com/cgi-bin/material/add_news?access_token='
    . $token, self::json_article( $post_ids, $token ), false );

/**
 * 将文章内容构造成json字符串
 *
 * @param array $post_ids
 * @param string $token
 * @return string json
 */
private function json_article( $post_ids, $token ) {
    $mp_article = '{"articles":[';
    foreach ( $post_ids as $post_id ) {
        $post = get_post( $post_id );
        $post_urls = self::preg_match_src( $post->post_content );
        if ( $post_urls ) {
            // 如果文章中有图片,将文章中的图片上传至微信素材库
            foreach ( $post_urls as $post_url ) {
                if ( strpos( $post_url, 'qpic.cn' ) === false ) {
                    // 如果图片没有上传到微信服务器
                    $res = Curl::curl_post_wx( 'https://api.weixin.qq.com/cgi-bin/material/add_material?'
                        . 'access_token=' . $token . '&type=image', false, Curl::curl_get_img( $post_url ) );
                    //替换文章内容img中的src地址
                    $post->post_content = str_replace( $post_url, $res['url'], $post->post_content );
                }
                $post->post_content = str_replace( '"', '\"', $post->post_content );
            }
        }

        // 获取缩略图并上传
        // 相应的code省略

        // 构造json
        $mp_article .= '{
            "title": "' . $post->post_title . '",
            "content_source_url": "' . get_permalink( $post_id, false ) . '",
            "thumb_media_id": "' . $thumb_res['media_id'] . '",
            "content": "' . htmlspecialchars_decode( $post->post_content ) . '",
            "show_cover_pic": 0,
        ';
        if ( !empty($post->post_excerpt ) ) {
            $mp_article .= '"digest": "' . $post->post_excerpt . '",';
        }
        $mp_article .= '},';
    }

    return rtrim($mp_article, ',') . ']}';
}</code>
4, 스크린샷: 없음.

5, 기타 참고 자료:
CSDN에서 tilun_099가 비슷한 문제에 직면한 것을 보았습니다: http://bbs.csdn.net/topics/39....
tilun_099의 문제점은 다음과 같습니다. "다중 이미지 및 텍스트 자료를 업로드할 때 콘텐츠 내용이 일반 텍스트이면 업로드에 성공할 수 있고 media_id를 얻을 수 있으며 그룹 전송 인터페이스를 통해 휴대폰에서는 다중 이미지 및 텍스트 정보를 올바르게 얻을 수 있습니다. 그러나 콘텐츠에

,

등과 같은 html 태그가 포함된 경우 media_id는 업로드 후에 얻을 수 있습니다. , 대량 전송 후 휴대폰에는 단일 이미지와 텍스트가 포함되며, 이 단일 이미지와 텍스트에는 사진과 제목이 포함됩니다. 즉, 내용이 비어 있습니다. 그의 문제: "아무도 대답하지 않았지만 콘텐츠에 html 태그가 포함되어 있으면 마침내 문제를 해결했습니다. 그렇다면 콘텐츠를 이스케이프해야 합니다. 콘텐츠에 style=".." 및 ""가 포함된 콘텐츠가 있으면 비용을 지불해야 합니다. 그것에 더 많은 관심을 기울이십시오.

urlencoding을 수행할 때 태그가 영향을 받지 않도록 html의 "" 따옴표를 먼저 작은따옴표로 변환한 다음 이를 html 엔터티로 변환해야 합니다.

<code>foreach ($news as &$item){
    foreach ($item as $k=>$v){
        if($k =='content'){
            $item[$k] = urlencode(htmlspecialchars(str_replace("\"","'",$v)));
            }else{
                $item[$k] = urlencode($v);
            }
        }
    }</code>
업로드하기 전에 콘텐츠를 urldecode하고 html 엔터티를 html 태그로 변환하면 괜찮습니다.

테스트 완료! ”

<code>$data=array("articles"=>$news);
    $data=json_encode($data);
    $end_data= urldecode($data);
    $end_data= htmlspecialchars_decode($end_data);</code>
그와 내가 직면한 문제는 다소 유사하지만 json을 직접 구성한 것과 완전히 똑같지는 않습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.