简体中文
wechatircd inyecta JavaScript ( injector.js
) en wx.qq.com, que utiliza WebSocket para comunicarse con un servidor IRC ( wechatircd.py
), lo que permite a los clientes IRC conectados al servidor enviar y recibir mensajes de WeChat, establecer temas e invitar. /eliminar miembros,...
IRC WebSocket HTTPS
IRC client --- wechatircd.py --------- browser ----- wx.qq.com
injector.user.js
injector.js
Discuta sobre wechatircd uniéndose a #wechatircd en freenode o al grupo de usuarios en Telegram. Vídeo sobre el uso de WeChat en WeeChat
yaourt -S wechatircd-git
. Generará un par de clave/certificado de CA autofirmado /etc/wechatircd/ca.{cert,key}.pem
y un par de clave/certificado {cert,key}.pem
(ver más abajo)./etc/wechatircd/ca.cert.pem
al navegador (ver más abajo).systemctl start wechatircd
, que ejecuta /usr/bin/wechatircd --http-cert /etc/wechatircd/cert.pem --http-key /etc/wechatircd/key.pem --http-root /usr/share/wechatircd
. Es posible que desee personalizar /etc/systemd/system/wechatircd.service
. wechatircd.py
(el servidor) escuchará en 127.0.0.1:6667 (IRC) y 127.0.0.1:9000 (HTTPS + WebSocket sobre TLS).
Si ejecuta el servidor en otra máquina, se recomienda configurar IRC sobre TLS y una contraseña de conexión IRC con algunas opciones más: --irc-cert /path/to/irc.key --irc-key /path/to/irc.cert --irc-password yourpassword
. Como alternativa a la contraseña de conexión IRC, puede especificar --sasl-password yourpassword
y autenticarse con SASL PLAIN. Puede reutilizar el certificado HTTPS+clave. Si usa WeeChat y le resulta difícil configurar un certificado válido (gnutls verifica el nombre de host), escriba las siguientes líneas en WeeChat:
/set irc.server.wechat.ssl on
/set irc.server.wechat.ssl_verify off
/set irc.server.wechat.password yourpassword
pip install -r requirements.txt
openssl req -x509 -newkey rsa:2048 -sha256 -nodes -keyout ca.key.pem -out ca.cert.pem -days 9999 -subj ' /CN=127.0.0.1 '
openssl req -new -newkey rsa:2048 -sha256 -nodes -keyout key.pem -subj ' /CN=127.0.0.1 ' |
openssl x509 -req -out cert.pem -CAkey ca.key.pem -CA ca.cert.pem -set_serial 2 -days 9999 -extfile <(
printf " subjectAltName = IP:127.0.0.1, DNS:localhost " )
ca.cert.pem
al navegador../wechatircd.py --http-cert cert.pem --http-key key.pem
La dirección IP o el nombre de dominio utilizado para servir injector.js
e injector.user.js
deben coincidir con los campos subjectAlternativeName
. Chrome ha eliminado la compatibilidad con la coincidencia commonName
en los certificados desde la versión 58. Consulte https://developers.google.com/web/updates/2017/03/chrome-58-deprecations#remove_support_for_commonname_matching_in_certificates para obtener más detalles.
Cromo/Cromo
chrome://settings/certificates
, importe ca.cert.pem
, haga clic en la pestaña Authorities
, seleccione el certificado 127.0.0.1
, Editar->Confiar en este certificado para identificar sitios web.127.0.0.1:9000
si desea que wechatircd escuche en otra dirección.Firefox
El servidor sirve conexiones injector.js
y WebSocket en 127.0.0.1:9000 de forma predeterminada, que se puede anular con --http-listen 0.0.0.0 --http-port 9000
.
Puede habilitar HTTPS de dos maneras:
--http-cert cert.pem --http-key key.pem
para que wechatircd sirva HTTPS--http-cert --http-key
para que wechatircd sirva HTTP y use Nginx (con HTTPS habilitado) como proxy inverso. En este caso, debe pasar Host:
a wechatircd ( proxy_set_header Host $http_host;
) ya que cambia la URL de WebSocket definida en injector.js
según Host:
especificado por el navegador. wechatircd.py
injector.run()
Te unirás al canal +wechat
automáticamente y encontrarás tu lista de contactos allí. Algunos comandos están disponibles:
help
eval
, eval una expresión de Python, como por ejemplo: eval server.nick2special_user
eval server.name2special_room
status
, mostrar contactos/canalesreload_contact __all__
, recarga toda la información de contacto en caso de que no such nick/channel
en privmsgEl servidor sólo puede estar vinculado a una cuenta wx.qq.com; sin embargo, es posible que tenga más de un cliente IRC conectado al servidor.
#
.&
. El nombre del canal se genera a partir del título del grupo. SpecialChannel#update
+v
(voz, generalmente mostrada con un prefijo +
). SpecialChannel#update_detail
!m line0nline1
!html line0<br>line1
nick0: nick1: test
se convertirá en @GroupAlias0 @GroupAlias1 test
, donde GroupAlias0
es My Alias in Group
/ Name
en el perfil/ WeChat ID
establecido por ese usuario. Corresponde a On-screen names
de la aplicación móvil.@1234 !m multinlinenreply
, que se enviará como 「Re GroupAlias: text」text
!m @123456 multinlinenreply
@2 reply
--http-url https://127.0.0.1:9000
si desea acortar las URL de medios a algo como https://127.0.0.1:9000/media/0
!m
, @3
, nick:
se puede organizar en cualquier orden.
Para WeeChat, su mecanismo anti-inundación evitará que dos mensajes de usuario se envíen al servidor IRC al mismo tiempo. Desactive anti-inundación para habilitar la detección de pasta.
/set irc.server.wechat.anti_flood_prio_high 0
extensión server-time
de IRC versión 3.1, 3.2. wechatircd.py
incluye la marca de tiempo (obtenida de JavaScript) en los mensajes para informar a los clientes de IRC que el mensaje ocurrió en el momento indicado. Consulte http://ircv3.net/irc/. Consulte http://ircv3.net/software/clients.html para obtener soporte para clientes de IRCv3.
Configuración para WeeChat:
/set irc.server_default.capabilities "account-notify,away-notify,cap-notify,multi-prefix,server-time,znc.in/server-time-iso,znc.in/self-message"
Comandos IRC soportados:
/cap
, capacidades admitidas./dcc send $nick/$channel $filename
, enviar imagen o archivo. Esta característica toma prestado el comando /dcc send
que es bien soportado en clientes IRC. Consulte https://en.wikipedia.org/wiki/Direct_Client-to-Client#DCC_SEND./invite $nick [$channel]
, invita a un contacto al grupo./kick $nick
, elimina un miembro del grupo. Debes ser el líder del grupo para hacer esto. Debido a defectos del cliente Web, es posible que no reciba notificaciones sobre el cambio de miembros./kill $nick [$reason]
, provoca que se cierre la conexión de ese cliente/list
, listar grupos./mode +m
, no volver a unirse en --join new
. /mode -m
para revertir./motd
, ver las últimas 5 confirmaciones de este repositorio/names
, actualiza los nicks en el canal./part [$channel]
, ya no recibe mensajes del canal. Simplemente toma prestado el comando /part
y no abandonará el grupo./query $nick
, abre una ventana de chat con $nick
./squit $any
, cerrar sesión/summon $nick $message
,añadir un contacto./topic topic
, cambia el tema de un grupo. Debido a que IRC no admite el cambio de nombre de un canal, deberás abandonar el canal con el nombre anterior y unirte a un canal con el nuevo nombre./who $channel
, consulta la lista de miembros.MSGTYPE_TEXT
, mensaje de texto o invitación a una llamada de voz o vídeoMSGTYPE_IMG
,imagen, mostrada como [Image] $url
MSGTYPE_VOICE
,audio, mostrado como [Voice] $url
MSGTYPE_VIDEO
,video, mostrado como [Video] $url
MSGTYPE_MICROVIDEO
,¿microvídeo?,se muestra como [MicroVideo] $url
MSGTYPE_APP
, artículos de cuentas de suscripción, paquete rojo, URL, ..., mostrados como [App] $title $url
Los emojis QQ se muestran como <img class="qqemoji qqemoji0" text="[Smile]_web" src="/zh_CN/htmledition/v2/images/spacer.gif">
, [Smile]
en los mensajes enviados se reemplazará por un emoticón .
Los emojis se representan como <img class="emoji emoji1f604" text="_web" src="/zh_CN/htmledition/v2/images/spacer.gif">
. Cada emoji se convertirá en un solo carácter antes de enviarse al cliente IRC. Los emojis pueden superponerse, ya que es posible que los emuladores de terminales no sepan que los emojis tienen un ancho de 2, consulte 终端模拟器下使用双倍宽度多色Emoji字体.
--config
, opción corta -c
, ruta del archivo de configuración, ver configuración--http-cert cert.pem
, certificado TLS para HTTPS/WebSocket. Puede concatenar certificado+clave, especificar un único archivo PEM y omitir --http-key
. Utilice HTTP si no se especifica --http-cert
ni --http-key
.--http-key key.pem
, clave TLS para HTTPS/WebSocket--http-listen 127.1 ::1
, cambia la dirección de escucha HTTPS/WebSocket a 127.1
y ::1
, anulando --listen
--http-port 9000
, cambie el puerto de escucha HTTPS/WebSocket a 9000--http-root .
, el directorio raíz para servir injector.js
--http-url https://127.0.0.1:9000
, si se especifica, muestra enlaces de medios como https://127.0.0.1:9000/document/$id; si no, https://wx.qq.com/cgi-bin/...
--ignore '&fo[o]' '&bar'
, no se una automáticamente a canales cuyos nombres (generados a partir del nombre del grupo) coincidan parcialmente con la expresión regular &fo[o]
o &bar
--ignore-display-name 'fo[o]' bar
, opción corta -I
, no unir automáticamente canales cuyo nombre de grupo coincida parcialmente con la expresión regular fo[o]
o bar
--ignore-brand
, ignora los mensajes de las cuentas de suscripción ( MM_USERATTRVERIFYFALG_BIZ_BRAND
)--irc-cert cert.pem
, certificado TLS para IRC sobre TLS. Puede concatenar certificado+clave, especificar un único archivo PEM y omitir --irc-key
. Utilice IRC simple si no se especifica --irc-cert ni --irc-key.--irc-key key.pem
, clave TLS para IRC sobre TLS.--irc-listen 127.1 ::1
, cambia la dirección de escucha de IRC a 127.1
y ::1
, anulando --listen
.--irc-nicks ray ray1
, nicks reverberados para clientes. SpecialUser
no tendrá estos nicks.--irc-password pass
, establece la contraseña de conexión para pass
.--irc-port 6667
, puerto de escucha del servidor IRC.-j
--join auto
, predeterminado: unirse al canal al recibir el primer mensaje, no volver a unirse después de emitir /part
y recibir mensajes más tarde--join all
: unirse a todos los canales--join manual
: no se une automáticamente--join new
: como auto
, pero vuelve a unirse cuando llegan nuevos mensajes incluso después de /part
--listen 127.0.0.1
, opción corta -l
, cambie la dirección de escucha IRC/HTTP/WebSocket a 127.0.0.1
.--logger-ignore '&test0' '&test1'
, lista de expresiones regulares ignoradas, no registra contactos/grupos cuyos nombres coincidan parcialmente--logger-mask '/tmp/wechat/$channel/%Y-%m-%d.log'
, formato de los nombres de los archivos de registro--logger-time-format %H:%M
, formato de hora de las entradas del registro del lado del servidor--paste-wait 0.1
, las líneas se retendrán hasta 0,1 segundos antes de enviarse, las líneas en este intervalo se empaquetarán en un mensaje de varias líneas--sasl-password pass
, establece la contraseña SASL para pass
.--special-channel-prefix
, opciones: &
!
, #
, ##
, prefijo de Canal Especial. Quassel no parece admitir canales con prefijos &
, --special-channel-prefix '##'
para hacer feliz a Quassel Consulte wechatircd.service para obtener una plantilla de /etc/systemd/system/wechatircd.service
.
injector.js
contactFactory#{addContact,deleteContact}
para observar los cambios en los contactos.CtrlServer#onmessage
, maneja comandos (mensajes de texto/archivo, invitar a alguien al grupo, ...) desde el servidor.CtrlServer#seenLocalID
, evita que el cliente reciba mensajes enviados por sí mismo. wechatircd.py
.
├── Web HTTP(s)/WebSocket server
├── Server IRC server
├── Channel
│ ├── StandardChannel IRC channels
│ ├── StatusChannel `+wechat`
│ └── SpecialChannel WeChat groups
├── (User)
│ ├── Client IRC clients
│ ├── SpecialUser WeChat users
├── (IRCCommands)
│ ├── UnregisteredCommands available commands: CAP NICK PASS USER QUIT
│ ├── RegisteredCommands
Si no puede tolerar el escaneo de códigos QR con su teléfono todos los días, consulte 无需每日扫码的IRC版微信和QQ:wechatircd、webqqircd.
UserName
de algunas cuentas especiales no tiene el prefijo @
: newsapp,fmessage,filehelper,weibo,qqmail,fmessage
. UserName
de las cuentas estándar comienza con @
; UserName
de los grupos comienza con @@
. UserName
son diferentes entre sesiones. Uin
parece un identificador único, pero la mayoría de las veces su valor es 0. OwnerUin
de un grupo es el Uin
de los propietarios, pero la mayoría de las veces Uin
es 0.
mi cuenta
angular . element ( document . body ) . scope ( ) . account
Lista de todos los contactos
angular . element ( $ ( '#navContact' ) [ 0 ] ) . scope ( ) . allContacts
Eliminar un miembro de un grupo
var injector = angular . element ( document ) . injector ( )
# 这里获取了chatroomFactory,还可用于获取其他factory、service、controller等
var chatroomFactory = injector . get ( 'chatroomFactory' )
# 设置其中的`room`与`userToRemove`
chatroomFactory . delMember ( room . UserName , userToRemove . UserName ) `
Enviar un mensaje al chat actual
angular . element ( 'pre:last' ) . scope ( ) . editAreaCtn = "Hello,微信" ;
angular . element ( 'pre:last' ) . scope ( ) . sendTextMessage ( ) ;
Si no puede tolerar el escaneo de códigos QR con su teléfono todos los días, puede ejecutar el navegador y wechatircd en un servidor.
chromium --user-data-dir=$HOME/.config/chromium-wechatircd
y realice la configuración antes mencionada (certificado para injector.js
, Tampermonkey, injector.user.js
), luego cierre el navegador.xorg-server-xvfb
en Arch Linux)xvfb-run -n 99 chromium --user-data-dir=$HOME/.config/chromium-wechatircd https://wx.qq.com
DISPLAY=:99 import -window root /tmp/a.jpg && $your_image_viewer /tmp/a.jpg
, toma una captura de pantalla y escanea el código QR con tu aplicación móvil.Puede interactuar con el navegador usando VNC:
x11vnc -localhost -display :99
vncviewer localhost
Una alternativa es x2go, consulte 无需每日扫码的IRC版微信和QQ:wechatircd、webqqircd.
En la aplicación móvil, On-screen Names
de los usuarios se resuelven en este orden:
Set Remark and Tag
si está configuradoMy Alias in Group
( Group Alias
) si está configuradoName
en su perfilWeChat ID
La información de contacto se proporciona en las API batchgetcontact
y webwxsync
. La serialización JSON utiliza nombres de campos engañosos.
Amigo de WeChat en contactFactory#addContact
:
.Alias
: Name
en su perfil.NickName
: WeChat ID
.RemarkName
: Set Remark and Tag
Amigo/no contacto de WeChat en .MemberList
:
.DisplayName
: My Alias in Group
.NickName
: Name
en su perfil o WeChat ID
El JSON para un usuario puede devolverse repetidamente y todos estos campos pueden estar vacíos. Los nicks de los usuarios se generan buscando el primer valor que no esté vacío en estos campos: .RemarkName
, .NickName
, .DisplayName
. Es posible que veas xx now known as yy
en tu cliente de IRC si un contacto de sala comparte varias salas contigo.
Uncaught TypeError: angular.extend is not a function
Es posible que vea estos mensajes en la consola de DevTools:
Uncaught TypeError: angular.extend is not a function
at Object.setUserInfo (index_0c7087d.js:4)
at index_0c7087d.js:2
at c (vendor_2de5d3a.js:11)
at vendor_2de5d3a.js:11
at c.$eval (vendor_2de5d3a.js:11)
at c.$digest (vendor_2de5d3a.js:11)
at c.$apply (vendor_2de5d3a.js:11)
at l (vendor_2de5d3a.js:11)
at m (vendor_2de5d3a.js:11)
at XMLHttpRequest.C.onreadystatechange (vendor_2de5d3a.js:11)
Uncaught TypeError: angular.forEach is not a function
injector.js
debe ejecutarse después de vendor_*.js
y antes de index_*.js
. Sin embargo, TamperMonkey no puede controlar con precisión el tiempo de ejecución debido a la limitación de Chrome.
En este caso, la conexión WebSocket a wechatircd.py
debe cerrarse para informar a los usuarios que deben volver a cargar la página web.
:
) en WindowsPART (Change name)
JOIN
. Los nombres de los canales se generan a partir de .NickName
(nombre del grupo) y el nombre del grupo puede cambiar. No conozco ninguna identificación persistente de una cuenta/grupo porque UserName
cambia en cada nueva sesión.