如何用python脚本获取和回复阿里国际站的新询盘和未读TM信息,并转发到微信

阿里国际站地址

阿里国际站地址:阿里国际站

项目意义

用python脚本监控阿里国际站的未读询盘和TM信息,并转发到微信,可以提醒业务员回复。在晚上睡觉期间实现自动回复,可以提高回复及时率。做好客服,提升店铺竞争力。

实现思路

我们可以把实现思路分为以下几步:
第一步:实现用python脚本调用微信发信息。
第二步:首先在浏览器访问相应的网页,写几个js脚本,实现登录阿里国际站,获取未读询盘和回复新询盘,获取和回复未读TM信息。
第三步:把各个js脚本都单独另存为一个文本,用python脚本打开浏览器,访问网页以及运行相应的js脚本。
第四步:将独立的功能整合起来,实现完整的功能。

运行环境

一开始试了itchat,发现我的微信号被限制登录网页版微信,实现不了。后来找到了python调用微信电脑版发信息的WechatPCAPI项目,就直接拿下来用了。
运行环境要求为:python 3.7.4、微信电脑版 2.7.1.82。
python 3.7.4下载地址:python 3.7.4
微信电脑版 2.7.1.82下载地址:微信电脑版 2.7.1.82,提取码: nidd。
WechatPCAPI使用方法参考这里:WechatPCAPI

js脚本操作网页部分

我把登录阿里国际站的js脚本拆成了上下两部分,上面是实现登录功能函数代码,下面是一句带参数传递的调用函数代码,因为有账号、密码变量,所以在python脚本里写调用函数代码。执行该js脚本的时候再把上下两部分合并回来。

login.txt

/*
登录阿里后台
https://passport.alibaba.com/icbu_login.htm
*/

function login(id, password) {
	var login_id = document.getElementById("fm-login-id"); //账号输入框
	var login_password = document.getElementById("fm-login-password"); //密码输入框

	login_id.value = id; //输入账号
	login_password.value = password; //输入密码

	var login_submit = document.getElementById("fm-login-submit"); //登录按钮
	login_submit.click(); //点击登录

	return "登录成功"
}

获取未读询盘数据列表:

inquiry_list.txt

/*
获取未读询盘数据列表
https://message.alibaba.com/message/default.htm?spm=a2700.7756200.0.0.5d3c71d2vw5Viy#feedback/all
*/

