手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表全部文章

wget post数据

 一直以为wget只是下载点东西的工具。看到一篇网上的文章,才注意到wget原来还可以post数据。

为什么我想用wget来post数据呢?是因为。。。busybox不带curl,而bash版的ddns更新(dnspod的域名更新)是使用curl的。既然curl不支持,我就google了一下:wget能够post数据吗?
果然,第一篇就是:
http://hi.baidu.com/hhflying/item/7ae51f3d30ce64fdde2221d9
  1. 这段时间需要用wget做一些事情,主要是抓取网页的数据工作,发现wget还是很强大的。下面是一些应用场景:  
  2. 1. 简单页面的抓取  
  3. wget的最基本用法  
  4. wget http://domain.com/path/simple_page.html  
  5. 2. 添加自己的head  
  6. 有些网站或者页面,需要额外的认证,所以需要添加额外的HTTP Header,使用方法:  
  7. wget --header="MyHeader: head_value" http://domain.com/path/page/need_header.php  
  8. 3. 伪装成浏览器  
  9. 有些网站,例如facebook,会检测请求方式是否是浏览器,如果不是正常的浏览器,那么会redirect到一个"incompatible browser"的错误页面。这时候需要wget伪装成一个浏览器(我是Mozilla Firefox!):  
  10. 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  
  11. 4. post数据到某个页面  
  12. wget不光可以用get方式请求网页,还可以post data的,那样就可以实现自动注册、自动登录了(有验证码的页面除外。。。。)  
  13. wget --post-data="user=user1&pass=pass1&submit=Login" http://domain.com/login.php  
  14. 5. 访问需要登录的页面  
  15. 有些页面的访问需要登录,访问的时候需要传递cookie,这时候就需要和上面提到的post方式结合。一般过程是:post用户名和密码登录、保存cookie,然后访问页面时附带上cookie。  
  16. wget --post-data="user=user1&pass=pass1&submit=Login" --save-cookies=cookie.txt --keep-session-cookies http://domain.com/login.php  
  17. wget --load-cookies=cookie.txt http://domain.com/path/page_need_login.php  
  18. 暂时就探索到这些,以后有什么新的用法,继续补充。  
不过,可惜的是,我运行下来之后,还有一个小问题:
https://dnsapi.cn/Record.Ddns: HTTPS support not compiled in.
哎。。。我没有openssl,https不支持啊。。纠结,uis2000的路真难走。
 

Tags: wget, uis2000

go 进行简单的POST和GET

用Go来处理GET实在是太简单了。。

GET
  1. u, _ :url.Parse(SMS_URL)  
  2. :u.Query()  
  3. q.Set("username", SMS_USER)  
  4. q.Set("password", SMS_PASS)  
  5. q.Set("mobile", s.To)  
  6. q.Set("message", s.Content)  
  7. u.RawQuery = q.Encode()  
  8. res,err:=http.GET(u.String());  
