def __init__(self): self.username = '' self.nick_name = '' self.is_login = False self.headers = { 'User-Agent': USER_AGENT, } # 保存cookie,第二次免登录 self.sess = requests.session() self.item_cat = dict() self.risk_control = '' self.eid = global_config.get('config', 'eid') or DEFAULT_EID self.fp = global_config.get('config', 'fp') or DEFAULT_FP self.track_id = '9643cbd55bbbe103eef18a213e069eb0' self.seckill_init_info = dict() self.seckill_order_data = dict() self.seckill_url = dict() try: self._load_cookies() except Exception as e: pass
def __init__(self): # 钉钉url self._access_token = global_config.get('config', 'access_token') self._timestamp, self._sign = build_sign() self.url = 'https://oapi.dingtalk.com/robot/send?access_token=%s×tamp=%s&sign=%s' % ( self._access_token, self._timestamp, self._sign) self.headers = {"Content-Type": "application/json ;charset=utf-8"} self.expression = global_config.get('config', 'expression') self.content = ""
def main(options): login = BaiduLogin() login.login_by_username(username=global_config.get('account', 'username'), password=global_config.get('account', 'password')) pan = BaiduPan(is_encrypt=True if options.password else False, is_folder=options.folder, link=options.link, password=options.password) link = pan.get_download_link() print(link)
def get_redis(db_name): redis_host = config.get('public', 'redis_host') redis_port = config.get('public', 'redis_port') redis_password = config.get('public', 'redis_password') db = config.get(db_name, 'redis_db_name') pool = ConnectionPool(host=redis_host, port=redis_port, password=redis_password, db=db) redis = StrictRedis(connection_pool=pool) return redis
def _create_package_folder(pkg_folder, pkg_name, version): package_folder = os.path.join(pkg_folder, pkg_name) os.makedirs(package_folder) with open(os.path.join(package_folder, "__init__.py"), "w") as fp: fp.write( """ # IMPORTS WHICH SHOULD APPEAR IN emzed.ext AFTER INSTALLING THE PACKAGE: from minimal_module import hello # makes emzed.ext.%s.hello() visible # DO NOT TOUCH THE FOLLOWING LINE: import pkg_resources __version__ = tuple(map(int, pkg_resources.require(__name__)[0].version.split("."))) del pkg_resources""" % pkg_name ) with open(os.path.join(package_folder, "app.py"), "w") as fp: fp.write( """ def run(): return 42 """ ) with open(os.path.join(package_folder, "minimal_module.py"), "w") as fp: fp.write( """ def hello(): return "hello from %s" """ % pkg_name ) with open(os.path.join(pkg_folder, "setup.py"), "w") as fp: user = global_config.get("emzed_store_user") password = global_config.get("emzed_store_password") repository = global_config.get_url("emzed_store_url") author = global_config.get("user_name") author_email = global_config.get("user_email") author_url = global_config.get("user_url") fp.write(SETUP_PY_TEMPLATE % locals()) with open(os.path.join(pkg_folder, "LICENSE"), "w") as fp: fp.write(licenses.GPL_3) with open(os.path.join(pkg_folder, "README"), "w") as fp: fp.write("please describe your emzed package here\n")
def delete_from_emzed_store(pkg_name, version_string, secret=""): assert_valid_secret(secret) assert version_string, "empty version_string not allowed" user = global_config.get("emzed_store_user") password = global_config.get("emzed_store_password") url = global_config.get_url("emzed_store_url") # + pkg_name + "/" + version_string folder = "/" + secret try: files = client.list_files(url, user, folder) except requests.HTTPError, e: print e.message print print "MAYBE USER %s IS NOT KNOWN OR SECRET %r IS NOT VALID" % (user, secret) print return False
def server(self, contents): #server酱推送 SCKEY = global_config.get('message', 'SCKEY') server_message = {"text": "V2EX每日签到奖励!", "desp": contents} r = requests.post("https://sc.ftqq.com/" + SCKEY + ".send", data=server_message) if r.status_code == 200: print('[+]server酱已推送,请查收')
def delete_from_emzed_store(pkg_name, version_string, secret=""): assert_valid_secret(secret) assert version_string, "empty version_string not allowed" user = global_config.get("emzed_store_user") password = global_config.get("emzed_store_password") url = global_config.get_url( "emzed_store_url") # + pkg_name + "/" + version_string folder = "/" + secret try: files = client.list_files(url, user, folder) except requests.HTTPError, e: print str(e) print print "MAYBE USER %s IS NOT KNOWN OR SECRET %r IS NOT VALID" % (user, secret) print return False
def upload_to_emzed_store(pkg_folder, secret=""): assert_valid_secret(secret) with changed_working_directory(pkg_folder): # make sure we load the right setup.py sys.path.insert(0, os.path.abspath(pkg_folder)) import setup reload(setup) sys.path.pop(0) existing_versions = list_packages_from_emzed_store()[setup.PKG_NAME] if existing_versions: if any(setup.VERSION == v for (v, __) in existing_versions): raise Exception("package %s with version %s already exists" % (setup.PKG_NAME, setup.VERSION)) if os.path.exists("dist"): shutil.rmtree("dist") rc = subprocess.call("python setup.py sdist", shell=True, stdout=sys.__stdout__, stderr=sys.__stdout__) if rc: raise Exception("upload failed") user = global_config.get("emzed_store_user") password = global_config.get("emzed_store_password") url = global_config.get_url("emzed_store_url") for p in glob.glob("dist/*"): if os.path.isfile(p): path = "/%s/%s" % (secret, os.path.basename(p)) with open(p, "rb") as fp: try: client.upload_file(url, user, password, path, fp) except requests.HTTPError, e: print str(e) print print "MAYBE USER %s IS UNKNOWN OR PASSWORD DOES NOT MATCH" % user print print "USE emzed.config.edit() TO CHANGE THEM." print break
def upload_to_emzed_store(pkg_folder, secret=""): assert_valid_secret(secret) with changed_working_directory(pkg_folder): # make sure we load the right setup.py sys.path.insert(0, os.path.abspath(pkg_folder)) import setup reload(setup) sys.path.pop(0) existing_versions = list_packages_from_emzed_store()[setup.PKG_NAME] if existing_versions: if any(setup.VERSION == v for (v, __) in existing_versions): raise Exception("package %s with version %s already exists" % (setup.PKG_NAME, setup.VERSION)) if os.path.exists("dist"): shutil.rmtree("dist") rc = subprocess.call("python setup.py sdist", shell=True, stdout=sys.__stdout__, stderr= sys.__stdout__) if rc: raise Exception("upload failed") user = global_config.get("emzed_store_user") password = global_config.get("emzed_store_password") url = global_config.get_url("emzed_store_url") for p in glob.glob("dist/*"): if os.path.isfile(p): path = "/%s/%s" % (secret, os.path.basename(p)) with open(p, "rb") as fp: try: client.upload_file(url, user, password, path, fp) except requests.HTTPError, e: print e.message print print "MAYBE USER %s IS UNKNOWN OR PASSWORD DOES NOT MATCH" % user print print "USE emzed.config.edit() TO CHANGE THEM." print break
def check_enable(resp): if resp and result_parse(resp): redis.set('enable', 1) redis.set('fail_count', 0) else: fail_count = int(redis.get('fail_count')) redis.set('fail_count', fail_count + 1) log.info("第{}次提交失败".format(fail_count + 1)) if fail_count + 1 > int(config.get('fl', 'max_fail')): log.info("第{}次提交失败,已达最大失败次数,充值暂停".format(fail_count + 1)) redis.set('enable', 0)
def __init__(self): GPIO.setmode(GPIO.BCM) # 定义树莓派GPIO引脚以BCM方式编号 GPIO.setwarnings(False) GPIO.setup(servo_pin, GPIO.OUT) # 设置舵机IO口为输出 GPIO.setup(motor_pin, GPIO.OUT) # 设置电调IO口为输出 self.servo_pwm = GPIO.PWM(servo_pin, frequency) # 定义舵机pwm输出频率 self.motor_pwm = GPIO.PWM(motor_pin, frequency) # 定义电调pwm输出频率 self.direction_add = int(global_config.get('config', 'direction_add')) # 左右方向修正 self.direction_per = float(global_config.get( 'config', 'direction_per')) # 最大转向角度占比 self.direction_reverse = int( global_config.get('config', 'direction_reverse')) # 方向反向 self.speed_add = int(global_config.get('config', 'speed_add')) # 前进后退修正 self.speed_per = float(global_config.get('config', 'speed_per')) # 速度比例100% self.last_direction = 0 self.last_speed = 0
def build_sign(): timestamp = str(round(time.time() * 1000)) secret = global_config.get('config', 'secret') secret_enc = secret.encode('utf-8') string_to_sign = '{}\n{}'.format(timestamp, secret) string_to_sign_enc = string_to_sign.encode('utf-8') hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest() sign = urllib.parse.quote_plus(base64.b64encode(hmac_code)) return timestamp, sign
def get_weather(): url = "https://devapi.heweather.net/v7/weather/24h" key = global_config.get('config', 'key') location = global_config.get('config', 'location') # 失败重试5次 count = 0 while count < 5: try: count += 1 result = requests.get(url=url, params={ 'location': location, 'key': key }, timeout=(3, 1)) if result: return get_result(result) except Exception as e: logging.error(f'retry,{count}, {e}') time.sleep(1)
def _create_package_folder(pkg_folder, pkg_name, version): package_folder = os.path.join(pkg_folder, pkg_name) os.makedirs(package_folder) with open(os.path.join(package_folder, "__init__.py"), "w") as fp: fp.write(""" # IMPORTS WHICH SHOULD APPEAR IN emzed.ext AFTER INSTALLING THE PACKAGE: from minimal_module import hello # makes emzed.ext.%s.hello() visible # DO NOT TOUCH THE FOLLOWING LINE: import pkg_resources __version__ = tuple(map(int, pkg_resources.require(__name__)[0].version.split("."))) del pkg_resources""" % pkg_name) with open(os.path.join(package_folder, "app.py"), "w") as fp: fp.write(""" def run(): return 42 """) with open(os.path.join(package_folder, "minimal_module.py"), "w") as fp: fp.write(""" def hello(): return "hello from %s" """ % pkg_name) with open(os.path.join(pkg_folder, "setup.py"), "w") as fp: user = global_config.get("emzed_store_user") password = global_config.get("emzed_store_password") repository = global_config.get_url("emzed_store_url") author = global_config.get("user_name") author_email = global_config.get("user_email") author_url = global_config.get("user_url") fp.write(SETUP_PY_TEMPLATE % locals()) with open(os.path.join(pkg_folder, "LICENSE"), "w") as fp: fp.write(licenses.GPL_3) with open(os.path.join(pkg_folder, "README"), "w") as fp: fp.write("please describe your emzed package here\n")
def __init__(self): use_random_ua = global_config.getboolean('config', 'random_useragent') self.user_agent = DEFAULT_USER_AGENT if not use_random_ua else get_random_useragent( ) self.headers = {'User-Agent': self.user_agent} self.is_login = False self.nick_name = '' ################## self.eid = global_config.get('config', 'eid') self.fp = global_config.get('config', 'fp') self.track_id = global_config.get('config', 'track_id') self.item_cat = dict() self.item_vender_ids = dict() # 记录商家id self.timeout = float( global_config.get('config', 'timeout') or DEFAULT_TIMEOUT) self.send_message = global_config.getboolean('messenger', 'enable') self.messenger = Messenger(global_config.get( 'messenger', 'sckey')) if self.send_message else None self.sess = requests.session()
def send_markdown(self, title, use_img=False): if use_img: img = global_config.get('config', 'img') if img: self.content += "\n![](%s)" % img msg = { "msgtype": "markdown", "markdown": { "title": title, "text": self.content } } msg_json = json.dumps(msg) requests.post(url=self.url, data=msg_json, headers=self.headers)
def start(self, contents): notice = global_config.get('message', 'notice') if notice == '1': try: self.server(contents) except: print('[+]server酱配置出错') elif notice == '2': try: self.dingtalk(contents) except: print('[+]钉钉配置出错') else: print('[+]已选择不推送')
def dingtalk(self, contents): #钉钉消息推送 webhook_url = global_config.get('message', 'webhook') dd_header = {"Content-Type": "application/json", "Charset": "UTF-8"} dd_message = { "msgtype": "text", "text": { "content": f'V2EX每日签到奖励 信息通知!\n{contents}' } } r = requests.post(url=webhook_url, headers=dd_header, data=json.dumps(dd_message)) if r.status_code == 200: print('[+]钉钉消息已推送,请查收\n')
def _get_seckill_order_data(self): """生成提交抢购订单所需的请求体参数 :return: 请求体参数组成的dict """ logger.info('生成提交抢购订单所需参数...') # 获取用户秒杀初始化信息 self.seckill_init_info[self.sku_id] = self._get_seckill_init_info() init_info = self.seckill_init_info.get(self.sku_id) default_address = init_info['addressList'][0] # 默认地址dict logger.info("默认地址dict: {}".format(json.dumps(default_address))) invoice_info = init_info.get('invoiceInfo', {}) # 默认发票信息dict, 有可能不返回 token = init_info['token'] data = { 'skuId': self.sku_id, 'num': self.seckill_num, 'addressId': default_address['id'], 'yuShou': 'true', 'isModifyAddress': 'false', 'name': default_address['name'], 'provinceId': default_address['provinceId'], 'cityId': default_address['cityId'], 'countyId': default_address['countyId'], 'townId': default_address['townId'], 'addressDetail': default_address['addressDetail'], 'mobile': default_address['mobile'], 'mobileKey': default_address['mobileKey'], 'email': default_address.get('email', ''), 'postCode': '', 'invoiceTitle': invoice_info.get('invoiceTitle', -1), 'invoiceCompanyName': '', 'invoiceContent': invoice_info.get('invoiceContentType', 1), 'invoiceTaxpayerNO': '', 'invoiceEmail': '', 'invoicePhone': invoice_info.get('invoicePhone', ''), 'invoicePhoneKey': invoice_info.get('invoicePhoneKey', ''), 'invoice': 'true' if invoice_info else 'false', 'password': global_config.get('account', 'payment_pwd'), 'codTimeType': 3, 'paymentType': 4, 'areaCode': '', 'overseas': 0, 'phone': '', 'eid': global_config.getRaw('config', 'eid'), 'fp': global_config.getRaw('config', 'fp'), 'token': token, 'pru': '' } logger.info("提交抢购订单所需参数: {}".format(json.dumps(data))) return data
def __init__(self): self.username = '' self.nick_name = '' self.is_login = False self.headers = { 'User-Agent': USER_AGENT, } self.sess = requests.session() self.item_cat = dict() self.risk_control = '' self.eid = global_config.get('config', 'eid') or DEFAULT_EID self.fp = global_config.get('config', 'fp') or DEFAULT_FP self.track_id = DEFAULT_TRACK_ID self.seckill_init_info = dict() self.seckill_order_data = dict() self.seckill_url = dict() try: self._load_cookies() except Exception: pass
def list_packages_from_emzed_store(secret=""): url = global_config.get_url("emzed_store_url") result = defaultdict(list) if not secret: packages = client.list_public_files(url) else: user = global_config.get("emzed_store_user") folder = "/" + secret try: packages = client.list_files(url, user, folder) except requests.HTTPError, e: print e.message print print "MAYBE USER %s IS UNKNOWN OR SECRET '%s' IS INVALID" % (user, secret) print return result
def list_packages_from_emzed_store(secret=""): url = global_config.get_url("emzed_store_url") result = defaultdict(list) if not secret: packages = client.list_public_files(url) else: user = global_config.get("emzed_store_user") folder = "/" + secret try: packages = client.list_files(url, user, folder) except requests.HTTPError, e: print str(e) print print "MAYBE USER %s IS UNKNOWN OR SECRET '%s' IS INVALID" % ( user, secret) print return result
def get_json(url): from config import global_config user = global_config.get("emzed_store_user") password = global_config.get("emzed_store_password") return requests.get(url, headers=dict(Accept="application/json"), auth=(user, password))
from lib_translate import translate_all_in_one from config import global_config src_lang = global_config.get("translate_src_lang") if src_lang == "zh": # text = "习近平在贺电中指出,巴勒斯坦问题作为中东根源性问题,关乎地区和平稳定,关乎国际公平正义,关乎人类良知道义。实现巴勒斯坦与以色列比邻而居、和平共处,不仅是巴以人民世代梦想,也是地区各国人民和国际社会的殷切期望。国际社会应该坚持“两国方案”的正确方向,以联合国有关决议、“土地换和平”原则等国际共识为基础,努力推动中东和平进程。当前形势下,应该更多关注新冠肺炎疫情对巴勒斯坦造成的严峻挑战,帮助巴勒斯坦人民抗击疫情。" text = "坡度差" elif src_lang == "en": text = "As in Q2 2020, the year-on-year traffic growth rate remained at a more normal level, around 50 percent, compared to the extraordinary peak in 2018 and the first part of 2019. The quarter-on-quarter growth for Q3 2020 was 10 percent. COVID-19 related restrictions, such as lockdowns and constraints on movement, continue to be reflected in people’s communication patterns. However, mobile traffic and mobility are gradually returning to normal levels. In many countries, mobile traffic is, to a certain extent, still geographically shifted from public and office locations to homes and remote work locations. Some countries have seen an increase in mobile broadband data traffic, while others have experienced a decline supported by Wi-Fi offload in homes with good fixed broadband connections. These traffic patterns could change again if new waves of COVID-19 occur." else: raise AttributeError("Unsupported src_lang.") translation = translate_all_in_one(text) print(translation)
#!/usr/bin/env python # -*- coding:utf-8 -*- from jd_assistant import Assistant from config import global_config """ 重要提示:此处为示例代码之一,请移步下面的链接查看使用教程👇 https://github.com/tychxn/jd-assistant/wiki/1.-%E4%BA%AC%E4%B8%9C%E6%8A%A2%E8%B4%AD%E5%8A%A9%E6%89%8B%E7%94%A8%E6%B3%95 """ # 抢购通用配置 sku_id = global_config.get('sku', 'sku_id') # 商品id buy_time = global_config.get('sku', 'buy_time') # 开始抢购时间,格式:'2020-11-28 12:59:59.950' retry = 5 # 抢购重复执行次数,可选参数,默认4次 interval = 0.01 # 抢购执行间隔,可选参数,默认4秒 num = 1 # 购买数量,可选参数,默认1个 sleep_interval = 0.5 # 抢购前倒计时轮询时间,默认0.5秒 fast_sleep_interval = 0.01 # 抢购5秒内倒计时轮询时间,默认0.01秒 # 配置【预约抢购,自动加入购物车】 # 注意:一定要在抢购开始前手动清空购物车中此类无法勾选的商品!(因为脚本在执行清空购物车操作时,无法清空不能勾选的商品) is_pass_cart = False # 是否跳过添加购物车,默认False # 配置【预约抢购,不会自动加入购物车】 # area = '19_1607_3155_62117' # 区域id # sku_buy_time = '2020-12-04 15:00:00.000' # 商品抢购时间 # buy_time = None # 开始抢购时间,默认为None,自动提前0.050秒,网络通畅时不需要修改,如果网络慢可根据自己情况适当修改,格式:'2020-11-28 12:59:59.950' fast_mode = True # 快速模式:略过访问抢购订单结算页面这一步骤,默认为 True
import json from config import global_config DEFAULT_HEADER = { 'Host': 'webapi.mybti.cn', 'Connection': 'keep-alive', 'Accept': 'application/json, text/plain, */*', 'Origin': 'https://webui.mybti.cn', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1295.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat', 'Authorization': global_config.get('config', 'token'), 'Referer': 'https://webui.mybti.cn/', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.5;q=0.4' } def parse_json(s): begin = s.find('{') end = s.rfind('}') + 1 return json.loads(s[begin:end])
def __init__(self): self.header = DEFAULT_HEADER self.send_message = global_config.getboolean('messenger', 'enable') self.messenger = Messenger(global_config.get( 'messenger', 'sckey')) if self.send_message else None
""" 翻译预处理器 method: processor input_type: str output_type: str """ import sys from config import global_config # 获取当前模块有用的配置 preprocess_pipeline = global_config.get("preprocess_pipeline", []) def get_basic_preprocessor(): """ 使用bert中的脚本对中文进行分字处理 >>> processor = get_basic_preprocessor() >>> text = "你好" >>> processor(text) '你 好' """ from lib_translate.bert_tokenizer import BasicTokenizer tokenizer = BasicTokenizer(do_lower_case=False) def preprocessor(line): return " ".join(tokenizer.tokenize(line)) return preprocessor
import os import time import json from utils.funcs import post_rpc from config import global_config serve_port = global_config.get('serve_port') robot_code = "test_robot_id" version = "v0.1" user_id = "user1" cwd = os.path.dirname(os.path.abspath(__file__)) def train_nlu(): with open(os.path.join(cwd, "assets/nlu_training_data.json")) as f: nlu_data = json.load(f) # 训练nlu模型 data = { "robot_id": robot_code, "method": "train", "version": version, "data": nlu_data } response = post_rpc( "http://127.0.0.1:{}/xiaoyu/multi/nlu".format(serve_port), data) print(response) def train_dialogue(): with open(os.path.join(cwd, "assets/dialogue_graph.json")) as f: graph_data = json.load(f)
>>> src_word.lower() not in show_words(return_dict=True) True >>> mask_term("hello world! I'm.") ("hello world! I'm.", []) """ import re import warnings import pandas from sqlalchemy import Column, String, create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base from config import global_config PROTECTION_SYMBOL = global_config["term_mask_symbol"] DICT_FILE = global_config.get("term_protection_dict", None) SRC_LANG = global_config["translate_src_lang"] TGT_LANG = global_config["translate_tgt_lang"] TERM_PROTECTION_DB = global_config["term_protection_db"] __all__ = [ "mask_term", "de_mask_term", "add_words", "delete_words", "show_words" ] def _transform_word(word): """ 对加入词表的词进行预处理 """ return word.strip().lower()
""" 对模型的长句进行分割(根据配置的最长句长限制) method: sent_splitter input type: str output type: List[str] """ from config import global_config # 获取当前模块有用的配置 max_sent_len = global_config.get("max_sent_len", 100) src_lang = global_config.get("translate_src_lang") if src_lang == "zh": from pyltp import SentenceSplitter def sent_splitter(text): def sent_len(x): # 因为在预处理时会分字,所以在计算句长时把空格去掉。 return len(x.replace(" ", "")) if sent_len(text) > max_sent_len: sents = SentenceSplitter.split(text) long_sents = list( filter(lambda x: sent_len(x) > max_sent_len, sents)) if long_sents: raise AttributeError( "Please enter text less than {} chars in chinese.".format( max_sent_len)) else: sents = [text] return sents
import xlwings as xw import win32com.client as win32 import os import work from config import global_config #编写config模块,设置全局配置信息 # 首先定义所有需要用到的文件路径 file_path = global_config.get('send_mail', 'file_path') # 读取投资者信息表文件所在路径 sheet_name = global_config.get('send_mail', 'sheet_name') col = global_config.getint('send_mail', 'col') mail_to = global_config.getint('send_mail', 'mail_to') mail_sub = global_config.get('send_mail', 'mail_sub') mail_body = global_config.get('send_mail', 'mail_body') attach_report = global_config.get('send_mail', 'attach_report') save_path = global_config.get('excel_split', 'save_path') if __name__ == '__main__': print('现在开始保存邮件,请稍候……') print('***' * 20) work.save_mail(file_path, mail_sub, mail_body, attach_report, save_path, mail_to, sheet_name, col)
def submit_order(self): """提交订单 重要: 1.该方法只适用于普通商品的提交订单(即可以加入购物车,然后结算提交订单的商品) 2.提交订单时,会对购物车中勾选✓的商品进行结算(如果勾选了多个商品,将会提交成一个订单) :return: True/False 订单提交结果 """ url = 'https://trade.jd.com/shopping/order/submitOrder.action' # js function of submit order is included in https://trade.jd.com/shopping/misc/js/order.js?r=2018070403091 data = { 'overseaPurchaseCookies': '', 'vendorRemarks': '[]', 'submitOrderParam.sopNotPutInvoice': 'false', 'submitOrderParam.trackID': 'TestTrackId', 'submitOrderParam.ignorePriceChange': '0', 'submitOrderParam.btSupport': '0', 'riskControl': self.risk_control, 'submitOrderParam.isBestCoupon': 1, 'submitOrderParam.jxj': 1, 'submitOrderParam.trackId': self.track_id, # Todo: need to get trackId 'submitOrderParam.eid': self.eid, 'submitOrderParam.fp': self.fp, 'submitOrderParam.needCheck': 1, } # add payment password when necessary payment_pwd = global_config.get('account', 'payment_pwd') if payment_pwd: data['submitOrderParam.payPassword'] = encrypt_payment_pwd( payment_pwd) headers = { 'User-Agent': self.user_agent, 'Host': 'trade.jd.com', 'Referer': 'http://trade.jd.com/shopping/order/getOrderInfo.action', } try: resp = self.sess.post(url=url, data=data, headers=headers) resp_json = json.loads(resp.text) # 返回信息示例: # 下单失败 # {'overSea': False, 'orderXml': None, 'cartXml': None, 'noStockSkuIds': '', 'reqInfo': None, 'hasJxj': False, 'addedServiceList': None, 'sign': None, 'pin': 'xxx', 'needCheckCode': False, 'success': False, 'resultCode': 60123, 'orderId': 0, 'submitSkuNum': 0, 'deductMoneyFlag': 0, 'goJumpOrderCenter': False, 'payInfo': None, 'scaleSkuInfoListVO': None, 'purchaseSkuInfoListVO': None, 'noSupportHomeServiceSkuList': None, 'msgMobile': None, 'addressVO': None, 'msgUuid': None, 'message': '请输入支付密码!'} # {'overSea': False, 'cartXml': None, 'noStockSkuIds': '', 'reqInfo': None, 'hasJxj': False, 'addedServiceList': None, 'orderXml': None, 'sign': None, 'pin': 'xxx', 'needCheckCode': False, 'success': False, 'resultCode': 60017, 'orderId': 0, 'submitSkuNum': 0, 'deductMoneyFlag': 0, 'goJumpOrderCenter': False, 'payInfo': None, 'scaleSkuInfoListVO': None, 'purchaseSkuInfoListVO': None, 'noSupportHomeServiceSkuList': None, 'msgMobile': None, 'addressVO': None, 'msgUuid': None, 'message': '您多次提交过快,请稍后再试'} # {'overSea': False, 'orderXml': None, 'cartXml': None, 'noStockSkuIds': '', 'reqInfo': None, 'hasJxj': False, 'addedServiceList': None, 'sign': None, 'pin': 'xxx', 'needCheckCode': False, 'success': False, 'resultCode': 60077, 'orderId': 0, 'submitSkuNum': 0, 'deductMoneyFlag': 0, 'goJumpOrderCenter': False, 'payInfo': None, 'scaleSkuInfoListVO': None, 'purchaseSkuInfoListVO': None, 'noSupportHomeServiceSkuList': None, 'msgMobile': None, 'addressVO': None, 'msgUuid': None, 'message': '获取用户订单信息失败'} # {"cartXml":null,"noStockSkuIds":"xxx","reqInfo":null,"hasJxj":false,"addedServiceList":null,"overSea":false,"orderXml":null,"sign":null,"pin":"xxx","needCheckCode":false,"success":false,"resultCode":600157,"orderId":0,"submitSkuNum":0,"deductMoneyFlag":0,"goJumpOrderCenter":false,"payInfo":null,"scaleSkuInfoListVO":null,"purchaseSkuInfoListVO":null,"noSupportHomeServiceSkuList":null,"msgMobile":null,"addressVO":{"pin":"xxx","areaName":"","provinceId":xx,"cityId":xx,"countyId":xx,"townId":xx,"paymentId":0,"selected":false,"addressDetail":"xx","mobile":"xx","idCard":"","phone":null,"email":null,"selfPickMobile":null,"selfPickPhone":null,"provinceName":null,"cityName":null,"countyName":null,"townName":null,"giftSenderConsigneeName":null,"giftSenderConsigneeMobile":null,"gcLat":0.0,"gcLng":0.0,"coord_type":0,"longitude":0.0,"latitude":0.0,"selfPickOptimize":0,"consigneeId":0,"selectedAddressType":0,"siteType":0,"helpMessage":null,"tipInfo":null,"cabinetAvailable":true,"limitKeyword":0,"specialRemark":null,"siteProvinceId":0,"siteCityId":0,"siteCountyId":0,"siteTownId":0,"skuSupported":false,"addressSupported":0,"isCod":0,"consigneeName":null,"pickVOname":null,"shipmentType":0,"retTag":0,"tagSource":0,"userDefinedTag":null,"newProvinceId":0,"newCityId":0,"newCountyId":0,"newTownId":0,"newProvinceName":null,"newCityName":null,"newCountyName":null,"newTownName":null,"checkLevel":0,"optimizePickID":0,"pickType":0,"dataSign":0,"overseas":0,"areaCode":null,"nameCode":null,"appSelfPickAddress":0,"associatePickId":0,"associateAddressId":0,"appId":null,"encryptText":null,"certNum":null,"used":false,"oldAddress":false,"mapping":false,"addressType":0,"fullAddress":"xxxx","postCode":null,"addressDefault":false,"addressName":null,"selfPickAddressShuntFlag":0,"pickId":0,"pickName":null,"pickVOselected":false,"mapUrl":null,"branchId":0,"canSelected":false,"address":null,"name":"xxx","message":null,"id":0},"msgUuid":null,"message":"xxxxxx商品无货"} # {'orderXml': None, 'overSea': False, 'noStockSkuIds': 'xxx', 'reqInfo': None, 'hasJxj': False, 'addedServiceList': None, 'cartXml': None, 'sign': None, 'pin': 'xxx', 'needCheckCode': False, 'success': False, 'resultCode': 600158, 'orderId': 0, 'submitSkuNum': 0, 'deductMoneyFlag': 0, 'goJumpOrderCenter': False, 'payInfo': None, 'scaleSkuInfoListVO': None, 'purchaseSkuInfoListVO': None, 'noSupportHomeServiceSkuList': None, 'msgMobile': None, 'addressVO': {'oldAddress': False, 'mapping': False, 'pin': 'xxx', 'areaName': '', 'provinceId': xx, 'cityId': xx, 'countyId': xx, 'townId': xx, 'paymentId': 0, 'selected': False, 'addressDetail': 'xxxx', 'mobile': 'xxxx', 'idCard': '', 'phone': None, 'email': None, 'selfPickMobile': None, 'selfPickPhone': None, 'provinceName': None, 'cityName': None, 'countyName': None, 'townName': None, 'giftSenderConsigneeName': None, 'giftSenderConsigneeMobile': None, 'gcLat': 0.0, 'gcLng': 0.0, 'coord_type': 0, 'longitude': 0.0, 'latitude': 0.0, 'selfPickOptimize': 0, 'consigneeId': 0, 'selectedAddressType': 0, 'newCityName': None, 'newCountyName': None, 'newTownName': None, 'checkLevel': 0, 'optimizePickID': 0, 'pickType': 0, 'dataSign': 0, 'overseas': 0, 'areaCode': None, 'nameCode': None, 'appSelfPickAddress': 0, 'associatePickId': 0, 'associateAddressId': 0, 'appId': None, 'encryptText': None, 'certNum': None, 'addressType': 0, 'fullAddress': 'xxxx', 'postCode': None, 'addressDefault': False, 'addressName': None, 'selfPickAddressShuntFlag': 0, 'pickId': 0, 'pickName': None, 'pickVOselected': False, 'mapUrl': None, 'branchId': 0, 'canSelected': False, 'siteType': 0, 'helpMessage': None, 'tipInfo': None, 'cabinetAvailable': True, 'limitKeyword': 0, 'specialRemark': None, 'siteProvinceId': 0, 'siteCityId': 0, 'siteCountyId': 0, 'siteTownId': 0, 'skuSupported': False, 'addressSupported': 0, 'isCod': 0, 'consigneeName': None, 'pickVOname': None, 'shipmentType': 0, 'retTag': 0, 'tagSource': 0, 'userDefinedTag': None, 'newProvinceId': 0, 'newCityId': 0, 'newCountyId': 0, 'newTownId': 0, 'newProvinceName': None, 'used': False, 'address': None, 'name': 'xx', 'message': None, 'id': 0}, 'msgUuid': None, 'message': 'xxxxxx商品无货'} # 下单成功 # {'overSea': False, 'orderXml': None, 'cartXml': None, 'noStockSkuIds': '', 'reqInfo': None, 'hasJxj': False, 'addedServiceList': None, 'sign': None, 'pin': 'xxx', 'needCheckCode': False, 'success': True, 'resultCode': 0, 'orderId': 8740xxxxx, 'submitSkuNum': 1, 'deductMoneyFlag': 0, 'goJumpOrderCenter': False, 'payInfo': None, 'scaleSkuInfoListVO': None, 'purchaseSkuInfoListVO': None, 'noSupportHomeServiceSkuList': None, 'msgMobile': None, 'addressVO': None, 'msgUuid': None, 'message': None} if resp_json.get('success'): order_id = resp_json.get('orderId') logger.info('订单提交成功! 订单号:%s', order_id) if self.send_message: self.messenger.send(text='jd-assistant 订单提交成功', desp='订单号:%s' % order_id) return True else: message, result_code = resp_json.get('message'), resp_json.get( 'resultCode') if result_code == 0: self._save_invoice() message = message + '(下单商品可能为第三方商品,将切换为普通发票进行尝试)' elif result_code == 60077: message = message + '(可能是购物车为空 或 未勾选购物车中商品)' elif result_code == 60123: message = message + '(需要在config.ini文件中配置支付密码)' logger.info('订单提交失败, 错误码:%s, 返回信息:%s', result_code, message) logger.info(resp_json) return False except Exception as e: logger.error(e) return False
import os import work from config import global_config #编写config模块,设置全局配置信息 # 结算单文件夹路径 path1 = global_config.get('account_path', 'path1') # 结算单保存的文件名 investors_info1 = os.path.join( path1, global_config.get('account_path', 'investors_info1')) if __name__ == '__main__': print('正在逐个提取结算单信息,请稍候……') data1 = work.cust_info_list2(path1) # 结算单信息统计 data1.to_excel(investors_info1) # 保存结算单信息到excel表 print('已全部提取完成,请打开转入结算单所在文件夹查看')