function inquiry_list() {

	inquiry_area = ''; //询盘数据区域
	var div = document.getElementsByTagName("div");
	for (var i = 0; i < div.length; i++) {
		if (div[i].className == "aui-grid-container") {
			inquiry_area = div[i];
			break;
		}
	}

	var inquiry_div = inquiry_area.getElementsByTagName("div");
	unread_inquiry = []; // 未读询盘信息

	for (var i = 0; i < inquiry_div.length; i++) {
		if (inquiry_div[i].className == "aui2-grid-wraper actions-view-") {

			inquiry_json = {}; // 单条询盘信息

			var inquiry_url = inquiry_div[i].getElementsByTagName("a")[0];
			//console.log(inquiry_url.href);
			if (inquiry_url != undefined) {
				inquiry_json["url"] = inquiry_url.href; //询盘链接
			}

			var inquiry_div2 = inquiry_div[i].getElementsByTagName("div");
			for (var j = 0; j < inquiry_div2.length; j++) {
				if (inquiry_div2[j].className == "util-left m-header-padding spec-inquiry-id util-ellipsis") {
					//console.log(inquiry_div2[j].innerText);
					inquiry_json["id"] = inquiry_div2[j].innerText; // 询价单号
				}
				if (inquiry_div2[j].className == "util-left m-header-padding") {
					//console.log(inquiry_div2[j].innerText);
					inquiry_json["time"] = inquiry_div2[j].innerText // 时间
				}
				if (inquiry_div2[j].className == "aui2-grid-name u-text-center") {
					//console.log(inquiry_div2[j].innerText);
					inquiry_json["sender"] = inquiry_div2[j].innerText; // 发起人
				}
				if (inquiry_div2[j].className == "aui-grid-inner-text aui-grid-owner-name") {
					//console.log(inquiry_div2[j].innerText);
					inquiry_json["owner"] = inquiry_div2[j].innerText; // 负责人
				}
			}

			var inquiry_tr = inquiry_div[i].getElementsByTagName("tr");
			for (var j = 0; j < inquiry_tr.length; j++) {
				if (inquiry_tr[j].className.trim() == "has-unread") {
					//console.log("unread");
					inquiry_json["read"] = "unread"; // 未读
				}
			}

			var inquiry_td = inquiry_div[i].getElementsByTagName("td");
			for (var j = 0; j < inquiry_td.length; j++) {
				if (inquiry_td[j].className.trim() == "aui2-grid-quo-status-col") {
					//console.log(inquiry_td[j].innerText);
					inquiry_json["status"] = inquiry_td[j].innerText.trim().replace(/\s+/g, "   "); // 状态
				}
				if (inquiry_td[j].className.trim() == "buyer-list-actions") {
					//console.log(inquiry_td[j].innerText);
					inquiry_json["operation"] = inquiry_td[j].innerText; // 操作
				}
			}

			var inquiry_p = inquiry_div[i].getElementsByTagName("p");
			for (var j = 0; j < inquiry_p.length; j++) {
				if (inquiry_p[j].className == "buyer-chat-msg") {
					//console.log(inquiry_p[j].innerText);
					inquiry_json["chat"] = inquiry_p[j].innerText;
				}
			}

			//console.log(inquiry_json);
			if (inquiry_json["read"] != undefined) {
				unread_inquiry.push(inquiry_json);
			}

		}
	}

	//console.log(unread_inquiry);
	return unread_inquiry;

}

return inquiry_list();

回复新询盘:

inq_rep_send.txt

function inquiry_reply_send(mail, whatsapp, skype) { //回复新询盘
	var input_holder = document.getElementsByClassName("holder")[0]; //输入开关
	//console.log(input_holder.innerText);
	input_holder.click();
	setTimeout(function() {
		var send_confirm = document.getElementById("dialog-footer-2"); //代人回复按钮区域
		//console.log(send_confirm.innerHTML);
		if (send_confirm != undefined) {
			var send_confirm_button = send_confirm.getElementsByClassName("next-btn next-btn-primary next-btn-medium")[0]; //代人回复按钮
			//console.log(send_confirm_button.innerText);
			send_confirm_button.click();
		}
		var input_area = document.getElementById("normal-im-send_ifr").contentWindow.document; //输入内容区域
		var input = input_area.getElementsByTagName("p")[0]; //输入内容标签
        // 自动回复内容
		var input_text = "Dear Customer,\n\n" +
			"Good day!\n" +
			"We're looking forward to your arrival.\n\n" +
			"Please feel free to leave a message to tell us more about your requests or contact information.\n" +
			"We'll reply you as soon as possible.\n\n" +
			"By the way, you can contact me through these ways:\n" +
			"Mail: " + mail + "\n";
		if(whatsapp != ""){
		    input_text += "WhatsApp: " + whatsapp + "\n";
		}
		if(skype != ""){
		    input_text += "Skype: " + skype + "\n";
		}
		input_text += "\nThanks & Best regards";
		input.innerText = input_text;
		setTimeout(function() {
			var bold_icon = document.getElementsByClassName("mce-ico mce-i-bold")[0]; //点击加粗字体图表激活发送内容
			bold_icon.click();
			var send_button = document.getElementsByClassName("send")[0]; //发送按钮
			//console.log(send_button.innerText);
			send_button.click();
		}, 2000)
	}, 2000)
}

获取TM信息数据列表:

tm_list.txt

/*
获取TM信息数据列表
https://www.alibaba.com/
*/

