牛骨文教育服务平台(让学习变的简单)
博文笔记

微信爬取过程中参数分析

创建时间:2017-03-08 投稿人: 浏览次数:2627

一:找到永久的历史信息列表:http://mp.weixin.qq.com/mp/getmasssendmsg?__biz=XXX==#wechat_redirect

将XXX==替换为自己的BIZ


二:4个参数可以唯一确定一篇微信文章:

__biz可以认为是微信公众平台对外公布的公众帐号的唯一id
mid是图文消息id
idx是发布的第几条消息(1就代表是头条位置消息)
sn是一个随机加密串(对于一篇图文消息是唯一的,如果你想问这个sn的生成规则是什么或者怎么破解,你基本上只能从微信公众平台开发团队才能得到答案)熬伪装


三:伪装微信客户端登陆,取历史信息页时,最重要4个参数:__biz;uin=;key=;pass_ticket=;这4个参数。【有时候需要手机配合】


四:取得general_msg_list 后,分析各个字段
"list": [ //最外层的键名;只出现一次,所有内容都被它包含。
    {//这个大阔号之内是一条多图文或单图文消息,通俗的说就是一天的群发都在这里
        "app_msg_ext_info":{//图文消息的扩展信息
            "content_url": "图文消息的链接地址",
            "cover": "封面图片",
            "digest": "摘要",
            "is_multi": "是否多图文,值为1和0",
            "multi_app_msg_item_list": [//这里面包含的是从第二条开始的图文消息,如果is_multi=0,这里将为空
                {
                    "content_url": "图文消息的链接地址",
                    "cover": "封面图片",
                    "digest": ""摘要"",
                    "source_url": "阅读原文的地址",
                    "title": "子内容标题"
                },
                ...//循环被省略
            ],
            "source_url": "阅读原文的地址",
            "title": "头条标题"
        },
        "comm_msg_info":{//图文消息的基本信息
            "datetime": "发布时间,值为unix时间戳",
            "type": 49 //类型为49的时候是图文消息
        }
    },
    ...//循环被省略
]

五:采集程序原型

建立表:
 

1、微信公众号表

CREATE TABLE `weixin` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `biz` varchar(255) DEFAULT "" COMMENT "公众号唯一标识biz",
  `collect` int(11) DEFAULT "1" COMMENT "记录采集时间的时间戳",
  PRIMARY KEY (`id`)
) ;

2、微信文章表

CREATE TABLE `post` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `biz` varchar(255) CHARACTER SET utf8 NOT NULL COMMENT "文章对应的公众号biz",
  `field_id` int(11) NOT NULL COMMENT "微信定义的一个id,每条文章唯一",
  `title` varchar(255) NOT NULL DEFAULT "" COMMENT "文章标题",
  `title_encode` text CHARACTER SET utf8 NOT NULL COMMENT "文章编码,防止文章出现emoji",
  `digest` varchar(500) NOT NULL DEFAULT "" COMMENT "文章摘要",
  `content_url` varchar(500) CHARACTER SET utf8 NOT NULL COMMENT "文章地址",
  `source_url` varchar(500) CHARACTER SET utf8 NOT NULL COMMENT "阅读原文地址",
  `cover` varchar(500) CHARACTER SET utf8 NOT NULL COMMENT "封面图片",
  `is_multi` int(11) NOT NULL COMMENT "是否多图文",
  `is_top` int(11) NOT NULL COMMENT "是否头条",
  `datetime` int(11) NOT NULL COMMENT "文章时间戳",
  `readNum` int(11) NOT NULL DEFAULT "1" COMMENT "文章阅读量",
  `likeNum` int(11) NOT NULL DEFAULT "0" COMMENT "文章点赞量",
  PRIMARY KEY (`id`)
) ;

3、采集队列表

CREATE TABLE `tmplist` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `content_url` varchar(255) DEFAULT NULL COMMENT "文章地址",
  `load` int(11) DEFAULT "0" COMMENT "读取中标记",
  PRIMARY KEY (`id`),
  UNIQUE KEY `content_url` (`content_url`)
) ;


采集:
1、getMsgJson.php:这个程序负责接收历史消息的json并解析后存入数据库
<?
$str = $_POST["str"];
$url = $_POST["url"];//先获取到两个POST变量

//先针对url参数进行操作
parse_str(parse_url(htmlspecialchars_decode(urldecode($url)),PHP_URL_QUERY ),$query);//解析url地址
$biz = $query["__biz"];//得到公众号的biz
//接下来进行以下操作
//从数据库中查询biz是否已经存在,如果不存在则插入,这代表着我们新添加了一个采集目标公众号。

