01-yxb.py
import time from YDM import YDMHttp import requests import time import pymysql import logging import json from file_handle import wite_to_excel_text from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart import smtplib logging.basicConfig( level=logging.INFO, # 定义输出到文件的log级别,大于此级别的都被输出 format='%(asctime)s %(filename)s %(levelname)s : %(message)s', # 定义输出log的格式 datefmt='%Y-%m-%d %H:%M:%S', # 时间 filename='yibao.log', # log文件名 filemode='a') # 写入模式“w”或“a” class yyb(object): def __init__(self): self.db = pymysql.connect(host='localhost', port=3306, database='cfda', user='root', password='root', charset='utf8') self.cursor = self.db.cursor() self.headers = { "user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36", } self.url = 'http://code.nhsa.gov.cn:8000/jbzd/public/toStdOperationTreeList.html' self.sess = requests.Session() # 邮箱设置 # 设置发件服务器地址 self.host = 'smtp.163.com' # 设置发件服务器端口号。注意,这里有SSL和非SSL两种形式 self.port = 465 # 设置发件邮箱,一定要自己注册的邮箱 self.sender = '17682303516@163.com' # 设置发件邮箱的密码,163邮箱的授权码,等会登陆会用到 self.pwd = 'yu17682303516' # 设置邮件接收人,可以是扣扣邮箱 self.receiver0 = '1064145110@qq.com' # self.receiver0 = 'caifu.yu@kangcenet.com' # self.receiver1 = '54400407@qq.com' self.main() def login(self): image = self.sess.get( url='https://www.1xuebao.com/randCodeImage?a={}'.format(int(time.time() * 1000)), headers=self.headers, verify=False) with open(r'./code.jpg', 'wb') as f: f.write(image.content) filename = r'./code.jpg' codetype = 1004 # 超时时间,秒 timeout = 60 ydm = YDMHttp() cid, code_result = ydm.run(filename, codetype, timeout) code_result = input('请输入验证码:') data = { "userName": "18069859702", "password": "18069859702", "randCode": code_result, "autologin": "false", } self.sess.post(url='https://www.1xuebao.com/loginController.do?checkuser', data=data, headers=self.headers, verify=False).content.decode('utf-8') def data_area(self): data = { } html = self.sess.post(url='https://www.1xuebao.com/planController.do?infoForAddPlan', data=data, headers=self.headers, verify=False).content.decode('utf-8') data_json = json.loads(html) time.sleep(1) return data_json['companys'] def data_shop(self, id): data = { "companyid": int(id), } html = self.sess.post(url='https://www.1xuebao.com/planController.do?getStores', data=data, headers=self.headers, verify=False).content.decode('utf-8') data_json = json.loads(html) time.sleep(1) return data_json['stores'] def execls(self): data = self.data_area() head_data_area = ['id', '投放连锁名称', '是否新增(1为新增)'] records_area = [] for i, j in enumerate(data): whether = 0 num = self.cursor.execute('select id from yxb_area where ids={}'.format(j['id'])) if not num: self.cursor.execute('insert into yxb_area(ids, names, createtime) values({}, "{}", "{}")'.format(j['id'], j['text'], time.strftime("%Y-%m-%d %X", time.localtime()))) self.db.commit() whether = 1 record = [] record.append(i + 1) record.append(j['text']) record.append(whether) records_area.append(record) try: data_shop = self.data_shop(j['id']) for p in data_shop: print('p:', p) num = self.cursor.execute('select id from xyb_data_shop where store_id="{}"'.format(p['store_id'])) if not num: list_key = [] list_lalues = [] for key, lalues in p.items(): list_key.append(key) list_lalues.append("'" + str(lalues).replace("'", "‘") + "'") # 拼接sql语句 insert_sql = 'insert into xyb_data_shop({}, companym, createtime) values({}, "{}", "{}")'.format( ', '.join(list_key), ', '.join(list_lalues), j['text'], time.strftime("%Y-%m-%d %X", time.localtime())) try: self.cursor.execute(insert_sql) self.db.commit() except Exception as e: print('insert_sql:', insert_sql) print(e) except: print('错误的是', j['id'], j['text']) logging.info('错误的是:{},{}'.format(j['id'], j['text'])) n = len(records_area) # 设置生成文件所在路径 download_url = './' # excel文件名称 table_name = '投放连锁名称区域' # 写入数据到excel中 wite_to_excel_text(n, head_data_area, records_area, download_url, table_name) # 邮箱设置--------------------------- # 设置邮件正文,这里是支持HTML的 body = '<h1> 投放连锁名称.xls </h1>' # 设置正文为符合邮件格式的HTML内容 msg = MIMEText(body, 'html') message = MIMEMultipart() # 设置邮件标题 message['subject'] = ' 药学宝投放连锁名称 ' # 设置发送人 message['from'] = self.sender # 设置接收人 message['to'] = self.receiver0 message.attach(msg) # 构造附件1,传送当前目录下的 filename 文件 filename = '投放连锁名称.xls' att1 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8') att1["Content-Type"] = 'application/octet-stream' # 这里的filename可以任意写,写什么名字,邮件中显示什么名字 att1["Content-Disposition"] = 'attachment; filename="' + filename + '"' print('attachment; filename="' + filename + '"') message.attach(att1) try: # 注意!如果是使用SSL端口,这里就要改为SMTP_SSL s = smtplib.SMTP_SSL(self.host, self.port) # 登陆邮箱 s.login(self.sender, self.pwd) # 发送邮件! s.sendmail(self.sender, self.receiver0, message.as_string()) # 发送第二人邮件 # s.sendmail(self.sender, self.receiver1, message.as_string()) print('邮件发送成功') except smtplib.SMTPException: print('邮件发送失败') def main(self): self.login() self.execls() if __name__ == "__main__": yyb()
02-file_handle.py
import xlwt, datetime from xlwt import * import xlsxwriter # 写入excel文件函数 def wite_to_excel(n, head_data, records, download_url, table_name): # 获取时间戳 timestr = datetime.datetime.now().strftime("%Y%m%d%H%M%S") # 工作表 wbk = xlwt.Workbook(style_compression=2, encoding='utf-8') sheet1 = wbk.add_sheet('sheet1', cell_overwrite_ok=True) # 写入表头 for filed in range(0, len(head_data)): sheet1.write(0, filed, head_data[filed], excel_head_style()) # 写入数据记录 for row in range(1, n + 1): for col in range(0, len(head_data)): sheet1.write(row, col, records[row - 1][col], excel_record_style()) # 设置默认单元格宽度 sheet1.col(col).width = 256 * 15 wbk.save(download_url + table_name + '.xls') return timestr # 写入excel文件函数 def wite_to_excel_text(n, head_data, records, download_url, table_name): # 获取时间戳 timestr = datetime.datetime.now().strftime("%Y%m%d%H%M%S") # 工作表 wbk = xlsxwriter.Workbook(download_url + table_name + '.xls') sheet1 = wbk.add_worksheet('sheet1') # 写入表头 for filed in range(0, len(head_data)): sheet1.write(0, filed, head_data[filed]) # 写入数据记录 for row in range(1, n + 1): for col in range(0, len(head_data)): sheet1.write(row, col, records[row - 1][col]) # 设置默认单元格宽度 # sheet1.col(col).width = 256 * 15 # wbk.save(download_url + table_name + '.xls') wbk.close() return timestr # 定义导出文件表头格式 def excel_head_style(): # 创建一个样式 style = XFStyle() # 设置背景色 pattern = Pattern() pattern.pattern = Pattern.SOLID_PATTERN pattern.pattern_fore_colour = Style.colour_map['light_green'] # 设置单元格背景色 style.pattern = pattern # 设置字体 font0 = xlwt.Font() font0.name = u'微软雅黑' font0.bold = True font0.colour_index = 0 font0.height = 240 style.font = font0 # 设置文字位置 alignment = xlwt.Alignment() # 设置字体在单元格的位置 alignment.horz = xlwt.Alignment.HORZ_CENTER # 水平方向 alignment.vert = xlwt.Alignment.VERT_CENTER # 竖直方向 style.alignment = alignment # 设置边框 borders = xlwt.Borders() # Create borders borders.left = xlwt.Borders.THIN # 添加边框-虚线边框 borders.right = xlwt.Borders.THIN # 添加边框-虚线边框 borders.top = xlwt.Borders.THIN # 添加边框-虚线边框 borders.bottom = xlwt.Borders.THIN # 添加边框-虚线边框 style.borders = borders return style # 定义导出文件记录格式 def excel_record_style(): # 创建一个样式 style = XFStyle() # 设置字体 font0 = xlwt.Font() font0.name = u'微软雅黑' font0.bold = False font0.colour_index = 0 font0.height = 200 style.font = font0 # 设置文字位置 alignment = xlwt.Alignment() # 设置字体在单元格的位置 alignment.horz = xlwt.Alignment.HORZ_CENTER # 水平方向 alignment.vert = xlwt.Alignment.VERT_CENTER # 竖直方向 style.alignment = alignment # 设置边框 borders = xlwt.Borders() # Create borders borders.left = xlwt.Borders.THIN # 添加边框-虚线边框 borders.right = xlwt.Borders.THIN # 添加边框-虚线边框 borders.top = xlwt.Borders.THIN # 添加边框-虚线边框 borders.bottom = xlwt.Borders.THIN # 添加边框-虚线边框 style.borders = borders return style
03-YDM.py
# coding:utf-8 import json, time, requests class YDMHttp: apiurl = 'http://api.yundama.com/api.php' username = '' password = '' appid = '' appkey = '' def __init__(self): # 用户名 username = '17682303516' # 密码 password = 'yu1064145110' # 软件ID,开发者分成必要参数。登录开发者后台【我的软件】获得! appid = 5942 # 软件密钥,开发者分成必要参数。登录开发者后台【我的软件】获得! appkey = 'd0b1f02e797d4470c1eb3d1d0590592b' self.username = username self.password = password self.appid = str(appid) self.appkey = appkey def request(self, fields, files=[]): response = self.post_url(self.apiurl, fields, files) response = json.loads(response) return response def balance(self): data = {'method': 'balance', 'username': self.username, 'password': self.password, 'appid': self.appid, 'appkey': self.appkey} response = self.request(data) if (response): if (response['ret'] and response['ret'] < 0): return response['ret'] else: return response['balance'] else: return -9001 def login(self): data = {'method': 'login', 'username': self.username, 'password': self.password, 'appid': self.appid, 'appkey': self.appkey} response = self.request(data) if (response): if (response['ret'] and response['ret'] < 0): return response['ret'] else: return response['uid'] else: return -9001 def upload(self, filename, codetype, timeout): data = {'method': 'upload', 'username': self.username, 'password': self.password, 'appid': self.appid, 'appkey': self.appkey, 'codetype': str(codetype), 'timeout': str(timeout)} file = {'file': filename} response = self.request(data, file) if (response): if (response['ret'] and response['ret'] < 0): return response['ret'] else: return response['cid'] else: return -9001 def result(self, cid): data = {'method': 'result', 'username': self.username, 'password': self.password, 'appid': self.appid, 'appkey': self.appkey, 'cid': str(cid)} response = self.request(data) return response and response['text'] or '' def decode(self, filename, codetype, timeout): cid = self.upload(filename, codetype, timeout) if (cid > 0): for i in range(0, timeout): result = self.result(cid) if (result != ''): return cid, result else: time.sleep(1) return -3003, '' else: return cid, '' def report(self, cid): data = {'method': 'report', 'username': self.username, 'password': self.password, 'appid': self.appid, 'appkey': self.appkey, 'cid': str(cid), 'flag': '0'} response = self.request(data) if (response): return response['ret'] else: return -9001 def post_url(self, url, fields, files=[]): for key in files: files[key] = open(files[key], 'rb') res = requests.post(url, files=files, data=fields) return res.text def run(self, filename, codetype, timeout): uid = self.login() cid, result = self.decode(filename, codetype, timeout) return cid, result ###################################################################### if __name__ == "__main__": # 图片文件 filename = 'code.jpg' # 验证码类型,# 例:1004表示4位字母数字,不同类型收费不同。请准确填写,否则影响识别率。在此查询所有类型 http://www.yundama.com/price.html codetype = 1004 # 超时时间,秒 timeout = 60 ydm = YDMHttp() cid, result = ydm.run(filename, codetype, timeout) print(result)