function tm_list() {

	var tm_iframe = document.getElementById("#weblite-iframe").contentWindow.document; //加载TM信息
	//console.log(tm_iframe);

	var tm_area = tm_iframe.getElementById("icbu-weblite-list"); //TM信息区域
	var unread_count = 0; //未读TM信息条数
	if (tm_area.getElementsByClassName("unread-count")[0] != undefined) {
		var unread_count = tm_area.getElementsByClassName("unread-count")[0].innerText;
	}
	//console.log(unread_count);
	var tm_list = tm_area.getElementsByClassName("recent-list")[0]; //TM最近信息列表
	var per_tm_list = tm_list.getElementsByClassName("recent-list-item recent-list-item-unread"); //单个咨询人TM信息

	var all_tm = []; //全部TM信息

	for (var i = 0; i < per_tm_list.length; i++) {

		per_tm = {}; //单条TM信息

		//console.log(per_tm_list[i].outerHTML);
		var conversation_id = per_tm_list[i].outerHTML.split("conversationId&quot;:&quot;")[1].split("&quot;")[0]; //会话id
		//console.log(conversation_id);
		per_tm["conversation_id"] = conversation_id;
		var unread_num = per_tm_list[i].getElementsByClassName("unread-num")[0]; //未读信息数
		//console.log(unread_num.innerText);
		per_tm["unread_num"] = unread_num.innerText;
		var sender = per_tm_list[i].getElementsByClassName("name")[0]; //咨询人
		//console.log(sender.innerText);
		per_tm["sender"] = sender.innerText;
		var contact_time = per_tm_list[i].getElementsByClassName("contact-time")[0]; //联系时间
		//console.log(contact_time.innerText);
		per_tm["contact_time"] = contact_time.innerText;
		var latest_msg = per_tm_list[i].getElementsByClassName("latest-msg")[0]; //最新信息
		if (latest_msg) {
			//console.log(latest_msg.innerText);
			per_tm["latest_msg"] = latest_msg.innerText;
		}

		//console.log(per_tm);
		all_tm.push(per_tm)
	}

	//console.log(all_tm);
	return all_tm;
}

return tm_list();

展开TM聊天框:

tm_open.txt

function open_tm() { //展开TM聊天框
	var tm_iframe = document.getElementById("#weblite-iframe").contentWindow.document; //获取TM信息区域
	var open_icon = tm_iframe.getElementsByClassName("next-icon next-icon-arrow-up-filling next-icon-xl fold-up")[0]; //展开TM图标
	open_icon.click();
	return "展开TM聊天框成功";
}

return open_tm();

展开未读聊天对话框:

tm_open_send.txt

function open_send(tm_id) { //点击展开未读聊天
	var tm_iframe = document.getElementById("#weblite-iframe").contentWindow.document; //获取TM信息区域
	var recent_list = tm_iframe.getElementsByClassName("recent-list")[0]; //全部TM信息
	recent_list_item = recent_list.getElementsByClassName("recent-list-item recent-list-item-unread"); //单个咨询人TM信息;
	for (var i = 0; i < recent_list_item.length; i++) {
		//console.log(recent_list_item[i].outerHTML);
		var conversation_id = recent_list_item[i].outerHTML.split("conversationId&quot;:&quot;")[1].split("&quot;")[0];
		//console.log(conversation_id);
		if (conversation_id == tm_id) {
			recent_list_item[i].click();
			return "展开新TM对话框成功"
		}
	}
}

发送TM信息:

tm_send_reply.txt

function send_reply(mail, whatsapp, skype) { //发送TM信息
	setTimeout(function() {
		var tm_iframe = document.getElementById("#weblite-iframe").contentWindow.document; //获取TM信息区域
		var message_box = tm_iframe.getElementsByClassName("message-box")[0]; //TM聊天框
		var send_textarea = message_box.getElementsByClassName("send-textarea")[0]; //TM聊天输入框
		// 自动回复内容
		var send_msg = "Sorry, I'm not online now.\n" +
			"I'll reply you as soon as possible. \n" +
			"By the way, you can contact me through these ways:\n" +
			"Mail: " + mail + "\n";
		if(whatsapp != ""){
		    send_msg += "WhatsApp: " + whatsapp + "\n";
		}
		if(skype != ""){
		    send_msg += "Skype: " + skype + "\n";
		}
		send_msg += "Thank you.";
		send_textarea.value = send_msg; //输入回复内容
		setTimeout(function() {
			var send_button = message_box.getElementsByClassName(
				"next-btn next-btn-primary next-btn-medium send-tool-button")[0]; //发送按钮
			send_button.click();
		}, 2000)
	}, 2000)
}

