Tweets2PDF开发手记

2011年3月1日 5 条评论 8,556 人阅读过  

之前一直想学一下Python却迟迟未曾下手,直到过年前几天好不容易闲下来,突然有个想法想把Twitter上发的tweets备份成PDF,我这个人一有了什么想法就会立马动手去做,于是正好借这个机会学下Python,没有太多时间,用Python比用C会节省很多开发时间,于是折腾了几天就有了这样一个小工具,Tweets2PDF,趁着还没把看过的东西忘光就先记录下写开发过程。

Twitter使用OAuth认证,其实之前对OAuth的原理也不是很了解,正好也借这个机会简单看了一下它的原理。

首先,程序需要向Twitter官网申请一个consumer token,每个客户端需要持有这个token,OAuth开始的时候向Twitter的Request Token URL发送请求来获取一个Request Token,当然HTTP请求中需要加上一些参数,这些参数中包含了Consumer Token相关的值,当然不止这些,具体的参数内容就去参考Twitter上OAuth的介绍或者去读OAuth的RFC。

获取到Request Token之后再根据这个Token生成一个URL,在浏览器中打开这个URL就可以对应用程序进行认证,有一个请求参数是Callback参数,它可以是一个URL,表示验证成功之后程序跳转到该URL,这个URL是Consumer的URL,这适合Web形式的第三方程序,桌面应用程序大家如果用过肯定都知道是需要一个PIN码的,如果要让Twitter返回这个PIN码,只需要把Callback的值设为oob即可,这样在认证之后Twitter后给出一个PIN码。

将这个PIN码由用户交回桌面应用程序,应用程序便再利用这个PIN码和Request Token再生成一个HTTP请求,这个请求成功之后会获取一个Access Token,这个Token是需要用户保存的,之后对于Twitter的访问只需要在请求中根据这个Token生成添加相应的HTTP请求参数即可,Twitter就会知道这个应用程序是经过认证的。

...
分类: Python 标签: ,

浅析linux kernel network之socket创建

2011年2月20日 6 条评论 12,795 人阅读过  

去年受@colyli指点,决定花些时间读一些linux kernel network部分的代码,准备把阅读代码的过程记录下来,也希望能有大牛前来指点,下面就先写一下创建socket对象的过程:

首先,创建socket需要执行socket系统调用:

int socket(int domain, int type, int protocol);

该系统调用有3个参数,在内核中由SYSCALL_DEFINE3定义,具体代码如下:

SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
{
	int retval;
	struct socket *sock;
	int flags;
 
	flags = type & ~SOCK_TYPE_MASK;
	if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
		return -EINVAL;
	type &= SOCK_TYPE_MASK;
 
	if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK))
		flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK;
 
	retval = sock_create(family, type, protocol, &sock);
	if (retval < 0)
		goto out;
 
	retval = sock_map_fd(sock, flags & (O_CLOEXEC | O_NONBLOCK));
	if (retval < 0)
		goto out_release;
 
out:
	/* It may be already another descriptor 8) Not kernel problem. */
	return retval;
 
out_release:
	sock_release(sock);
	return retval;
}
...
分类: Kernel 标签:

libofetion demo以及纯命令行飞信

2010年12月20日 27 条评论 25,544 人阅读过  

之前一直有用户要求写一个libofetion的demo,再加上很多用户对于纯命令行版本飞信的强烈需求,于是我昨天简单地写了一个demo,把libofetion的API也做了一些修改,使它用起来更像是一个lib,不过对于第三方开发的话还是有很多很难理解的地方,因为最初并没有想把它当做一个lib来发布。到现在我对飞信的开发又要暂时先告一段落了,周末都在openfetion和娱乐中度过的,实验室项目和论文又要开始提上日程了,OK,先把code列出来,再做下简单地说明

首先需要libofetion的支持,因为用到了最新的API,所以需要从hg中clone最新版本编译安装后才可编译该程序:

hg clone https://ofetion.googlecode.com/hg/ ofetion

编译方法如下:

gcc -o cli cli.c `pkg-config --cflags --libs ofetion`

