Submitted by gouki on 2013, September 3, 12:31 PM
量子统计应该算是我用的时间最长的一个统计程序了吧?看看量子统计上是怎么写的:
XML/HTML代码
- 名称:飞天小肥猪的简单人生
- 地址:http://neatstudio.com
- 类型:电脑科技
- 开始统计时间:2008-06-25
- 已统计时间:1897天
之所以不用它。一来它的统计其实并没有那么的精确,二来也经常被人挂马,三来,这么多年来几乎是不思进取。四来,用了腾讯的统计后,发现速度、效果等都远超它了。
于是,今天正式停用量子统计,转用腾讯的统计程序。
Misc | 评论:0
| 阅读:13598
Submitted by gouki on 2013, September 2, 11:08 PM
获取公网IP的方法其实很简单,最简单的就是利用dnspod的服务,echo `nc ns1.dnspod.net 6666`,立刻就出来了。于是hugozhu的一段代码就是这样写的:
XML/HTML代码
- func GetLocalPublicIpUseDnspod() (string, error) {
- timeout := time.Nanosecond * 30
- conn, err := net.DialTimeout("tcp", "ns1.dnspod.net:6666", timeout*time.Second)
- defer func() {
- if x := recover(); x != nil {
- log.Println("Can't get public ip", x)
- }
- if conn != nil {
- conn.Close()
- }
- }()
- if err == nil {
- var bytes []byte
- deadline := time.Now().Add(timeout * time.Second)
- err = conn.SetDeadline(deadline)
- if err != nil {
- return "", err
- }
- bytes, err = ioutil.ReadAll(conn)
- if err == nil {
- return string(bytes), nil
- }
- }
- return "", err
- }
上面的原始代码在:http://hugozhu.myalert.info/2013/02/26/dynamic-dns-script.html,原文的代码中其实是不能运行的。因为:timeout是个未定义的变量。
OK,不说这个。我在现实中不能使用上面的代码,因为nc ns1.dnspod.net取出来的结果不正确。为什么?因为我用的是铁通,好象会经过一层代理。但是我访问ip138又是可以取到真实的公网IP,所以我使用了如下代码 :
XML/HTML代码
- func GetLocalPublicIp() (string, error) {
- // `nc ns1.dnspod.cn 6666`
- res, err := http.Get("http://iframe.ip138.com/ic.asp")
- if err != nil {
- return "", err
- }
- defer res.Body.Close()
- result, err := ioutil.ReadAll(res.Body)
- if err != nil {
- return "", err
- }
- reg := regexp.MustCompile(`\d+\.\d+\.\d+\.\d+`)
- return reg.FindString(string(result)), nil
- }
上面我用的正则十分简单。就这样写写算了。因为这个页面里就这么一个符合的地方。OK,现在就一切正常了
Go | 评论:0
| 阅读:18654
Submitted by gouki on 2013, September 2, 10:53 AM
一直以为wget只是下载点东西的工具。看到一篇网上的文章,才注意到wget原来还可以post数据。
为什么我想用wget来post数据呢?是因为。。。busybox不带curl,而bash版的ddns更新(dnspod的域名更新)是使用curl的。既然curl不支持,我就google了一下:wget能够post数据吗?
果然,第一篇就是:
http://hi.baidu.com/hhflying/item/7ae51f3d30ce64fdde2221d9
- 这段时间需要用wget做一些事情,主要是抓取网页的数据工作,发现wget还是很强大的。下面是一些应用场景:
- 1. 简单页面的抓取
- wget的最基本用法
- wget http://domain.com/path/simple_page.html
- 2. 添加自己的head
- 有些网站或者页面,需要额外的认证,所以需要添加额外的HTTP Header,使用方法:
- wget --header="MyHeader: head_value" http://domain.com/path/page/need_header.php
- 3. 伪装成浏览器
- 有些网站,例如facebook,会检测请求方式是否是浏览器,如果不是正常的浏览器,那么会redirect到一个"incompatible browser"的错误页面。这时候需要wget伪装成一个浏览器(我是Mozilla Firefox!):
- wget --user-agent="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)" http://domain.com/path/page/check_user_agent.php
- 4. post数据到某个页面
- wget不光可以用get方式请求网页,还可以post data的,那样就可以实现自动注册、自动登录了(有验证码的页面除外。。。。)
- wget --post-data="user=user1&pass=pass1&submit=Login" http://domain.com/login.php
- 5. 访问需要登录的页面
- 有些页面的访问需要登录,访问的时候需要传递cookie,这时候就需要和上面提到的post方式结合。一般过程是:post用户名和密码登录、保存cookie,然后访问页面时附带上cookie。
- wget --post-data="user=user1&pass=pass1&submit=Login" --save-cookies=cookie.txt --keep-session-cookies http://domain.com/login.php
- wget --load-cookies=cookie.txt http://domain.com/path/page_need_login.php
- 暂时就探索到这些,以后有什么新的用法,继续补充。
不过,可惜的是,我运行下来之后,还有一个小问题:
https://dnsapi.cn/Record.Ddns: HTTPS support not compiled in.
哎。。。我没有openssl,https不支持啊。。纠结,uis2000的路真难走。
Tags: wget, uis2000
Linux | 评论:0
| 阅读:20731
Submitted by gouki on 2013, August 28, 6:47 PM
用Go来处理GET实在是太简单了。。
GET
- u, _ := url.Parse(SMS_URL)
- q := u.Query()
- q.Set("username", SMS_USER)
- q.Set("password", SMS_PASS)
- q.Set("mobile", s.To)
- q.Set("message", s.Content)
- u.RawQuery = q.Encode()
- res,err:=http.GET(u.String());
POST分多种,一种是key/value,一种是纯body,还有。。能够上传文件的。这里先不谈上传文件(我还没有用到)
XML/HTML代码
- body := bytes.NewBuffer(msg)
- res, err := http.Post(http://api.xxx.com/, "application/x-www-form-urlencoded", body)
-
- v := make(url.Values)
- v.Set("email", "anything@stathat.com")
- v.Set("stat", "messages sent - female to male")
- v.Set("count", "1")
- res, err := http.PostForm("http://api.xxx.com/", values)
处理res也非常方便:
XML/HTML代码
- if err != nil {
- log.Fatal(err)
- return
- }
- result, err := ioutil.ReadAll(res.Body)
- res.Body.Close()
- if err != nil {
- log.Fatal(err)
- return
- }
- fmt.Printf("%s", result)
就是这样的方便
Go | 评论:0
| 阅读:20549
Submitted by gouki on 2013, August 28, 11:49 AM
不要以为扫雷 就是游戏扫雷,其实只不过是扫清程序中可能会遇到的坑。比如原作者写的if else中不能重复定义变量就是一个坑 。我原来想,我要定义一个变量,但他可能会变,特别是[]byte,长度只能用常量。这可怎么办,于是我想直接定义在if else中吧。if a { var a1 [128]byte} elseif b { var a1[256]byte},结果嘛,当然是报错的。。后来才发现这是个坑。当然后面我也解决了这个问题了。。。换个角度make一下。。make的时候就可以用变量了。
以下内容来自:http://my.oschina.net/meilihao/blog/123698
XML/HTML代码
- 1.//实现前导零出错:sn:="7DC3"+fmt.printf("%05d", uint16(rawdata[2])&0xFF+uint16(rawdata[1]))
-
- &:[fmt.Printf返回的是一个int和一个error,不能与string用+号一起操作]
-
- sn := fmt.Sprintf("%s%05d", "7DC3", uint16(rawdata[2])&0xFF+uint16(rawdata[1]))或fmt.Sprintf("7DC3%05d",uint16(rawdata[2])&0xFF+uint16(rawdata[1]))
-
- 2.//fmt.Sprint不能输出
-
- &:根据fmt包API描述,fmt.Sprint是返回字符串,与fmt.Print的标准输出不同.
-
- 3.//go run *.go,且*.go引用同一packge中其他文件的函数时,提示undefined "函数名"
-
- &:[go run 时,只会编译当前文件再运行,没有导入其他文件的自定义函数]要先go build 再运行./*
-
- 4.//func FormatInt(i int64, base int) string,base的意思
-
- &:base表示进制,如八进制(8),十进制(10)等
-
- 5.//在if..else中定义同一个变量出错
-
- &:在golang语法中必须在外面先定义好,再在if..else结构中使用.
-
- 6.//go build/install 出错
-
- &:执行命令时需两个条件GOPATH和当前目录下有*.go的文件
-
- 7.//panic template: unexpected EOF
-
- &:可能是{{}}标签没有闭合
-
- 8.//error信息中template(*Template).Execute
-
- &:检查顺序:先确认go代码正确,然后看调用的模板名称是否正确或已存在,最后检查模板中的golang标签是否正确(或关闭)
-
- 9.//http.Get("www.ip138.com") unsupported protocol scheme ""
-
- &:使用http.Get时必须写明使用的协议,应使用http.Get("http://www.ip138.com")
我另外遇到一个问题就是我定义了一下struct,然后我在init前,就
var a struct,但我在使用a.X = 1的时候就报错了。理由是我的a.X没有初始化。起初没看代码说明,后来仔细看了才发现。。。不得已,在var a struct下面加了一行var a.X int。(当然,这得和 sturct中的结构一致)
Go | 评论:0
| 阅读:19670