检查是否发送TM信息成功:

tm_check_reply.txt

function check_reply() { //检查是否已经自动回复
	var send_flag = 0; //判断是否回复成功
	var tm_iframe = document.getElementById("#weblite-iframe").contentWindow.document; //获取TM信息区域
	var message_box = tm_iframe.getElementsByClassName("message-box")[0]; //TM聊天框
	var send_text = message_box.getElementsByClassName("session-rich-content text")[0]; //最新聊天内容;
	//console.log(send_text.innerText);
	if (send_text.innerText.search(
			"Sorry, I'm not online now.") != -1) {
		send_flag = 1;
	}
	if (send_flag == 1) {
		return "发送成功";
	} else {
		return "发送失败";
	}
}

return check_reply();

python脚本部分

这里用到selenium的webdriver的chromedriver控制谷歌浏览器访问网址,并执行自己写的js脚本。chromedriver下载地址: chromedriver
注意:要下载与安装的谷歌浏览器相同版本的chromedriver,否则程序运行时会出错。

ali_message.py

# -*- coding: utf-8 -*-
from WechatPCAPI import WechatPCAPI
import time
import logging
from queue import Queue
import threading
from time import sleep
from selenium import webdriver


# 加载js脚本
def load_js(ext_js):
    with open(ext_js, 'r', encoding='utf-8') as ext_js_file:
        js = ext_js_file.read()
        print('加载' + ext_js + '成功')
        return js


# js上下两部分拼接
def join_js(top_js, bottom_js):
    full_js = top_js + bottom_js
    # print(full_js)
    return full_js


# 获取现在时间
def get_cur_time():
    now = time.time()
    # print(formal_time(now))
    # 现在时间
    cur_time = formal_time(now)[11:16]
    # print(cur_time)
    cur_hour = int(cur_time[:2])
    cur_min = int(cur_time[3:])
    # print(cur_hour)
    # print(cur_min)
    cur_time_min = cur_hour * 60 + cur_min
    # print(cur_time_min)
    # 下一次执行时间
    if cur_min >= 30:
        next_time_min = (cur_hour + 1) * 60
    else:
        next_time_min = cur_hour * 60 + 30
    # print(next_time_min)
    # 睡眠时间
    sleep_time_min = next_time_min - cur_time_min
    # print(sleep_time_min)
    sleep_time = sleep_time_min * 60
    # print(sleep_time)
    cur_time = {'cur_hour': cur_hour, 'sleep_time': sleep_time}
    return cur_time


# 时间戳转标准时间
def formal_time(timestamp):
    # 转换成localtime
    localtime = time.localtime(timestamp)
    # 转换成新的时间格式
    standard_time = time.strftime("%Y-%m-%d %H:%M:%S", localtime)
    return standard_time


