Python 企业微信群推送消息

方法一,操控企业微信发送消息,条件:需要登录企业微信并置顶群聊

方法二,通过企业微信机器人发送消息,可以不用登录企业微信(推荐)

方法一代码如下:

import os
import time
import win32gui
import win32con
import win32api
import win32clipboard
import pyautogui as pag
from win32gui import IsWindow, IsWindowEnabled, IsWindowVisible, GetWindowText, EnumWindows


class PaySend:
    """
    付款申请,企业微信群发送消息
    """
    _we_are_one = {}
    is_run = False

    def __new__(cls, *args, **kwargs):
        """ 共享模式一 """
        self = object.__new__(cls, *args, **kwargs)
        self.__dict__ = cls._we_are_one
        return self

    def get_ct(self):
        """ 获取所有Windows打开的窗体 """
        titles = set()
        def foo(hwnd, mouse):
            # 去掉下面这句就能获取所有,但是我不需要那么多
            if IsWindow(hwnd) and IsWindowEnabled(hwnd) and IsWindowVisible(hwnd):
                titles.add(GetWindowText(hwnd))
        EnumWindows(foo, 0)
        return titles

    def sbdj(self, x, y, enter=False, txt=''):
        """ 操控剪贴板粘贴信息并发送 """
        win32api.SetCursorPos([x, y])  # 为鼠标焦点设定一个位置
        time.sleep(0.02)
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
        time.sleep(0.02)
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
        # win32api.keybd_event(0,0,win32con.KEYEVENTF_KEYUP,0)
        if txt:
            # 复制到剪切板
            win32clipboard.OpenClipboard()
            win32clipboard.EmptyClipboard()
            win32clipboard.SetClipboardText(txt)
            win32clipboard.CloseClipboard()
            # 按下ctrl+v
            win32api.keybd_event(0x11, 0, 0, 0)
            win32api.keybd_event(0x56, 0, 0, 0)
            win32api.keybd_event(0x56, 0, win32con.KEYEVENTF_KEYUP, 0)
            win32api.keybd_event(0x11, 0, win32con.KEYEVENTF_KEYUP, 0)
        if enter:
            # 按下回车键
            time.sleep(0.05)
            # win32api.keybd_event(32, 0, 0, 0)
            # time.sleep(1)
            # win32api.keybd_event(32, 0, win32con.KEYEVENTF_KEYUP, 0)
            win32api.keybd_event(13, 0, 0, 0)
            win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)

    def send_mess(self, txt):
        """ 发送消息 """
        c = 1
        while self.is_run:  # 如果正在执行,等待
            time.sleep(4)
            c += 1
            if c > 100:
                break
        self.is_run = True
        try:
            title = '企业微信'
            # if title not in self.get_ct():
            #     os.startfile(r'D:\Program Files (x86)\WXWork\WXWork.exe')
            #     time.sleep(5)

            x, y = pag.position()  # 原来鼠标坐标

            win = win32gui.FindWindow(None, title)  # 获取标题名称为title的句柄
            win2 = win32gui.GetForegroundWindow()  # 获取当前窗口句柄
            while win == 0:  # 如果没有启动企业微信,启动
                os.startfile(r'D:\Program Files (x86)\WXWork\WXWork.exe')
                time.sleep(10)
                win = win32gui.FindWindow(None, title)
                c += 1
                if c > 100:
                    break
            # 如果title窗体正在作业,等待
            while win == win2:  # 当然当前正在企业微信会话工作,则等待
                time.sleep(3)
                win2 = win32gui.GetForegroundWindow()  # 获取当前窗口句柄
                c += 1
                if c > 100:
                    break

            win32gui.SetForegroundWindow(win)  # 前台显示
            win32gui.ShowWindow(win, win32con.SW_MAXIMIZE)  # 最大化

            self.sbdj(150, 82, enter=False, txt='')
            time.sleep(0.02)
            self.sbdj(468, 966, enter=True, txt=txt) 
            win32gui.CloseWindow(win)  # 最小化

            # 为鼠标还原到原来的坐标
            win32api.SetCursorPos([x, y])
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
            # win32gui.CloseWindow(win)  # 最小化
        except Exception as e:
            print('执行错误')
        finally:
            self.is_run = False
            
            
if __name__ == '__main__':
    sname = '群成员名称'
    txt = f"@{sname} 您有新的消息"
    pay = PaySend()
    pay.send_mess(txt)

方法二代码如下:

import requests


def send_txt():
    """ 文本消息 """
    headers = {"Content-Type": "text/plain"}
    send_url = "机器人的webhook地址"
    send_data = {
        "msgtype": "text",  # 消息类型
        "text": {
            "content": "您有新的消息",  # 文本内容,最长不超过2048个字节,必须是utf8编码
            # "mentioned_list": ["@all"],
            # userid的列表,提醒群中的指定成员(@某个成员),@all表示提醒所有人,如果开发者获取不到userid,可以使用mentioned_mobile_list
            "mentioned_mobile_list": ["13812891678"]  # 手机号列表,提醒手机号对应的群成员(@某个成员),@all表示提醒所有人
        }
    }

    res = requests.post(url=send_url, headers=headers, json=send_data)
    print(res.text)

def send_markdown():
    """ markdown类型消息 """
    headers = {"Content-Type": "text/plain"}
    send_url = "机器人的webhook地址"
    send_data = {
        "msgtype": "markdown",  # 消息类型,此时固定为markdown
        "markdown": {
            "content": "<@userid> [您有新的消息](http://www.xxx.com/info)",
        }
    }

    res = requests.post(url=send_url, headers=headers, json=send_data)
    print(res.text)

你可能感兴趣的:(python,python,企业微信,开发语言)