王二的博客

Subscribe to feed

Home About Works

在草稿箱放了一段时间了,今天写完吧。。。

首先下载这个压缩包:  ChromeExTpl.zip。解压之后可以看到三个文件: icon.png ,  manifest.json ,  popup.html 这就是一个简单的Chrome扩展所需要的三个文件。

然后,打开 可以插入网页的Google 小工具的目录. 通过浏览或搜索找到你需要的小工具,

点击 “添加到您的网页”。 然后点击 “获取代码”,

用文本编辑器打开上面解压出的popup.html,把上面这段代码复制进去,保存。

发布

打开chrome的扩展程序页面

点击展开的  开发人员模式, 选择“载入正在开发的扩展程序”,然后选中扩展文件夹,就可以在本机上安装你开发的扩展;如果要打包成.crx的话,选择 “打包扩展程序”。

———————————————

Chrome扩展开发文档: http://code.google.com/chrome/extensions/docs.html

开发一个简单的Chrome扩展: http://code.google.com/chrome/extensions/getstarted.html

就是把一个iGoogle上的人人网小工具搞成Chrome扩展了而已。。。。相关权利归原作者所有。。。

下载地址:https://chrome.google.com/extensions/detail/emakkilalakigbnhmgiofdappaihided

今天看到木头同学在博客里晒了他们的未名Google版版衫
我也来晒一下我的iknow站衫:oh

摄像头拍的。。。

大家都说前面那团是胸毛。。

由于某些原因,我的上一个帐号玉小乌已 经无法使用,于是我注册了这个新号。

第一件事就是怎么把以前的好友加 回来,手动添加这500多个好友显然是会很悲剧的,于是我写了个程序来做这件事。

这个程序可以自动把某个指定用户的全部好友加为自己的好友,

——————分割线—————–

下载及使用:

(1) Windows用户:

下载: RRFriendCopyer.exe (2.8M)

使用:


其中  要备份的用户的id   可以在它的个人主页的地址栏看到:


(2) Linux用户:

直接下载源码   RRFriendCopyer.py (2.1KB)

然后在终端中通过   python RRFriendCopyer.py   执行

使用同上。。。

————————————-

原理:

首先要获得目标用户的好友列表,


通过Firebug分析   玉小乌的好友 那个页面的搜索的请求,发现

可以向  http://friend.renren.com/friendfriendSelector发送请求,

参数是