# 阿里账号列表
def account_list():
    # 填入各个账号的店铺名、负责人、账号、密码、账号类型(main代表主账号,sub代表子账号)、联系方式(邮箱、whatsapp、skype,邮箱为必填,其他两个没有的填'')
    account = [{'store': '店铺名1', 'owner': '负责人1',
                'id': '账号1', 'password': '密码1',
                'type': 'main',
                'contact': {'mail': '邮箱1',
                            'whatsapp': 'whatsapp联系方式1',
                            'skype': 'skype联系方式1'}
                },
               {'store': '店铺名2', 'owner': '负责人2',
                'id': '账号2', 'password': '密码2',
                'type': 'sub',
                'contact': {'mail': '邮箱2',
                            'whatsapp': 'whatsapp联系方式2',
                            'skype': 'skype联系方式2'}
                },
               {'store': '店铺名3', 'owner': '负责人3',
                'id': '账号3', 'password': '密码3',
                'type': 'sub',
                'contact': {'mail': '邮箱3',
                            'whatsapp': 'whatsapp联系方式3',
                            'skype': 'skype联系方式3'}
                },
               {'store': '店铺名4', 'owner': '负责人4',
                'id': '账号4', 'password': '密码4',
                'type': 'main',
                'contact': {'mail': '邮箱4',
                            'whatsapp': 'whatsapp联系方式4',
                            'skype': 'skype联系方式4'}
                },
               {'store': '店铺名5', 'owner': '负责人5',
                'id': '账号5', 'password': '密码5',
                'type': 'sub',
                'contact': {'mail': '邮箱5',
                            'whatsapp': 'whatsapp联系方式5',
                            'skype': 'skype联系方式5'}
                },
               {'store': '店铺名6', 'owner': '负责人6',
                'id': '账号6', 'password': '密码6',
                'type': 'sub',
                'contact': {'mail': '邮箱6',
                            'whatsapp': 'whatsapp联系方式6',
                            'skype': 'skype联系方式6'}
                },
               {'store': '店铺名7', 'owner': '负责人7',
                'id': '账号7', 'password': '密码7',
                'type': 'sub',
                'contact': {'mail': '邮箱7',
                            'whatsapp': 'whatsapp联系方式7',
                            'skype': 'skype联系方式7'}
                }
               ]
    # print(account)
    return account


# 获取单个账号的结果信息
def get_one_messages(account, browser):
    # 单个账号的结果信息
    result = AliMessage(account, browser).get_account_messages()
    global all_send_msg
    if result.strip() != '':
        all_send_msg += result


# 配置浏览器
def configure_browser(index):
    # 谷歌浏览器配置
    chrome_options = webdriver.ChromeOptions()
    # 设置浏览器用户目录
    chrome_options.add_argument('--user-data-dir=C:/ChromeUser/Webdriver/User' + str(index))
    browser = webdriver.Chrome(executable_path=chromedriver, options=chrome_options)
    # 设置访问超时时间
    browser.set_page_load_timeout(30)
    return browser


# 打开浏览器
def open_browser():
    # 浏览器列表
    browser_list = []
    for i in range(len(account_list())):
        browser = configure_browser(i + 1)
        browser_list.append(browser)
    # print(browser_list)
    return browser_list


# 多线程操作
def threading_operation(browser):
    # 账号列表
    account = account_list()
    # 线程列表
    threads = []
    for i in range(len(browser)):
        thread = threading.Thread(target=get_one_messages, args=(account[i], browser[i],))
        threads.append(thread)
    # 线程开始
    for thread in threads:
        thread.start()
    # 线程阻塞
    for thread in threads:
        thread.join()


def on_message(message):
    queue_received_message.put(message)


def thread_handle_message(wx_inst):
    while 1:
        message = queue_received_message.get()
        print(str(message).encode('gbk', 'ignore').decode('gbk'))


# 发送微信信息
def send_message():
    wx_inst = WechatPCAPI(on_message=on_message, log=logging)
    wx_inst.start_wechat(block=True)
    while not wx_inst.get_myself():
        time.sleep(5)
    print('微信登录成功')
    print(wx_inst.get_myself())
    threading.Thread(target=thread_handle_message, args=(wx_inst,)).start()
    # 打开浏览器
    browser_list = open_browser()
    while 1:
        cur_time = get_cur_time()
        # 睡眠时间
        sleep_time = cur_time['sleep_time']
        # 清空转发信息
        global all_send_msg
        all_send_msg = ''
        # 多线程获取各个账号的信息
        threading_operation(browser_list)
        # 去除末尾换行符
        all_send_msg = all_send_msg.strip()
        print('---全部转发信息---')
        if all_send_msg == '':
            print('没有未读询盘和TM信息,不转发到微信')
        else:
            print(all_send_msg)
        print('----------------')
        if all_send_msg != '':
            all_send_msg = all_send_msg.encode('gbk', 'ignore').decode('gbk')
            wx_inst.send_text(to_user='24572759676@chatroom', msg=all_send_msg)
        # 睡眠到下一次执行
        sleep(sleep_time)


