2010/10/04 - Posted By
起衣
在这里介绍的 OAuth 认证过程示例是利用上一篇所说的“简版 OAuthr 认证 for C#“里的代码,针对的只是单一的功能,和那些已经很完善的但是很复杂的成品类库不存在可比性。另外,这也是目前“一堆微博客”中所使用的部分代码,因此,如果有好的改进建议,希望留言提出来,感谢
简单地说,目前这三家服务所支持的 OAuth 1.0/1.0a 协议认证过程包含3个步骤。
- 使用已有的 consumer key 和 consumer secret 生成参数,换取未授权的 Request Token
- 用户手动授权 Request Token
- 使用 consumer key、consumer secret 和 Request Token 换取 Access Token
至于更加详细地步骤说明,请参见:OAuth 认证步骤 一文
打断一下,为了更好地适合一些意外情况,将”简版 OAuthr 认证 for C#”中的代码做了一些修改,除了统一一下命名方式外, UrlEncode 函数首先判断待转换字符串是否为空,是则直接返回空字符串,而 RequestParams 函数将接收的 message 参数改为 postData,这样可以变得更加通用一些,也算是为将来“一堆微博客”的功能能够更好地扩展。修改的代码见文末。
官方的开发文档地址:twitter、豆瓣我说、新浪微博,其中豆瓣和twitter并没有明确地说明在认证时需要限定为某一种 HTTP 请求方式,但是新浪微博在每一步中则是指定了 HTTP 请求方式,因此,整个地过程中就要顺着新浪来了,分别为:获取未授权的 Request Token 使用 GET 方式,请求用户授权 Token 使用 GET 方式(可选?),获取授权过的 Access Token 使用 POST 方式。这样,3中服务的授权就可以使用一套通用的代码来完成了。
首先建立一个字典类型的变量来存储要使用的参数
Dictionary<string, string> param = new Dictionary<string, string>();
然后就可以开始第一步的获取 Request Token,在引用了 OAuthBase 命名空间的情况下,只需要一句变可获得所有需要的参数了
»阅读全文
2010/09/20 - Posted By
起衣
最初是打算直接用 Google Code 上的 oAuthBase.cs 的啊,可是居然不支持 oauth 1.1 规范,虽然修补一下只要稍微加个参数就好了,但是后来又觉得这么多代码对于”一堆微博客“的需求来说又有些过了,搞得那么混乱,零乱,跟我的风格不符...(好吧,我承认,我看不懂找的借口...),所以最终还是按照自己的想法来完成最贴切使用需求的代码。
在继续阅读下去之前,我强烈的要求先看看之前的一篇文章:OAuth认证步骤。因为这里的代码基本就是按照我在那时理解的思路来写的。
首先,是搞清楚自己需要哪些功能,对于“一堆微博客”目前来说,需要的是 OAuth 的认证授权部分和 OAuth 认证更新消息部分,这样,我所需要考虑的情况就少很多了,不用考虑各种参数,而在签名的时候我写死了用 HMACSHA1 也不会产生什么影响... 言归正传,班门弄斧地卖弄一下我的这份代码。
我遇到的第一个问题就很囧,因为在 C# 直接调用的 HttpUtility.UrlEncode() 得到的转义字符串有个特色,比如 HttpUtility.UrlEncode("好好学习"),那么得到的会是 %e5%a5%bd%e5%a5%bd%e5%ad%a6%e4%b9%a0 ,不过大多数情况下我们需要的应当是 %E5%A5%BD%E5%A5%BD%E5%AD%A6%E4%B9%A0 ,一般时候当然不会出问题,不过在 OAuth 认证时需要生成 base_string ,base_string 又需要进行 UrlEncode,而 base_string 是要拿去签名的,这时候大小写就很有分别了,直接决定了 oauth_signature 是否正确,早期我求助 olly 帮忙写了个转换函数,即检测 HttpUtility.UrlEncode() 的结果,遇到 '%' 的时候再检查后面两个字符,如果遇到是小写字母那么就单独转换为大写,最后再所有的重组起来返回。这样很麻烦是不是,所以后来还是决定参照 oAuthBase.cs 自己单独写一个 UrlEncode 函数。
- using System;
- using System.Collections.Generic;
- using System.Security.Cryptography;
- using System.Linq;
- using System.Text;
以上之后的就不解释了- -
- /// <summary>
- /// 不进行 UrlEncode 的字符
- /// </summary>
- private static string unreservedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";
- /// <summary>
- /// 重写的 UrlEncode 函数,因为 HttpUtility.UrlEncode 转义的为小写在签名时可能遇到问题
- /// </summary>
- /// <param name="source_string">要进行 UrlEncode 的源字符串</param>
- /// <returns>UrlEncode 转义后的字符串</returns>
- public static string UrlEncode(string source_string)
- {
- StringBuilder result = new StringBuilder();
- foreach (char symbol in source_string)
- {
- if (unreservedChars.IndexOf(symbol) != -1)
- {
- result.Append(symbol);
- }
- else
- {
- byte[] temp = Encoding.UTF8.GetBytes(symbol.ToString());
- foreach (byte tem in temp)
- {
- result.Append('%' + Convert.ToString(tem, 16).ToUpper());
- }
- }
- }
- return result.ToString();
- }
学着加了注释,要养成好习惯..恩..这个函数和 oAuthBase.cs 中不同的是可以正确地转义中文字符(不是中文字符的一般也不要转义是不是...)。
»阅读全文
2010/09/18 - Posted By
起衣
因为想要一个简单一点的C编译环境,所以就得自己小配置一下,尽量利用现有的东西。虽然类似内容的文章网上已经很多了,不过自己在操作过程中感觉有些地方有些不同,并且也有需要完善的地方,所以再记录一下。
使用的环境是 Win 7 32bit 、VS2010、Notepad++5.7绿色版,VS2010 里的 cl.exe 版本号为 16.0.30319.1,VS 的安装目录在 S:\Program Files\Microsoft Visual Studio 10.0\ ,Notepad++ 程序的文件则放在 D 盘下。
具体的操作..恩。
1、在系统的环境变量设置,用户环境变量设置中的 PATH 添加 S:\Program Files\Microsoft Visual Studio 10.0\VC\bin,新建环境变量 INCLUDE,值为 S:\Program Files\Microsoft Visual Studio 10.0\VC\include;S:\Program Files\Microsoft SDKs\Windows\v7.0A\Include ,新建环境变量 LIB,值为 S:\Program Files\Microsoft Visual Studio 10.0\VC\lib;S:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib,注意值之间用分号隔开的。
2、从 S:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\ 下拷贝文件 mspdb100.dll 到 S:\Program Files\Microsoft Visual Studio 10.0\VC\bin\ 下,据说遇到意外情况,比如IDE编译时又出问题的话可以将 S:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\mspdbsrv.exe 也一同拷贝到 S:\Program Files\Microsoft Visual Studio 10.0\VC\bin\ 下面去。
3、Notepad++的运行命令为
cmd /k chdir /d $(CURRENT_DIRECTORY) & cl $(FILE_NAME) & PAUSE & EXIT
注意最开始是用的 chdir命令加 /d 参数,最开始我也是使用的 cd 命令..结果很悲剧地抑制提示找不到文件,郁闷了很久才发现问题,我的 Notepad++ 程序目录和当前工作目录并不在同一个盘,CD 命令切换不过去...
4、设置个快捷键吧,设置-管理快捷键...
好叻,没有其他意外的话就能正常工作了。
2010/09/17 - Posted By
起衣
我一直认为,在自己的网站上给不同浏览器、不同用户提供一些个性化的服务是一件很令人开心的事情,昨天(太平洋时间9月15日...)IE9 Beta 出世,带来了一些很有创意的新特性,比如 Site Pinning。
注意到这个新特性之后,就想将其加入到 WordPress 上来,用最简单的 Jump List Tasks 来试试手:如果将网站 Pin 到了 Win 7 的任务栏上,那么在 JumpList 菜单中可以显示最新的5篇文章,且能够根据网站上的内容自行更新,当然,点击对应的项目可以直接打开对应的文章。
太简单了,查看一下 twitter 的源代码示例,马上就能搞定叻,几行代码搞定。在 header.php 的 </header> 之前加入
- <?php
- $recentPosts = new WP_Query();
- $recentPosts->query('showposts=5');
- ?>
- <meta name="application-name" content="iSouth: 一边生活,一边折腾 " />
- <meta name="msapplication-tooltip" content="iSouth 是一个博客平台,关注电脑技巧,网络应用,最新资讯等,分享优秀资源,谈论生活,影音媒体......." />
- <?php while ($recentPosts->have_posts()) : $recentPosts->the_post(); ?>
- <meta name="msapplication-task" content="name=<?php the_title(); ?>; action-uri=<?php the_permalink(); ?>; icon-uri=/favicon.ico" />
- <?php endwhile; ?>
看个效果图:

或者,在 Jumplist 里显示网站的分类?根据自己的喜好玩吧-.-
2010/09/09 - Posted By
起衣
这年头,估计随便拉个人出来都知道可以使用一些常见的安全工具(如:我还是不举例了,伤感情...)来修复被恶意篡改的浏览器首页,不过流氓软件们也没停下脚步,他们继续发展其他战场。前段时间,我就遇到了一浏览器的新建标签页被“劫持”的情况。第一次看见的时候,还觉得这软件还真是有创意,从对首页的争夺战争中跳出来,居然别开生面地修改起了默认的新建标签页,并且似乎修改新建标签页比修改浏览器首页的效果更加好。大多数时候,我们看到新建标签页的时间可比看到浏览器首页的时间要长的多!
这个想法好是好,但是对于用户来说,频频亮相的未知导航网站只怕很难获得认同。因为我个人并没有使用杀毒软件及其他的安全工具,所以对他们的功能也并不是太熟悉,我不知道他们现在是否也能轻松地搞定这种情况,如果不嫌麻烦的话,自己修改注册表对应键值为默认就好了。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\AboutURLs]
"Tabs"="res://ieframe.dll/tabswelcome.htm"
如上,自行修改为默认值,如果需要的话,也可以自己定义一个页面-.-