python 爬虫之某虚拟币抢币软件的实现过程

python爬虫之某虚拟币抢币软件的实现

闲着无聊,最近发现了一个虚拟币平台(不是在做广告,这个平台差不多倒闭了,千万别入坑)),只要能抢到币,就能盈利。由于手动抢单的速度太慢,经常抢不到,于是就自己写了一个多线程的简单的抢币软件,先来放一个软件界面图,哈哈:
python 爬虫之某虚拟币抢币软件的实现过程_第1张图片
首先,先实现批量登陆的功能吧,打开这个虚拟币的网址https://cs.gmyf.net/#/passport/login,打开之后如下图:
python 爬虫之某虚拟币抢币软件的实现过程_第2张图片
看到这个界面,先打开浏览器的开发者模式,不管3721先发送一个请求看看是怎么样的,如下:
python 爬虫之某虚拟币抢币软件的实现过程_第3张图片
请求方式是post,请求的接口也看到了,来看看请求参数吧,如下:
python 爬虫之某虚拟币抢币软件的实现过程_第4张图片
开始我还以为应该会有一些其他加密的参数或者csrf token之类的参数,结果就只有账号密码,有点出乎意外,那就直接干吧(登陆的目的是获取每一个账号的token,以便后面发送报价请求),伪代码如下:

def get_token():
	# 先打开一个窗口,选择账号密码所在文件
	ilename = filedialog.askopenfilename()
	# 打开文件
    with open(filename, 'r') as f:
    	# 读取文件内容
        useracount = f.read()
    # 按换行分割,获取每一个账号密码  
    useracount = useracount.split('\n')
    userpass = []
    # 遍历文件,获取账号密码,这里账号密码中间是以:分割
    # 生成一个ua 
    headers = get_headers()
    postdata = {}
    # 登陆的接口
    url = 'https://cs.gmyf.net/api/account/login'
    for i in useracount:
        i = i.split(":")
        if len(i) == 2:
        	postdata.update({
                'username': i[0], # 账号
                'password': i[1], # 密码
            })
            # 发送账号密码登陆
            res = requests.post(url, data=postdata, headers=headers)
            # 返回的是json数据
            res = json.loads(res.content.decode())
            # 如果登陆成功就保存数据
            if res['msg'] == '登录成功':
                with open('./token.txt', 'a') as f:
                    f.write(i[0] + ':' + res['data']['access_token'])
                    f.write('\n')      

成功获取到token之后,那接下来就要开始报价了,先来看看报价的页面,如下:
python 爬虫之某虚拟币抢币软件的实现过程_第5张图片
第一次看到这个页面,就觉得这个平台肯定干不久,老规矩,打开开发者模式,先发一个请求,看看参数吧,如下:
python 爬虫之某虚拟币抢币软件的实现过程_第6张图片
发送报价之后,浏览器请求了2次,如上图,先看上图红框中这个接口返回的是什么吧,如下:
python 爬虫之某虚拟币抢币软件的实现过程_第7张图片
请求方式是post(这里卡了一小会,因为这个请求发送的时候没有携带参数,一直以为是get请求,细看才发现是post,我靠),返回的结果如下:
python 爬虫之某虚拟币抢币软件的实现过程_第8张图片
先把这个返回结果放一边,到这一步知道这个data有用,但是具体做什么用还不知道,接下来继续下一个接口,如下图:
python 爬虫之某虚拟币抢币软件的实现过程_第9张图片
请求方式是post,在看看参数把:
python 爬虫之某虚拟币抢币软件的实现过程_第10张图片
重点看看红框的sec这个参数,虽然参数名字跟上面那个sec一样,但是这里的值不是上图中返回的那个值,是一个md5值,没办法了,只能分析js源码了,如下:
python 爬虫之某虚拟币抢币软件的实现过程_第11张图片
还是打开开发者模式,分析js源码把,通过搜索这个api地址,发现了这个js代码的部分,如下:
python 爬虫之某虚拟币抢币软件的实现过程_第12张图片
然后一步步debug,又找到了一个代码段,如下:
python 爬虫之某虚拟币抢币软件的实现过程_第13张图片
发现了这个v是登陆获取的那个token,然后通过切片的方式获取索引10-20之间的值,在跟之前sec这个api接口返回值拼接,最终计算md5值,然后就有了sec这个参数了,那接下来就可以开始发送请求了,开始干把:

# url = 'https://cs.gmyf.net/api/market/make/sec'  # 获取报价id的接口
# url2 = 'https://cs.gmyf.net/api/market/make'  # 报价接口

def buy(token,num,price):
	# 先构造请求头,加入token
	headers.update({
            'x-requested-with': 'XMLHttpRequest',
            'xu-token': token,
        })
    # 先请求 sec的接口,获取待拼接的sec参数
    res = requests.post(self.url, headers=headers, data=postdate)
    res = json.loads(res.content.decode())
    # 判断一下,是否请求成功了
    postdate={}
    if res1['msg'] == 'success':
	   postdate.update({
	        'market_id': '16',
	        'market_type': '1',
	        'num': num,
	        'price': price,
	        # 请求返回的sec参数 + token切片后的值,算出md5值
	        'sec': md5hash(res['data'] + token[10:20])
	    })
	    # 请求数据,买入虚拟币。
	    resp = requests.post(self.url2, headers=headers, data=postdate)
	    print(res.content.decode())

至此,报价已经可以发送成功了,以上都是伪代码,主要说的是一个实现的过程,由于这个网站做了限制,一个IP每秒只允许一个账号发送报价,所以还要加入代理IP,由于账号数量太多,IP需求量也大,必须是高质量专属代理IP,关注我,下一期将会跟大家分享如何免费获取付费级别的高质量专属代理IP。码字辛苦,帮忙关注一下公众号,有福利哦。
python 爬虫之某虚拟币抢币软件的实现过程_第14张图片

你可能感兴趣的:(爬虫,支付宝,python,post,json,https)