Tag Archives: ahk

AHK实现07073.com批量淘号

本文实现一个较为复杂的自动化流程,从多Web页面中提取到我们需要的信息。

要求

具体需要实现的完整流程描述如下:

1. 访问 http://fahao.07073.com/19547.html,截图如下:

2. 点击每一个 “淘号”,如果没有登录,即提示登录,如果已经登录,则在一个弹出的iframe里显示一个号码。

 

我们需要把这个号码得到。

3. 每页25个号码,一共74页,第一页url为 http://fahao.07073.com/19547.html,第二页为http://fahao.07073.com/19547-2.html,第三页为 -3,类推。

简单的方法恐怕不行,我们需要一种更为合理的方法。

实现

先看一下点击淘号时发生了什么,每点击,其实是调用一个叫activate()的javascript函数,参数是8位的数字id。这个函数把 id组装到类似下面的url里,

http://fahao.07073.com/?action=sumtao&id=15721753

其中 15721753便是其中的id。通过访问此url,返回iframe里的内容,iframe里的号码以”XX4670t6XF21783″的形式表达,前2个是XX打头,其后是13位或字母或数字。

因此我们的实现流程就简单了,分为四步,1. 根据页面pattern下载全部的74个网页的内容,存在本地;2. 利用规则表达式提取到id;3. 利用id组装合适的url,再次把全部的iframe 下载到本地;4. 对全部的iframe进行分析,提取礼包号码。

其中,几个规则表达式的pattern可以表示为,

id: “activate(d{8})”

礼包号: “value=””w{15}”””

对应与流程,实现为4个ahk脚本。

dl_all_pages.ahk,下载全部页码的网页内容,保存在pages目录下,命名为 页码.html,如9.html表示第9页的内容,70.html表示第70页的内容。其中使用了ahk自带的 urldownloadtofile函数。

; Author: Zhuotong Nan ([email protected])
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
pg :=74
;download all pages
loop,%pg%
{
pageurl_pat = http://fahao.07073.com/19547-%A_Index%.html
urldownloadtofile,%pageurl_pat%,pages%A_Index%.html
}

find_ids.ahk,从74页内容html文件中提取到全部的id,保存在ids.txt文件里。id以分号(;)分隔。

; find ids
ids :=””
outfile_ids := “ids.txt”
loop,pages*.html
{
fileread,file_cont,pages%a_loopfilename%
;parse “activate(16492748)” from file_cont
startpos :=1
loop
{
pos :=regexmatch(file_cont,”activate(d{8})”,””,startpos)
startpos := pos+17
if pos=0
break
id:=substr(file_cont,pos+9,8)
ids = %id%;%ids%
}
}
fileappend,%ids%,%outfile_ids%

dl_wl3hao.ahk,根据id号,下载全部的iframe,iframe里包括需要的礼包号码,每个id下载过来的内容保存在以id命名的txt里,放在nos目录下。

id_file :=”ids.txt”
fileread,file_cont,%id_file%
;http://fahao.07073.com/?action=sumtao&id=15721753
loop,Parse,file_cont,;
{
urldownloadtofile,http://fahao.07073.com/?action=sumtao&id=%a_loopfield%,nos%a_loopfield%.txt
}

find_wl3_gifts.ahk,根据iframe内容,利用规则表达式得到需要的信息。保存在gifts.txt里,每行一个礼包号。

; find wl3 gift no
gifts :=””
outfile_gifts := “gifts.txt”
loop,nos*.txt
{
fileread,file_cont,nos%a_loopfilename%
;parse value=”XX4670t6XF21783″ from file_cont
pat:= “value=””w{15}”””
pos :=regexmatch(file_cont,pat)
gift:=substr(file_cont,pos+7,15)
gifts = %gift%`r`n%gifts%
}
fileappend,%gifts%,%outfile_gifts%

最终的gifts.txt 如下图所示。

结论

本文演示了如何从一个比较复杂的多网页批量提取需要的数据。利用了一些基本的网络函数,和规则表达式。使用AHK实现。有关AHK的更多介绍可以参阅其官方网站,google, autohotkey即可找到。

AHK实现批量网页数据提取

Author: Zhuotong Nan ([email protected])

AHK是很好用的在windows下实现自动化的脚本语言,对于有一定编程基础的童鞋,很快就可以上手写代码。ahk的官方网址是http://www.autohotkey.com/,其forum里有大量的他人写好的脚本。

本文实现一个从网页里自动提取数据的一个例子。

目的

从40407.com网站里自动批量得到《武林3》70区豪侠礼包代码。原始网站界面如下,

1. 进入http://fahao.40407.com/11417.html,点击“淘号”按钮,如果未登陆,则提示登录。登录后弹出淘号界面如下图,

从界面中获取以XX打头的15位代码。

2. 关闭“查看卡号”,然后重复步骤1,可以得到一系列的代码。

现在的目的是实现其自动化,并把得到的代码保存到一个文本文件(gifts.txt)里。

实现

1. 点击“我要淘号”时,本地与远程有一个通讯。利用chrome自带的inspect element的network功能(也可以用任何网络分析工具),在“我要淘号”上右键选 inspect element, 到Network tab上,这时点一下“我要淘号”执行一次通讯,Network将捕捉到通讯信息。

