1
+ #!/usr/bin/env python
2
+ # -*- encoding: utf-8 -*-
3
+ """
4
+ @Description: 玩客家 币价变化,邮件通知 api
5
+ @Date :2020/12/17
6
+ @Author :xhunmon
7
+
8
+ """
9
+ import json
10
+ import smtplib
11
+ import time
12
+ from email .mime .multipart import MIMEMultipart
13
+ from email .mime .text import MIMEText
14
+
15
+ import requests
16
+ from my_fake_useragent import UserAgent
17
+
18
+ ua = UserAgent ()
19
+ agent = ua .random ()
20
+
21
+
22
+ class Email (object ):
23
+ def __init__ (self , from_user , pwd , to_other ):
24
+ """
25
+ :param from_user: 发送者邮箱号
26
+ :param pwd: 发送者邮箱密码(非登录密码)
27
+ :param to_other: 目标邮箱
28
+ """
29
+ self .__from_user = from_user
30
+ self .__pwd = pwd
31
+ self .__to_other = to_other
32
+
33
+ def sendMsg (self , title = "" , content = "" ):
34
+ print ("%s向%s发送邮件:标题{%s}\t 内容{%s}" % (self .__from_user , self .__to_other , title , content ))
35
+ retry = 0
36
+ while True :
37
+ print ("【%s】开始发送,次数:%3d" % (title , retry ))
38
+ try :
39
+ msg = MIMEMultipart ()
40
+ msg .attach (MIMEText (content , 'plain' , 'utf-8' ))
41
+ msg ['Subject' ] = title
42
+ msg ['From' ] = self .__from_user
43
+ s = smtplib .SMTP_SSL ("smtp.qq.com" , 465 ) # 通过SSL方式发送,服务器地址和端口
44
+ s .login (self .__from_user , self .__pwd ) # 登录邮箱
45
+ s .sendmail (self .__from_user , self .__to_other , msg .as_string ()) # 开始发送
46
+ print ("邮件发送成功,发送时间【%s】" % (time .strftime ('%Y-%m-%d %H:%M:%S' , time .localtime (time .time ()))))
47
+ break
48
+ except Exception as e :
49
+ print (
50
+ "邮件发送失败,5秒钟后重新发送,发送时间【%s】" % (time .strftime ('%Y-%m-%d %H:%M:%S' , time .localtime (time .time ()))))
51
+ print (e )
52
+ retry += 1
53
+ time .sleep (5 )
54
+
55
+
56
+ class Coin (object ):
57
+ def __init__ (self , coin = "" , diff = 3.0 , sleep = 3 , reload = 1 * 60 * 60 , email : Email = None ):
58
+ self .__COIN = coin # 币名称
59
+ self .__DIFF = diff # 当trend的值幅度差为该设定值,邮箱进行通知
60
+ self .__SLEEP_TIME = sleep # 每次获取的睡眠时间
61
+ self .__RELOAD_TIME = reload # 每小时重复更新一次页面
62
+ self .__email = email
63
+ self .__RINGE_COUNT = int (self .__RELOAD_TIME / self .__SLEEP_TIME )
64
+ self .__is_release = False
65
+ self .__last_price = 0.0
66
+ self .__last_time = 0
67
+ self .__last_trend = 0.0
68
+ self .__is_first = True
69
+ self .__URL = "https://app.wkj.pub/api/market/getMarketTradeJson" # 请求地址
70
+ self .__DATA = 'market=%s_bitcny&sellnum=10&buynum=10&donenum=10' % coin .lower ()
71
+ self .__headers = {"user-agent" : agent }
72
+
73
+ def start (self ):
74
+ print ("thread【%2s diff is %2s , sleep is %2d ,retry time is %5ld】" % (
75
+ self .__COIN , str (self .__DIFF ), self .__SLEEP_TIME , self .__RELOAD_TIME ))
76
+ while True :
77
+ try :
78
+ time .sleep (self .__SLEEP_TIME )
79
+ if self .__is_release :
80
+ print ("%2s 已释放,退出!" % self .__COIN )
81
+ break
82
+ req = requests .post (self .__URL , data = self .__DATA , headers = self .__headers )
83
+ if req .status_code != 200 :
84
+ print ("%2s 请求失败-%s" % (self .__COIN , req .status_code ))
85
+ continue
86
+ data = json .loads (req .text )
87
+ # print(req.text)
88
+ price = float (data .get ("data" ).get ("new_price" )) # 当前价格
89
+ trend = float (data .get ("data" ).get ("change" )) # 跌涨幅 趋势
90
+ num = float (data .get ("data" ).get ("doneOrders" )[0 ].get ("num" )) # 当前成交价
91
+ done_time = int (data .get ("data" ).get ("doneOrders" )[0 ].get ("time" )) # 当前成交价
92
+ done_type = int (data .get ("data" ).get ("doneOrders" )[0 ].get ("type" )) # 当前状态(1-buy,2-sell)
93
+ if price <= 0 :
94
+ print ("%2s 价格为0,没有获取到数据,跳过" % self .__COIN )
95
+ continue
96
+ if done_time == self .__last_time : # 没有最新成交的单
97
+ print ("【%2s …………】" % self .__COIN )
98
+ continue
99
+ status = "buy" if done_type == 1 else "sell"
100
+ print ("【%2s \t | %2s \t | %5s \t | %2s% \t | %2s】" % (
101
+ self .__COIN , status , str (price ), trend , str (num )))
102
+ self .__last_price = price
103
+ self .__last_time = done_time
104
+ if self .__is_first : # 第一次启动就不必了
105
+ self .__is_first = False
106
+ self .__last_trend = trend
107
+ print ("【%2s __is_first】" % self .__COIN )
108
+ continue
109
+ temp_time = time .strftime ('%Y-%m-%d %H:%M:%S' , time .localtime (time .time ()))
110
+ if self .__last_trend - trend > self .__DIFF : # 跌了
111
+ self .__last_trend = trend
112
+ self .__email .sendMsg (
113
+ "【%2s跌:%s | %s%】" % (self .__COIN , str (self .__last_price ), str (trend )),
114
+ str ("【价格:%s,跌幅:%s%,时间:%s】" % (
115
+ str (self .__last_price ), str (trend ), temp_time )))
116
+ elif trend - self .__last_trend > self .__DIFF : # 涨了
117
+ self .__last_trend = trend
118
+ self .__email .sendMsg (
119
+ "【%2s涨:%s | %s%】" % (self .__COIN , str (self .__last_price ), str (trend )),
120
+ str ("【价格:%s,涨幅:%s%,时间:%s】" % (
121
+ str (self .__last_price ), str (trend ), temp_time )))
122
+ except Exception as e :
123
+ print ("wkj api【%2s】异常,5秒钟后重试!" % self .__COIN )
124
+ print (e )
125
+ time .sleep (5 )
126
+ print ("【%2s 结束了】" % self .__COIN )
127
+
128
+
129
+ if __name__ == "__main__" :
130
+ email = Email (
from_user = "[email protected] " ,
pwd = "bbb" ,
to_other = '[email protected] ' )
131
+ eth = Coin (coin = "ETH" , diff = 2 , sleep = 5 , reload = 2 * 60 * 60 , email = email )
132
+ eth .start ()
0 commit comments