有一个地方需要说明,请大家找到/* these… fuck the fetion protocol */这个句注释,它下面的几句话的作用是这样的,飞信在用户完成身份验证之后订阅相关信息之前会推送过来一条信令:

BN 406472150 SIP-C/4.0
N: SyncUserInfoV4
I: 2
Q: 1 BN
L: 124
 
<events><event type="SyncUserInfo"><user-info>
<score value="1261" level="2" level-score="678"/>
</user-info></event></events>

用它来更新用户的积分等级之类的玩意,像这种浮云般的信令都被我直接忽略掉了,但在这种命令行模式纯粹为了发短信的情况下,不需要新建线程监听服务器推送过来的信息,但这条推送过来的信令就有可能影响其它信令的交互,而且更让人蛋疼的是并不是每次登录都会推送这条信令,有时候有,有时候没有,所以就加了在登录完成之后加了一个recv,设定了1s的超时,来处理这句信令,如果在网络情况不好的情况下,大家可以自己把超时时间设长一些,这样也就意味着在发送一条短信时在recv那里要停留几秒钟,否则就有可能导致信息发送失败。

...
分类: C/C++ 标签: ,

openfetion cli功能开发手记

2010年12月19日 11 条评论 32,118 人阅读过  

之前一直有用户提出的命令行短信功能终于被我落实了下来,不过却让很多网友失望,因为所谓的命令行并非是纯命令行,而是需要先有openfetion GUI版本登录以作为server,cli程序通过IPC将数据交由server转发,自己并不进行与sipc server的直接数据通信,也就是必须有X图形界面的支持,当然如果要把现在的openfetion server做成不需要图形界面支持的deamon server还存在很多问题,如deamon在收到短信时该怎么处理等,另外deamon server的开发应该也需要花些时间,这个暂时未做考虑,而基于目前的飞信协议如果要发送短信则必须进行身份验证,也就是纯命令行不需要deamon server支持的飞信必须在每次发短信之前都需要登录一次,考虑到这个问题就迟迟没有开发纯命令行的版本,主要是觉得这种形式的短信发送方式存在的意义不大,不仅速度慢而且需要经过复杂的身份验证,但很多用户想用它管理server的话那也就只能这样来实现了,技术上其实问题不大,调用libofetion的api很简单就能实现,过几天抽点时间写一个看看,今天先把已经实现的CLI功能的开发过程总结一下。

首先,先看一下CLI的使用方法:

...
分类: C/C++ 标签: , , ,

linux终端中输出彩色字体(C/SHELL)

2010年12月15日 3 条评论 14,522 人阅读过  

这几天在用libvlc的时候看到它在terminal里面输出彩色字体觉得挺好玩的,以为是用ncurses实现的,后来一查原来用ANSI C的转义字符就可以实现,不过好现只在linux下有效吧, windows神马的貌似不行,把项目终端凌乱的输出信息整理了一下,关键字符也都用彩色显示,看上去舒服多了,写一下用法以防止以后忘了再去查。

先把控制码列出来(从网上搜来的):

背景色:
40:黑 41:深红 42:绿 43:黄色 44:蓝色 45:紫色 46:深绿 47:白色
前景色:
30:黑 31:红 32:绿 33:黄 34:蓝色 35:紫色 36:深绿 37:白色

控制字符是打开某种样式,输出完成时需要再关闭样式才能使terminal恢复到原来状态,简单例子:

printf("\e[32m%s\e[0m\n", "hello world");

\033\e是一回事,使用\e会更简单一些,输出为绿色字体,如下图:

...
分类: Linux 标签: , ,

linux网络编程手记

2010年12月12日 4 条评论 12,812 人阅读过  

做linux下的网络编程有一段时间了,中间遇到过很多问题,其中不少是因为自己对网络编程和网络协议的一些基本概念搞不清楚,趁着今天没心情干活就把自己在网络编程方面的理解和一些经验总结一下,Request For Comments。

