在官方文档中描述了过期策略,即expires_in标注的有效期。实际测试时和微信公众号的过期策略还是不一样的。
实际测试中,每次调用API,返回的都是相同的token,而且有效期都是7200s,那么你肯定有这样的疑问:
Highcharts是utf-8编码的,其本地的.net导出环境也是utf-8格式的,导致网页如果采用gb2312编码,显示正常,导出就乱码了。这种现象也同样经常出现在ajax的使用过程中。
ajax中一般的解决办法就是将中文等非英文的字符进行escape编码,再由后端模拟unescape解码,以避免编码的问题。跟着这个思路修改以解决Highcharts的导出乱码问题。同时为了配合后端简化,我使用了encodeURIComponent去编码。
由于需要在提交之前进行编码,那么我们需要修改Highcharts的导出文件的源码,你需要慎重考虑下。
我们修改js/modules/exporting.src.js中的Highcharts.post方法:
// add the data for (name in data) { createElement('input', { type: HIDDEN, name: name, value: encodeURIComponent(data[name])//here we add escape for all value }, null, form); }
修改上面的代码,在value的值前全部加上encodeURIComponent的编码方法。
我们修改项目中的Exporter.cs,在class Exporter下增加下面的函数,并将接收的参数进行编码:
/// <summary> /// Unescape for javascript escape. Return string; /// </summary> public static string UnEscape(string str) { return HttpUtility.UrlDecode(str); } //在Exporter中我们同样要修改如下 //unescape all arguments string extension; fileName = UnEscape(fileName); this.ContentType = UnEscape(type).ToLower(); this.Name = fileName; this.Svg = UnEscape(svg);
保存,生成,将生成的dll文件覆盖现在使用的,再次导出基本上可以解决乱码的问题。
1.由于使用的是HttpUtility.UrlDecode()方法,如果你传递前没有encodeURIComponent,且编码就为utf-8,那么导出也是正常的;
2.没有经过大数据的测试,用于正式项目前建议您先测试下;
3.压缩包:http://pan.baidu.com/share/link?shareid=1309032918&uk=352812205
4.由于使用了编码,因此导出的文件名也是可以被指定为中文的;
5.导出文件的width必须被指定,否则导致导出出错,待修复。
1.未选中项目导出时未被忽略,描述:http://www.cnblogs.com/youngerliu/p/3177252.html
2.网页为gb2312,导出时中文乱码问题。
由于项目中highcharts需要内网使用,需要本地搭建导出的环境。下面简述下步骤:
1.下载开源的.net导出文件:https://github.com/imclem/Highcharts-export-module-asp.net
2.新建虚拟站点,IIS下配置如图:(注意端口设定:80端口已经用了,就设定为8081;应用池的设定,仅支持framework3.5以上版本)
3.拷贝下载的压缩包中的Exporting_Demo_website文件夹下的文件到新站点的目录下。删除目录下的web.config文件,重命名web-dotNET4.0.config为web.config。(不需要Exporting_Demo_website这个文件夹,文件放在根目录下即可,否则后面的操作全部要加上这个路径)
4.打开站点http://localhost:8081/访问,内置一个Demo,选择导出,看是否正常。正常即完成。不正常就需要修正了。
打开IIS管理器,选择“ISAPI和CGI限制”,里面找到我们上面设置的framework的版本,设定为允许。
BUG描述及修复,请参见http://www.cnblogs.com/youngerliu/p/3177252.html
需要修改的地方是在Exporter.cs的CreateSvgDocument方法
private SvgDocument CreateSvgDocument()<br /> {<br /> SvgDocument svgDoc;<br /><br /> XmlDocument xml = new XmlDocument();<br /> xml.LoadXml(this.Svg);<br /> XmlNodeList nodeListAllg = xml.GetElementsByTagName("g");<br /> Dictionary<int, XmlNode[,]> dic = new Dictionary<int, XmlNode[,]>();<br /> int i = 0;<br /> foreach (XmlNode xNod in nodeListAllg)<br /> {<br /> i++;<br /> XmlNode xmlvisibility = xNod.Attributes.GetNamedItem("class");<br /> if (xmlvisibility != null && xmlvisibility.Value == "highcharts-series-group")<br /> {<br /> foreach (XmlNode xNod2 in xNod.ChildNodes)<br /> {<br /> i++;<br /> XmlNode xmlvisibility1 = xNod2.Attributes.GetNamedItem("visibility");<br /> if (xmlvisibility1 != null && xmlvisibility1.Value == "hidden")<br /> {<br /> XmlNode[,] xmln = new XmlNode[1, 2];<br /> xmln[0, 0] = xNod;<br /> xmln[0, 1] = xNod2;<br /> dic.Add(i, xmln);<br /> }<br /> }<br /> }<br /> else if (xmlvisibility != null && xmlvisibility.Value == "highcharts-tooltip")<br /> {<br /> XmlNode[,] xmln = new XmlNode[1, 2];<br /> xmln[0, 0] = xml.FirstChild;<br /> xmln[0, 1] = xNod;<br /> dic.Add(i, xmln);<br /> }<br /> }<br /> foreach (KeyValuePair<int, XmlNode[,]> a in dic)<br /> {<br /> a.Value[0, 0].RemoveChild(a.Value[0, 1]);<br /> }<br /><br /> this.Svg = xml.OuterXml;<br /><br /> // Create a MemoryStream from SVG string.<br /> using (MemoryStream streamSvg = new MemoryStream(<br /> Encoding.UTF8.GetBytes(this.Svg)))<br /> {<br /> // Create and return SvgDocument from stream.<br /> svgDoc = SvgDocument.Open(streamSvg);<br /> }<br /><br /> // Scale SVG document to requested width.<br /> svgDoc.Transforms = new SvgTransformCollection();<br /> float scalar = (float)this.Width / (float)svgDoc.Width;<br /> svgDoc.Transforms.Add(new SvgScale(scalar, scalar));<br /> svgDoc.Width = new SvgUnit(svgDoc.Width.Type, svgDoc.Width * scalar);<br /> svgDoc.Height = new SvgUnit(svgDoc.Height.Type, svgDoc.Height * scalar);<br /><br /> return svgDoc;<br /> }
注意:复制上面博客中的代码时,需要在项目中引入相关的文件,如图
这里我已经生成,没有环境的朋友可以直接到这里下载:http://pan.baidu.com/share/link?shareid=1300438122&uk=352812205(下载后直接把Bin目录下的4个文件覆盖掉项目Bin文件夹下的4个文件)
菜单栏—工具—导入与导出设置—重置所有设置—下一步。完成后重新生成,依然无效,只有重启电脑(我是重启电脑解决的)。
在你的文档里面增加设定,width为必须项,否则报错
exporting: {<br /> url: 'http://localhost:8081/HighchartsExport.axd',<br /> filename: 'MyChartX',<br /> width: 1200//必选参数<br /> }
注意开启IIS的写权限,因为highcharts的导出代码可能较大,所以导出使用的是上传文件流的方式,具体可参考exporting.src.js源码。另外在正式服中配置时特别注意端口冲突及framework的版本问题(如果选择4.0以上版本,需要修改web.config,上面有提到),建议先找个win2003的测试服试试!
此问题来自:http://www.cnblogs.com/wxmxiaoming/articles/3522468.html,jucelin没有验证,供参考。
解决方法:
从以下地址下载Svg.dll文件覆盖Bin目录下对应的文件即可(两个文件虽然版本一样,但是MD5值不一样);
http://svg.codeplex.com/
插件作用如其名UpyunUploader。因为图片使用又拍云的外链比较方便,最主要的是网站在长城外,但图片在长城内,由此可大幅度的提高加载速度。
在最新稳定版0.9 (13.12.12)中测试通过,可正常使用。注意检查下插件配置是否正确。
下载-上传-安装-配置。配置中几个项目都必须填写,如果信息填错了,那么上传肯定失败。目前仅测试了typecho的“最新版”0.8(10.8.15)-release。
配置完成后,当你上传附件时,插件会自动将上传的附件上传一遍到又拍云,如果上传成功,则会返回成功后的外链地址。再点击插入后,可以看到使用的就是外链地址了。
1.会直接在你的又拍云空间里面创建文件夹usr/uploads/…,以实现本地目录和又拍云空间里面的目录保持一致。
2.如果本次上传的文件没有插入到文章内容中去,那么下次打开后点击插入,则会使用本地的文件路径。解决办法可以直接将你的又拍云外链地址替换本地地址即可,原因由上面一条说明。
3.其他暂未知。
PS:吐槽下,TE新版开发太慢了…
关于QQ挂机宝,可以移步这里看下:PHP模拟QQ登录,宣传版的:QQ挂机宝:免费在线挂QQ
因为TX方面将3g版QQ的安全机制进行了升级,从3g版登录后,如果IP地址改变,将要求再次输入验证码,否则无法正常登录,所以原先只需要本地获得的SID和QQ号即可登录的方式已经失效,而需要在挂QQ的服务器上成功登录获得的SID才可以无验证码方式登录。
说起来升级,其实也就在自动获取SID的地方增加了验证码的输入并提交,让QQ能成功的在服务器的IP地址上完成一次成功登录。
挂Q地址:QQ挂机宝(推荐非IE访问)
在原版本中,很多朋友都加我,并向我要源码。这里需要说明下:
1. 这个程序本身就是利用的TX漏洞或者说设计上的不足来写的,如果开源,后果你懂的,当然核心源代码其实已经公布了;
2. 我发布的QQ挂机宝是多用户版的,而如果想单个QQ挂机,可以直接参考PHP模拟QQ登录;
3. 考虑到这次升级的内容,估计PHP模拟QQ登录中的方法仅支持本地了。
4. 程序中仅记录QQ号和SID,不存储QQ密码,个人人品保证,如果不信,那随便吧。
5. 程序依然有很多不足,只能说尽量去实现,欢迎提意见。
PS:好久没写日志了,懒了很多。发现现在和玩微博一样,基本上都是以看为主,所以如果没有及时回复留言,还请见谅。广告下,我的腾讯微博@jucelin,哈哈。
调用自带jquery方法
<?php wp_enqueue_script("jquery"); ?>
但要注意的是: wp_enqueue_script(“jquery”); 务必加在 wp_head(); 的前面。
同时,需要注意的是wordpress自带的jquery和官方的jquery是有区别的,自带的jquery则需要这样使用:
jQuery(document).ready(function() {
// ""符号在这里才能被识别
});
WP 的 jQuery 和原版唯一的不同, 就是在最后一行加了 jQuery.noConflict();这个noConflict() 就是为了与其它的library 兼容性, 如:Prototype, MooTools, 或 YUI。
调用其他jquery方式
1.最直接的:
<script type=”text/javascript” src=”<?php bloginfo(‘template_url’); ?>/js/jquery.js”></script>
2.调用谷歌 Google 的 API库:
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script> //最好再加上以下代码,一边在连接google的API库是失效时调用本地的jQuery文件: <script> !window.jQuery && document.write('<script src="jquery-1.6.1.min.js"><\/script>'); </script>
取消使用自带jquery
网上最多的方法是在/wp-includes/script-loader.php的119行,将
$scripts->add( 'jquery', '/wp-includes/js/jquery/jquery.js', false, '1.7.1' ); //修改为 if(is_admin()){ $scripts->add( 'jquery', '/wp-includes/js/jquery/jquery.js', false, '1.7.1' ); }
这个方法不支持wp升级,因为升级后会将这个文件修改回来。另外jucelin想到的最简单的方法就是,将官方的jquery替换自带的jquery文件(这个方法会导致后台无法使用自带jQuery!)当然这也应该不支持wp的升级,升级后会被新的jquery覆盖掉。
参考来源:
jucelin在早前发表的一篇关于新浪微博短地址获取办法的文章简单获取新浪微博短地址接口(API),发现很多开发这都对这个比较感兴趣,这里jucelin写了个小接口,方便没有API KEY的朋友使用。实际上获取新浪微博的短地址非常简单,直接使用curl技术就可以了,详细的方法和获取的源代码可以参考上文。
API地址:https://jucelin.com/lab/short.php
老规矩,请使用get方式提交参数,post方式获取不到。
参数说明
type:处理方式,1表示原地址缩短为新浪微博短地址;2表示将新浪短地址还原成原地址。
url:链接地址,根据上面的type方式url为相应的地址。
需要注意的地方
请不要尝试将新浪微博短地址再次缩短,结果会返回错误。
演示地址
长转短:https://jucelin.com/lab/short.php?type=1&url=https://jucelin.com
短转长:https://jucelin.com/lab/short.php?type=2&url=http://t.cn/S4bLBm
服务器在国外,建议寄居国外的朋友使用。有API KEY的朋友建议您为自己建个接口,方便自己站内使用。如果有什么疑问欢迎留言。
jucelin写的源代码下载地址:https://jucelin.com/lab/short.txt
自从Mysql5.0版本后,Mysql就增加了存储过程,在MSSQL上肯定大家用过存储过程,知道它的强大,虽然jucelin也没查到Mysql上存储过程能带来多大的效率,但我坚信肯定会提高效率,哪怕是以后的版本才能。至于你信不信,反正我信了。
Mysql存储过程官方教程文档:http://dev.mysql.com/doc/refman/5.1/zh/stored-procedures.html
俺表示俺对全大写的E文很反感,本来英文水平就不行,看到大写的基本上都是心里默拼下才知道是什么单词,汗颜。OK,下面的PDF文档也是类似的情况,因此,看了好一会,好一会。
MySQL存储过程PDF文档【来自网络】下载地址:
源下载地址:http://net.ytu.edu.cn/share/%D7%CA%C1%CF/MySQL%B4%E6%B4%A2%B9%FD%B3%CC.pdf
DBank下载地址:http://dl.dbank.com/c0bzsslzff
115网盘下载地址:http://115.com/file/dnmr5pn7
另外今天有几个问题待解决,列出来,以后问下前辈们:
1.Mysql存储过程中代码是否区分大小写?平时写sql的时候是不区分的。
2.判断为空咋个写法。如查询出来的结果为空或者没有结果如何判断。
3.等等头疼的问题。
其他参考资料:
跟我学MySQL存储过程:http://www.blogjava.net/sxyx2008/archive/2009/11/24/303497.html
mysql 5.0存储过程学习总结:http://www.ccvita.com/100.html
在短地址(也称短链接、缩短地址等)方面,在twitter发展之后就接着发展了起来,而且很多互联网网站都使用了短地址,国内国外都很多,但稳定和可靠性,还是国内的比较靠谱些,不怕没墙,国外几家已经悲剧了,所以如果项目中用到短地址,个人还是建议使用新浪或者其他国内的短链接服务。
新浪微博短链接API是开放的,而腾讯微博的短地址API没有开放,本想着通过不一样的路径获取腾讯微博的API的,最后还是以失败收场。新浪微博短地址API是不需要用户登录的,所以直接可以调用,而且速度很快,下面的代码是从网站找来的,用的是CURL POST的方法,可供参考。
新浪微博短链接API文档在旧版开发文档中,新版中暂未加入:http://open.weibo.com/wiki/Short_url/shorten
function shortenSinaUrl(long_url){apiKey='1234567890';//这里是你申请的应用的API KEY,随便写个应用名就会自动分配给你 apiUrl='http://api.t.sina.com.cn/short_url/shorten.json?source='.apiKey.'&url_long='.long_url;curlObj = curl_init(); curl_setopt(curlObj, CURLOPT_URL,apiUrl); curl_setopt(curlObj, CURLOPT_RETURNTRANSFER, 1); curl_setopt(curlObj, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt(curlObj, CURLOPT_HEADER, 0); curl_setopt(curlObj, CURLOPT_HTTPHEADER, array('Content-type:application/json')); response = curl_exec(curlObj); curl_close(curlObj);json = json_decode(response); returnjson[0]->url_short; } function expandSinaUrl(short_url){apiKey='1234567890';//要修改这里的key再测试哦 apiUrl='http://api.t.sina.com.cn/short_url/expand.json?source='.apiKey.'&url_short='.short_url;curlObj = curl_init(); curl_setopt(curlObj, CURLOPT_URL,apiUrl); curl_setopt(curlObj, CURLOPT_RETURNTRANSFER, 1); curl_setopt(curlObj, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt(curlObj, CURLOPT_HEADER, 0); curl_setopt(curlObj, CURLOPT_HTTPHEADER, array('Content-type:application/json')); response = curl_exec(curlObj); curl_close(curlObj);json = json_decode(response); returnjson[0]->url_long; }
参照新浪微博的开发文档,其推荐的是使用get的方法获取。那代码就更简单了
function shorturl(long_url){apiKey='1234567890';//要修改这里的key再测试哦 apiUrl='http://api.t.sina.com.cn/short_url/shorten.json?source='.apiKey.'&url_long='.long_url;response = file_get_contents(apiUrl);json = json_decode(response); returnjson[0]->url_short; } function expandurl(short_url){apiKey='1234567890';//要修改这里的key再测试哦 apiUrl='http://api.t.sina.com.cn/short_url/expand.json?source='.apiKey.'&url_short='.short_url;response = file_get_contents(apiUrl);json = json_decode(response); returnjson[0]->url_long; }
OK,是不是更简单了?
大家在调试上面的代码是需要填写自己的API key哦,不然肯定获取不到的。
特别提示:短地址服务现在仅对已经认证的APP KEY提供服务,刚申请的APP KEY会被提示无权限。大家可以使用209678993和3818214747两个KEY做测试,这2个KEY来历不明,不建议用于生产。(感谢@congxz6688的提醒)
jucelin写了个调试的文档,大家可以测试下:
长转短:https://jucelin.com/lab/short.php?type=1&url=https://jucelin.com
短转长:https://jucelin.com/lab/short.php?type=2&url=http://t.cn/S4bLBm
就2个参数,type:1表示长转短,2表示短转长,后面的URL就是目标域名了,因为比较懒,就没有写错误判断,新浪微博短地址不支持短地址再转短地址的,逻辑上也应该这样控制。(不信你可以试试)。
关于新浪微博短地址接口的更详细说明可以参考《新浪微博短地址接口》。
在微博上看到网友使用PHP实现自动挂QQ,就自我思考了下模拟登录的方式。在PHP中CURL模拟提交则可以很简单的实现登录动作,这个方式在ASP则较难实现,使用JS倒是有点思路,但JS不能跨域限制就让我傻眼了。不过至少那位网友也是使用了PHP的curl实现的。好,让咱这个PHP的门外汉也试试吧。
PHP我确实是刚看,至于什么是curl,上php官网查,虽然不明白到底是什么意思,但照葫芦画瓢还是会的,共享万岁。因为是由程序来自动提交登录的,所有JS在程序里面就没什么用处了,而且要找个流量小的,太大程序下载的速度就会非常慢,最后定在使用3gqq登录方式。
跟着CURL的参数来,找个提交登录的3gqq的登陆URL,http://pt5.3g.qq.com/,因为网页格式是wap格式的,所以只有使用chrome或者opera才能访问,否则都会出现下载提示,IE8也不能访问,IE9不知道会不会改善。查看源码,会看到就几个输入框和几个隐藏的输入框,相信看到这里的你知道是神马个东西了。
<?php qqno='你的QQ';qqpw='QQ密码'; cookie = dirname(__FILE__).'/cookie.txt';post = array( 'login_url' => 'http://pt.3g.qq.com/s?sid=ATAll43N7ZULRQ5V8zdfojol&aid=nLogin', 'q_from' => '', 'loginTitle' => 'login', 'bid' => '0', 'qq' => qqno, 'pwd' =>qqpw, 'loginType' => '1', 'loginsubmit' => 'login', ); curl = curl_init('http://pt.3g.qq.com/handleLogin?aid=nLoginHandle&sid=ATAll43N7ZULRQ5V8zdfojol'); curl_setopt(curl, CURLOPT_HEADER, 0); curl_setopt(curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt(curl, CURLOPT_COOKIEJAR, cookie); // ?Cookie curl_setopt(curl, CURLOPT_POST, 1); curl_setopt(curl, CURLOPT_POSTFIELDS, http_build_query(post)); result = curl_exec(curl); curl_close($curl); ?>
我在测试的时候主要是因为cookie没有设置,因为总是想着这不是在客户端提交,记录Cookie也没有什么用,就删除了Cookie参数,试了好多次之后加上Cookie就成功了。
另外,QQ登录的时候会对你的IP进行检测,如果登录的IP地址不是经常登录的IP地址,则需要输入验证码,此时上面的模拟登录就不能用了,jucelin也没想到什么好的方式解决。不过,可以手动尝试在http://pt5.3g.qq.com/上登录,多登录几次,验证码就不会再有了,当然这里的几次不是登录就退出再登录再退出那么简单,估计至少时间跨度要大点,登录2-3次基本上就OK了。
其实使用SID登录也是一种模拟QQ登录的方式,SID码来自于登录后的URL中,每次登录都会分配唯一的SID码,这也是3gqq全站登录的方式,因为要考虑有的手机不支持Cookie(这里突然想到腾讯要是使用session,会是什么样的状况),但又要实现全站登录的需求。
OK,通过SID码登录就不多说了,相信聪明的你肯定能想到。 😆
因为这个程序一个多星期之前就写了,就进行了一些拓展,感兴趣的可以看看我写的这个实例:QQ挂机宝(好吧,我承认这个名字取得由点鸟,但我确实没想到啥名,凑合着叫叫吧)。这个实例主要重点放在了功能实现上,所有什么安全措施,什么用户体验,什么程序运行效率都没去弄,,所以…你懂的,如果你发现功能上不对的地方记得给我留言。
如果你有更好的思路或者更深的想法,欢迎交流,例如用来发QQ消息,发微博什么的,虽然上面2项都测试成功了。