php 抓取网页生成图片( 微信开发文档_新手接入获取数据包并返回这部分微信也)

优采云 发布时间: 2022-03-26 09:10

  php 抓取网页生成图片(

微信开发文档_新手接入获取数据包并返回这部分微信也)

  

  微信公众平台

  新手访问

  申请公众号后,如果需要开启开发模式,需要进行接口验证。这部分内容收录在微信开发文档中,并附上示例。我们需要做的是拥有自己的服务器。当微信服务器发送数据包后,会进行处理,返回正确的数据包。相关代码由微信提供,只要放在服务器目录下即可调用。

  微信开发文档_新手接入

  获取数据包并返回

  微信这部分也提供了例子。在wechatCallbackapiTest类中,有一个公共成员函数responseMsg(),相当于一个简单的HelloWorld例子。原创示例中未调用此函数。我们可以看这里的代码,这是一个接收消息,解析,自动回复的基本功能。

  这个功能我加了中文注释,方便大家理解。

  public function responseMsg()

{

//根据不同的服务器环境,这里需要获取POST来的数据

$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

//解析数据

if (!empty($postStr)){

//按照XML文件的格式解析

$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

$fromUsername = $postObj->FromUserName;

$toUsername = $postObj->ToUserName;

$keyword = trim($postObj->Content);//trim函数负责去除前后的空格

$time = time();

$textTpl = "

%s

";//制作返回数据包XML文件

if(!empty( $keyword ))

{

$msgType = "text";//返回的数据类型,这里是text文本信息

$contentStr = "Welcome to wechat world!";//返回数据的内容,默认是Welcome to wechat world!

//注意这里格式化写入,$fromUsername对应在XML文件里的位置在ToUserName,

//因为我们要返回信息,所以接受到的数据包里的"收件人"就成了"发件人"

$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);

echo $resultStr;//返回数据包

}else{

//如果收到的数据为空,则返回对应信息

echo "Input something...";

}

}else {

echo "";//如果无法获取到POST数据包,则返回对应信息

exit;

}

}

  有了这段代码,我们只需要修改我们需要的自定义部分就可以顺利返回数据了。注意这里建议填写错误信息。考虑到尽可能多的错误条件,并回显相应的信息,以后检查错误会非常方便。

  官方例子中的这个类不好用。让我们自己写一个。在写之前,我们简单地思考了一下。大致结构如下:

  class wechat

{

public function distribute();//判断收到的信息是哪些

public function text($postObj);//文本消息

public function location($postObj)//地理位置消息

}

  如果以后需要扩展新的回复内容,可以在分发功能中增加新的判断项,增加新的处理功能,有效处理新的内容。

  Distribute()是入口函数,负责解析接收到的信息,找到其中的MsgType,判断接收到的信息类型,并传递给相应的处理函数。如果无法获取数据,则返回相应的错误值。

  代码显示如下:

  public function distribute()//判断收到的信息是哪些

{

$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

//extract post data

if (!empty($postStr))

{

$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

$msgType = $postObj->MsgType;

switch ($msgType) //分发

{

case "text":

$this->text($postObj);

break;

case "location":

$this->location($postObj);

default:

echo "未知的消息类别";

break;

}

}

else//无法得到返回值

{

echo "无法得到返回值";

}

}

  text() 是负责处理文本的函数,是本次开发的重点。正文结构参考官方微信示例,在里面定制,包括自动回复具体信息。“blog”时,会自动返回博客信息,如果收到其他信息,则返回一般的自动回复信息。

  代码显示如下:

  public function text($postObj)//文本消息

{

$content = trim($postObj->Content);

switch ($content)

{

case "博客":

$info = new fetch();

$result = $info->get();

$contentStr = "我的博客\n《Coder成长之路》\n目前信息:\n";

$contentStr .=$result[0]."\n";//访问

$contentStr .=$result[1]."\n";//积分

$contentStr .=$result[2]."\n";//排名

$contentStr .=$result[3]."\n";//原创

$contentStr .=$result[4]."\n";//转载

$contentStr .=$result[5]."\n";//译文

$contentStr .=$result[6]."\n";//评论

$contentStr .= "欢迎访问我的博客\n http://t.cn/8kvGx7T \n";

break;

default:

$contentStr = "欢迎使用我的公众号,目前只有 1 个功能\n其余功能正在开发当中,请谅解。\n1. 回复“博客”可以获得我的博客的实时信息。";

break;

}

$fromUsername = $postObj->FromUserName;

$toUsername = $postObj->ToUserName;

$keyword = $content;

$time = time();

$textTpl = "

%s

";

if(!empty( $keyword ))

{

$msgType = "text";

$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);

echo $resultStr;

}

else

{

echo "无法获取输入的信息";

}

}

  主要内容与上例相同。有问题可以看之前有中文注释的代码。如果还有问题,可以在下方评论。

  地理位置信息还没做,暂时还没有想法。本来想回本地地图的,但是笨蛋微信公众平台不支持订阅号发图,只有服务号可以……坑……

  也许你可以返回周围的餐厅信息..

  PHP抓取网页

  SAE 的类别

  对于网页抓取,SAE提供了一个类供我们调用,虽然也支持curl,但是原文是这么说的……来体验一下吧……

  

  为了少收费。。我还是乖乖的用它的课。其实很简单,像这样

  $page = new SaeFetchurl();

$content = $page->fetch(“http://blog.csdn.net/yuri_4_vera");

  这样就可以抓取整个网页了。如果此时回显$content,就会看到整个HTML代码以文本的形式输出。

  正则表达式

  抓取网页很容易。难的是如何挑选出浏览量和评论数。我关心的部分在这里:

  

访问:508次

积分:72分

排名:千里之外

原创:7篇

转载:0篇

译文:0篇

评论:0条

  我的第一个念头是字符串匹配……实在想不出简单的方法,所以想用之前用Python写的正则表达式,但是好像两个函数支持的不一样,总有一些符号是不对,PHP的函数会报错。后来在网上查了很多资料,都很难找到适合自己需要的。我想以标签结尾,中间的所有标签都不需要,只要里面的文字。

  最后,我真的别无选择。我找到了一些例子并尝试了它。我用了三个例子,改了一下,这样就实现了选择:

  1.查找与标签匹配的所有元素

  2.删除“”(包括)

  3.去掉“/”

  代码变得稍微复杂了.. 使用了 3 次正则表达式,一次搜索和两次替换

  class fetch

{

public function get()

{

$page = new SaeFetchurl();//SAE的抓取网页类

$content = $page->fetch("http://blog.csdn.net/yuri_4_vera");

if($page->errno() == 0)

{

$regex = ‘/(.*?)/si’;//第一次匹配的正则表达式,找出所有和内的部分

if(preg_match_all($regex, $content,$result,PREG_PATTERN_ORDER))

{

for ( $i = 0; $i < 7; $i ++ )//对于每个部分分别进行操作

{

$result[1][$i] = preg_replace("","", $result[1][$i]);//去除部分

$result[1][$i] = preg_replace("","", $result[1][$i]);//去除”/”

}

return $result[1];

}

}

else

echo $page->errmsg();

}

}

  反射

  好久没学好正则表达式了……还是无法有效的挑出需要的片段,去掉不需要的部分

  这次使用的是SVN工具,上传代码非常方便。

  订阅号真可怜。。只能发短信,好吧。。。谁能借我个服务号试试?即使你每个月只能推一个...我承认..

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线