задний план
Я фронтенд, и я также люблю писать технические блоги и заводить друзей.По этой причине я также создал группу технического обмена WeChat и официальную учетную запись WeChat.Обычно я публикую официальную учетную запись и свой личный QR-код под статья, чтобы дать Заинтересованные друзья добавьте WeChat, а затем я добавлю их в группу, но это действительно больно продолжать соглашаться на проверку друга WeChat, а затем отправлять групповые приглашения.Я считаю, что многие друзья, у которых есть общедоступные учетные записи, похожи на меня.Как разработчик, это дублирование усилий абсолютно невыносимо
Я знаю и видел некоторых блоггеров, чьи учетные записи WeChat являются роботами, что очень удобно.Если бы у меня была учетная запись робота, было бы очень практично автоматически проходить проверку друзей, а затем отвечать на ключевые слова и напрямую отправлять приглашения в группы, гм~, подумай об этом и немного взбодрись
ТАК, вероятно, в октябре 2019 года я начал свое путешествие робота WeChat один за другим.
Во-первых, я нашел несколько платформ для роботов WeChat, но цена действительно некрасивая.
Шутка, мы серьезный разработчик, могу ли я использовать такого рода нетехнические средства? (Вообще-то денег нет! 😅 )
Просто делай, что говоришь, но развиться с 0 до 1 не реально, поэтому я начал искать работы с открытым исходным кодом на Github.
Сравните несколько известных проектов роботов WeChat с открытым исходным кодом.
- itchat
-
itchat
Это интерфейс личной учетной записи WeChat с открытым исходным кодом, основанный на python для вызова WeChat. - Менее чем в тридцати строках кода вы можете создать бота WeChat, который обрабатывает всю информацию.
-
- wechaty
-
Wechaty
это Bot SDK для личного WeChat, вы можете использовать 6 строк js для создания бота - включил
linux
,Windows
,MacOS
а такжеDocker
Включая кроссплатформенную поддержку на основе Node.js
-
- Vbot
- Он основан на интерфейсе веб-версии WeChat с использованием
http
Протокол и реализация опроса -
Vbot
Изюминкой является то, что с помощью анонимных функций можно реализовать множество интересных способов игры. - Через API удобнее создать свою веб-версию WeChat, основанную на PHP
- Он основан на интерфейсе веб-версии WeChat с использованием
Это официальные краткие описания проекта, непосредственноcopy
Да ладно, когда я впервые увидел эти три работы, я даже не подумал об этом, я решил выбратьwechaty
Почему? Только по первым впечатлениям
- Для внешнего интерфейса сходство Node.js само собой разумеется.
-
itchat
Официально нужно написать менее тридцати строк кода,Vbot
Не так много, чтобы сказать,Wechaty
Помимо JS, чиновник сказал, что он занимает всего 6 строк.
Правильно, поэтому я началwechaty
первый интимный контакт
Первый контакт с wechaty
Wechaty основан наNodeJS+TS
выполнить
Конечно, нам не обязательно использовать TS для разработки, можно также использовать js, который также является моим личным фаворитом.Wechaty
Одно очко от команды, потому что все официальные примеры основаны на js, а не на ts, друзья, которые не привыкли к ts, благословлены
Прежде чем разрабатывать, вы должны сначала проверить документацию wechaty.Не упоминайте об этом на первый взгляд, кажется, что начать очень легко.
После краткого просмотра документации я начал загружать официальный образец проекта.wechaty/wechaty-getting-started
После загрузки установите зависимости и запустите
Первый запуск очень медленный, и он может не увенчаться успехом, потому что его нужно установить и запустить в серединеPuppeteer
, кому-то, возможно, придется попробовать несколько раз
Однако ни с одним из таких я не сталкивался, операция прошла очень успешно, все прошло гладко, и вообще никаких аварий не было, хахаха
После успешного завершения операции, как показано на рисунке ниже, вы можете отсканировать код для входа в систему.
Потом случилась авария 😬
Неудачный вход в систему, действительно неловко
"为了你的帐号安全,此微信号不能登录网页微信。你可以使用Windows微信或Mac微信在电脑端登录。Windows微信下载地址:https://pc.weixin.qq.com Mac微信下载地址:https://mac.weixin.qq.com"
Ошибка входа в веб-версию WeChat
На самом деле, я застрял здесь на долгое время, и я пытался много раз безрезультатно.
Причина в том, что в настоящее время мы используем веб-интерфейс WeChat API, возможно, веб-интерфейс не очень безопасен.
Должностные лица WeChat постепенно сокращают использование WeChat на веб-сайте, и официальное лицо внесло динамические корректировки политики безопасности в веб-версию WeChat.
Если вы получаете запрос безопасности при входе в веб-версию WeChat, вы не сможете войти в веб-версию WeChat.
Учетные записи WeChat, зарегистрированные после 2017 года, не могут войти в веб-версию WeChat, а учетные записи WeChat, зарегистрированные до 2017 года, с высокой вероятностью не смогут войти.
Я быстро перепробовал все свои учетные записи WeChat, все они были зарегистрированы очень рано, но я все еще не мог войти в систему, и я не мог войти после запуска.Разве это не круто?
В конце концов, я, наконец, использовал учетную запись друга в WeChat, чтобы попасть на доску, но это была туба друга, и ею пользовались другие.
Позже я везде искал решение этой проблемы, включая учетную запись, которая позволяет мне войти в веб-версию WeChat после траты денег.
Убедитесь, что ваша учетная запись WeChat поддерживает только веб-версию WeChat, просто попробуйте войти в веб-версию WeChat.
Просто по этой ссылке войдите в терминал ПК, а затем отсканируйте код, чтобы войти в систему на мобильном телефоне.Если вы можете войти в систему, вы можете использовать веб-WeChat.
На самом деле раноVbot
а такжеitchat
Эти два проекта достаточно популярны, но оба они реализованы на базе веб-версии WeChat.
особенноitchat
ПроэктGithub issuse
Первый читает
Если не получается войти, советую всем тут, не заморачивайтесь по этому вопросу слишком долго
Небольшие партнеры с каналами могут попытаться получить учетную запись, которая может войти в веб-версию WeChat, но это сложно проверить лично.
Если у вас нет номера счета, не переживайте, это бесполезно и тратит время, испытайте сами (кто-то знал официальные ограничения, но все равно параноидально искал решение много дней 😭)
Увидев это, вы можете сказать: прочитав так много, вы сказали мне не делать этого?
Не волнуйтесь, если вы используетеVbot
а такжеitchat
, действительно невозможно продолжить работу без учетной записи WeChat для входа в систему.
Но сейчас мы используемwechaty
, то можно показать, чтоwechaty
блеск
Конечно, если вы можете войти в систему, вы можете посмотреть официальную документацию или образец разработки, что очень просто.
Вы также можете продолжить просмотр небольшого демо, которое я написал ниже.Хотя протокол отличается, API и идеи те же.
Если не получается войти, то нужно искать решение.
wechaty-puppet-padplus
Не можете войти в веб-версию WeChat? Вы можете войти в WeChat, но не можете его получить?
Не волнуйся
wechaty-puppet-padplus
такжеwechaty
Командная разработка, отличная от вышеописанной на базе веб-терминала WeChat, на базе протокола iPad
Для использования этого пакета требуетсяToken
токен, сказал чиновник
Our Mission: Make it easy to build a WeChat Chatbot for developers.
We provide a free access using iPad protocol for the developers who have a strong will and ability to build a valuable chatbot for users.
Any developers can add JuziBOT Inc's staff ( Wechat number : botorange_yeah) в качестве друга Wechat. После добавления вы получите форму отзыва. Если вы пройдете обзор и захотите написать блог в Wechaty, вы можете использовать наш протокол iPad бесплатно!
Наша миссия: легко создавать чат-боты WeChat для разработчиков
Мы делаем его доступным для разработчиков с сильной волей и способностью создавать ценных чат-ботов для своих пользователей.Протокол iPadизбесплатноразрешение на доступ
Любой разработчик может перевести персонал JuziBOT Inc (Идентификатор WeChat: botorange_yeah) в качестве друга WeChat. После добавления вы получите форму отзыва. Если вы пройдете проверку и захотите вести блог в Wechaty, наша сделка с iPad бесплатна!
Вероятно, это означает, что после того, как мы отправим форму проверки, мы получим 15-дневный бесплатный токен.
Если вы хотите получить долгосрочные бесплатные токены, вы можете участвовать в так называемом плане поощрения с открытым исходным кодом, то есть через 15 дней вам необходимо отправить репозиторий MVP (Minimum Viable Product) Github, Wechaty разветвит его в сообщество и предоставить долгосрочный бесплатный токен
Наоборот, надо продолжать переговоры и обсуждать дальнейшую форму сотрудничества, я считаю, что это очень добросовестно.
Да, этот пост является выходом под 15-дневным бесплатным токеном, на который я подал заявку.
Я, конечно, напишу, когда будет время, ведь времени не так много, поэтому функций разработано не так много, позже доработаю.
Сказав так много, следующим шагом будет серьезный обмен, который относительно прост и считается начальным уровнем для вашей справки.
Робот Wechat на основе протокола ipad
четкие потребности
Перед разработкой надо сначала уточнить требования, то есть что мне нужно от робота?
- Автоматически проходить проверку друга
- Когда кто-то добавляет робота, пройти или пройти сразу после оценки ключевого слова проверочного сообщения
- Автоматически отвечать и вводить функцию робота после прохождения проверки
- ключевое слово в приватном чате
- например, ответ
加群
Отправка приглашений в групповой чат - например, ответ
作者微信
Нажмите визитку автора WeChat
- например, ответ
- автоматический чат
- пройти в групповой чат
@[机器人]xxx
Может общаться с ботами - Приватный чат Отправить сообщение в чат
- пройти в групповой чат
- Присоединяйтесь к групповому чату автоматически приветствуются
- Автоматически, когда новый друг присоединяется к групповому чату
@[新的小伙伴]
отправить текст приветствия
- Автоматически, когда новый друг присоединяется к групповому чату
Хорошо, давайте сначала реализуем эти простые функции, это все же полезнее, поговорим о последних
Структура проекта
Функция относительно проста и разделена на несколько частей, чтобы все коды не находились в одном файле, а просто отделялись друг от друга.
|-- src/
|---- index.js # 入口文件
|---- config.js # 配置文件
|---- onScan.js # 机器人需要扫描二维码时监听回调
|---- onRoomJoin.js # 进入房间监听回调
|---- onMessage.js # 消息监听回调
|---- onFriendShip.js # 好友添加监听回调
|-- package.json
начальная подготовка
Сначала создайте новую папку, инициализируйте
npm init -y
Затем мы устанавливаем более важные основные пакеты.
// Wechaty核心包
npm install --save wechaty
// padplus协议包
npm install --save wechaty-puppet-padplus
В процессе разработки нам также необходимо использоватьqrcode-terminal
Функция этого пакета заключается в выводе QR-кода на терминал, чтобы мы могли отсканировать код для входа в систему.
npm install --save qrcode-terminal
Тогда вы можете развивать радостно, да, это так просто
конфигурационный файл
Так называемый конфигурационный файл состоит в том, чтоconfig.js
, просто удалите некоторые настраиваемые параметры, которые нам нужно использовать
module.exports = {
// puppet_padplus Token
token: "你自己申请的ipad协议token",
// 你的机器人名字
name: "圈子",
// 房间/群聊
room: {
// 管理群组列表
roomList: {
// 群名字(用于发送群名字加群):群id,后面会介绍到
Web圈: "*****@chatroom",
男神群: "*****@chatroom"
},
// 加入房间回复
roomJoinReply: `你好,欢迎加入`
},
// 私人
personal: {
// 好友验证自动通过关键字
addFriendKeywords: ["加群", "前端"],
// 是否开启加群
addRoom: true
}
}
входной файл
входной файл, который является нашимsrc
в каталогеindex.js
документ
Тут делается очень просто, никакой логики
Сначала импортируйте наш пакет
const { Wechaty } = require("wechaty") // Wechaty核心包
const { PuppetPadplus } = require("wechaty-puppet-padplus") // padplus协议包
const config = require("./config") // 配置文件
Затем инициализируем нашего бота
// 初始化
const bot = new Wechaty({
puppet: new PuppetPadplus({
token: config.token
}),
name: config.name
})
Дальше цепочка звонков, послушай, начни, закончи
const onScan = require("./onScan")
const onRoomJoin = require("./onRoomJoin")
const onMessage = require("./onMessage")
const onFriendShip = require("./onFriendShip")
bot
.on("scan", onScan) // 机器人需要扫描二维码时监听
.on("room-join", onRoomJoin) // 加入房间监听
.on("message", onMessage(bot)) // 消息监听
.on("friendship", onFriendShip) // 好友添加监听
.start()
Приведенный выше код закомментирован,scan, room-join, message, friendship
Это прослушиватели событий для наших различных этапов.
- сканирование Робот слушает, когда ему нужно отсканировать QR-код
- присоединяйтесь к комнате, присоединяйтесь к монитору комнаты
- прослушиватель сообщений сообщений
- дружба друзья добавить мониторинг
Я даю только краткое объяснение этих событий мониторинга, потому что сказать нечего, в документации API это есть
Я не могу не думать об эмодзи Йоды: Пожалуйста, внимательно прочитайте нашу документацию! ! !
Эти обратные вызовы за монитором, я просто вынес их сюда, то есть файлы в структуре каталогов выше
здесьonMessage
Это вызов метода, но он по-прежнему возвращает функцию обратного вызова, но мы используем его в мониторинге сообщений.bot
Экземпляр, поэтому просто передайте значение таким образом
Далее мы объясним по порядку, что делают эти файлы
onScan
onScan
Файл является нашим обратным вызовом слушателя, когда роботу нужно отсканировать QR-код.
Код здесь очень простой
const Qrterminal = require("qrcode-terminal")
module.exports = function onScan(qrcode, status) {
Qrterminal.generate(qrcode, { small: true })
}
сначала импортироватьqrcode-terminal
Мешок
Этот обратный вызов на самом деле очень прост, обратный вызов получает два параметра
- qr-код qr-код
- статус статус
мы используемQrterminal.generate
Этот API выводит только код qr на терминал, последнийsmall
параметр, потому чтоqrcode-terminal
Выходной QR-код этого пакета по умолчанию слишком велик, уменьшите его.
onFriendShip
onFriendShip - это обратный вызов мониторинга событий дружбы, друзья добавляют мониторинг
const { Friendship } = require("wechaty")
// 配置文件
const config = require("./config")
// 好友添加验证消息自动同意关键字数组
const addFriendKeywords = config.personal.addFriendKeywords
// 好友添加监听回调
module.exports = async function onFriendShip(friendship) {
let logMsg
try {
logMsg = "添加好友" + friendship.contact().name()
console.log(logMsg)
switch (friendship.type()) {
/**
* 1. 新的好友请求
* 设置请求后,我们可以从request.hello中获得验证消息,
* 并通过`request.accept()`接受此请求
*/
case Friendship.Type.Receive:
// 判断配置信息中是否存在该验证消息
if (addFriendKeywords.some(v => v == friendship.hello())) {
logMsg = `自动通过验证,因为验证消息是"${friendship.hello()}"`
// 通过验证
await friendship.accept()
} else {
logMsg = "不自动通过,因为验证消息是: " + friendship.hello()
}
break
/**
* 2. 友谊确认
*/
case Friendship.Type.Confirm:
logMsg = "friend ship confirmed with " + friendship.contact().name()
break
}
console.log(logMsg)
} catch (e) {
logMsg = e.message
}
}
Как показано выше, когда мы хотим добавить друзей, проверочное сообщение можно передать автоматически, заполнив указанный нами текст.
Итак, мы получаем этот параметр из конфигурационного файла и судим, когда приходит новый запрос в друзья.
onRoomJoin
onRoomJoin, то есть вход в комнату для мониторинга обратного вызова
// 配置文件
const config = require("./config")
// 加入房间回复
const roomJoinReply = config.room.roomJoinReply
// 管理群组列表
const roomList = config.room.roomList
// 进入房间监听回调 room-群聊 inviteeList-受邀者名单 inviter-邀请者
module.exports = async function onRoomJoin(room, inviteeList, inviter) {
// 判断配置项群组id数组中是否存在该群聊id
if (Object.values(roomList).some(v => v == room.id)) {
// let roomTopic = await room.topic()
inviteeList.map(c => {
// 发送消息并@
room.say(roomJoinReply, c)
})
}
}
Требование состоит в том, что в групповом чате, которым мы должны управлять, пока новый человек присоединяется, мы отправим приветственную речь и @его вниз
Конечно, эти вещи все еще настраиваются в конфиге, вы можете получить их здесь.
Этот обратный вызов получает три параметра
- пример группового чата в комнате
- приглашенныйСписок приглашенных
- приглашающий приглашающий
С номерами, приглашёнными, приглашёнными, тут очень просто
Просто оцените, вотroom.id
значение объекта списка группы управления, который мы настроили
Зачем нужен объект списка группы управления? Потому что, когда мы входим в учетную запись WeChat, отслеживание записи группы осуществляется для всех групп в учетной записи WeChat.
Мне нужно управлять своей группой, поэтому я заранее запустил программу и вывелroom
, а потом отправляю сообщение в группу, я получаю всю информацию группы, которой хочу управлять, id естественно в ней, а потом прописываю в конфиге
Следующим шагом является отслеживание нового присоединения, просмотр списка приглашенных и использованиеroom.say
для отправки группового сообщения, а список приглашенных сохраняет присоединенный экземпляр WeChat.say
Первый параметр метода — это сообщение, которое нужно отправить, а второй параметр — для @этого человека. . . Я чувствую, что мой рассказ не питательный, или это предложение, вот только что оно означает, пожалуйста, прочитайте документацию для конкретного API, документация вся есть, и это очень просто
message
Последним является обратный вызов сообщения, в котором больше всего кода, обратный вызов мониторинга сообщений?
Это также слегка логическое место в коде, потому что должно быть различные суждения.
Давайте не будем сначала говорить о логике программы, робот должен уметь общаться, поэтому я нашел в Интернете бесплатный интерфейс чата робота и пристыковал его.
Подробности смотрите в интерфейсе
По сути это API, давайте его инкапсулируем, вызываем входящие сообщения, возвращаем сообщения и все.
Поскольку есть запрос, этот блок использует пакет запроса и пакет декодирования параметров, поэтому его необходимо установить и импортировать.
npm install --save request
npm install --save urlencode
Инкапсулируйте интерфейс, потому что это бесплатный робот, так что это определенно не очень хорошо, но для личного использования достаточно, как показано ниже.
// node-request请求模块包
const request = require("request")
// 请求参数解码
const urlencode = require("urlencode")
/**
* @description 机器人请求接口 处理函数
* @param {String} info 发送文字
* @return {Promise} 相应内容
*/
function requestRobot(info) {
return new Promise((resolve, reject) => {
let url = `https://open.drea.cc/bbsapi/chat/get?keyWord=${urlencode(info)}`
request(url, (error, response, body) => {
if (!error && response.statusCode == 200) {
let res = JSON.parse(body)
if (res.isSuccess) {
let send = res.data.reply
// 免费的接口,所以需要把机器人名字替换成为自己设置的机器人名字
send = send.replace(/Smile/g, name)
resolve(send)
} else {
if (res.code == 1010) {
resolve("没事别老艾特我,我还以为爱情来了")
} else {
resolve("你在说什么,我听不懂")
}
}
} else {
resolve("你在说什么,我脑子有点短路诶!")
}
})
})
}
Дальше можно написать логику обратного вызова мониторинга сообщения.Текстового описания здесь нет.Это слишком трудоемко.Комментарии пишутся построчно,ха-ха.
const { Message } = require("wechaty")
// 配置文件
const config = require("./config")
// 机器人名字
const name = config.name
// 管理群组列表
const roomList = config.room.roomList
// 消息监听回调
module.exports = bot => {
return async function onMessage(msg) {
// 判断消息来自自己,直接return
if (msg.self()) return
// 判断此消息类型是否为文本
if (msg.type() == Message.Type.Text) {
// 判断消息类型来自群聊
if (msg.room()) {
// 获取群聊
const room = await msg.room()
// 收到消息,提到自己
if (await msg.mentionSelf()) {
// 获取提到自己的名字
let self = await msg.to()
self = "@" + self.name()
// 获取消息内容,拿到整个消息文本,去掉 @+名字
let sendText = msg.text().replace(self, "")
// 请求机器人接口回复
let res = await requestRobot(sendText)
// 返回消息,并@来自人
room.say(res, msg.from())
return
}
// 收到消息,没有提到自己 忽略
} else {
// 回复信息是关键字 “加群”
if (await isAddRoom(msg)) return
// 回复信息是所管理的群聊名
if (await isRoomName(bot, msg)) return
// 请求机器人聊天接口
let res = await requestRobot(msg.text())
// 返回聊天接口内容
await msg.say(res)
}
} else {
console.log("消息不是文本!")
}
}
}
/**
* @description 回复信息是关键字 “加群” 处理函数
* @param {Object} msg 消息对象
* @return {Promise} true-是 false-不是
*/
async function isAddRoom(msg) {
// 关键字 加群 处理
if (msg.text() == "加群") {
let roomListName = Object.keys(roomList)
let info = `${name}当前管理群聊有${roomListName.length}个,回复群聊名即可加入哦\n\n`
roomListName.map(v => {
info += "【" + v + "】" + "\n"
})
msg.say(info)
return true
}
return false
}
/**
* @description 回复信息是所管理的群聊名 处理函数
* @param {Object} bot 实例对象
* @param {Object} msg 消息对象
* @return {Promise} true-是群聊 false-不是群聊
*/
async function isRoomName(bot, msg) {
// 回复信息为管理的群聊名
if (Object.keys(roomList).some(v => v == msg.text())) {
// 通过群聊id获取到该群聊实例
const room = await bot.Room.find({ id: roomList[msg.text()] })
// 判断是否在房间中 在-提示并结束
if (await room.has(msg.from())) {
await msg.say("您已经在房间中了")
return true
}
// 发送群邀请
await room.add(msg.from())
await msg.say("已发送群邀请")
return true
}
return false
}
Затем вы можете запустить его локально
Вот и все, я надеюсь, что это может быть вам чем-то полезно. Если вы поддержите меня, вы можете поставить большой палец вверх.
Глядя на множество файлов и кодов, на самом деле это просто какое-то логическое суждение.
Взгляните на документацию по API, вам решать, как в нее играть, и тут судить можно только по текстовым сообщениям.
наконец
Если вы хотите использовать мои материалы, потяните кодconfig.js
Просто замените токен и некоторую информацию о конфигурации в нем.Конечно, я постоянно обновляю, и функций будет все больше и больше, поэтому код на складе будет немного отличаться от текста.При его использовании просто смотрите на код и писать подробные комментарии. очень просто
В настоящее время реализованы некоторые базовые функции, а некоторые обработки, такие как выход из системы и отказоустойчивость, недоступны.Поскольку эти дни слишком загружены, я добавлю их позже.Это только для друзей, которые хотят это сделать, но не давайте познакомимся с Wechaty, он прост и удобен в использовании, давайте попробуем. То, что я представляю здесь, — это только вершина айсберга. Для студентов, которым нравится Python, команда wechat также поддерживает версию Python, которая вы тоже можете попробовать😄
Вы также можете получить более интересные функции (функция, о которой я думаю, предназначена только для моих личных нужд, просто для обеспечения беспрепятственного подключения к официальной учетной записи, моему групповому чату и т. д. Конечно, вы также можете делать другие вещи, например, делать задача на время регулярно отправлять сообщения своей девушке), функции, которые я могу добавить на более позднем этапе, следующие:
- толкать
- Например, в 8 утра каждый день вытягивать текущий день
IT界新闻/掘金热门文章
отправить в групповой чат - Доступно в групповых чатах
@[机器人]关键字
Просматривайте новости, статьи и многое другое - Вы можете устанавливать временные задачи и регулярно отправлять сообщения себе/групповым чатам.
- Например, в 8 утра каждый день вытягивать текущий день
- Управление сообщениями функции группового чата
- Следите за сообщениями в групповых чатах и предупреждайте их при наличии неуместных замечаний или ненормативной лексики
- Записывайте количество предупреждений для одного и того же человека, очищайте запись каждый месяц и автоматически удаляйте их из группового чата по достижении определенного количества предупреждений в месяц
- Голосование в групповом чате
- Боты могут инициировать групповое голосование по чему-либо
- игра в групповом чате
- веер угадывания
- так далее
- Система фонового управления (визуальная настройка и статистика данных группового чата)
- Визуально настройте реализованные функции робота, включая все функции, такие как вход в систему, и визуализируйте работу и обработку на веб-стороне.
- Статистические данные, такие как активность участников/присоединение людей/предупреждения в групповых чатах.
Да ладно, жизнь заключается в метании, а веселые вещи всегда нужно пробовать. В конце концов, это не занимает много времени. Вы также можете добавить моего маленького помощника [Круг] WeChat, чтобы испытать это, и написать проверочное сообщение [front -end/back-end/full stack] /Others] Вы можете напрямую пройти, пообщаться с ним или ответить на [Добавить группу] и группу технического обмена, мы можем играть вместе