美文网首页
PRO-009:微信简易聊天

PRO-009:微信简易聊天

作者: 杨强AT南京 | 来源:发表于2019-02-24 14:54 被阅读10次

本主题使用Qt与itchat实现的小程序,主要功能:
  1. 二维码登录
  2. 加载聊天室清单
  3. 选择聊天室,自动发送一个短信


一、 代码


from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import itchat
import sys


class WebChatHelper(QThread):
    # 成员数据
    login_uuid = None

    # 定义信号
    qr = pyqtSignal(bytes)      # 发送登录二维码信号
    login = pyqtSignal()        # 发送登录成功信号

    chatrooms = pyqtSignal(list)    # 发送聊天室列表信号

    # 线程任务运行函数
    def run(self):
        # 登录
        itchat.auto_login(
            hotReload=False,
            qrCallback=self.qr_call,  # 登录二维码下载回调函数设置
            loginCallback=self.login_call)  # 登录成功回调函数设置

        # 初始化加载聊天室列表
        chatroom_list = itchat.get_friends(update=False)
        self.chatrooms.emit(chatroom_list)

        # 这个线程持续与保持微信登录状态
        itchat.run()
        # 微信登录二维码回调函数

    # 登录过程回调:二维码下载回调函数
    def qr_call(self, uuid, status, qrcode):
        self.login_uuid = uuid  # 保存登录产生的UUID
        # 二进制打开文件
        if status == '0':
            print('发送登录二维码信号')
        self.qr.emit(qrcode)

    # 登录过程回调:登录成功回调函数
    def login_call(self):
        # check_login会导致重新登录
        # if itchat.check_login(uuid=self.login_uuid) == '200':  # 检测UUID是否登录成功
        #     print('发送登录成功信号')
        self.login.emit()

    # 发送消息
    def seng_msg(self, msg_, user_):
        r = itchat.send_msg(msg_, user_)
        print(r)


# 二维码窗体
class LoginDialog(QDialog):

    # 初始化窗体
    def __init__(self, parent=None):
        super(QDialog, self).__init__(parent=parent)
        # 居中
        screen = QApplication.desktop()
        screen_w = screen.width()
        screen_h = screen.height()

        self.setWindowFlags(Qt.CustomizeWindowHint)
        self.setGeometry(
            (screen_w - 400) / 2, (screen_h - 400) / 2,
            400, 400)
        self.lbl_qr = QLabel(self, text='<font size=20>加载二维码中...</font>')
        self.lbl_qr.setAlignment(Qt.AlignCenter)
        self.lbl_qr.setGeometry(0, 0, 400, 400)

    # 接受二维码,并显示
    def show_qr(self, qrcode):
        img_qr = QImage.fromData(qrcode)
        pix_qr = QPixmap.fromImage(img_qr)
        self.lbl_qr.setPixmap(pix_qr)
        self.lbl_qr.setScaledContents(True)


# 微信聊天窗体
class MainWidget(QWidget):

    def __init__(self):
        super(MainWidget, self).__init__()
        # 窗体初始化
        screen = QApplication.desktop()
        screen_w = screen.width()
        screen_h = screen.height()
        self.setWindowFlags(
            Qt.CustomizeWindowHint |
            Qt.WindowMinimizeButtonHint |
            Qt.WindowCloseButtonHint
        )
        self.setGeometry(
            (screen_w - 800) / 2, (screen_h - 600) / 2,
            800, 600)
        # 显示用户的列表框
        self.lst_users = QListView(self)
        self.mod_users = QStandardItemModel()
        self.lst_users.setGeometry(0, 0, 300, 600)
        self.lst_users.setModel(self.mod_users)


    def show_chatroom_list(self, chatrooms_):
        for room in chatrooms_:
            room_item = QStandardItem(QIcon('user.jpg'), room["NickName"])
            room_item.setData(room['UserName'])
            self.mod_users.appendRow(room_item)


# 业务应用
class  WebChatApp(QObject):

    # 获取当前用户(微信序列,用户昵称)
    current_user = None

    # 构造器
    def __init__(self):
        super(QObject, self).__init__()
        # 二维码窗体
        self.ui_login = LoginDialog()
        # 微信聊天窗体
        self.ui_main = MainWidget()
        # 微信模块
        self.web_chat = WebChatHelper()

        # 建立通信关系
        # 微信模块与二维码登录窗体
        self.web_chat.qr.connect(self.ui_login.show_qr)
        # 微信模块与应用模块
        self.web_chat.login.connect(self.login_ok)
        # 登录模块与微信聊天窗体
        self.web_chat.chatrooms.connect(self.ui_main.show_chatroom_list)

        # 处理事件
        self.ui_main.lst_users.clicked.connect(self.select_user)

        self.ui_login.show()
        self.ui_main.hide()
        self.web_chat.start()

    def login_ok(self):
        print('显示聊天窗体')
        self.ui_login.hide()
        self.ui_main.show()
        self.ui_login.close()    # 关闭
        self.ui_login.destroy()  # 释放

    def select_user(self, index):
        # 返回选择的行
        row = index.row()
        # 获取用户名:userName
        self.current_user = [
            self.ui_main.mod_users.item(row).data(),
            index.data()
        ]
        print("选择用户:", self.current_user)
        # 发送消息
        print('消息发送:',self.current_user[0])
        self.web_chat.seng_msg('测试', self.current_user[0])


# 使用下面这个if,可以独立运行,也可以作为模块调用
if __name__ == '__main__':
    qt_app = QApplication(sys.argv)
    app = WebChatApp()
    status = qt_app.exec()
    sys.exit(status)


二、说明

  在此基础上基本上可以完成一个微信完整的功能版本。

相关文章

  • PRO-009:微信简易聊天

    本主题使用Qt与itchat实现的小程序,主要功能:  1. 二维码登录  2. 加载聊天室清单  3. 选择聊天...

  • 78# D4#分类作业

    简易版 微信分类 微博分类

  • 扫码入“JST简明社群《罗规》【私有】讨论”群

    各位群友好, 为更好的改进“简易QQ、微信群《罗规》1.0”,设立两个微信群: 1.JST简易社群《罗规》...

  • 微信聊天

    1、开个小玩笑。 2、谈女生有关的话题。 不要评价、不要提问、不要直接邀约,太鲁莽了。 1、我们是朋友吗? 当然是...

  • 微信聊天

    陈辰和朱梅是一对从农村来上海打工的夫妻,育有一子在老家上学和奶奶一起生活。 没有孩子在身边,所以他们下班后空闲时间...

  • 微信聊天

    这个对我们预售工作跟客户聊天是十分重要的,比方有一些禁用表情,站在对方的立场去考虑发微信等等

  • 微信聊天

    一般不会有太大反感 因为好像都可以体谅 可能意思不是那个意思 总之就是一定要站在别人的立场去发一些信息

  • 微信聊天

    今天想爸爸了,可是不知道他有没有时间陪我视频聊天,所以先发一个微信问问吧,不一会儿老爸的视频发过来了,...

  • 微信聊天

    今天收到一位关系比较好的朋友发来的微信,信息上就两个字"在吗?" 我想了想,回复"我不知道我该在还是不在?" 对方...

  • 微信聊天

    今天突然又冒出一个感悟。 聊天的前提是对他人的生活充满好奇感,对自己的生活充满新鲜感。否则聊天无法继续下去。 我一...

网友评论

      本文标题:PRO-009:微信简易聊天

      本文链接:https://www.haomeiwen.com/subject/latbyqtx.html