我们可以看到通讯的header。我们需要做的是模拟chrome的通讯用ahk来实现。

2. ahk有几个有用的他人写的http通讯脚本,一个叫httpquery,一个叫httprequest,都很优秀,但前者2010年后已经不再继续支持,并且不支持cookies文件头。而cookie信息是我们这个任务里的关键,否则“我要淘号”返回是要求登陆的信息。httprequest可以从这个网址下载:http://www.autohotkey.com/community/viewtopic.php?t=73040

3. 代码实现。本代码实现了自动获取500个号码。

; Author: Zhuotong Nan ([email protected])
; Date: 8/8/2012

loop, 500
{
url := “http://fahao.40407.com/app/common.php”
data := “a=taohao&id=11417”

header :=”Cookie: PHPSESSID=da317c26545caafa204520e4c89276c9; DedeUserID=427080; DedeUserID__ckMd5=d770e5fdd4d5a237; DedeLoginTime=1344523159; DedeLoginTime__ckMd5=2233e446322305d5; Hm_lvt_75e3d45d3ad80ecb1af209e743d1b514=1344521115290,1344521187845,1344523168489; Hm_lpvt_75e3d45d3ad80ecb1af209e743d1b514=1344523168489`nReferer: http://fahao.40407.com/11417.html`nConnection: keep-alive”
options :=””

bytes := httprequest(url, data, header, options)

sleep 500

;parse gift code
pos:=Regexmatch(data,”XXw{13}”)

if pos!=0
{
code := substr(data,pos,15)
fileappend,%code%`n,gifts.txt
}

sleep 1000

fileappend,%data%`n,test.html
}

#include httprequest.ahk

ESC::
exitapp

4. 注意httprequest有4个参数,参数1是访问的地址,参数2是上传的数据(post data)和下载过来的内容(放同一个参数里),参数3是上传的http头,响应的http头也在参数3里,参数4是选项。我们需要使用的是前3个参数。注意参数3 header的构造,不同的key-value对使用分行符(`n)来分隔。而且这里必须要增加cookie信息,这个信息可以从chrome里分析得到。传回来的数据存放在参数2,data里。

5. 使用了正则表达式,从下载过来的data 里进行pattern分析。礼包代码是以XX开头的15长度的大小写字母和数字组成。表达式为XXw{13}。

6. #include httprequest.ahk 把httprequest脚本包括进来,所以前文可以调用httprequest函数。

7. 获取的代码存放在 gifts.txt里。

8. 使用本代码前,必须事先用chrome (或者IE等别的浏览器,需要对应获取其cookie)登录成功。按esc键随时退出。

结论

本文演示了使用AHK从网页自动批量获取指定数据。使用了httprequest方法,其中关键是必须维持cookie信息。

通过AHK设置延迟启动

我的笔记本电脑8个G的内存,大可把再多的程序都一并装载到内存使用。但随着程序安装的越来越多,启动越来越慢,原因是启动项里被安装了大量的程序,比如在启动时要执行声卡的一些控制程序,蓝牙,输入法,thinkpad本身的一些不知道干啥的程序,这些启动时就消耗了大量的时间。下图是我机器上的启动项。估计多数人的机器里启动项只会比这个多,而不是少。

ScreenClip(3)

想着能不能把一些不必要的内容延迟启动。网上当然有一些现成的工具是做延迟启动的,但这么简单的事情,有必要搞的这么复杂吗,我们用autohotkey自己弄一个得了。

首先建一目录,比如在C:WORKSPACESTARTUP目录下,把延迟启动的内容的快捷方式(注意是快捷方式,不是程序本身)放在这里,如下图。

ScreenClip(7)

然后把对应的启动项给禁止掉。我用的是 You Uninstaller!的starter manager来关掉启动项的。比如下图,我把 Evernote Clipper, 三星同步软件Kies等给关掉,其中 Evernote Clipper延迟启动,做了个快捷方式放到刚才建好的C:WORKSPACESTARTUP目录下。

在C:WORKSPACESTARTUP目录下新建一个autohotkey脚本,取名autorun.ahk,用记事本打开,在里面放如下内容:

folder = C:WORKSPACESTARTUP
Loop, %folder%*.lnk

;遍历全部的快捷方式, 非快捷方式不启动
{
run %folder%%A_LoopFileName%
; run 命令,等一个程序启动后再循环启动下一个程序,直到循环自动退出。
}
ExitApp
; 自动退出

然后把autorun的快捷方式放到开始菜单里的启动项(startup)里。

  • 注意有些项如我机器上的bluetooth,可能无法通过此方法启动,这样就只能保留在原本的启动位置了。
  • 快捷名中间不能有空格吧。
  • 如果要自定义启动次序,可以使用在快捷名前加1, 2, 3,或者a, b, c 来实现。

开机试试效果。


1. AHK 快餐店 – 开机自动运行程序的延迟启动[绿色版], http://www.appinn.com/ahk-23-run-later/

2. autohotkey, http://www.autohotkey.com