微信爬取过程中参数分析

一:找到永久的历史信息列表: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 后,分析各个字段
  1. "list": [ //最外层的键名;只出现一次,所有内容都被它包含。
  2. {//这个大阔号之内是一条多图文或单图文消息,通俗的说就是一天的群发都在这里
  3. "app_msg_ext_info":{//图文消息的扩展信息
  4. "content_url": "图文消息的链接地址",
  5. "cover": "封面图片",
  6. "digest": "摘要",
  7. "is_multi": "是否多图文,值为1和0",
  8. "multi_app_msg_item_list": [//这里面包含的是从第二条开始的图文消息,如果is_multi=0,这里将为空
  9. {
  10. "content_url": "图文消息的链接地址",
  11. "cover": "封面图片",
  12. "digest": ""摘要"",
  13. "source_url": "阅读原文的地址",
  14. "title": "子内容标题"
  15. },
  16. ...//循环被省略
  17. ],
  18. "source_url": "阅读原文的地址",
  19. "title": "头条标题"
  20. },
  21. "comm_msg_info":{//图文消息的基本信息
  22. "datetime": '发布时间,值为unix时间戳',
  23. "type": 49 //类型为49的时候是图文消息
  24. }
  25. },
  26. ...//循环被省略
  27. ]

五:采集程序原型 

建立表:
 

1、微信公众号表

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

2、微信文章表

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

3、采集队列表

  1. CREATE TABLE ` tmplist ` (
  2. ` id ` int ( 11 ) unsigned NOT NULL AUTO_INCREMENT ,
  3. ` content_url ` varchar ( 255 ) DEFAULT NULL COMMENT '文章地址' ,
  4. ` load ` int ( 11 ) DEFAULT '0' COMMENT '读取中标记' ,
  5. PRIMARY KEY ( ` id ` ),
  6. UNIQUE KEY ` content_url ` ( ` content_url ` )
  7. ) ;


采集:
1、getMsgJson.php:这个程序负责接收历史消息的json并解析后存入数据库
  1. <?
  2. $str = $_POST[ 'str'];
  3. $url = $_POST[ 'url']; //先获取到两个POST变量
  4. //先针对url参数进行操作
  5. parse_str(parse_url(htmlspecialchars_decode(urldecode($url)),PHP_URL_QUERY ),$query); //解析url地址
  6. $biz = $query[ '__biz']; //得到公众号的biz
  7. //接下来进行以下操作
  8. //从数据库中查询biz是否已经存在,如果不存在则插入,这代表着我们新添加了一个采集目标公众号。
  9. //再解析str变量
  10. $json = json_decode($str, true); //首先进行json_decode
  11. if(!$json){
  12. $json = json_decode(htmlspecialchars_decode($str), true); //如果不成功,就增加一步htmlspecialchars_decode
  13. }
  14. foreach($json[ 'list'] as $k=>$v){
  15. $type = $v[ 'comm_msg_info'][ 'type'];
  16. if($type== 49){ //type=49代表是图文消息
  17. $content_url = str_replace( "\\", "", htmlspecialchars_decode($v[ 'app_msg_ext_info'][ 'content_url'])); //获得图文消息的链接地址
  18. $is_multi = $v[ 'app_msg_ext_info'][ 'is_multi']; //是否是多图文消息
  19. $datetime = $v[ 'comm_msg_info'][ 'datetime']; //图文消息发送时间
  20. //在这里将图文消息链接地址插入到采集队列库中(队列库将在后文介绍,主要目的是建立一个批量采集队列,另一个程序将根据队列安排下一个采集的公众号或者文章内容)
  21. //在这里根据$content_url从数据库中判断一下是否重复
  22. if( '数据库中不存在相同的$content_url') {
  23. $fileid = $v[ 'app_msg_ext_info'][ 'fileid']; //一个微信给的id
  24. $title = $v[ 'app_msg_ext_info'][ 'title']; //文章标题
  25. $title_encode = urlencode(str_replace( " ", "", $title)); //建议将标题进行编码,这样就可以存储emoji特殊符号了
  26. $digest = $v[ 'app_msg_ext_info'][ 'digest']; //文章摘要
  27. $source_url = str_replace( "\\", "", htmlspecialchars_decode($v[ 'app_msg_ext_info'][ 'source_url'])); //阅读原文的链接
  28. $cover = str_replace( "\\", "", htmlspecialchars_decode($v[ 'app_msg_ext_info'][ 'cover'])); //封面图片
  29. $is_top = 1; //标记一下是头条内容
  30. //现在存入数据库
  31. echo "头条标题:".$title.$lastId. "\n"; //这个echo可以显示在anyproxy的终端里
  32. }
  33. if($is_multi== 1){ //如果是多图文消息
  34. foreach($v[ 'app_msg_ext_info'][ 'multi_app_msg_item_list'] as $kk=>$vv){ //循环后面的图文消息
  35. $content_url = str_replace( "\\", "",htmlspecialchars_decode($vv[ 'content_url'])); //图文消息链接地址
  36. //这里再次根据$content_url判断一下数据库中是否重复以免出错
  37. if( '数据库中不存在相同的$content_url'){
  38. //在这里将图文消息链接地址插入到采集队列库中(队列库将在后文介绍,主要目的是建立一个批量采集队列,另一个程序将根据队列安排下一个采集的公众号或者文章内容)
  39. $title = $vv[ 'title']; //文章标题
  40. $fileid = $vv[ 'fileid']; //一个微信给的id
  41. $title_encode = urlencode(str_replace( " ", "",$title)); //建议将标题进行编码,这样就可以存储emoji特殊符号了
  42. $digest = htmlspecialchars($vv[ 'digest']); //文章摘要
  43. $source_url = str_replace( "\\", "",htmlspecialchars_decode($vv[ 'source_url'])); //阅读原文的链接
  44. //$cover = getCover(str_replace("\\","",htmlspecialchars_decode($vv['cover'])));
  45. $cover = str_replace( "\\", "",htmlspecialchars_decode($vv[ 'cover'])); //封面图片
  46. //现在存入数据库
  47. echo "标题:".$title.$lastId. "\n";
  48. }
  49. }
  50. }
  51. }
  52. }
  53. ?>

2、getMsgExt.php获取文章阅读量和点赞量的程序
  1. ?
  2. $str = $_POST[ 'str'];
  3. $url = $_POST[ 'url']; //先获取到两个POST变量
  4. //先针对url参数进行操作
  5. parse_str(parse_url(htmlspecialchars_decode(urldecode($url)),PHP_URL_QUERY ),$query); //解析url地址
  6. $biz = $query[ '__biz']; //得到公众号的biz
  7. $sn = $query[ 'sn'];
  8. //再解析str变量
  9. $json = json_decode($str, true); //进行json_decode
  10. //$sql = "select * from `文章表` where `biz`='".$biz."' and `content_url` like '%".$sn."%'" limit 0,1;
  11. //根据biz和sn找到对应的文章
  12. $read_num = $json[ 'appmsgstat'][ 'read_num']; //阅读量
  13. $like_num = $json[ 'appmsgstat'][ 'like_num']; //点赞量
  14. //在这里同样根据sn在采集队列表中删除对应的文章,代表这篇文章可以移出采集队列了
  15. //$sql = "delete from `队列表` where `content_url` like '%".$sn."%'"
  16. //然后将阅读量和点赞量更新到文章表中。
  17. exit(json_encode($msg)); //可以显示在anyproxy的终端里
  18. ?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值