在诸多的网络协议中接触的最多也最紧密的无疑是TCP和UDP,SCTP之前因为项目原因也研究过,不过最终由于方案修改给抛弃了,TCP年代已经很久远,在网上的资料也非常多,而且我感觉它是一种非常复杂的协议,感觉要把编好基于TCP的程序光简单地了解几个socket API是不够的,刚开始接触网络编程的时候自己确实也吃了不少苦头,后来我还专门拿时间出来阅读了一下RFC,再加上长时间的实践总算也对TCP有所了解,把自己的一些经验和教训都总结一下。

首先说一下TCP的状态转移图,这个应该是很重要的,了解TCP运行周期的各种状态才能更好地运用netstat之类的应用程序去对程序进行调试,我这里收藏了一张图,是TCP的状态图,记不清是从哪里找来的,也不知道直接版权该给谁,但这张图应该最终是出自于UNP第一卷的,那copyright就是UNP了吧。

1.TCP连接状态

连接建立的几个状态没什么可说的,TCP的三次握手众所周知,更重要的是TCP连接中止的几个状态,应该可以说是连接中止需要四次握手吧。

当Client调用close函数主动关闭socket时,连接状态被标记为TCP_WAIT_1,Server在收到FIN之后read函数会返回0,这里server知道Client已经关闭连接,回复ACK,这里client连接状态被标记为TIME_WAIT_2,接下来Server调用close函数关闭连接,这时候Server向client发送FIN,Client收到之后将状态标记为TIME_WAIT,并回复ACK。

...
分类: Linux 标签: , ,

抓取飞信协议数据包的bash脚本

2010年12月11日 9 条评论 8,786 人阅读过  

昨晚想写个抓飞信协议包的脚本,结果刚写了一点就去看电影了,今天把它给完善了一下贴出来,也顺便可以帮助大家更好地理解飞信协议,也为了更多的人能够加入到openfetion的开发中来。

其实不是我不懂“工欲善其事必先利其器”这个道理,只是之前在写openfetion的时候我只能跑到windows下去抓包,windows里面的什么vbs之类的脚本我也不会写,就用最笨的办法用wireshark把数据包抓出来然后复制到txt中,现在在linux下可以抓openfetion的数据包,它的包格式与官方飞信相同(这句是废话,要不然也不可能实现互联互通)。

简单地说一下这个脚本,其实不用说它也很简单,就这么几行,飞信在登录的时候需要向一台sipc服务器注册,随后主要的数据包都是与这台服务器之前交换的,而这台服务器我想肯定也是分布式架构了,不同的飞信号会对应于自己的sipc服务器,而服务器的地址是通过配置文件传递给客户端的,客户端在注册之前先向nav.fetion.com.cn这个地址POST一个http请求,随后服务器会响应一个大的xml,之前版本的openfeion并没有对这些数据做本地缓存,所以在每次登录的时候都需要获取这个配置文件,所以经常会有用户反应卡在“正在下载配置文件”这一步进行不下去了,现在的方法是在本地把需要用到的字段做了缓存,再次登录的时候用缓存版本号查询服务器,如果版本号是最新则会返回一个很小的xml结构,速度当然也会比完全下载快得多。

接着说这个脚本,请求到配置文件之后便会得到飞信号对应的sipc服务器地址,之后就用tcpdump来抓取通往这个地址的包和来自这个地址的包,然后就简单做了一下解析。

...
分类: Linux 标签: , , ,

libvlc-gtk使用手记

2010年12月5日 2 条评论 7,568 人阅读过  

前几天实验室这个破项目非要加上什么流媒体的功能,简单起见使用了VLC来实现,客户端这边就得需要把相关的播放界面整合到现有的界面里面来,之前的客户端UI我都是用GTK实现的,没办法,GTK用得比较多,相对熟练一些就用GTK来做了,没想到要把VLC整到GTK里面来那么麻烦,原生的libvlc是不支持GTK的,需要加一层libvlc-gtk,从网上好不容易下载到了libvlc-gtk的源码,从哪里下的也记不清了,反正就是零散地几个文件,没有README甚至连Makefile都没有,没办法首先得先写个Makefile把它编译一下,libvlc-gtk一共有八个文件,Makefile如下:

libvlc_objs=gtk-libvlc-media.o gtk-libvlc-instance.o gtk-libvlc-media-player.o
libvlc_cflags=`pkg-config --cflags gtk+-2.0 libvlc` -I../ -fPIC -shared
libvlc_ldflag=-fPIC -shared `pkg-config --libs gtk+-2.0 libvlc`
libvlc_so=libvlcgtk.so
 
%.o:%.c
	gcc -o $@ -c $< -g $(libvlc_cflags) 
 
$(libvlc_so):$(libvlc_objs)
	gcc $(libvlc_ldflag) -o $(libvlc_so) $(libvlc_objs)
 
install:
	install libvlcgtk.so /usr/local/lib/libvlcgtk.so
	ldconfig
 
clean:
	rm -f *.o *.so
...
分类: C/C++ 标签: ,

OpenFetion V2.0正式版发布

2010年10月24日 74 条评论 21,554 人阅读过  


经过近一个月的修改测试,Openfetion 2.0正式版今天release出来了,相比于之前的1.x版本相比,2.0有更多的优点和特性,最重要的是2.0稳定性较之于之前版本登录速度更快,稳定性更高。

这次版本主要集中在解决历史版本中所存在的登录崩溃,运行时崩溃的问题,以及用户所普遍反映的登录速度过慢的问题,引入了SQLITE3来实现了数据的本地化,使登录过程需要下载的数据量很小,从而大大提高了用户登录速度,也因为实现了数据的本地化,新版本也增加了离线和离线登录功能。

新版本另一个重要的特性是检测网络状态,可以实现断线检测并自动重连,失败时会显示用户离线,而不是之前离线时直接退出程序。检测网络状态需要NetworkManager的支持,此依赖库为可选,如果安装时disable,则不具有自动重连功能。

另外新版本增加了空闲时间自动离开功能,空闲时间目前固定为3分钟。此功能需要XScreenSaver的支持,此依赖库也为可选。

另外新版本再一次更换了图标,新图标由@riku设计,由@xhacker修改,感谢二位对OpenFetion做出的贡献。

...
分类: Linux 标签: , , ,

sqlite3使用手记

2010年10月23日 5 条评论 16,531 人阅读过  

前几天为了解决openfetion登录速度过慢的问题,决定实现数据的本地化功能,以往采用二进制文件直接写入磁盘的形式效率和灵活性显然远远不够,于是毅然决定采用sqlite3来实现,用过之后才发现sqlite3果然是绝佳的选择,作为一种轻量型的数据库,sqlite3有着它独特的优势,简单易用,而且极为高效,当初在引入这个依赖库的时候还在犹豫,但完成后发现它所带来的用户体验绝对可以掩盖住安装时多一个小步骤的繁琐。

sqlite3第一次用,简单地把自己的使用过程写一下,以后再用到可以参考。

sqlite3对很多通过的SQL语句都支持,像SELECT,UPDATE,INSERT,DELETE等等都支持地很好,只要懂SQL语句就可以用sqlite3。

1,下面是几个比较重要的API函数:

/* 打开数据库,如果不存在则创建一个 */
int sqlite3_open(const char*, sqlite3**);
 
/* 关闭数据库 */
int sqlite3_close(sqlite3*);
 
/* 获取错误信息字符串 */
const char *sqlite3_errmsg(sqlite3*);
 
/* 执行SQL语句 */
int sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void*, char**);
 
/* 获取SQL查询结果,其实这个函数是不推荐使用的,一方面是因为它不安全,另一方面它不能处理BLOG类型的字段,当然,在这里我在查询的时候还是使用了它,因为没有涉及到多复杂多庞大的数据,这个使用起来又简单,所以就选用了这个方法 */
int sqlite3_get_table(
  sqlite3 *db,          /* An open database */
  const char *zSql,     /* SQL to be evaluated */
  char ***pazResult,    /* Results of the query */
  int *pnRow,           /* Number of result rows written here */
  int *pnColumn,        /* Number of result columns written here */
  char **pzErrmsg       /* Error msg written here */
);
...
分类: C/C++ 标签: ,