微信公众平台模拟登录之验证码获取
这个时候平台首页的登录逻辑就会经常出现无法登录的状态,前几天写了一个抓取验证码要求用户输入,这个么有做多少代码的调整,主要是
让前端写了一写js直接调用微信公众平台的验证码连接了,发现不行,两个方面:
1、imgcode这个表单名打错了
2、在抓包的时候突然发现获取验证码的连接有设置cookie的
发现问题后这些都不是什么大事了,码码代码松松解决:
public function getImgCode($username){
$str = $this -> getcurl()-> get("https://mp.weixin.qq.com/cgi-bin/verifycode?username=".$username."&r=".time())->execute();
header('Content-Type:image/jpeg');
echo $str;
}
先用curl来请求验证码,顺便将cookie保存下来,当然这里我对curl进行了简单的封装,然后直接将输出抓取到内容,输出header头
PS:这里遇到一个问题,其实也不算什么问题,可能会经常注意不到,在测试的时候发现有一个warning错误,提示头已经发送。我就很郁闷了
直接在代码中输出呢,为什么会出现这个呢。文件也是utf-8无bom头的格式,往下一拉才发现当前这个类库中有写 ?> 这个东西,后边正好有一个空行。
其实把重点不在这里,因为就算这个文件的末尾有空行也不会提示头已经发送啊。直接分析到curl类文件中,OK,果然这个文件中又写了 ?> shit!!!
原文来自:http://www.mapenggang.com/
json_encode处理中文会有几种情况一种是null空,一种是u80e5这种符号,还有一种就是正常的中文了,下面一聚教程小编就来给你把这些问题一种整理一篇。
json_encode这个函数作用是起到不同语言之间数据传递的作用,尤其是php对js之间数据交换十分方便。
但是json_encode这个函数在使用的时候需要注意几点:
1 所传输的数据必须是UTF8格式的
2 需要对中文做一些URLENCODE处理
json_encode中文为null解决
原因分析:使用json_encode函数应应使用utf-8编码,我的页面用的是gbk.
解决:在json_encode函数前使用iconv('gbk','utf8')函数。
代码如下 | 复制代码 |
function gbk2utf8($data){ |
这样显示出来的会是如{"item1":1,"item2":"u4e2du6587"} 格式了,虽然空解决了,但是没显示汉字呀。
我们再来分析一下
例如:'胥'经过json_encode处理后变为'u80e5',最终的json中中文部分被替换为unicode编码。我们要解决的就是将对象转换为json并保证对象内部的中文在json中仍然是以正常的中文出现,现在看来只使用json_encode是不能达到目的的。www.111cn.net
我的解决方法:先将类中的中文字段进行url编码(urlencode),然后再对对象进行json编码(jsonencode),最后url解码(urldecode)json,即最终的json,里面的中文依旧是那个中文!
代码如下 | 复制代码 |
<?php 查看输出结果为: {“name”:”中文字符串”,”value”:”test”} |
到此,成功地输出了中文字符。随意使用json_encode吧。这样子在PHP后台输出的JSON字符串在前台javascript中Ajax接收后eval出来也不会出现中文乱码,因为js在处理JSON格式数据是也是以UTF8的形式进行的,与PHP类似,故接收PHP页面的JSON字符串不会出现问题。
下面是对json_encode这个函数做一些完善
代码如下 | 复制代码 |
<?php |
近日用PHP处理约7k条网络数据,现有网络情况下,耗时通常一秒一条,跑完整个程序大约近两个小时。
由于跑一次数据的时间太长,因此计划通过多个线程实现并行处理,我们可以通过pthreads扩展来实现真正的多线程,而不是常见的fsockopen来“模拟”。pthreads的官网介绍在这里:http://pthreads.org/
需要注意的是,如果尝试用数组在线程间交换数据,你会失望的,因为php的数组本身不是线程安全的,正确的做法是继承Stackable类。一个简单的demo如下所示:
代码如下 | 复制代码 |
<?php class my extends Thread { public function run(){ $this->synchronized(function($thread){ $storage = new storage(); $my->synchronized(function($thread){ var_dump($storage); |
上例如果$storage是array,那么dump出来的将是null。
启用多线程后,跑一次数据的时间可以压缩到1000秒内,不到二十分钟,已经在我的接受范围内了
最后发现一个自动加载BUG
线程的run方法可以继承主线程的常量,函数定义。ini_set()和自动加载不能继承。
具体什么能继承什么不能继承没找到相关文档,只能自己摸索。
继承过来的函数中只能进行一些基本操作,如果试图new一个对象(比如PDO)然后返回这个对象就会导致进程意外终止。
就目前来说基本不能用于生产环境。
微信的api现在己经强大到可以随意调用我们网站或指定数据库的内容进行自能回复现推送消息了,现在我来给大家介绍一个我微信开的笔记。
山猫的博客,发送1,2,3,7测试相应的消息。菜单模式需要升级为服务号,或者订阅人数超过500以上。
1.用户发送的消息都是通过你提交的开发者 URL来接收。这里订阅号就可以搞定。
发送过来的都是xml格式数据,需要解析:
代码如下 | 复制代码 |
$data = $GLOBALS["HTTP_RAW_POST_DATA"]; |
回复也是需要返回XML的数据格式。
2.主动发送给用户消息,查询用户信息,创建自定义菜单(现在订阅号也可以用),以及一些高级功能,都是需要获取appid 和 AppSecret 以便得到 access_token
access_token 这东西,除接收信息,每个接口都要用到。access_token 的时间为 7200毫秒
过期需要重新获取。
更多请参考:http://mp.weixin.qq.com/wiki/index.php?title=%E9%A6%96%E9%A1%B5 额
目前我已经实现了,接收消息,自动判断回复相应消息(新闻),创建自定义菜单,点击自定义菜单后执行相应操作。用户列表之类。感觉目前开发模式和订阅模式没什么区别。。。
这里有一个测试回复的测试例子
代码如下 | 复制代码 |
<?php //define your token class wechatCallbackapiTest //valid signature , option public function responseMsg() //extract post data }else { ?> |
PHP 5.3 以上版本,使用pthreads PHP扩展,可以使PHP真正地支持多线程。多线程在处理重复性的循环任务,能够大大缩短程序执行时间。
PHP扩展下载:https://github.com/krakjoe/pthreads
PHP手册文档:http://php.net/manual/zh/book.pthreads.php
1、扩展的编译安装(Linux),编辑参数 --enable-maintainer-zts 是必选项:
cd /Data/tgz/php-5.3.8
./configure --prefix=/Data/apps/php --with-config-file-path=/Data/apps/php/etc --with-mysql=/Data/apps/mysql --with-mysqli=/Data/apps/mysql/bin/mysql_config --with-iconv-dir --with-freetype-dir=/Data/apps/libs --with-jpeg-dir=/Data/apps/libs --with-png-dir=/Data/apps/libs --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt=/Data/apps/libs --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-opcache --with-pdo-mysql --enable-maintainer-zts
make clean
make
make install
unzip pthreads-master.zip
cd pthreads-master
/Data/apps/php/bin/phpize
./configure --with-php-config=/Data/apps/php/bin/php-config
make
make install
添加扩展:
vi /Data/apps/php/etc/php.ini
extension = "pthreads.so"
一段PHP多线程、与For循环,抓取百度搜索页面的PHP代码示例:
代码如下 | 复制代码 |
<?php class test_thread_run extends Thread { public $url; public $data; public function __construct($url) { $this->url = $url; } public function run() { if(($url = $this->url)) { $this->data = model_http_curl_get($url); } } } function model_thread_result_get($urls_array) { foreach ($urls_array as $key => $value) { $thread_array[$key] = new test_thread_run($value["url"]); $thread_array[$key]->start(); } foreach ($thread_array as $thread_array_key => $thread_array_value) { while($thread_array[$thread_array_key]->isRunning()) { usleep(10); } if($thread_array[$thread_array_key]->join()) { $variable_data[$thread_array_key] = $thread_array[$thread_array_key]->data; } } return $variable_data; } function model_http_curl_get($url,$userAgent="") { $userAgent = $userAgent ? $userAgent : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)'; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_TIMEOUT, 5); curl_setopt($curl, CURLOPT_USERAGENT, $userAgent); $result = curl_exec($curl); curl_close($curl); return $result; } for ($i=0; $i < 100; $i++) { $urls_array[] = array("name" => "baidu", "url" => "http://www.baidu.com/s?wd=".mt_rand(10000,20000)); } $t = microtime(true); $result = model_thread_result_get($urls_array); $e = microtime(true); echo "多线程:".($e-$t)."n"; $t = microtime(true); foreach ($urls_array as $key => $value) { $result_new[$key] = model_http_curl_get($value["url"]); } $e = microtime(true); echo "For循环:".($e-$t)."n"; ?> |
例子,采集数据
代码如下 | 复制代码 |
<?php $save_to='/test.txt'; // 把抓取的代码写入该文件 $mh = curl_multi_init(); do { foreach ($urls as $i => $url) { foreach ($urls as $i => $url) { curl_multi_close($mh); |
相关文章
- 本文章完美的利用了php的curl功能实现模拟登录discuz以及模拟发帖,本教程供参考学习哦。 代码如下 复制代码 <?php $discuz_url = ‘ht...2016-11-25
- 微信公众平台实现微信网页登陆授权开发其实是非常的简单了,因为官方的参考程序了,下面小编就看了一站长根据官方参考做的一个网页登陆授权例子,大家可看看。 文件1:in...2016-11-25
- 这篇文章主要介绍了PHP Curl模拟登录微信公众平台、新浪微博实例代码的相关资料,涉及到php curl模拟登录相关知识,需要的朋友可以参考下...2016-02-01
- 微信公众平开发时碰到回复中文乱码了,这个问题小编发现是编码问题,其实只要把编码转成utf8就可以解决了,具体来看看。 很多微信公众平台的自动回复程序都是 ThinkWec...2016-11-25
- 自定义菜单可以在后台设置但如果你使用了开发者之后那么后台的自定义菜单功能就失效了,必须通过程序来创建了,下面一起来看一个简单的通过php创建自定义菜单的例子。...2016-11-25
- 微信公众平台服务号可申请自定义菜单了,其它的号暂时不支持自定义菜单了,这个不但可以使用api来操作,还可以直接在后台定义菜单与参数哦。 申请自定义菜单 服务号可...2016-11-25
- 几乎所有的程序员来模仿用户登录或抓取数据都会使用到curl函数,下面我来给各位介绍利用curl函数实现登录并抓取数据,希望下面例子对各位有帮助。 PHP的curl()在抓取...2016-11-25
- 这篇文章主要介绍了Scrapy实现模拟登录的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-21
- 在本篇文章里小编给大家整理的是一篇关于python scrapy简单模拟登录的代码分析,有兴趣的朋友们可以学习参考下。...2021-07-19
- 微信公众平台开发我们现在做得比较多了,下面给各位介绍的是一个入门级别的微信公众平台验证基础知识了,有兴趣的和小编来看看。 开发微信的时候 需要验证一下 。...2016-11-25
- 最近在模拟登录的时候愈发的出现登录失败的情况,原因是:微信公众平台登录如果时不时的会对一些异常帐号要求输入验证码才可以登录 这个时候平台首页的登录逻辑就会...2016-11-25
- 要对微信公众平台进行开发,首先需要成为开发者,可以到https://mp.weixin.qq.com/注册一个帐号,然后按要求填写相关信息即可。 有了公众号后,在公众平台的高级功能里选...2016-11-25
- 微信公众平台服务号开放了自定义菜单API,本案例介绍C#开发微信公众号自定义菜单功能。在此基础上可以开发更完善的自定义菜单管理功能...2020-06-25
- 其实这种发送邮件是非常的简单了我们只要接受由用户提交过来的邮箱地址然后再由php的邮件控制进行邮件发送了,下面看一个综合开发例子。 首先yyuc框架是支持发送em...2016-11-25
- 微信公众平台现在有许多的api接口了我们可以利用微信公众平台来实现许多的一些功能,下面来看一个php版本的微信公众平台开发实例。 最近在做微信公众平台开发,一口...2016-11-25
- 用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的URL。方便开发者给用户下发欢迎消息或者做帐号的解绑 下面是一个微信公众平台关注和取消关注的...2016-11-25
- 模拟登录在php中使用curl来进行了我们可以使用模拟登录像用户一样的登录发布数据及获得数据了,下面来看一个php 模拟登录网站并获取用户信息示例,具体如下。 前言...2016-11-25
- 下面我们一起来看看关于微信公众平台网页获取用户OpenID方法,有需要了解的朋友可以一起来看看吧. 用户点击微信自定义菜单view类型按钮后,微信客户端将会打开开发者...2016-11-25
- 在微信公众平台中,有一个接收普通消息的接口,关注公众号之后,每回复一条信息,都会post到开发中心填写的地址上面去。 接收普通消息在官方开发文档中截图如下: 上面的...2016-05-19
- 本文章来给各位同学介绍一下关于微信公众平台之CURL应用实例,如果你碰到此类问题不防进入参考一下吧。 这几天工作有大量用curl,curl就是模拟浏览器来传输数据,他支...2016-11-25