首页
时事
归档
壁纸
更多
留言
关于
邻里
Search
1
使用必应Bing每日图片做网站背景(自动)
2,810 阅读
2
vue的输入值校验规则整理
1,443 阅读
3
好站推荐-https://wangchujiang.com/linux-command/
1,391 阅读
4
微信支付开发前准备(小程序、公众号、App、H5)
1,391 阅读
5
VUE `ERR_CONNECTION_TIMED_OUT`的解决办法
1,321 阅读
文章
图说
代码
吐槽
登录
Search
标签搜索
Linux
laravel
windows
TYPO3
php
shell脚本
git
微信
好站
vue
第三方登录
centos
linxu
centos7
thinkPHP
微信支付
api
MySQL
桌面
必应首图
Beer
累计撰写
114
篇文章
累计收到
21
条评论
首页
栏目
文章
图说
代码
吐槽
页面
时事
归档
壁纸
留言
关于
邻里
搜索到
90
篇与
文章
的结果
2019-02-27
解决UEDITOR自动将DIV标签换成P标签的问题
前言在项目中使用UEditor时,发现编辑器会自动将HTML代码中的<div>标签替换为<p>标签,本来的样式都没了,可以说是贼鸡儿烦了,几经周折,终于找到了修改办法解决办法:在ueditor.all.js文件或ueditor.all.min.js内搜索allowDivTransToP,找到如下的代码,将true设置为falseme.setOpt({ //'allowDivTransToP':true, 'allowDivTransToP':false, 'disabledTableInTable':true });注:在ueditor.config.js文件内搜索一下allowDivTransToP,如果找到如下的代码,将注释去掉并且改为false//,allowDivTransToP:true //允许进入编辑器的div标签自动变成p标签 ,allowDivTransToP:false //允许进入编辑器的div标签自动变成p标签完成这样就把UEditor的<div>自动替换为<p>标签问题修改完成了,刷新js加载就能看到效果了
2019年02月27日
650 阅读
0 评论
0 点赞
2019-02-27
web网站接入GitHub第三方登录(踩坑)
web网站接入GitHub第三方登录(踩坑)博客已近上线了几个月了,但是一直没有做用户登录,这两天想了下,干脆直接用第三方登录吧,最终决定用QQ,Gitee,GitHub三种方式登录,下面是我的踩坑纪录和实现源码,分享出来官方文档地址https://developer.github.com/apps/building-oauth-apps/authorizing-oauth-apps/创建应用,获取Client ID,Client Secret,Authorization callback URL进入后,找到左侧 Developer settings填写你的应用信息,保存即可保存后,纪录下面的两个值和你填写的回调地址更新有朋友在使用下面代码的时候说报错了,然后我才发现我的文章内容没有写完整 [aru_85] ,惭愧,特在此表示歉意并且更新下本篇文章内容,保证尽量少的出现问题2018-10-18日更新在使用下面代码的时候,请先执行以下命令(对Windows无爱,仅Linux),#安装第三方类库 composer require sy-records/oauth-login安装完成后在控制器中引用use Auth\GithubConnect;编写代码,获取数据1. 入口重定向接口:https://github.com/login/oauth/authorize?client_id=yourclientid&redirect_uri=yourredirect_uri<a href="https://github.com/login/oauth/authorize?client_id=yourclientid&redirect_uri=yourredirect_uri">github登录</a>重定向至下面页面2. 根据code获取access_token回调页面中处理获取access_token接口:https://github.com/login/oauth/access_token// 用户登录 if (isset($_GET['code'])) { $access_token_url = 'https://github.com/login/oauth/access_token'; $params = array( 'client_id' => self::GITHUB_CLIENT_ID, 'client_secret' => self::GITHUB_CLIENT_SECRET, 'code' => $_GET['code'], ); $access_token = getHttpResponsePOST($access_token_url, $params); }取到的access_token数据格式是stringaccess_token=e72e16c7e42f292c6912e7710c838347ae178b4a&token_type=bearer3. 根据access_token获取用户信息获取用户信息接口:https://api.github.com/user在这我用的是curl进行http请求,if ($access_token) { $info_url = 'https://api.github.com/user?'.$access_token; $data = array(); parse_str($access_token,$data); $token = $data['access_token']; $url = "https://api.github.com/user?access_token=".$token; $headers[] = 'Authorization: token '.$token; $headers[] = "User-Agent: 木木彡博客"; $result = getHttpResponseGET($info_url,[],$headers); $info = json_decode($result,true); if (isset($info['id'])) { // 处理获取到的数据 } }4. 开发过程中的坑上面步骤中,第一步和第二步都没问题,但是到第三部时,看我代码你会发现,我在curl请求时添加了header,这个header必须填写,这可能是github的严格的验证机制吧,其中1、Authorization填写内容是你获取到的access_token,例:"Authorization: token e72e16c7e42f292c6912e7710c838347ae178b4a";2、User-Agent填写内容是你的应用名称,如我的应用名称是木木彡博客,例:"User-Agent: 木木彡博客"5. 处理数据完整代码// 用户登录 public function github() { if (isset($_GET['code'])) { $access_token_url = 'https://github.com/login/oauth/access_token'; $params = array( 'client_id' => self::GITHUB_CLIENT_ID, 'client_secret' => self::GITHUB_CLIENT_SECRET, 'code' => $_GET['code'], ); $access_token = getHttpResponsePOST($access_token_url, $params); if ($access_token) { $info_url = 'https://api.github.com/user?'.$access_token; $data = array(); parse_str($access_token,$data); $token = $data['access_token']; $url = "https://api.github.com/user?access_token=".$token; $headers[] = 'Authorization: token '.$token; $headers[] = "User-Agent: 木木彡博客"; $result = getHttpResponseGET($info_url, $headers); $info = json_decode($result,true); if (isset($info['id'])) { $Oauth = new OauthModel(); $num = $Oauth->github($info); if ($num==3) { // 登录成功 $this->redirect('index/index'); } } } } } /** * 远程获取数据,POST模式 * @param $url 指定URL完整路径地址 * @param $param 请求的数据 * return 远程输出的数据 */ function getHttpResponsePOST($url = '', $param = array()) { if (empty($url) || empty($param)) { return false; } $ch = curl_init();//初始化curl curl_setopt($ch, CURLOPT_URL,$url);//抓取指定网页 curl_setopt($ch, CURLOPT_HEADER, 0);//设置header curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上 curl_setopt($ch, CURLOPT_POST, 1);//post提交方式 curl_setopt($ch, CURLOPT_POSTFIELDS, $param); $data = curl_exec($ch);//运行curl curl_close($ch); return $data; } /** * 远程获取数据,GET模式 * 注意: * @param $url 指定URL完整路径地址 * @param $header 头部 * return 远程输出的数据 */ function getHttpResponseGET($url,$header=null) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); if(!empty($header)){ curl_setopt($curl, CURLOPT_HTTPHEADER, $header); } curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($curl); // echo curl_getinfo($curl); curl_close($curl); unset($curl); return $output; }
2019年02月27日
570 阅读
0 评论
0 点赞
2019-02-27
MySQL更新一个表字段的值到另一个表字段
MySQL更新一个表字段的值到另一个表字段有时在新建了一张数据表之后,需要做些测试,但是表中没有数据,可以使用下面方法更新数据库,达到测试目的同一张表中数据(当前表)update tableA A set A.actvalid=A.svalid where A.actvalid='0000-00-00 00:00:00';不同表中数据update tableA A,tableB B set A.typeA=B.typeB where A.idA=B.idB;
2019年02月27日
520 阅读
0 评论
0 点赞
2019-02-19
元宵佳节,看着窗外的烟花,我在与getshell做斗争
元宵佳节,看着窗外的烟花,我在与getshell做斗争先来点轻松的2018年十月份接受的项目,终于在2019年春节前交付,也是拿着项目交付的微薄报酬过了个年。年初七上班,我还沉寂在春节的氛围中,还在思考着准备去给谁家小孩发压岁钱(实则蹭饭),但是,突如其来的微信消息让我一下子崩紧了精神。。。问题初现跟我对接的业务小哥突然给我发来这么一张图,说网站访问不了了,让我赶紧看看怎么回事。。。说实话,当时我也是一脸懵逼的,毕竟我只是个写代码的。。。但是,这个项目是我做的,我必须得处理啊然后,我查看代码,才发现网站的首页文件 index.php 被改写了,我凸(艹皿艹 ),但是我赶肯定的是没有人动过服务器,这怎么办。。。那现在治标不治本的办法只能是代码回滚到三天前了,没想到刚过一晚上,又出现问题了。。。然后我只能百度到处找解决办法了。后来才知道,这次的首页篡改事件是tp框架有高危漏洞。然而,我他喵的不知道。那我的代码不就跟砧板上的肉一样,任人宰割了吗。。。凸(艹皿艹 )。果然,系统已经被搞的遍体鳞伤了事件背景2018-12-10 ThinkPHP5系列发布安全更新,该安全更新修复了一处严重漏洞,该漏洞可导致(php/系统)代码执行。由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞影响范围ThinkPHP 5.x5.1.x ~ 5.1.315.0.x ~ 5.0.23初步解决官方修复建议按照官方漏洞修复方案执行后,代码重新回滚,总算是清除了系统的webshell,但是,为时已晚啊,网站已经被腾讯电脑管家拦截了,还得想办法去解封。。。凸(艹皿艹 )后记这算是个比较大的教训把,告诫下自己吧。1、web开发的时候,选对开发框架很重要,当时图简单用了tp,没想到出先这种问题(推荐使用极益CMS2.0)2、使用框架时,要时常关注下官方动态,比如我这次,官方2018年12月份发布高危漏洞,我2019年2月份才去处理,亡羊补牢,为时太晚啊互勉
2019年02月19日
641 阅读
0 评论
0 点赞
2019-02-14
使用必应Bing每日图片做网站背景(自动)
创建API文件在项目允许访问的目录下创建一个PHP文件供后续调用 api.php 调用地址:http://访问目录/api.phpAPI代码以下代码复制粘贴即可<?php //从bing获取数据 $str = file_get_contents('https://cn.bing.com/HPImageArchive.aspx?idx=0&n=1'); if (preg_match("/\<url\>(.+?)<\/url>/ies", $str, $matches)) { //正则匹配抓取图片url $imgurl = 'https://cn.bing.com' . $matches[1]; } else { //使用默认的图像 $imgurl = 'https: //picsum.photos/1920/1080/?random'; } header("Location: $imgurl"); ?>使用方法例:如果作为页面背景图的话,使用下面代码即可body{ width:100%; height:100%; background: url(API地址) no-repeat; -moz-background-size: cover; /*背景图片拉伸以铺满全屏*/ -ms-background-size: cover; -webkit-background-size: cover; background-size: cover; }
2019年02月14日
2,810 阅读
2 评论
0 点赞
2018-08-14
使用翔云 OCR 开发名片识别API数据保存到数据库
公司近几天一直再开发crm,在开发crm的时候,用户数据较多,仅靠表单提交和导入去录入数据完全不够,于是想到了开发名片扫描时别。。。 本次开发使用的是翔云ocr,为啥会用这个呢,我在找了一圈以后本来准备使用腾讯云的SDK进行开发,但是我写了一个demo后进行测试,发现腾讯云的SDK转化率并不像是管方文档着呢说的达到90%,能达到70%都是非常不错了,后来又找了找,发现翔云还不错,果断购买之!下面说下两种api的调用方式1、使用PHP进行调用不得不说,翔云的api示例还是有点小瑕疵的,下面已做修改<?php /** * 翔云OCR名片识别类 * @Date: 2018-08-14 10:11:38 * @Author: Wang HongBin | <whb199330@163.com> * @Last Modified by: Wang HongBin * @Last Modified time: 2018-08-14 10:16:19 */ class XiangYunOCR { /** * 获取名片信息 * @Author wanghongbin * @Email wanghongbin@ngoos.org * @DateTime 2018-08-14 * @param [type] $filepath [description] * @return [type] [description] */ public function cardInfo($filepath) { $ocr = $this->cardOCR ( $filepath ); if ($ocr) { if ($ocr ['message'] ['status'] == 0) { $cardinfo = $ocr ['cardsinfo'] [0]; foreach ( $cardinfo ['items'] as $k => $v ) { if ($v ['desc'] == "姓名") { $card ['name'] = $v ['content']; } if ($v ['desc'] == "职务/部门") { $card ['position'] = $v ['content']; } if ($v ['desc'] == "公司") { $card ['company'] = $v ['content']; } if ($v ['desc'] == "手机") { $card ['mobile'] [] = $v ['content']; } if ($v ['desc'] == "电话") { $card ['tel'] = $v ['content']; } if ($v ['desc'] == "传真") { $card ['fax'] = $v ['content']; } if ($v ['desc'] == "电子邮箱") { $card ['email'] = $v ['content']; } if ($v ['desc'] == "网址") { $card ['www'] = $v ['content']; } if ($v ['desc'] == "邮编") { $card ['postcode'] = $v ['content']; } } } } else { $card = $ocr; } return $card; } // 远程提交OCR获取数据 protected function cardOCR($filepath) { $filepath = realpath ( $filepath ); $file = array ( "key" => "*******************", "secret" => "*******************", "typeId" => "20",//20对应名片识别 "format" => "json", "file" => new \CURLFile ( $filepath, 'image/jpeg' ) ); $curl = curl_init (); curl_setopt ( $curl, CURLOPT_URL, "http://netocr.com/api/recog.do" ); curl_setopt ( $curl, CURLOPT_POST, true ); curl_setopt ( $curl, CURLOPT_POSTFIELDS, $file ); curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, true ); $result = curl_exec ( $curl ); curl_close ( $curl ); return json_decode ( $result, true ); } }调用require_once('../XiangYunOCR.php'); $OCR = new XiangYunOCR(); $ocr = $OCR->cardInfo ($filepath);使用html5调用<form id="uploadForm" name="uploadForm" action="" method="post" enctype="multipart/form-data" > <div id="img-view" onclick="document.getElementById('file').click();return false;"><i class="glyphicon glyphicon-plus" style="font-size: 30px;position: relative;top: 9px;right: 5px;"></i>点击选择图片或拍照</div> <input type="file" name="file" class="hide" id="file" onchange="view_img(this);"> <input type="hidden" name="format" value="json"> <input type="hidden" name="typeId" value="20"> <input type="hidden" name="key" value="yourkey" /> <input type="hidden" name="secret" value="yoursecret" /> <input type="hidden" name="_dontcare"> </form>//上传图片即时显示 function view_img(obj) { var file = $(obj); var fileObj = file[0]; var windowURL = window.URL || window.webkitURL; if(fileObj && fileObj.files && fileObj.files[0]){ var dataURL = windowURL.createObjectURL(fileObj.files[0]); }else{ var dataURL = file.val(); } console.log(dataURL); $("#img-view").empty(); $("#img-view").append('<img src="'+dataURL+'" >'); } // ajax提交图片进行识别并返回值 $(document).ready(function(){ var form = document.getElementById("uploadForm"); $("#startocr").click(function(e) { e.preventDefault();//必须 var oData = new FormData(form); $.ajax({ url: "http://netocr.com/api/recog.do" , type: 'POST', data: oData, async: true, cache: false, contentType: false, processData: false, success: function (returndata) { console.log(returndata); var resdata = returndata.cardsinfo; for (var i = 0; i < resdata.length; i++) { var items = resdata[i].items; $("#ocrname").val(items[0].content); $("#ocrposition").val(items[1].content); $("#ocrmobile").val(items[2].content); $("#ocrcompany").val(items[3].content); $("#ocraddress").val(items[4].content); $("#ocrtel").val(items[5].content); $("#ocrfax").val(items[6].content); $("#ocremail").val(items[7].content); $("#ocrwww").val(items[8].content); $("#ocrpostcode").val(items[9].content); } }, error: function (returndata) { alert("请求失败"); } }); }); });使用截图
2018年08月14日
474 阅读
0 评论
0 点赞
1
...
7
8