首页
关于
友人
留言
更多
壁纸
直播
视频
推荐
开往
图床
图标库
阿里图标库
Search
1
最新最全Markdown语法大全
12266 阅读
2
分享几个免费申请SSL证书的网站
2869 阅读
3
用JS判断用户来路域名,实现不同来路展现不同界面
1336 阅读
4
网友因cos痛哭流泪
926 阅读
5
发起一次网络攻击要花多少钱?
594 阅读
生活笔记
折腾笔记
代码笔记
Search
标签搜索
Typecho
PHP
A站
评论
头像
互赞宝
富豪刑警
JS
CDN
PHP代码
Pandownload
Vue
网站源码
轻量级
源码
Markdown
开往-Travelling
Redis
网络攻击
黑客攻击
白鸽
累计撰写
28
篇文章
累计收到
53
条评论
首页
栏目
生活笔记
折腾笔记
代码笔记
页面
关于
友人
留言
壁纸
直播
视频
推荐
开往
图床
图标库
阿里图标库
搜索到
14
篇与
代码笔记
的结果
2021-02-23
Object.defineProperty的使用
这个方法的主要用处是用来做数据劫持的,在vue2.x主要使用这个方法,在3.0中换成了proxy做数据劫持,数据劫持就是监听到数据的变化,然后可以做什么等/* 随便定义一个对象 */ let obj = { name: 'hello', age: 18, child: { sex: '女' } } observer(obj) function observer(obj) { /* 判断传入进来的是否是对象 */ if (obj.constructor === Object) { /* 循环对象 */ for (let key in obj) { /* 如果值不是对象,则做劫持 */ if (obj[key].constructor !== Object) { /* 定义一个临时变量,用于return出去 */ let _value = obj[key] Object.defineProperty(obj, key, { /* 设置属性可以被删除,可以被修改 */ configurable: true, /* 设置属性可以被遍历 */ enumerable: true, get() { console.log('触发读取') return _value }, set(newVal) { console.log('触发修改') _value = newVal } }) } else { /* 否则进行递归,再次判断 */ observer(obj[key]) } } } }
2021年02月23日
8 阅读
0 评论
1 点赞
2021-02-17
网站顶部的跑马灯特效代码
放置说明放在头部head里即可。代码<!-- 顶部跑马灯特效 --> <style> #top-grrk{ background:url(https://external-30160.picsz.qpic.cn/e94ff0137dfb6cc51925d4ccf61d2541); height:2px; position:fixed; width:100%; Z-index:10000; } </style> <div id="top-grrk"></div> <!-- 顶部跑马灯特效 -->
2021年02月17日
16 阅读
0 评论
0 点赞
2021-02-17
jQuery中Ajax事件及各参数含义
Ajax会触发很多事件。有两种事件,一种是局部事件,一种是全局事件:局部事件:通过$.ajax来调用并且分配。$.ajax({ beforeSend: function () { }, complete: function () { } });全局事件,可以用bind来绑定,用unbind来取消绑定。这个跟click/mousedown/keyup等事件类似。但他可以传递到每一个DOM元素上。$("#loading").bind("ajaxSend", function () { //使用bind $(this).show(); }).ajaxComplete(function () { //直接使用ajaxComplete $(this).hide(); });事件的顺序如下:ajaxStart 全局事件 开始新的Ajax请求,并且此时没有其他ajax请求正在进行。 beforeSend 局部事件 当一个Ajax请求开始时触发。如果需要,你可以在这里设置XHR对象。 ajaxSend 全局事件 请求开始前触发的全局事件 success 局部事件 请求成功时触发。即服务器没有返回错误,返回的数据也没有错误。 ajaxSuccess 全局事件 全局的请求成功 error 局部事件 仅当发生错误时触发。你无法同时执行success和error两个回调函数。 ajaxError 全局事件 全局的发生错误时触发 complete 局部事件 不管你请求成功还是失败,即便是同步请求,你都能在请求完成时触发这个事件。 ajaxComplete 全局事件 全局的请求完成时触发 ajaxStop 全局事件 当没有Ajax正在进行中的时候,触发。局部事件回调的参数在文档中写的很清楚了,这里就不累述了。全局事件中,除了ajaxStart和ajaxStop之外,其他的事件都有3个参数event, XMLHttpRequest, ajaxOptions第一个是事件,第二个是XHR对象,第三个参数最有用,是当时调用这个ajax的时候的参数。对于ajaxError,还有第四个参数thrownError,只有当异常发生时才会被传递。我们可以利用ajaxOptions来写一个全局的ajax事件。$("#msg").beforeSend(function (e, xhr, o) { $(this).html("正在请求" + o.url); }).ajaxSuccess(function (e, xhr, o) { $(this).html(o.url + "请求成功"); }).ajaxError(function (e, xhr, o) { $(this).html(o.url + "请求失败"); });对于这个例子,这样我们就可以很方便的全局地在某个地方显示当前的ajax状态。当然,之前说了,第三个参数实际上是传递给ajax的参数。get/post/load/getScript/getJSON等方法本质上都是调用ajax方法的,所以ajaxOptions.url属性总是有效的。还有更丰富的例子。如果你用ajax调用,还可以传递自定义参数。下面的例子我就自定义了一个msg参数给了ajax调用//自定义参数msg $.ajax({url: "test1.html", type: "get", msg: "页面一"}); $.ajax({url: "test2.html", type: "get", msg: "页面二"}); $.ajax({url: "test3.html", type: "get", msg: "页面三"}); $.ajax({url: "test4.html", type: "get", msg: "页面四"}); //这里就能获取到自定义参数msg。 //这可以用来区别对待不同的ajax请求。 $("#msg").beforeSend(function (e, xhr, o) { $(this).html("正在请求" + o.msg); }).ajaxSuccess(function (e, xhr, o) { $(this).html(o.msg + "请求成功"); }).ajaxError(function (e, xhr, o) { $(this).html(o.msg + "请求失败"); });最后对于load方法,还有话说。其他的简易ajax方法,比如get,post,getJSON等,他们的回调函数都是设置了success回调。而只有load设置的其实是complete回调。所以,load里设置的回调函数的参数应该有2个。XMLHttpRequest和textStatus但实际上也并非如此。load的回调有三个参数XMLHttpRequest.responseText, textStatus, XMLHttpRequest所以,你可以在load的回调里通过textStatus==”success”或者textStatus==”error”来判断是否调用成功。或者用XMLHttpRequest.status属性判断是200还是404或者其他的。这点上,我认为比普通的get/post等方法更先进。如果要单数设置每get的error是不可能的。但是设置一个全局的ajaxError其实也是不错的选择。API:http://api.jquery.com/Ajax_Events/
2021年02月17日
8 阅读
0 评论
0 点赞
2021-02-12
Typecho实现评论显示操作系统和评论来源
首先打开 functions.php 文件,粘贴下面的代码// 获取浏览器信息 function getBrowser($agent) { if (preg_match('/MSIE\s([^\s|;]+)/i', $agent, $regs)) { $outputer = 'Internet Explore'; } else if (preg_match('/FireFox\/([^\s]+)/i', $agent, $regs)) { $str1 = explode('Firefox/', $regs[0]); $FireFox_vern = explode('.', $str1[1]); $outputer = 'FireFox'; } else if (preg_match('/Maxthon([\d]*)\/([^\s]+)/i', $agent, $regs)) { $str1 = explode('Maxthon/', $agent); $Maxthon_vern = explode('.', $str1[1]); $outputer = 'MicroSoft Edge'; } else if (preg_match('#360([a-zA-Z0-9.]+)#i', $agent, $regs)) { $outputer = '360 Fast Browser'; } else if (preg_match('/Edge([\d]*)\/([^\s]+)/i', $agent, $regs)) { $str1 = explode('Edge/', $regs[0]); $Edge_vern = explode('.', $str1[1]); $outputer = 'MicroSoft Edge'; } else if (preg_match('/UC/i', $agent)) { $str1 = explode('rowser/', $agent); $UCBrowser_vern = explode('.', $str1[1]); $outputer = 'UC Browser'; } else if (preg_match('/QQ/i', $agent, $regs)||preg_match('/QQ Browser\/([^\s]+)/i', $agent, $regs)) { $str1 = explode('rowser/', $agent); $QQ_vern = explode('.', $str1[1]); $outputer = 'QQ Browser'; } else if (preg_match('/UBrowser/i', $agent, $regs)) { $str1 = explode('rowser/', $agent); $UCBrowser_vern = explode('.', $str1[1]); $outputer = 'UC Browser'; } else if (preg_match('/Opera[\s|\/]([^\s]+)/i', $agent, $regs)) { $outputer = 'Opera'; } else if (preg_match('/Chrome([\d]*)\/([^\s]+)/i', $agent, $regs)) { $str1 = explode('Chrome/', $agent); $chrome_vern = explode('.', $str1[1]); $outputer = 'Google Chrome'; } else if (preg_match('/safari\/([^\s]+)/i', $agent, $regs)) { $str1 = explode('Version/', $agent); $safari_vern = explode('.', $str1[1]); $outputer = 'Safari'; } else{ $outputer = 'Google Chrome'; } echo $outputer; } // 获取操作系统信息 function getOs($agent) { $os = false; if (preg_match('/win/i', $agent)) { if (preg_match('/nt 6.0/i', $agent)) { $os = 'Windows Vista · '; } else if (preg_match('/nt 6.1/i', $agent)) { $os = 'Windows 7 · '; } else if (preg_match('/nt 6.2/i', $agent)) { $os = 'Windows 8 · '; } else if(preg_match('/nt 6.3/i', $agent)) { $os = 'Windows 8.1 · '; } else if(preg_match('/nt 5.1/i', $agent)) { $os = 'Windows XP · '; } else if (preg_match('/nt 10.0/i', $agent)) { $os = 'Windows 10 · '; } else{ $os = 'Windows X64 · '; } } else if (preg_match('/android/i', $agent)) { if (preg_match('/android 9/i', $agent)) { $os = 'Android Pie · '; } else if (preg_match('/android 8/i', $agent)) { $os = 'Android Oreo · '; } else{ $os = 'Android · '; } } else if (preg_match('/ubuntu/i', $agent)) { $os = 'Ubuntu · '; } else if (preg_match('/linux/i', $agent)) { $os = 'Linux · '; } else if (preg_match('/iPhone/i', $agent)) { $os = 'iPhone · '; } else if (preg_match('/mac/i', $agent)) { $os = 'MacOS · '; }else if (preg_match('/fusion/i', $agent)) { $os = 'Android · '; } else { $os = 'Linux · '; } echo $os; }comments.php 中找到合适位置(比如评论作者的后面)添加以下代码<?php getOs($comments->agent); ?><?php getBrowser($comments->agent); ?>
2021年02月12日
10 阅读
0 评论
1 点赞
2021-02-08
ThinkPHP实现邮件发送功能
前言ThinkPHP 本身没有支持发送邮件功能,我们可以自己封装一个就行了,下面给我的实现方法分享一下。实现首先 ThinkPHP 是支持 Composer 的,我们直接安装 PHPMailer 即可composer require phpmailer/phpmailer接着在应用公共文件添加发送邮件的函数,说一下web_config这个是读取的全局中间价的网站配置,我懒得改了,大家自行修改一下就行。use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; /** * 系统邮件发送函数 * @param string $to 接收邮件者邮箱 * @param string $subject 邮件主题 * @param string $body 邮件内容 * @param bool $form_name 发件人昵称 * @param string $attachment 附件列表 * @return boolean */ function send_mail($to, $subject = '', $body = '', $form_name = false, $attachment = null) { $mail = new PHPMailer(true); $mail_config = Request::param('web_config'); //服务器配置 $mail->CharSet = "UTF-8"; $mail->SMTPDebug = 0; $mail->isSMTP(); $mail->Host = $mail_config['mail_stmp']; $mail->SMTPAuth = true; if ($mail_config['mail_ssl']) { $mail->SMTPSecure = 'ssl'; } else { $mail->SMTPAutoTLS = false; $mail->SMTPSecure = false; } $mail->Username = $mail_config['mail_name']; $mail->Password = $mail_config['mail_pwd']; $mail->Port = $mail_config['mail_port']; $mail->setFrom($mail_config['mail_name'], $form_name ? $form_name : $mail_config['mail_form']); $mail->addAddress($to, 'Joe'); $mail->addReplyTo($mail_config['mail_name'], $form_name ? $form_name : $mail_config['mail_form']); $mail->isHTML(true); $mail->Subject = $subject; $mail->Body = $body; if (is_array($attachment)) { foreach ($attachment as $file) { is_file($file) && $mail->AddAttachment($file); } } return $mail->Send() ? true : $mail->ErrorInfo; }使用send_mail('1090370813@qq.com', '标题', '内容', '白鸽大人');参数为收件人邮箱地址,邮件标题,邮件内容,发件人昵称(此处可不填写,但是要保证函数里面配置的有默认的发件人昵称)最后有问题可在下方评论,一起探讨。
2021年02月08日
10 阅读
0 评论
0 点赞
2020-04-20
Typecho安装Redis加速内容
引入当你知道了高速的好,你必定想追求速度的极致。opcache 扩展的脚本加速、对象存储图片、动静分离成绩已然无法满足部分站长对速度的极致要求,难道没有更极致的速度么?答案是是有。Redis,一个可以缓存网站内容的扩展,可以解决你国外服务器延迟的痛苦。ps:文章内的步骤为宝塔用户步骤,部分非宝塔面板的用户可以参考并更换为自己的步骤。步骤准备如果有使用的话,暂时关闭宝塔防篡改插件、暂时关闭宝塔加固插件或云锁等应用。进入 php 设置,选择安装扩展,并安装 redis 扩展。服务器在软件商店搜索并安装 Redis,确认 Redis 正常运行。然后在配置文件内配置好适合自己服务器的值。插件下载Tpcache插件,上传至/usr/plugins并解压,修改文件夹名为TpCachehttps://github.com/phpgao/TpCache进入后台插件设置,将端口号修改为6379缓存驱动选择Redis结束至此,步骤就都完成了,此时只需尝试刷新缓存,访问自己的网站,即可体验到加速的效果。温馨提示:Redis 一时爽,网站报错两行泪,遇到评论错误、访问错误,建议先关闭 Redis 插件,然后重新开启试试。Redis 有概率把错误缓存,导致某个目录所有未登录用户访问全部都错误,无法评论等问题。你也可以选择安装宝塔面板第三方插件 “redis 数据管理工具”,查找错误的 Redis,并删除。补充说明使用 Redis 加速后容易出现诸如 “错误被缓存、评论者信息被缓存、登录密码信息被缓存” 等问题,请谨慎使用。
2020年04月20日
389 阅读
0 评论
0 点赞
2020-04-17
PHP根据设备类型自动跳转相应页面
前言如果你的系统是用 PHP 写的,那么一下以下代码对你会很实用,可根据这些移动设备终端自动跳转到适合它们浏览的页面,也就是在电脑和手机访问站点智能判断并跳转。代码如下: <?php $agent = strtolower($_SERVER['HTTP_USER_AGENT']); $iphone = (strpos($agent, 'iphone')) ? true : false; $ipad = (strpos($agent, 'ipad')) ? true : false; $android = (strpos($agent, 'android')) ? true : false; if($iphone || $ipad){ echo "<script>window.location.href='https://blog.iswl.vip'</script>"; } if($android){ echo "<script>window.location.href='https://blog.iswl.vip'</script>"; }这里使用 PHP 中的内置函数 HTTP_USER_AGENT 获取客户端设备类型,再使用字符串处理函数对其提取,然后判断是什么设备,根据设备自动定位到适合的网页或页面发送给客户端。
2020年04月17日
255 阅读
0 评论
0 点赞
2020-04-17
Vue动态组件选项卡显示
前言Vue概念:Vue中提供有一个内置的组件叫做 component 。这个组件就是动态组件,它需要设置 is 属性。is 属性的值就是需要渲染的组件的名字1. 引入 vue 链接https://cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.js <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.js"><2. 创建组件(三个选项需要做三个小组件)。 Vue.component("home", { template: ` <div> <h1>home</h1> </div> `, }); Vue.component("list", { template: ` <div> <h1>list</h1> </div> `, }); Vue.component("about", { template: ` <div> <h1>about</h1> </div> `, });3. 创建实例 var vm = new Vue({ //实例的id:app el: "#app", //data的数据是为了模拟一个选中时用的数据 data: { curPage: "home", }, });4. 调用组件与插件 <div id="app"> //这里的css是一个高亮的样式用了v-bind做了绑定与判断 //@click自定义事件触发curPage赋值为home将根里的data的数据修改为home <button :class="{ active: curPage === 'home' }" @click="curPage = 'home'"> home </button> <button :class="{ active: curPage === 'list' }" @click="curPage = 'list'"> list </button> <button :class="{ active: curPage === 'about' }" @click="curPage = 'about'" > about </button> <hr /> //<component is="组件名" ></component> //is 属性的值就是需要渲染的组件的名字用v-bind绑定 <component :is="curPage"></component> </div>
2020年04月17日
201 阅读
0 评论
0 点赞
2020-04-17
最新最全Markdown语法大全
Markdown 基础语法标题支持 6 种大小的标题,分别对应#,##,###,####,#####,######,和样式文件中的 h1,...,h6如:#####H5 ######H6强调**我是强调**斜体试试**斜体*强调的斜体试试***强调的斜体***删除试试 ~~删除~~外链的超链接Markdown对链接的语法为:[](),如:[我是外链的超链接](http://www.baidu.com)页内的超链接页内的超链接语法类似外链,只是要在页内增加锚点如:[我是页内的超链接](#jump_1)注:你先要在要跳转的到地方放置一个类似:<a id="jump_1">任意内容</a> 的锚点。由 id="jump_1" 来匹配。图片显示Markdown 对图片链接的语法是:![](),如:![图注:iSwl's Blog] (https://secure.gravatar.com/avatar/63202432f983f6b43893861c8694ca7a?s=500&r=X&d=#vwid=500&vhei=500)注:可直接把网络图片地址添加到 markdown 中,默认为图片居中,[这里写图片描述] 中对图片的描述内容会自动生成在图片的底部。有序列表有序列表 1有序列表 2有序列表 3无序列表无序列表 1无序列表 2无序列表 3引用块只需要在前面加 >,如下:就是这样1234567890分割线如下:----------行内代码Markdown 对行内代码的语法是前后用:,其中 为 Windows 键盘左上角那个,如:AppCompatActivity 类`AppCompatActivity`代码块Markdown 对代码块的语法是开始和结束行都要添加:`, 其中 ` 为 windows 键盘左上角那个如下: @ApiOperation("垂深对应值数据中转任务") @ApiImplicitParams(@ApiImplicitParam(name = "wellState", required = true, value = "井状态", paramType = "query")) @GetMapping(value = "verticalDepthTask") public void verticalDepthTask(String wellState) { List<String> jhList = complexBusinessService.getWellNumListByCondition(wellState); if (null != jhList && jhList.size() > 0) { for (String jh : jhList) { List<Logging> loggingByWellNum = loggingService.getLoggingByWellNum(jh); if (null != loggingByWellNum && loggingByWellNum.size() > 0) { loggingService.deleteLoggingByWellNum(jh, 3); for (Logging logging : loggingByWellNum) { verticalDepthService.deleteVerticalDepthByLoggingId(logging.getLoggingId()); } } } complexBusinessService.insertVerticalDepth(jhList); } }要精确指定语言(如:java,cpp,css,xml,javascript,python,php,go,kotlin,lua,objectivec 等等)时,在头部直接指定,如:`javascriptMarkdown 扩展语法表格如下:| 表头 | 表头 | | ---- | ---- | | 单元格 | 单元格 | | 单元格 | 单元格 |表头表头单元格单元格单元格单元格对齐方式我们可以设置表格的对齐方式:-: 设置内容和标题栏居右对齐。:- 设置内容和标题栏居左对齐。:-: 设置内容和标题栏居中对齐。如下:| 左对齐 | 右对齐 | 居中对齐 | | :-----| ----: | :----: | | 单元格 | 单元格 | 单元格 | | 单元格 | 单元格 | 单元格 |左对齐右对齐居中对齐单元格单元格单元格单元格单元格单元格注:表格在公众号预览时,可能在 PC 端显示的不是正确的全屏,但在手机上预览时就会正常显示为全屏的了。任务列表如:{x} 任务1,已完成; {x} 任务2,已完成; { } 任务3,未完成;{x} 任务1,已完成;{x} 任务2,已完成;{ } 任务3,未完成;注脚我是注脚 [^10]。点点就能知到我跳到了那儿。或跳到放置:<a id="footnote-10">任意内容</a> 的地方,[^10] 对应 id="footnote-10"TOC看内容目录就是用 [toc] 生成的注:只要放置:[TOC], 就能把其后面的标题如:#,##,...######自动生成目录树,注意,[TOC] 要独立一行,并前面和后面都要空一行。直接支持 html,css如果你懂 html 和 css,那下面这些效果就不在话下了:来个页内跳转,跳转到文未的:<a id="jump_1">我是页内跳转到的位置</a> , 对应:id="jump_1"
2020年04月17日
12,266 阅读
9 评论
2 点赞
2020-04-17
用JS判断用户来路域名,实现不同来路展现不同界面
绑定了多个域名,默认情况下访问这些域名的时候是指向网站的首页,也就是访问不同域名时看到的页面是一样的,一般情况下,我们可以用子站绑定域名的方法来实现,访问不同的域名进入不同的子站,但我们用JS判断的方式亦可实现,这个用处很大,比如你有一个灰产网站,想用国内的主机或服务器,但容易掉北岸,或你域名被QQ或wx拦截了,想混一混申诉过去那么下面这段代码或许能用上:代码放在<head></head>里 <script type="text/javascript"> host = window.location.host; if (host=="www.abc.com" || host=="abc.com" ) { window.location.href='www.cba.com'; } if (host=="来路域名" || host=="来路域名") { window.location.href='你想展现给用户的网址或目录'; } </script>你可以看到,当来路域名为www.abc.com和abc.com时,用户直接跳转到了www.cba.comwww.cba.com亦可替换成你网站的一个子目录,不过这个有一个BUG就是当你访问时会先加载出你网站的标题,如果你网站的响应速度很快,那么你可以忽视
2020年04月17日
1,336 阅读
0 评论
0 点赞
2020-04-15
轻量级在线疫情实时动态源码
打开阿里云接口申请地址免费申请,申请好后然后复制AppCode到api.php文件的AppCode里填写即可使用。
2020年04月15日
419 阅读
1 评论
0 点赞
2020-04-15
PHP实现QQ扫码登入,非开放平台
原理就是生成二维码后,前端设置定时器查看二维码状态,因为没有openid只能保存固定的值,那就是qq号了<!--more--> // 生成二维码 public function getqrpic() { $url = 'https://ssl.ptlogin2.qq.com/ptqrshow?appid=1006102&e=2&l=M&s=4&d=72&v=4&t=0.5409099' . time() . 'daid=1&pt_3rd_aid=0'; $arr = $this->get_curl($url, 0, 0, 0, 1, 0, 0, 1); preg_match('/qrsig=(.*?);/', $arr['header'], $match); if ($qrsig = $match[1]) { Json::msg(0, 'success', ['qrsig' => $qrsig, 'data' => base64_encode($arr['body'])]); } else { Json::msg(1, '二维码获取失败'); } } // 获取二维码状态 public function qqlogin() { error_reporting(0); if (input('?get.qrsig')) { $qrsig = input('get.qrsig'); } else { Json::msg(400, 'qrsig不能为空'); } $sig = ''; $url = 'https://ssl.ptlogin2.qq.com/ptqrlogin?u1=https%3A%2F%2Fid.qq.com%2Findex.html&ptqrtoken=' . $this->getqrtoken($qrsig) . '&ptredirect=1&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=0-0-' . time() . '0000&js_ver=10291&js_type=1&login_sig=' . $sig . '&pt_uistyle=40&aid=1006102&daid=1&'; $ret = $this->get_curl($url, 0, $url, 'qrsig=' . $qrsig . '; ', 1); preg_match("/ptuiCB\('(.*?)'\)/", $ret, $ts_arr); $r = @explode("','", str_replace("', '", "','", $ts_arr[1])); if ($r[0] == 65) { Json::msg(205, '二维码已失效'); } elseif ($r[0] == 66) { Json::msg(202, '二维码未失效'); } elseif ($r[0] == 67) { Json::msg(204, '正在验证二维码'); } else { if (strpos($ret, '403')) Json::msg(306, $ret); } if (strlen($ret) > 1000) { $arr = explode(';', $ret); $data = substr($arr[17], strpos($arr[17], '=o') + 2, strlen($arr[17])); if (empty($data)) { Json::msg(400, '请切换二维码' . $ret); } $qq = ltrim($data, '0'); // $qq是qq号,下面写你接下来需要处理的语句 } } private function get_curl($url, $post = 0, $referer = 0, $cookie = 0, $header = 0, $ua = 0, $nobaody = 0, $split = 0) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); $httpheader[] = "Accept:*/*"; $httpheader[] = "Accept-Encoding:gzip,deflate,sdch"; $httpheader[] = "Accept-Language:zh-CN,zh;q=0.8"; $httpheader[] = "Connection:close"; curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader); if ($post) { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); } if ($header) { curl_setopt($ch, CURLOPT_HEADER, TRUE); } if ($cookie) { curl_setopt($ch, CURLOPT_COOKIE, $cookie); } if ($referer) { curl_setopt($ch, CURLOPT_REFERER, $referer); } if ($ua) { curl_setopt($ch, CURLOPT_USERAGENT, $ua); } else { curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36'); } if ($nobaody) { curl_setopt($ch, CURLOPT_NOBODY, 1); } curl_setopt($ch, CURLOPT_ENCODING, "gzip"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $ret = curl_exec($ch); if ($split) { $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $header = substr($ret, 0, $headerSize); $body = substr($ret, $headerSize); $ret = array(); $ret['header'] = $header; $ret['body'] = $body; } curl_close($ch); return $ret; } - 前端js getqrpic(); function getqrpic() { var getvcurl = "qlogin/getqrpic/r/" + Math.random(1); $.get(getvcurl, function (res) { console.log(res.info.qrsig) if (res.status == 0) { $('#qrimg').attr('qrsig', res.info.qrsig); $('#qrimg').html('<img onclick="getqrpic()" src="data:image/png;base64,' + res.info.data + '" title="点击刷新">'); } else { //alert(res.msg); } }, 'json'); } $(document).ready(function(){ interval1=setInterval(getMsg,2000); }); function getMsg() { var qrsig=$('#qrimg').attr('qrsig'); var getvcurl = "qlogin/qqlogin/qrsig/" + decodeURIComponent(qrsig) + '/r/' + Math.random(1); $.get(getvcurl, function (res) { if (res.status == 200) { // 这里写登入过后你执行的语句 } else if (res.status == 205 || res.status == 306) { getqrpic(); } else { } }, 'json'); }
2020年04月15日
257 阅读
0 评论
0 点赞
1
2