功能点如下:
- 用python登录网站,获取积分信息
- 数据库存储用户信息,网站信息
- 邮件发送登录结果信息等
- 每天定时登录
all_work.py
from auto_login.login import login
from auto_login.db_info import get_info,get_total_num,update_remain
from auto_login.smtp import send
from auto_login.log import logger
import time
def all_login():
user_num = get_total_num()[0]
logging = logger
print('******************************************')
s = '需登录账户数:'+str(user_num)
logging.info(s)
print(s)
i = 0
while (i < user_num):
info = get_info(10, i)
succ_num = 0
fail_num = 0
no_remain_num = 0
i += 10
for user in info:
if user['remain_days'] == None or user['remain_days']<= 0:
no_remain_num+=1
continue
print('*****************************************************')
r = login(user['url'], user['username'], user['passw'])
if r != -1:
succ_num += 1
s = '用户 '+user['username']+' 登录成功!'+ str(r)+'; 剩余自动登录天数:'+str(user['remain_days']-1)+'\n'+time.asctime()
logging.info(s+'\n')
print(s)
update_remain(user['id'], user['remain_days']-1)
if user['rev_email'] == 1:
send(s, user['email'])
# pass
else:
s = '用户 '+ user['username']+ ' 登录出错!'
logging.error(s+'\n')
print(s)
fail_num += 1
print('*****************************************************')
result_str = '成功登录账户数:'+str(succ_num)+' 失败登录账户数:'+str(fail_num)+' 余额不足账户数:'+str(no_remain_num)+'\n'+time.asctime()
logging.info(result_str+'\n')
print(result_str)
# send(result_str)
def wait_time():
start_time = '00:01'
while(True):
hour_and_min = time.strftime('%H:%M')
if hour_and_min == start_time:
print('**************开始执行登录**************',time.asctime())
all_login()
time.sleep(85000)
time.sleep(50)
if __name__ == '__main__':
all_login()
db_info.py
from mysql import connector
def get_info(num, start_index):
conn = connector.connect(user = 'root', password='123456', database='auto_login')
cursor = conn.cursor(dictionary=True)
sql = 'select u.id,username,passw,email,rev_email,web_id,url,other_info,remain_days,last_points from ' \
'users u left join websites w on u.web_id = w.id limit %s,%s;'
cursor.execute(sql, [start_index, num])
info = cursor.fetchall()
conn.close()
return info
def get_total_num():
conn = connector.connect(user = 'root', password='123456', database='auto_login')
cursor = conn.cursor()
sql = 'select count(id) from users;'
cursor.execute(sql)
num = cursor.fetchone()
conn.close()
return num
def update_remain(id, days):
conn = connector.connect(user = 'root', password='123456', database='auto_login')
cursor = conn.cursor(dictionary=True)
sql = 'update users set remain_days = %s where id = %s;'
cursor.execute(sql, [days, id])
conn.commit()
conn.close()
if __name__ == '__main__':
val = get_info(10, 0)
print(val,type(val), type(val[0]))
num = get_total_num()
print('total num = ',num)
login.py
import urllib,re
from urllib import request
from http import cookiejar
from auto_login.log import logger
def login(url, id, passw, action='login'):
logging = logger
# 封装头信息,伪装成浏览器
header = {
'Connection': 'Keep-Alive',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'User-Agent': 'Mozilla/5.0(compatible;MSIE9.0;WindowsPhoneOS7.5;Trident/5.0;IEMobile/9.0;HTC;Titan)',
'X-Requested-With': 'XMLHttpRequest'
}
login_data = urllib.parse.urlencode({
'action': action,
'username': id,
'pass': passw
}).encode(encoding='utf8')
try:
req = request.Request(url, login_data, headers=header)
cj = cookiejar.LWPCookieJar()
opener = request.build_opener(request.HTTPCookieProcessor(cj))
# request.install_opener(opener)
resp = opener.open(req)
page = resp.read().decode('utf8')
# print(page)
pattern = '本次登录获得 \d* 积分|积分:\d*'
result = re.search(pattern, page)
if result:
points = result.group()
# print(points)
return points
else:
if page.find('用户名或密码错误,请注意区分大小写') > -1:
s = '用户'+id+' 用户名或密码错误,请注意区分大小写'
logging.warning(s)
print(s)
return -1
s = '用户'+id+'未找到积分,可以登录'
logging.error(s+'\n')
return -1
except Exception as e:
print('用户',id, url,' 登录失败!')
print(e)
return -1
if __name__ == '__main__':
url = 'www.baidu.com'
id = '767108'
passw = '12230'
action = 'login'
login(url, id, passw, action)
smtp.py
import smtplib,time,wmi,psutil
# import logging;logging.basicConfig(level=logging.INFO, filename='F:\\auto_login.log', filemode='a',format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: \n%(message)s')
from email.mime.text import MIMEText
from auto_login.log import logger
e_from = 'xusfdsdf89@163.com'
password = '1230sdaf0aa'
host = 'smtp.163.com'
port = 25
subject = '自动登录结果通知'
logging = logger
def send(content, e_to = '76asdf118@qq.com'):
msg = MIMEText(content)
# logging.debug(msg.as_string())
msg['Subject'] = subject
msg['From'] = e_from
msg['To'] = e_to
#qq
# s = smtplib.SMTP_SSL(host, port)
#163
s = smtplib.SMTP(host, port)
try:
s.login(e_from, password)
s.sendmail(e_from, e_to, msg.as_string())
logging.info('send success')
except Exception as e:
logging.info('send failure', e)
pass
finally:
s.quit()
log.py
import logging
def logger_console_file():
# 创建一个logger
logger = logging.getLogger('mylog')
logger.setLevel(logging.INFO)
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('F:\\auto_login.log')
fh.setLevel(logging.INFO)
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s :\n %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 给logger添加handler
logger.addHandler(fh)
# logger.addHandler(ch)
return logger
logger = logger_console_file()
if __name__ == '__main__':
logger = logger_console_file()
logger.info('hello')