Chat聊天记录聊天记录导出

Posted 爱吃熊掌的鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Chat聊天记录聊天记录导出相关的知识,希望对你有一定的参考价值。

ChatGPT大家应该都玩过吧,今天我给大家提供一个将聊天记录导出的教学。

第一步:将聊天的页面保存到本地

  1. 打开聊天记录界面,调出控制台(F12或Fn+F12)
  2. 点击查看器选项卡
  3. 右键html标记,选择编辑为html(如下图)
  4. 全选复制到一个文本文件里

第二步:使用脚本导出

脚本源码

import requests
from lxml import etree

# 直接拷贝页面保存为文件后获取
# path为保存的html文件的路径
def getHtml(path):
    with open(path, 'r', encoding='utf-8') as f:
        html = f.read()
        return html





def getusertalk():
    html = getHtml('聊天记录.html')
    Selector = etree.HTML(html)
    user = Selector.xpath(
        '/html/body/div[1]/div[2]/div[1]/main/div[1]/div/div/div/div/div/div[2]/div[1]/div/text()')
    list1 = []
    for i in user:
        if i.strip() == '':
            pass
        else:
            list1.append(i.strip())
    return list1


def getgpttalk():
    html = getHtml('聊天记录.html')
    Selector = etree.HTML(html)
    chatgpt = Selector.xpath(
        '/html/body/div[1]/div[2]/div[1]/main/div[1]/div/div/div/div/div/div[2]/div[1]/div/div')
    list1 = []
    # pre = chatgpt[0].xpath('./pre/div/div[2]/code/span/text()')
    # for i in pre:
    #     print(i)
    # print(pre)      代码块太繁琐了,略过
    for i in chatgpt:
        try:
            pre = i.xpath('./pre/string()')
            print(pre)
        except Exception:
            pass
        p = i.xpath('./p/text()')
        if len(p) > 1:
            temp = ''
            for i in p:
                temp += i.strip()
        else:
            temp = p[0].strip()
        list1.append(temp)

    return list1

user = getusertalk()
# print(len(user))
chatgpt = getgpttalk()
# print(len(chatgpt))

# 输出到控制台
# for i, j in zip(user, chatgpt):
#     print('<h3>爱吃熊掌的鱼:' + i + '</h3>')
#     print('><b>ChatGPT3.5:</b>' + j + '\\n')
# 写入到文件
with open('聊天记录.md', 'w+', encoding='utf-8') as f:
    for i, j in zip(user, chatgpt):
        f.writelines('<h3>爱吃熊掌的鱼:' + i + '</h3>')
        f.writelines('><b>ChatGPT3.5:</b>' + j + '\\n')
    print(f'写入完成,共len(user)组问答')

导出后的聊天记录:
我与ChatGPT的对话

Chat聊天记录聊天记录导出
Chat聊天记录聊天记录导出
Chat聊天记录聊天记录导出
Chat聊天记录聊天记录导出
Chat聊天记录聊天记录导出
Chat聊天记录聊天记录导出
Chat聊天记录聊天记录导出
Chat聊天记录聊天记录导出
Chat聊天记录聊天记录导出
Chat聊天记录聊天记录导出
Chat聊天记录聊天记录导出

Node聊天程序实例02:chat_server.js

作者:vousiu

出处:http://www.cnblogs.com/vousiu

 

本实例参考自Mike Cantelon等人的《Node.js in Action》一书。

 

chat_server.js:

 技术分享

客户端和服务端就是不断通过socket.io事件来通信:

chat_server ---------------> chat_ui

chat_server <--------------- chat_ui

 

其中的这一段:

    socket.on(‘rooms‘, function() {

      socket.emit(‘rooms‘, io.sockets.manager.rooms);

    });

 

注册异步回调函数:

<--------------- ‘rooms‘ ------------------