class AliMessage:
    def __init__(self, account, browser):
        # 店铺名字
        self.store = account['store']
        # 店铺负责人名字
        self.owner = account['owner']
        # 账号
        self.id = account['id']
        # 密码
        self.password = account['password']
        # 账号类型
        self.type = account['type']
        # 邮箱
        self.mail = account['contact']['mail']
        # whatsapp
        self.whatsapp = account['contact']['whatsapp']
        # skype
        self.skype = account['contact']['skype']
        # 浏览器
        self.browser = browser
        # 阿里后台登录网址
        self.login_url = 'https://passport.alibaba.com/icbu_login.htm'
        # 未读询盘页面网址
        self.inquiry_url = 'https://message.alibaba.com/message/default.htm?#feedback/all'
        # 获取TM信息页面网址
        self.tm_url = 'https://www.alibaba.com/'
        # 登录js
        self.login_js = login_js
        # 未读询盘数据列表js
        self.inquiry_list_js = inquiry_list_js
        # TM数据列表js
        self.tm_list_js = tm_list_js
        # 新询盘发送内容js
        self.inquiry_reply_send_js = inquiry_reply_send_js
        # 检查发送新询盘是否已自动回复js
        self.inquiry_reply_check_js = inquiry_reply_check_js
        # 展开TM聊天框js
        self.tm_open_js = tm_open_js
        # 展开新TM对话框js
        self.tm_open_send_js = tm_open_send_js
        # 新TM发送内容js
        self.tm_send_reply_js = tm_send_reply_js
        # 检查TM是否自动回复成功js
        self.tm_check_reply_js = tm_check_reply_js

    # 登录完整js
    def load_login_js(self):
        bottom_js = 'return login("%s","%s");' % (self.id, self.password)
        return join_js(self.login_js, bottom_js)

    # 回复询盘完整js
    def load_inquiry_reply_send_js(self):
        bottom_js = 'return inquiry_reply_send("%s","%s","%s");' % (self.mail, self.whatsapp, self.skype)
        return join_js(self.inquiry_reply_send_js, bottom_js)

    # 回复TM完整js
    def load_tm_send_reply_js(self):
        bottom_js = 'return send_reply("%s","%s","%s");' % (self.mail, self.whatsapp, self.skype)
        return join_js(self.tm_send_reply_js, bottom_js)

    # 浏览器执行脚本
    def browser_action(self, target_url, ext_js, run_action):
        # 最大失败执行次数
        num = 3
        while num > 0:
            try:
                if target_url != '':
                    self.browser.get(target_url)
                    sleep(20)
                if run_action == 'tm_list':
                    sleep(30)
                elif run_action == "inquiry_reply_send":
                    self.browser.execute_script(ext_js)
                    return '新询盘发送内容成功'
                elif run_action == "tm_send_reply":
                    self.browser.execute_script(ext_js)
                    return '新TM发送内容成功'
                return self.browser.execute_script(ext_js)
            except Exception as e:
                print('运行出错,原因:', e)
                num -= 1
                if num == 0:
                    if run_action == 'login':
                        return '登录失败'
                    elif run_action == 'inquiry_list':
                        return '获取未读询盘失败'
                    elif run_action == 'tm_list':
                        return '获取TM信息失败'
                    elif run_action == 'check_send_before':
                        return '新询盘回复前检测状态失败'
                    elif run_action == 'inquiry_reply_send':
                        return '新询盘发送内容失败'
                    elif run_action == 'check_send_after':
                        return '新询盘回复后检测状态失败'
                    elif run_action == 'tm_open':
                        return '展开TM聊天框失败'
                    elif run_action == 'tm_open_send':
                        return '展开新TM对话框失败'
                    elif run_action == 'tm_send_reply':
                        return '新TM发送内容失败'
                    elif run_action == 'tm_check_reply':
                        return '新TM检测回复状态失败'
                    else:
                        return '操作失败'
                sleep(10)
                if run_action == 'tm_list':
                    self.browser.get(self.tm_url)

    # 单个账号获取信息
    def get_account_messages(self):
        # 单个账号信息
        send_msg = ''
        # 登录后台
        login = self.browser_action(self.login_url, self.load_login_js(), 'login').replace(u'\xa0', u' ')
        # 登录结果
        login_msg = '【%s】店【%s】' % (self.store, self.owner) + login
        print(login_msg)
        if login == '登录失败':
            send_msg += '【%s】店【%s】' % (self.store, self.owner) + login + '\n'
        sleep(5)
        # 获取TM数据列表
        tm_list = self.browser_action('', self.tm_list_js, 'tm_list')
        # print(tm_list)
        # TM数据列表不为空
        if type(tm_list) == list:
            tm_list = self.tm_text(tm_list)
        # TM信息
        tm_msg = ''
        if tm_list == '':
            print('【%s】店【%s】没有未读TM信息' % (self.store, self.owner))
        else:
            tm_msg += '【%s】店【%s】' % (self.store, self.owner) + tm_list
            print(tm_msg)
            tm_msg += '\n'
        # 判断是否为主账号
        if self.type == 'main':
            # 获取未读询盘数据列表
            inquiry_list = self.browser_action(self.inquiry_url, self.inquiry_list_js, 'inquiry_list')
            # print(inquiry_list)
            # 未读询盘数据列表不为空
            if type(inquiry_list) == list:
                inquiry_list = self.inquiry_text(inquiry_list)
            if inquiry_list == '':
                send_msg += tm_msg
                print('【%s】店没有未读询盘' % self.store)
            else:
                inquiry_msg = '【%s】店' % self.store + inquiry_list
                send_msg += inquiry_msg + '\n' + tm_msg
                print(inquiry_msg)
        else:
            send_msg += tm_msg
        sleep(5)
        return send_msg

    # 将未读TM数据转化为字符串
    def tm_text(self, unread_tm):
        # 判断TM聊天框是否已经打开
        tm_open_flag = 0
        # 最终输出的TM信息
        unread_tm_str = '有' + str(len(unread_tm)) + '组未读TM信息:\n\n'
        for i in range(len(unread_tm)):
            # print(unread_tm[i])
            unread_tm_str += '一一一第' + str(i + 1) + '组一一一\n'
            unread_tm_str += '咨询人:' + unread_tm[i]["sender"] + '\n'
            unread_tm_str += '联系时间:' + unread_tm[i]["contact_time"] + '\n'
            unread_tm_str += '最新信息:' + unread_tm[i]["latest_msg"] + '\n'
            unread_tm_str += '未读条数:' + unread_tm[i]["unread_num"] + '\n\n'
            # 当前时间
            cur_time = get_cur_time()
            # 当前小时
            cur_hour = cur_time['cur_hour']
            # 执行自动回复时间
            if cur_hour <= 8 or cur_hour >= 22:
                if tm_open_flag == 0:
                    open_result = self.browser_action('', self.tm_open_js, 'tm_open')
                    print(open_result)
                    sleep(2)
                    tm_open_flag = 1
                run_open_send = 'return open_send("' + unread_tm[i]["conversation_id"] + '");'
                cur_tm_open_send_js = self.tm_open_send_js + run_open_send
                open_send_result = self.browser_action('', cur_tm_open_send_js, 'tm_open_send')
                print(open_send_result)
                send_reply_result = self.browser_action('', self.load_tm_send_reply_js(), 'tm_send_reply')
                print(send_reply_result)
                sleep(7)
                check_reply_result = self.browser_action('', self.tm_check_reply_js, 'tm_check_reply')
                print(check_reply_result)
                unread_tm_str = unread_tm_str[:-1] + '自动回复:' + check_reply_result + '\n\n'
        if len(unread_tm) == 0:
            return ''
        else:
            return unread_tm_str[:-1].replace(u'\xa0', u' ')

    # 将未读询盘数据转化为字符串
    def inquiry_text(self, unread_inquiry):
        # 最终输出的未读询盘信息
        unread_inquiry_str = '有' + str(len(unread_inquiry)) + '条未读询盘:\n\n'
        for i in range(len(unread_inquiry)):
            # print(unread_inquiry[i])
            unread_inquiry_str += '一一一第' + str(i + 1) + '条一一一\n'
            unread_inquiry_str += unread_inquiry[i]['id'] + '\n'
            unread_inquiry_str += unread_inquiry[i]['time'] + '\n'
            unread_inquiry_str += '发起人:' + unread_inquiry[i]['sender'] + '\n'
            unread_inquiry_str += '负责人:' + unread_inquiry[i]['owner'] + '\n'
            unread_inquiry_str += '状态:' + unread_inquiry[i]['status'] + '\n'
            unread_inquiry_str += '内容:' + unread_inquiry[i]['chat'] + '\n\n'
            # 当前时间
            cur_time = get_cur_time()
            # 当前小时
            cur_hour = cur_time['cur_hour']
            # 执行自动回复时间
            if cur_hour <= 8 or cur_hour >= 22:
                if unread_inquiry[i]['status'].find("新询盘") != -1:
                    before_check_result = self.browser_action(unread_inquiry[i]['url'],
                                                              self.inquiry_reply_check_js, 'check_send_before')
                    if before_check_result == '发送成功':
                        print(before_check_result)
                        unread_inquiry_str = unread_inquiry_str[:-1] + '自动回复:' + before_check_result + '\n\n'
                    else:
                        send_result = self.browser_action('', self.load_inquiry_reply_send_js(), 'inquiry_reply_send')
                        print(send_result)
                        sleep(7)
                        after_check_result = self.browser_action('', self.inquiry_reply_check_js, 'check_send_after')
                        print(after_check_result)
                        unread_inquiry_str = unread_inquiry_str[:-1] + '自动回复:' + after_check_result + '\n\n'
        if len(unread_inquiry) == 0:
            return ''
        else:
            return unread_inquiry_str[:-1].replace(u'\xa0', u' ')