p={’init’:false,’qkey’:'friend’,'uid’:true,’uname’:true,’uhead’:false,’limit’:1000,’param’:{’guest’:'xxxxxxx’}}

其 中guest是目标用户的id。

返回的数据是json格式。

然后再去分析一下添加好友时的请求。

请求是这样 的:

http://friend.renren.com/ajax_request_friend.do?from=sg_others_profile&codeFlag=0&requestToken=1756152095&why=&id=xxxxxxxx

于 是遍历上面得到的好友列表,将id作为参数post出去。

本来以为这样就行了,但是没想到才加了四五十个就不行了,原来每天添加的好友数大 于50(貌似?)个的话,再加好友就要输入验证码了。。。

然后就想等以后看看怎么破解验证码再搞吧。。。结果下午又发现了一个不用验证码的 方法。

再加好友的时候,看到弹出了这么个框,

选中一些人后,点下按钮就可以了,不用输验证码。

于是用Firebug看了下,请求地址 是:http://friend.renren.com/ajaxRequestFriendBatch

参 数:”friends”:None,

‘from’:’sg_friendumayknow’,

‘requestToken’:1756152095

其中friends是要添加的人的id,多个的话用 “,” 隔开。

完。

纯粹为了方便。

把这个文件下载解压后,把tran这个文件sudo mv到/bin就可以了。

可以进行汉->英 和 英->汉 的翻译,且支持句子。

效果如下:

screenshot

screenshot

每天

第一个上床

最后一个进入梦乡

被每一个起床的人吵醒

然后起床

我是不是有啥心理/神经疾病啊。。。。

评论邮件通知是增加博客评论互动的一个好方法,我觉得也是唯一行之有效的方法,你总不能让别人为了看你的回复成天来刷你的博客吧。

不过有些主机不支持发送邮件,比如我用的这个,我也为此纠结了很久,昨天终于想到了一个办法,终于搞定了。

思路如下:

首先要有@ Reply这个插件,它的功能是在博客的每条留言旁边加一个“回复”的链接,点击后会自动在留言板里填好回复信息,比如:

@<a href=”http://wong2.cn/?p=158&cpage=1#comment-105″>zpc</a>:

然后就可以写下对他的回复。

当用户点击提交评论按钮的时候,首先用onsubmit=”return false;”阻止表单的提交,点击按钮会触发onclick事件,执行我的sendemail()函数,这个函数首先获得留言板内的文字,然后用正则匹配出“#comment-”后面的那个数字,比如这里的105,这个数字就是这条评论的comment-id,(去数据库里看一下,可以发现每条评论都有一个不同的comment-id),然后ajax异步向一个php文件发送这个数字,php接受后去数据库里查找这个comment-id对应的作者的email,并返回,js获得email后,把它和评论内容、当前页面链接一起传送给我假设好的一个google app engine应用,这个应用的作用就是用我的邮箱向指定的email发送指定的内容,这样就完成了发邮件的过程。。。

不过今天早上在床上突然想到这样做有一些安全隐患,等我想好解决办法后再公布具体方法吧。。。

另外昨天测试的时候貌似给zpc童鞋发了不少垃圾邮件,希望没有对他造成干扰。。

高中玩的,上两个星期复习数值分析看到牛顿法的时候又想起来了,在这里记下。

所用的计算器就是普通的科学计算器,就是那种双行的,可以编辑表达式,最重要的是有 Ans 这个键(一般在 “=” 旁边)。

这个是我的计算器:

casio fx-82MS

casio fx-82MS

举个例子吧,比如我要求方程 x^4 + 3* x^2 – 5*x -18 = 0的 一个解,首先

令 f(x) = x^4 + 3* x^2 – 5*x -18 = 0 然后计算出 x-f(x)/f ‘(x) 的表达式,此处为: x-(x^4 + 3* x^2 – 5*x -18 )/(4*x^3 + 6 * x – 5) = (3*x^4 + 3*x^2 +18)/(4*x^3 + 6 * x – 5)

然后选择一个初值 x0 ,比如我选 x0 = 11

在计算器里输入: 11 , 然后按 “ =  ” 号,

接着输入: (3* Ans ^4 + 3* Ans ^2 + 18)/(4 * Ans ^ 3 + 6 * Ans - 5) ,然后不停地按 “ = ” 号,直到计算结果不再变化为止,这就是方程的一个(近似)解。 我这里是2,很巧是个整数,巧合巧合。。。

那么2是它的解吗?代进去算算吧: 2^4 + 3 * 2 ^ 2 – 5 * 2 – 18 = 16 + 3 * 4 – 10 – 18 = 0,这说明2确实是原方程的一个解。

原理就是牛顿法,以下几段摘自维基百科牛顿法条目

首先,选择一个接近函数f(x)零点的x0,计算相应的f(x0)和 切线斜率f‘(x0)(这里f表示函数f的导数)。 然后我们计算穿过点(x0,f(x0))并 且斜率为f‘(x0)的直线和x轴的交点的x坐 标,也就是求如下方程的解:

x\cdot f'(x_0)+f(x_0)-x_0\cdot f'(x_0)=0

我们将新求得的点的x坐标命名为x1,通常x1会 比x0更接近方程f(x) = 0的解。因此我们现在可以利用x1开始下一轮迭代。迭代公式可化简为如下所示:

x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}

已经证明,如果f是连续的,并且待求的零点x是 孤立的,那么在零点x周围存在一个区域,只要初始值x0位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果f‘(x)不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。

计算器的Ans符号表示的是上次计算的结果,所以我们可以利用它来进行迭代。

至于初值x0的选取,以前我都是随便选个数,不过 数值分析课本里有这样的结论: 初值x0 满足 |f ‘(x0)| ^ 2 > |f ”(x0) / 2| * |f(x0)| 且f ”(x0) != 0 时,可以保证大多数情况下牛顿法的收敛性。 不过我一直随机选数貌似也没出过问题。。。巧合巧合。。。

终于考完试了。。。

上次说到卡在PyQt模拟登录上了,本来准备等考完试再看看这个问题,不过有一天在CPyUG里看到有人说可以用win32com库控制IE,于是我放弃了先前的思路,改用这个来做,果然简单多了。

其实就是用Python控制IE,打开登录页面,模拟输入用户名、密码还有两个隐藏表单,然后点击登录按钮,登录后,打开要下载的相册中的一张照片,在DOM里就可以得到图片的地址,把它保存在一个list里,然后模拟点击这张图片,就会跳到下一张,再保存一个图片地址,如此循环下去,直至获得相册中所有图片的地址。之后遍历这个list,把所有图片保存下来就可以了。只不过在这个过程中,IE是被设为不显示的,所以你看不到它。

exe 下载地址:http://wong2.cn/works/rr/renren.html

上上周吧,在人人网写了篇日志发布了一下这个小程序,不过下载量不大,莫非大家没有这个需求?

悲剧的是,源代码找不找了,想来是前几天把虚拟机里的win7换成xp时没有拷下来。。。。

很早就有做这个东西的想法了。上星期的某一天(根据校内日志是星期六),我突然想把它付诸实践,于是我在校内上发了篇日志 ,记下了我认为应该可行的实现步骤,以下是最终方案:

1. 模拟登录

2. 访问http://photo.renren.com/photo/用户id/album-相册id/reorder   ,这是相册的图片排序页面,列出了这个相册里的所有图片的缩略图,可以通过drag&drop实现对图片的排序。看一下它的源码可以看到,图片部分的代码是这样的:

<ul id=“photos” class=“DragablePhotoList”>
<li pid=“2866049429″ >
<img src=“http://fmn.xnimg.cn/fmn039/20100424/1445/p_head_dJmX_035b000089622d13.jpg” alt=“” /></li>
<li pid=“2772466126″ >
<img src=“http://fmn.xnimg.cn/fmn039/20100324/2350/p_head_jwoD_66e0000147002d11.jpg” alt=“怀旧” /></li>
…..
</ul>

从这里可以得到所有缩略图的地址,但是没什么用,因为不知道怎么由缩略图的地址得到大图的地址;有用的是每个<li>的pid值,这是图片的 id,得到它之后,http://photo.renren.com/photo/用户id/photo-pid 就是显示这张图片的网页的地址。

3. 在上面提到的那个网页里提取图片的地址

4.根据地址下载图片

我从一开始就决定用Python来做,因为以前就见过Python抓网页的代码例子,好像还比较简单。然后仔细一看,确实很简单,以下语句就可以抓取Google主页的源码了:

import urllib2
print urllib2.urlopen('http://www.google.com').read()

简单吧。不过这个我要做的这个程序要是这么简单就好了,一来需要校内网需要登录才能访问,二来 第3步里提到了“提取图片地址”,可是看网页的源码,显示图片的代码是:

1 <img id=“photo” src=“http://xnimg.cn/a.gif” title=“点击查看下一张” />

显然图片的地址是后来通过js修改的,这就给抓地址的工作带来了很大的困难。。。

第一个模拟登陆的问题,我在网上一搜,搜到了一个校内自动发贴机的代码,登录部分的代码整理如下:

import urllib2
import urllib
import cookielib
 
class RenRen:
 
    def __init__(self, email, pwd):
        self.email = email
        self.pwd = pwd
 
    def login(self):
        cj = cookielib.LWPCookieJar()
        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
        urllib2.install_opener(opener)
 
        params = {'domain': 'renren.com', 'origURL': 'http://www.renren.com/Home.do', 'email': self.email, 'password': self.pwd}
        req = urllib2.Request('http://www.renren.com/PLogin.do', urllib.urlencode(params))
        operate = opener.open(req)
        if operate.geturl() == "http://www.renren.com/Home.do":
            print 'logged on successfully!'
        else:
            print 'logged on error!'
 
if __name__ == '__main__':
    wong2 = RenRen("usrname", "password")
    wong2.login()

看会书睡觉,明天再写吧。。。

—————————————

明日复明日,明日何其多。

—————————————

明天到了。

上回说到可以模拟登录了,然后就登录进去抓取吧。可是这样抓只能抓到网页的HTML源码,具体到图片地址那一部分,我只能抓取出: <img id=“photo” src=“http://xnimg.cn/a.gif” title=“点击查看 下一张” /> ,却得不到JS替换之后的图片地址。。

咋办呢?

这个问题的难度就在于你要模拟出一个浏览器环境,因为js是在浏览器里生成和操纵DOM的。

Google吧,记得那天晚上中英文交杂的搜到三点,试了几种方法,最后发现一个比较靠谱的: Downloading a page’s content with python and WebKit

作者是利用PyQt的QWebkit实现的,一个例子(需安装PyQt4):

import sys
import signal
 
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import QWebPage
 
class Crawler( QWebPage ):
	def __init__(self, url, file):
		QWebPage.__init__( self )
		self._url = url
		self._file = file
 
	def crawl( self ):
		signal.signal( signal.SIGINT, signal.SIG_DFL )
		self.connect( self, SIGNAL( 'loadFinished(bool)' ), self._finished_loading )
		self.mainFrame().load( QUrl( self._url ) )
 
	def _finished_loading( self, result ):
		file = open( self._file, 'w' )
		file.write( self.mainFrame().toHtml() )
		file.close()
		sys.exit( 0 )
 
if __name__ == '__main__':
	app = QApplication( sys.argv )
	crawler = Crawler("http://google.com", "/home/wong2/code/google.html")
	crawler.crawl()
	sys.exit( app.exec_() )

看上去不错。

激动之余我就赶紧睡觉了。

第二天起来继续搞,这才发现一个问题:校内网是要登录的,虽说上面已经实现了模拟登录了,可是在PyQt里怎么实现呢?

于是剩下的几天就在看PyQt4文档的QWebkit和QNetwork这一部分,可惜里面连个例子也没有,去网上查吧,什么也没查到,看来PyQt还是比较小众啊。。。

我也照着自己对文档里的说明的理解做了各种尝试,都已失败而告终。。而这时,我已经好几天没有好好上课去了,貌似还有作业没交,我终于觉得有点得不偿失了。于是终于痛下决心暂时放弃这个东西了。等有时间了再搞吧。

放弃果然是痛苦的啊。。。。