POST分多种,一种是key/value,一种是纯body,还有。。能够上传文件的。这里先不谈上传文件(我还没有用到)
XML/HTML代码
  1.     body :bytes.NewBuffer(msg)  
  2.     res, err :http.Post(http://api.xxx.com/, "application/x-www-form-urlencoded", body)  
  3.   
  4. :make(url.Values)  
  5.         v.Set("email", "anything@stathat.com")  
  6.         v.Set("stat", "messages sent - female to male")  
  7.         v.Set("count", "1")  
  8.         res, err :http.PostForm("http://api.xxx.com/", values)  
处理res也非常方便:
XML/HTML代码
  1. if err != nil {  
  2.     log.Fatal(err)  
  3.     return  
  4. }  
  5. result, err :ioutil.ReadAll(res.Body)  
  6. res.Body.Close()  
  7. if err != nil {  
  8.     log.Fatal(err)  
  9.     return  
  10. }  
  11. fmt.Printf("%s", result)  
就是这样的方便
 
 
 
 
 

转:go语言扫雷

 不要以为扫雷 就是游戏扫雷,其实只不过是扫清程序中可能会遇到的坑。比如原作者写的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. 1.//实现前导零出错:sn:="7DC3"+fmt.printf("%05d",  uint16(rawdata[2])&0xFF+uint16(rawdata[1]))  
  2.   
  3. &:[fmt.Printf返回的是一个int和一个error,不能与string用+号一起操作]  
  4.   
  5. sn :fmt.Sprintf("%s%05d", "7DC3", uint16(rawdata[2])&0xFF+uint16(rawdata[1]))或fmt.Sprintf("7DC3%05d",uint16(rawdata[2])&0xFF+uint16(rawdata[1]))  
  6.   
  7. 2.//fmt.Sprint不能输出  
  8.   
  9. &:根据fmt包API描述,fmt.Sprint是返回字符串,与fmt.Print的标准输出不同.  
  10.   
  11. 3.//go run *.go,且*.go引用同一packge中其他文件的函数时,提示undefined "函数名"  
  12.   
  13. &:[go run 时,只会编译当前文件再运行,没有导入其他文件的自定义函数]要先go build 再运行./*  
  14.   
  15. 4.//func FormatInt(i int64, base int) string,base的意思  
  16.   
  17. &:base表示进制,如八进制(8),十进制(10)等  
  18.   
  19. 5.//在if..else中定义同一个变量出错  
  20.   
  21. &:在golang语法中必须在外面先定义好,再在if..else结构中使用.  
  22.   
  23. 6.//go build/install 出错  
  24.   
  25. &:执行命令时需两个条件GOPATH和当前目录下有*.go的文件  
  26.   
  27. 7.//panic template: unexpected EOF  
  28.   
  29. &:可能是{{}}标签没有闭合  
  30.   
  31. 8.//error信息中template(*Template).Execute  
  32.   
  33. &:检查顺序:先确认go代码正确,然后看调用的模板名称是否正确或已存在,最后检查模板中的golang标签是否正确(或关闭)  
  34.   
  35. 9.//http.Get("www.ip138.com") unsupported protocol scheme ""  
  36.   
  37. &:使用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中的结构一致)

六种方法全面解释Linux下进程间通信

 因为最近在写点东西遇到了这方面的问题。所以关注了一下,这段内容是摘抄来的。因为以前用PHP的时候,一般就是shm_attach/msg_get_queue/ 管道等

有些东西不是特别熟,所以记录下来做笔记 

 

Linux下进程间通信大致有以下几种:(来自:http://golang.usr.cc/blog-1403-3071.html)
  1. 1.socket  
  2. 2.管道(包括匿名管道适用于父子进程,命名管道)  
  3. 3.信号量  
  4. 4.共享内存  
  5. 5.消息队列 
  6.  
  7. 1.socket  
  8. socket可以用于本地进程间通信也可以用于远程间,是最常用的。  
  9. 2.管道--匿名管道  
  10. 一般用pipe创建,在父子间通信。在父进程中关闭读/写管道,在子进程中关闭写/读管道。  
  11. 2.管道--命名管道  
  12. 一般用mkfifo来创建。如果没有说明管道是非阻塞的,那么一个为读打开的管道将阻塞直到有进程为写打开此FIFO。同样如果为写打开的管道将阻塞直到有进程为读打开此FIFO。  
  13. 3.信号量  
  14. 一个进程可以用kill发送信号至另外一个进程。  
  15. 4.共享内存  
  16. 使用函数:shmget、shmat、shmctl、shmdt  
  17. 用shmget函数得到一块内存,并用shmat设置为允许本进程使用这块共享内存。使用完以后用shmdt删除内存块。  
  18. 5.消息队列  
  19. 使用函数:msgget、msgsnd、msgrcv、msgctl  
  20. 使用步骤同上。  

 

BAE的坑

 自从GAE出来后。什么SAE,ACE,BAE什么什么的就全部出来了

ACE我跑几个程序一直有问题,禁用了一些函数,所以我最近在看BAE。速度也不错,也能绑域名。所以它就成了首选。但BAE有一个坑 需要注意
 
如果你的程序的上传没有改过。那么一般都是上传在自己当前的项目目录里,而这个目录由于没有经过svn上传,所以它并不在版本库里,因此,一旦碰到BAE来一个svn迁移的事件。或者更新的时候,极有可能你上传的那些附件会全部丢失。
 
慎重。我就觉得BAE就象一个实验室。我们上传代码到BAE的svn库里。然后svn库会自动 checkout到BAE的平台。于是。。如果他们要迁移了。这些数据应该都是直接delete。然后再checkout一份。
 
建议找个程序,上传到BAE自带的存储中(就象sae的存储)。

Tags: bae