if __name__ == '__main__':
    # 引入chromedriver.exe
    chromedriver = "C:/Program Files/Google/Chrome/Application/chromedriver.exe"
    # 登录js
    login_js = load_js('login.txt')
    # 未读询盘数据列表js
    inquiry_list_js = load_js('inquiry_list.txt')
    # TM数据列表js
    tm_list_js = load_js('tm_list.txt')
    # 新询盘发送内容js
    inquiry_reply_send_js = load_js('inq_rep_send.txt')
    # 检查发送新询盘是否已自动回复js
    inquiry_reply_check_js = load_js('inq_rep_che.txt')
    # 展开TM聊天框js
    tm_open_js = load_js('tm_open.txt')
    # 展开新TM对话框js
    tm_open_send_js = load_js('tm_open_send.txt')
    # 新TM发送内容js
    tm_send_reply_js = load_js('tm_send_reply.txt')
    # 检查TM是否自动回复成功js
    tm_check_reply_js = load_js('tm_check_reply.txt')
    # 微信配置
    logging.basicConfig(level=logging.INFO)
    queue_received_message = Queue()
    # 全部转发信息
    all_send_msg = ''
    # 运行程序
    send_message()

下图所示脚本位置中的店铺名、负责人、账号、密码、账号类型、联系方式、转发到的群,需要在对应的位置改动填入,测试时可以先把转发到的群改为filehelper(文件助手)。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
另外,不能删除项目文件夹下的OpenWechatMulti.exe、WechatPCHelper.dll、WechatPCAPI.pyd,程序调用微信需要用到。如果运行不成功,请关闭防火墙后再试。

运行截图

在这里插入图片描述
在这里插入图片描述

下载地址

百度网盘链接: 阿里国际站后台监控
提取码: dku4

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值