//再解析str变量
$json = json_decode($str,true);//首先进行json_decode
if(!$json){
    $json = json_decode(htmlspecialchars_decode($str),true);//如果不成功,就增加一步htmlspecialchars_decode
}

foreach($json["list"] as $k=>$v){
            $type = $v["comm_msg_info"]["type"];
            if($type==49){//type=49代表是图文消息
                $content_url = str_replace("\", "", htmlspecialchars_decode($v["app_msg_ext_info"]["content_url"]));//获得图文消息的链接地址
                $is_multi = $v["app_msg_ext_info"]["is_multi"];//是否是多图文消息
                $datetime = $v["comm_msg_info"]["datetime"];//图文消息发送时间
                //在这里将图文消息链接地址插入到采集队列库中(队列库将在后文介绍,主要目的是建立一个批量采集队列,另一个程序将根据队列安排下一个采集的公众号或者文章内容)
                //在这里根据$content_url从数据库中判断一下是否重复
                if("数据库中不存在相同的$content_url") {
                    $fileid = $v["app_msg_ext_info"]["fileid"];//一个微信给的id
                    $title = $v["app_msg_ext_info"]["title"];//文章标题
                    $title_encode = urlencode(str_replace(" ", "", $title));//建议将标题进行编码,这样就可以存储emoji特殊符号了
                    $digest = $v["app_msg_ext_info"]["digest"];//文章摘要
                    $source_url = str_replace("\", "", htmlspecialchars_decode($v["app_msg_ext_info"]["source_url"]));//阅读原文的链接
                    $cover = str_replace("\", "", htmlspecialchars_decode($v["app_msg_ext_info"]["cover"]));//封面图片

                    $is_top = 1;//标记一下是头条内容
                    //现在存入数据库
                    echo "头条标题:".$title.$lastId."
";//这个echo可以显示在anyproxy的终端里
                }
                if($is_multi==1){//如果是多图文消息
                    foreach($v["app_msg_ext_info"]["multi_app_msg_item_list"] as $kk=>$vv){//循环后面的图文消息
                        $content_url = str_replace("\","",htmlspecialchars_decode($vv["content_url"]));//图文消息链接地址
                        //这里再次根据$content_url判断一下数据库中是否重复以免出错
                        if("数据库中不存在相同的$content_url"){
                            //在这里将图文消息链接地址插入到采集队列库中(队列库将在后文介绍,主要目的是建立一个批量采集队列,另一个程序将根据队列安排下一个采集的公众号或者文章内容)
                            $title = $vv["title"];//文章标题
                            $fileid = $vv["fileid"];//一个微信给的id
                            $title_encode = urlencode(str_replace(" ","",$title));//建议将标题进行编码,这样就可以存储emoji特殊符号了
                            $digest = htmlspecialchars($vv["digest"]);//文章摘要
                            $source_url = str_replace("\","",htmlspecialchars_decode($vv["source_url"]));//阅读原文的链接
                            //$cover = getCover(str_replace("\","",htmlspecialchars_decode($vv["cover"])));
                            $cover = str_replace("\","",htmlspecialchars_decode($vv["cover"]));//封面图片
                            //现在存入数据库
                            echo "标题:".$title.$lastId."
";
                        }

                    }
                }
            }
        }
?>

2、getMsgExt.php获取文章阅读量和点赞量的程序
?
$str = $_POST["str"];
$url = $_POST["url"];//先获取到两个POST变量
//先针对url参数进行操作
parse_str(parse_url(htmlspecialchars_decode(urldecode($url)),PHP_URL_QUERY ),$query);//解析url地址
$biz = $query["__biz"];//得到公众号的biz
$sn = $query["sn"];
//再解析str变量
$json = json_decode($str,true);//进行json_decode

//$sql = "select * from `文章表` where `biz`="".$biz."" and `content_url` like "%".$sn."%"" limit 0,1;
//根据biz和sn找到对应的文章

$read_num = $json["appmsgstat"]["read_num"];//阅读量
$like_num = $json["appmsgstat"]["like_num"];//点赞量
//在这里同样根据sn在采集队列表中删除对应的文章,代表这篇文章可以移出采集队列了
//$sql = "delete from `队列表` where `content_url` like "%".$sn."%"" 
            
//然后将阅读量和点赞量更新到文章表中。
exit(json_encode($msg));//可以显示在anyproxy的终端里
?>










声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。