食亨菜单导出浆_yunV2.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. # Author:Clown
  2. # -*- codeing = utf-8 -*-
  3. # @Time :2022/3/16 14:17
  4. # @File: 食亨菜单导出浆v2.py
  5. import requests
  6. import pandas as pd
  7. import time
  8. import xlrd
  9. from datetime import date, timedelta, datetime
  10. import os
  11. import shutil
  12. import pymysql
  13. import sys
  14. import traceback
  15. import hashlib
  16. import csv
  17. def takeThetoken(username,password):
  18. '''密钥获取返回【token】'''
  19. try:
  20. cookie = ''
  21. url = 'https://bi.shihengtech.com/api/userlogin/login'
  22. headers = {
  23. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36',
  24. 'Cookie': cookie}
  25. params = {'username': username,
  26. 'password': password}
  27. resp = requests.post(url, headers=headers, json=params)
  28. token = resp.json()['result']
  29. except:
  30. token = ''
  31. return token
  32. def submit(startTime,endTime,headers,brandId):
  33. '''提交下载请求返回【submit_result】'''
  34. url_submit = "https://bi.shihengtech.com/api/excel/order/detail/export/submit"
  35. params_submit = {
  36. "brandId":brandId,
  37. "endTime":endTime,
  38. "labelIds":[],
  39. "orderStatusEnum":"VALID",
  40. "startTime":startTime,
  41. "platforms":[0,1],
  42. "provinces":None,
  43. "cities":None,
  44. "shopIds":None,
  45. "taskBizTypeEnum":"ORDER_DETAIL_DETAIL"}
  46. resp_submit = requests.post(url_submit,json = params_submit,headers = headers)
  47. if resp_submit.json()['code'] == 200:
  48. submit_result = 1
  49. print("成功提交请求")
  50. return submit_result
  51. else:
  52. submit_result = 0
  53. print("请求失败")
  54. return submit_result
  55. def queryTasks(headers):
  56. '''查找下载文件列表记录返回【df_linke,df_name】'''
  57. url_queryTasks = "https://bi.shihengtech.com/api/shtask/queryTasks"
  58. params_queryTasks = {
  59. "pageNo":1,
  60. "pageSize":20
  61. }
  62. resp_queryTasks = requests.post(url_queryTasks,json = params_queryTasks,headers = headers)
  63. data_queryTasks = resp_queryTasks.json()['result']['result']
  64. df_link = data_queryTasks[0]["resultUrl"]
  65. df_name = data_queryTasks[0]["name"]
  66. return df_link,df_name
  67. def excel2parts(excel_file,save_path_forms,save_path_goods):
  68. '''将导出的文件,按sheet分成两张表格,当表格sheet名称发生变化时,在此处进行修该'''
  69. for a,b,files in os.walk(excel_file,topdown = False):
  70. for file in files:
  71. path = str(excel_file)+'/'+str(file)
  72. workbook = xlrd.open_workbook(r'%s'%str(path))
  73. sheet_names = workbook.sheet_names()
  74. print(file, '正在拆分')
  75. for worksheet_name in sheet_names:
  76. if worksheet_name == '订单明细':
  77. data_xls = pd.read_excel(path,worksheet_name,dtype=str)
  78. data_xls.to_excel(save_path_forms + '/' +str(file)[:-5] + worksheet_name + '.xlsx', index=0,encoding='utf-8-sig')
  79. print(file, worksheet_name, '已拆出')
  80. else:
  81. data_xls = pd.read_excel(path, worksheet_name, dtype=str)
  82. data_xls.to_excel(save_path_goods + '/' + str(file)[:-5] + worksheet_name + '.xlsx', index=0,encoding='utf-8-sig')
  83. print(file, worksheet_name, '已拆出')
  84. def excel2sheet(file_path):
  85. '''读取excel表sheet中的数据返回【sheet_data】'''
  86. try:
  87. for a, b, files in os.walk(file_path, topdown=False):
  88. for file in files:
  89. path = str(file_path) + '/' + str(file)
  90. sheet_data = xlrd.open_workbook(path).sheet_by_name('Sheet1')
  91. print('\n%s 正在转csv文件' % str(file))
  92. except:
  93. sheet_data = ''
  94. print('excel数据读取失败')
  95. return sheet_data
  96. def linkTomySql(host,passwd,db_name):
  97. '''连接至数据库返回【db】,v2新增local_infile=1 打开文件导入权限'''
  98. try:
  99. #本地连接为:localhost 服务器连接为:124.222.188.59
  100. db = pymysql.connect(
  101. host='124.222.188.59', user="root",
  102. passwd=passwd,
  103. db=db_name,
  104. charset='utf8mb4',
  105. local_infile=1,
  106. port=63306)
  107. print('\nconnect to mysql server 成功')
  108. print('------------------------------------')
  109. except:
  110. print("\ncould not connect to mysql server")
  111. db = "连接失败"
  112. return db
  113. def excel2csv_forms(sheet_data,file_path):
  114. '''v2新增 excel文件转csv文件返回【csv_name】 处理forms'''
  115. csv_name = 'excel2csvForms.csv'
  116. f = open(file_path + '/' + f'{csv_name}', mode='a', encoding='utf-8-sig', newline='')
  117. csv_writer = csv.writer(f)
  118. csv_title = ['col0', 'col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7',
  119. 'col8', 'col9', 'col10', 'col11', 'col12', 'col13', 'col14', 'col15',
  120. 'col16', 'col17', 'col18', 'col19', 'col20', 'col21', 'col22', 'col23',
  121. 'col24', 'col25', 'col26', 'col27']
  122. csv_writer.writerow(csv_title)
  123. row_num = sheet_data.nrows
  124. for i in range(1, row_num): # 第一行是标题名,对应表中的字段名所以应该从第二行开始,计算机以0开始计数,所以值是1
  125. row_data = sheet_data.row_values(i)
  126. value = [row_data[0], row_data[1], row_data[2], row_data[3], row_data[4], row_data[5], row_data[6], row_data[7],
  127. row_data[8], row_data[9], row_data[10], row_data[11], row_data[12], row_data[13], row_data[14],
  128. row_data[15], row_data[16], row_data[17], row_data[18], row_data[19], row_data[20], row_data[21],
  129. row_data[22], row_data[23], row_data[24], row_data[25], row_data[26], row_data[27]]
  130. csv_writer.writerow(value)
  131. per = i / (row_num - 1) * 100
  132. print('\r 已导入%s行,共计%s行,已完成%2d%%' % (str(i), str(row_num - 1), per), end='')
  133. # print('\r 已导入%s行,共计%s行,已完成%2d%%' % (str(i), str(row_num - 1), per))
  134. return csv_name
  135. # def insert_forms_deta(sheet_data,db):
  136. # '''v1版函数 导入文件至order_froms或order_froms_zzx'''
  137. # cursor = db.cursor()
  138. # row_num = sheet_data.nrows
  139. # for i in range(1, row_num): # 第一行是标题名,对应表中的字段名所以应该从第二行开始,计算机以0开始计数,所以值是1
  140. # row_data = sheet_data.row_values(i)
  141. # value = (row_data[0], row_data[1], row_data[2], row_data[3], row_data[4], row_data[5], row_data[6], row_data[7], row_data[8], row_data[9], row_data[10], row_data[11], row_data[12], row_data[13], row_data[14], row_data[15], row_data[16], row_data[17], row_data[18], row_data[19], row_data[20], row_data[21], row_data[22], row_data[23], row_data[24], row_data[25], row_data[26], row_data[27])
  142. # sql = "INSERT INTO order_forms " \
  143. # "VALUES" \
  144. # "(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
  145. # cursor.execute(sql, value) # 执行sql语句
  146. # db.commit()
  147. # per = i / (row_num - 1) * 100
  148. # print('\r 已导入%s行,共计%s行,已完成%2d%%' % (str(i), str(row_num - 1), per), end='')
  149. # cursor.close() # 关闭连接
  150. def excel2csv_goods(sheet_data,file_path):
  151. '''v2新增 excel文件转csv文件返回【csv_name】 处理goods'''
  152. csv_name = 'excel2csvGoods.csv'
  153. f = open(file_path + '/' + f'{csv_name}', mode='a', encoding='utf-8-sig', newline='')
  154. csv_writer = csv.writer(f)
  155. csv_title = ['col0', 'col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7',
  156. 'col8', 'col9', 'col10', 'col11', 'col12', 'col13', 'col14', 'col15',
  157. 'col16', 'col17', 'col18', 'col19', 'col20', 'col21']
  158. csv_writer.writerow(csv_title)
  159. row_num = sheet_data.nrows
  160. for i in range(1, row_num): # 第一行是标题名,对应表中的字段名所以应该从第二行开始,计算机以0开始计数,所以值是1
  161. n = (str(i)).zfill(10)
  162. time_str = str(int(time.time())) + n
  163. row_data = sheet_data.row_values(i)
  164. # 定义hash值
  165. md5 = hashlib.md5()
  166. md5.update(row_data[3].encode('utf-8'))
  167. # 将【标准商品名称】改为hash值
  168. value = [time_str, row_data[0], row_data[1], md5.hexdigest(), row_data[3], row_data[4], row_data[5], row_data[6],
  169. row_data[7], row_data[8], str(int(float(row_data[9]))), row_data[10], str(int(float(row_data[11]))),
  170. row_data[12], row_data[13], row_data[14], row_data[15], row_data[16], row_data[17], row_data[18], row_data[19],
  171. row_data[20]]
  172. csv_writer.writerow(value)
  173. per = i / (row_num - 1) * 100
  174. print('\r 已导入%s行,共计%s行,已完成%2d%%' % (str(i), str(row_num - 1), per), end='')
  175. # print('\r 已导入%s行,共计%s行,已完成%2d%%' % (str(i), str(row_num - 1), per))
  176. return csv_name
  177. # def insert_goods_deta(sheet_data,db):
  178. # '''v1版函数 导入文件至order_fromsgoods或order_fromsgoods_zzx'''
  179. # cursor = db.cursor()
  180. # row_num = sheet_data.nrows
  181. # for i in range(1, row_num): # 第一行是标题名,对应表中的字段名所以应该从第二行开始,计算机以0开始计数,所以值是1
  182. # n = (str(i)).zfill(10)
  183. # time_str = str(int(time.time())) + n
  184. # row_data = sheet_data.row_values(i)
  185. #
  186. # #定义hash值
  187. # md5 = hashlib.md5()
  188. # md5.update(row_data[3].encode('utf-8'))
  189. #
  190. # #将【标准商品名称】改为hash值
  191. # value = (time_str,row_data[0], row_data[1], md5.hexdigest(), row_data[3], row_data[4], row_data[5], row_data[6], row_data[7], row_data[8], str(int(float(row_data[9]))), row_data[10], str(int(float(row_data[11]))), row_data[12], row_data[13], row_data[14], row_data[15], row_data[16], row_data[17], row_data[18], row_data[19], row_data[20])
  192. # sql = "INSERT INTO order_formsgoods " \
  193. # "VALUES" \
  194. # "(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
  195. # cursor.execute(sql, value) # 执行sql语句
  196. # db.commit()
  197. # per = i / (row_num - 1) * 100
  198. # print('\r 已导入%s行,共计%s行,已完成%2d%%' % (str(i), str(row_num - 1), per), end='')
  199. # cursor.close() # 关闭连接
  200. def loadDataInfile(file_path ,csv_name,db,table_name):
  201. '''v2新增 执行csv文件导入数据库,注意ENCLOSED BY '"' 防止误判'''
  202. cursor = db.cursor()
  203. sql0 = f"SET global local_infile = 1;"
  204. cursor.execute(sql0)
  205. db.commit()
  206. sql1 = f'''LOAD DATA LOCAL INFILE '{file_path+'/'+csv_name}' INTO TABLE {table_name} FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 LINES;'''
  207. cursor.execute(sql1)
  208. db.commit()
  209. sql2= f"SET global local_infile = 0;"
  210. cursor.execute(sql2)
  211. db.commit()
  212. cursor.close()
  213. def update_scriptrunninglogs(log_date,log_time,running_Time,operation_results,table_name,db):
  214. '''将脚本执行情况发送至【脚本执行日志】表'''
  215. try:
  216. sql = "INSERT INTO scriptrunninglogs VALUES (%s,%s,%s,%s,%s,%s,%s)"#date, time, running_Time, script_name, operation_results, table_name, id
  217. script_name = os.path.basename(sys.argv[0])
  218. value = (log_date,log_time,running_Time,script_name,operation_results,table_name,0)
  219. cursor = db.cursor()
  220. cursor.execute(sql, value) # 执行sql语句
  221. db.commit()
  222. cursor.close()
  223. except:
  224. result = "数据库连接失败"
  225. print(result)
  226. if __name__ == '__main__':
  227. log_date = (date.today()).strftime("%Y-%m-%d") #日志记录日期
  228. log_time = datetime.now().strftime('%H:%M:%S') #日志记录时间
  229. start_run = time.time() #脚本运行开始时间
  230. startTime = (date.today() + timedelta(days=-1)).strftime("%Y-%m-%d") #导出表,开始日期选择
  231. endTime = (date.today() + timedelta(days=-1)).strftime("%Y-%m-%d") #导出表,结束日期选择
  232. brandId = '102073' #浆小白
  233. username = 'JXBsjz888'
  234. pw = 'a330463a451f07658e0374042a1dea7b199cf73706d4e44cd06c5c3dc79cec45'
  235. user_token = takeThetoken(username, pw) #密钥
  236. # user_token = "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ7XCJ1c2VySWRcIjoyNDYyfSIsImV4cCI6MTY1NTI2MjQ4OH0.yIxEENnikcTAixfRYFGpj21PjdCc3RT5bO1Q7IZBgxpSURens0RjpZcicLk7zv7idtztG2rGbO3GIuBYDWsQEQ"
  237. # brandId = '105541'#粥小鲜
  238. # username = 'ZXXsjz888'
  239. # pw = '134fdc5ef944ff6ce1439d469ec719abdde30782eeb18a611449c66da81170d6'
  240. # user_token = takeThetoken(username, pw)
  241. # user_token = "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ7XCJ1c2VySWRcIjo1MDAyfSIsImV4cCI6MTY0ODA4NzY1NX0.BgZuyoVkZU5y732blbRKmx9oswPUBnNqZJPk_34VxbFEJJlpyzEvoReaVMcXx-H0qJP8_Ry52CaE6uRscNzGhg"
  242. save_path = r'C:/Users/ClownHe/Desktop/goods/home/orderForms_jxb' #excel文件下载路径
  243. out_path_forms = r'C:/Users/ClownHe/Desktop/goods/home/orderFormsSplit_forms_jxb' #订单详情excel文件保存路径
  244. out_path_goods = r'C:/Users/ClownHe/Desktop/goods/home/orderFormsSplit_goods_jxb' #订单商品详情excel文件保存路径
  245. # save_path = r'C:\Users\浆小白_何\Desktop\订单详情'
  246. # out_path = r'C:\Users\浆小白_何\Desktop\订单明细拆分'
  247. Cookie = "_ga=GA1.2.725502531.1618630729; " \
  248. "Hm_lvt_eaa57ca47dacb4ad4f5a257001a3457c=1625040492,1625123277,1625293351,1625448933; " \
  249. "_gid=GA1.2.296614433.1647229990; " \
  250. "acw_tc=76b20f6a16474114899837204e57f03f3766bf1b4d60819fca83da136ed7e6; " \
  251. "user-token=%s; " % str(user_token) + "_gat_gtag_UA_127759150_3=1" #request公共参数
  252. headers = {
  253. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36",
  254. "Content-Type": "application/json;charset=UTF-8",
  255. "Accept": "application/json",
  256. "Accept-Encoding": "gzip, deflate, br",
  257. "user-token": user_token,
  258. "Cookie": Cookie} #request公共参数
  259. shutil.rmtree(save_path)
  260. shutil.rmtree(out_path_forms)
  261. shutil.rmtree(out_path_goods)
  262. os.mkdir(save_path)
  263. os.mkdir(out_path_forms)
  264. os.mkdir(out_path_goods)
  265. print('已重置文件夹')
  266. try:
  267. if submit(startTime, endTime, headers,brandId) == 1 :#提交请求成功执信
  268. s = 2
  269. df_link,df_name = queryTasks(headers)
  270. while df_link == None and s <= 240:
  271. time.sleep(2)
  272. print("\rloading %d"%(s),end='')
  273. s += 2
  274. df_link, df_name = queryTasks(headers)
  275. df_data = requests.get(df_link).content
  276. with open(save_path+r'/%s.xlsx' % str(df_name),mode='wb') as f:
  277. f.write(df_data)
  278. print("\n",df_name,'下载成功')
  279. excel2parts(save_path, out_path_forms, out_path_goods)
  280. db = linkTomySql('localhost', '111...Clown', 'zuzu_data')
  281. forms_sheet_data = excel2sheet(out_path_forms)
  282. csv_name_forms = excel2csv_forms(forms_sheet_data, out_path_forms)
  283. table_name_f = 'order_forms'
  284. loadDataInfile(out_path_forms, csv_name_forms, db, table_name_f)
  285. goods_sheet_data = excel2sheet(out_path_goods)
  286. csv_name_goods = excel2csv_goods(goods_sheet_data, out_path_goods)
  287. table_name_g = 'order_formsgoods'
  288. loadDataInfile(out_path_goods, csv_name_goods, db, table_name_g)
  289. operation_results = '执行成功'
  290. else:
  291. operation_results = '无法访问网页'
  292. df_name = 'name null'
  293. print("有未知错误,请检查")
  294. except Exception as ee:
  295. print('excel文件异常,请检查')
  296. operation_results = traceback.format_exc()
  297. df_name = 'name null'
  298. end_run = time.time() #脚本运行结束时间
  299. running_Time = end_run - start_run #脚本运行时长
  300. db = linkTomySql('localhost', '111...Clown', 'zuzu_data') #连接本地数据库
  301. update_scriptrunninglogs(log_date, log_time, running_Time, operation_results, df_name, db) #更新数据库脚本执行日志