python自动登录,用户管理

功能点如下:
  • 用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')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值