|

 `------------- ‘rooms‘ ---------------> 全部房间。

这段代码与客户端定时请求所有房间号相配合,不断刷新可用房间列表。其实也可以在用户开新房间时再对所有用户广播,那样就不用定期刷新了。但是那样的话当最后一个用户离开原房间时,那个房间不会消失。

 

 

function assignGuestName(socket, guestNumber, nickNames, nameUsed) {

  var name = ‘Guest‘ + guestNumber;

 

  nickNames[socket.id] = name;

  socket.emit(‘nameResult‘, {

    success: true,

    name: name

  });

  nameUsed.push(name);

  return guestNumber + 1;

}

 

chat_server  ----------- ‘nameResult‘ ------------>  {success: true, name:‘Guestxxx‘}

更新服务器里与name有关的变量。

(用户还没收到该事件消息,服务器就继续执行后面的代码操作也没事,因为服务器这里的已经存储了每个用户的名称状态,它是一致的。)

我觉得这里后三个参数不需要传,因为它们本来就是服务器本地数据,传和不传都是一样的,而且这个函数不是异步函数,是立即执行的。如果是异步函数,反倒会造成不一致的情况。

 

function joinRoom(socket, room) {

  socket.join(room);

  currentRoom[socket.id] = room;

  socket.emit(‘joinResult‘, {room: room});

  socket.broadcast.to(room).emit(‘message‘, {

    text: nickNames[socket.id] + ‘ has joined ‘ + room + ‘.‘

  });

 

  var usersInRoom = io.sockets.clients(room);

  if (usersInRoom.length > 1) {

    var usersInRoomSummary = ‘Users currently in ‘ + room + ‘: ‘;

    for (var index in usersInRoom) {

      var userSocketId = usersInRoom[index].id;

      usersInRoomSummary + nickNames[userSocketId] + ‘ ‘;

    }

  }

  socket.emit(‘message‘, {text: usersInRoomSummary});

}

 

更新与room相关的本地变量。

把当前socket的用户加入socket的‘roomName‘分组。

chat_server  ----------- ‘joinResult‘ ------------>  {room: ‘roomName‘}

chat_server --------- (broadcast) ‘message‘ ---------->  {text: ‘当前用户名 has joined roomName.‘}

(这句待议,为什么是由socket来broadcast而不是io?)

同步获取房间里所有的人名。

chat_server  ----------- ‘message‘ ------------>  {text: ‘房间内所有人名‘}

 

function handleMessageBroadcasting(socket) {

  socket.on(‘message‘, function(message) {

    socket.broadcast.to(message.room).emit(‘message‘, {

      text: nickNames[socket.id] + ‘: ‘ + message.text

    });

  });

}

 

注册异步回调函数。

<--------------- ‘message‘ ------------------ message

|

 `------------- (broadcast:message.room) ‘message‘ ---------------> {text: ‘nickName: message‘}

 

function handleNameChangeAttempts(socket, nickNames, nameUsed) {

  socket.on(‘nameAttempt‘, function(name) {

    if (name.indexOf(‘Guest‘) == 0) {

      socket.emit(‘nameResult‘, {

        success: false,

        message: ‘Name cant begin with Guest‘

      });

    } else {

    if (nameUsed.indexOf(name) == -1) {

      var previousName = nickNames[socket.id];

      var previousNameIndex = nameUsed.indexOf(previousName);

      nameUsed.push(name);

      nickNames[socket.id] = name;

      delete nameUsed[previousNameIndex];

 

      socket.emit(‘nameResult‘, {

        success: true,

        name: name

      });

    } else {

      socket.emit(‘nameResult‘, {

        success: false,

        message: ‘Name already used.‘

      });

    }

    }

  });

}

 

注册异步回调函数。

<--------------- ‘nameAttempt‘ ------------------ name

|

 `------------- ‘nameResult‘ ---------------> {success: true||false, message: ‘name‘||‘why fail‘}

跟前面那个回调函数不一样,这个回调函数需要服务器全局变量和对其进行修改。

同理,这里后两个参数传的是引用,传跟不传也没什么不同。(是不传就无法访问吗?)

 

function handleRoomJoining(socket) {

  socket.on(‘join‘, function(room) {

    socket.leave(currentRoom[socket.id]);

    joinRoom(socket, room.newRoom);

  });

}

 

注册异步回调函数。

<--------------- ‘join‘ ------------------ room

|

socket离开原来的分组

|

joinRoom(socket, room.newRoom)

这个也需要服务器全局变量,它就没有传参。

 

function handleClientDisconnection(socket) {

  socket.on(‘disconnect‘, function() {

    var nameIndex = nameUsed.indexOf(nickNames[socket.id]);

    delete nameUsed[nameIndex];

    delete nickNames[socket.id];

  })

}

 

注册异步回调函数。

<------ x ------- ‘disconnect‘ ------- x --------

清理与这个用户相关的变量。

以上是关于Chat聊天记录聊天记录导出的主要内容,如果未能解决你的问题,请参考以下文章

chatGPT model说明

Chat--GPT-官方最新API官方免费PC版-Chat官方API

又发现一个ChatGPT国内镜像站,无次数限制也无广告

原创什么是chatGPT?Unity结合OpenAI官方api实现类似chatGPT的AI聊天机器人

Vue 堆栈组件

ChatGPT - 横看成岭侧成峰