简体中文
wechatircd injeta JavaScript ( injector.js
) em wx.qq.com, que usa WebSocket para se comunicar com um servidor IRC ( wechatircd.py
), permitindo assim que clientes de IRC conectados ao servidor enviem e recebam mensagens do WeChat, definam tópicos, convidem /excluir membros, ...
IRC WebSocket HTTPS
IRC client --- wechatircd.py --------- browser ----- wx.qq.com
injector.user.js
injector.js
Discuta o wechatircd juntando-se ao #wechatircd no freenode ou ao grupo de usuários no Telegram. Vídeo sobre como usar o WeChat no WeeChat
yaourt -S wechatircd-git
. Ele irá gerar um par de chave/certificado de CA autoassinado /etc/wechatircd/ca.{cert,key}.pem
e um par de chave/certificado {cert,key}.pem
(veja abaixo)./etc/wechatircd/ca.cert.pem
para o navegador (veja abaixo).systemctl start wechatircd
, que executa /usr/bin/wechatircd --http-cert /etc/wechatircd/cert.pem --http-key /etc/wechatircd/key.pem --http-root /usr/share/wechatircd
. Você pode querer personalizar /etc/systemd/system/wechatircd.service
. wechatircd.py
(o servidor) escutará em 127.0.0.1:6667 (IRC) e 127.0.0.1:9000 (HTTPS + WebSocket sobre TLS).
Se você executar o servidor em outra máquina, é recomendado configurar o IRC sobre TLS e uma senha de conexão IRC com mais algumas opções: --irc-cert /path/to/irc.key --irc-key /path/to/irc.cert --irc-password yourpassword
. Como alternativa à senha de conexão IRC, você pode especificar --sasl-password yourpassword
e autenticar com SASL PLAIN. Você pode reutilizar o certificado+chave HTTPS. Se você usa o WeeChat e acha difícil configurar um certificado válido (o gnutls verifica o nome do host), digite as seguintes linhas no 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
para o navegador../wechatircd.py --http-cert cert.pem --http-key key.pem
O endereço IP ou nome de domínio usado para servir injector.js
e injector.user.js
deve corresponder aos campos subjectAlternativeName
. O Chrome removeu o suporte para correspondência commonName
em certificados desde a versão 58. Consulte https://developers.google.com/web/updates/2017/03/chrome-58-deprecations#remove_support_for_commonname_matching_in_certificates para obter detalhes.
Cromo/Cromo
chrome://settings/certificates
, importe ca.cert.pem
, clique na guia Authorities
, selecione o certificado 127.0.0.1
, Editar-> Confiar neste certificado para identificar sites.127.0.0.1:9000
se quiser que o wechatircd escute em outro endereço.Raposa de fogo
O servidor atende conexões injector.js
e WebSocket em 127.0.0.1:9000 por padrão, que podem ser substituídas por --http-listen 0.0.0.0 --http-port 9000
.
Você pode ativar o HTTPS de duas maneiras:
--http-cert cert.pem --http-key key.pem
para fazer o wechatircd servir HTTPS--http-cert --http-key
para fazer com que o wechatircd sirva HTTP e use Nginx (com HTTPS habilitado) como proxy reverso. Neste caso, você precisa passar Host:
para wechatircd ( proxy_set_header Host $http_host;
) pois ele altera a URL do WebSocket definida em injector.js
de acordo com Host:
especificado pelo navegador. wechatircd.py
injector.run()
Você entrará no canal +wechat
automaticamente e encontrará sua lista de contatos lá. Alguns comandos estão disponíveis:
help
eval
, eval uma expressão Python, como: eval server.nick2special_user
eval server.name2special_room
status
, mostrar contatos/canaisreload_contact __all__
, recarregue todas as informações de contato caso no such nick/channel
no privmsgO servidor só pode estar vinculado a uma conta wx.qq.com, no entanto, você pode ter mais de um cliente IRC conectado ao servidor.
#
.&
. O nome do canal é gerado a partir do título do grupo. SpecialChannel#update
+v
(voz, geralmente exibida com um prefixo +
). SpecialChannel#update_detail
!m line0nline1
!html line0<br>line1
nick0: nick1: test
será convertido para @GroupAlias0 @GroupAlias1 test
, onde GroupAlias0
é My Alias in Group
/ Name
no perfil/ WeChat ID
definido por esse usuário. Corresponde aos On-screen names
do aplicativo móvel.@1234 !m multinlinenreply
, que será enviada como 「Re GroupAlias: text」text
!m @123456 multinlinenreply
@2 reply
--http-url https://127.0.0.1:9000
se desejar encurtar URLs de mídia para algo como https://127.0.0.1:9000/media/0
!m
, @3
, nick:
podem ser organizados em qualquer ordem.
Para o WeeChat, seu mecanismo anti-inundação impedirá que duas mensagens de usuário sejam enviadas ao servidor IRC ao mesmo tempo. Desative o anti-inundação para ativar a detecção de pasta.
/set irc.server.wechat.anti_flood_prio_high 0
extensão server-time
do IRC versão 3.1, 3.2. wechatircd.py
inclui o carimbo de data/hora (obtido de JavaScript) nas mensagens para informar aos clientes de IRC que a mensagem aconteceu em um determinado momento. Consulte http://ircv3.net/irc/. Veja http://ircv3.net/software/clients.html para suporte ao cliente do IRCv3.
Configuração 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 suportados:
/cap
, recursos suportados./dcc send $nick/$channel $filename
, envie imagem ou arquivo。Este recurso pega emprestado o comando /dcc send
que é bem suportado em clientes IRC. Consulte https://en.wikipedia.org/wiki/Direct_Client-to-Client#DCC_SEND./invite $nick [$channel]
, convide um contato para o grupo./kick $nick
, exclua um membro do grupo. Você deve ser o líder do grupo para fazer isso. Devido ao defeito do cliente Web, você poderá não receber notificações sobre a mudança de membros./kill $nick [$reason]
, faz com que a conexão desse cliente seja fechada/list
, lista grupos./mode +m
, não rejoin no --join new
. /mode -m
para reverter./motd
, veja os últimos 5 commits deste repositório/names
, atualiza os nicks do canal./part [$channel]
, não recebe mais mensagens do canal. Ele apenas pega emprestado o comando /part
e não sai do grupo./query $nick
, abra uma janela de bate-papo com $nick
./squit $any
, saia/summon $nick $message
,adiciona um contato./topic topic
, altere o tópico de um grupo. Como o IRC não suporta a renomeação de um canal, você sairá do canal com o nome antigo e entrará em um canal com o novo nome./who $channel
, veja a lista de membros.MSGTYPE_TEXT
,texto ou convite para chamada de voz/vídeoMSGTYPE_IMG
,imagem, exibida como [Image] $url
MSGTYPE_VOICE
,áudio, exibido como [Voice] $url
MSGTYPE_VIDEO
,vídeo, exibido como [Video] $url
MSGTYPE_MICROVIDEO
,micro vídeo?,exibido como [MicroVideo] $url
MSGTYPE_APP
,artigos de contas de assinatura, Red Packet, URL, ..., exibidos como [App] $title $url
Emojis QQ são exibidos como <img class="qqemoji qqemoji0" text="[Smile]_web" src="/zh_CN/htmledition/v2/images/spacer.gif">
, [Smile]
nas mensagens enviadas será substituído por emoticon .
Emojis são renderizados como <img class="emoji emoji1f604" text="_web" src="/zh_CN/htmledition/v2/images/spacer.gif">
. Cada emoji será convertido em um único caractere antes de ser entregue ao cliente de IRC. Os emojis podem se sobrepor, pois os emuladores de terminal podem não saber que os emojis têm largura 2, consulte 终端模拟器下使用双倍宽度多色Emoji字体.
--config
, opção curta -c
, caminho do arquivo de configuração, consulte configuração--http-cert cert.pem
, certificado TLS para HTTPS/WebSocket. Você pode concatenar certificado+chave, especificar um único arquivo PEM e omitir --http-key
. Use HTTP se nem --http-cert
nem --http-key
forem especificados.--http-key key.pem
, chave TLS para HTTPS/WebSocket--http-listen 127.1 ::1
, altere o endereço de escuta HTTPS/WebSocket para 127.1
e ::1
, substituindo --listen
--http-port 9000
, altere a porta de escuta HTTPS/WebSocket para 9000--http-root .
, o diretório raiz para servir injector.js
--http-url https://127.0.0.1:9000
, se especificado, exibe links de mídia como https://127.0.0.1:9000/document/$id ; caso contrário, https://wx.qq.com/cgi-bin/...
--ignore '&fo[o]' '&bar'
, não participe automaticamente de canais cujos nomes (gerados a partir do nome do grupo) correspondam parcialmente à regex &fo[o]
ou &bar
--ignore-display-name 'fo[o]' bar
, opção curta -I
, não ingresse automaticamente em canais cujo nome de grupo corresponda parcialmente à regex fo[o]
ou bar
--ignore-brand
, ignora mensagens de contas de assinatura ( MM_USERATTRVERIFYFALG_BIZ_BRAND
)--irc-cert cert.pem
, certificado TLS para IRC sobre TLS. Você pode concatenar certificado+chave, especificar um único arquivo PEM e omitir --irc-key
. Use IRC simples se nem --irc-cert nem --irc-key forem especificados.--irc-key key.pem
, chave TLS para IRC sobre TLS.--irc-listen 127.1 ::1
, altere o endereço de escuta do IRC para 127.1
e ::1
, substituindo --listen
.--irc-nicks ray ray1
, nicks reverenciados para clientes. SpecialUser
não terá esses nicks.--irc-password pass
, defina a senha de conexão como pass
.--irc-port 6667
, porta de escuta do servidor IRC.-j
--join auto
, padrão: entra no canal ao receber a primeira mensagem, não entra novamente após emitir /part
e receber mensagens posteriormente--join all
: junta-se a todos os canais--join manual
: sem junção automática--join new
: como auto
, mas reingresse quando novas mensagens chegarem, mesmo depois de /part
--listen 127.0.0.1
, opção curta -l
, altere o endereço de escuta IRC/HTTP/WebSocket para 127.0.0.1
.--logger-ignore '&test0' '&test1'
, lista de regex ignorados, não registra contatos/grupos cujos nomes correspondam parcialmente--logger-mask '/tmp/wechat/$channel/%Y-%m-%d.log'
, formato de nomes de arquivos de log--logger-time-format %H:%M
, formato de hora das entradas do log do lado do servidor--paste-wait 0.1
, as linhas serão retidas por até 0,1 segundos antes do envio, as linhas neste intervalo serão compactadas em uma mensagem multilinha--sasl-password pass
, defina a senha SASL como pass
.--special-channel-prefix
, opções: &
, !
, #
, ##
, prefixo para SpecialChannel. Quassel não parece suportar canais com prefixos &
, --special-channel-prefix '##'
para deixar Quassel feliz Consulte wechatircd.service para obter um modelo de /etc/systemd/system/wechatircd.service
.
injector.js
contactFactory#{addContact,deleteContact}
para observar as alterações nos contatos.CtrlServer#onmessage
, lida com comandos (mensagens de texto/arquivo, convidar alguém para o grupo, ...) do servidor.CtrlServer#seenLocalID
, evita que o cliente receba mensagens enviadas por ele mesmo. 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
Se você não consegue tolerar a leitura de códigos QR com seu telefone todos os dias, consulte 无需每日扫码的IRC版微信和QQ:wechatircd、webqqircd.
UserName
de algumas contas especiais não tem o prefixo @
: newsapp,fmessage,filehelper,weibo,qqmail,fmessage
。O UserName
das contas padrão começa com @
; UserName
dos grupos começam com @@
. UserName
são diferentes entre as sessões. Uin
parece um identificador único, mas na maioria das vezes seu valor é 0. O OwnerUin
de um grupo é o Uin
dos proprietários, mas na maioria das vezes Uin
é 0.
Minha conta
angular . element ( document . body ) . scope ( ) . account
Lista de todos os contatos
angular . element ( $ ( '#navContact' ) [ 0 ] ) . scope ( ) . allContacts
Excluir um membro de um grupo
var injector = angular . element ( document ) . injector ( )
# 这里获取了chatroomFactory,还可用于获取其他factory、service、controller等
var chatroomFactory = injector . get ( 'chatroomFactory' )
# 设置其中的`room`与`userToRemove`
chatroomFactory . delMember ( room . UserName , userToRemove . UserName ) `
Envie uma mensagem para o chat atual
angular . element ( 'pre:last' ) . scope ( ) . editAreaCtn = "Hello,微信" ;
angular . element ( 'pre:last' ) . scope ( ) . sendTextMessage ( ) ;
Se você não consegue tolerar a leitura de códigos QR com seu telefone todos os dias, você pode executar o navegador e wechatircd em um servidor.
chromium --user-data-dir=$HOME/.config/chromium-wechatircd
e faça a configuração mencionada acima (certificado para injector.js
, Tampermonkey, injector.user.js
) e feche o navegador.xorg-server-xvfb
no 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
, faça uma captura de tela e escaneie o código QR com seu aplicativo móvel.Você pode interagir com o navegador usando VNC:
x11vnc -localhost -display :99
vncviewer localhost
Uma alternativa é x2go, veja 无需每日扫码的IRC版微信和QQ:wechatircd、webqqircd.
No aplicativo móvel, On-screen Names
dos usuários são resolvidos nesta ordem:
Set Remark and Tag
se definidoMy Alias in Group
( Group Alias
) se definidoName
em seu perfilWeChat ID
As informações de contato são fornecidas nas APIs batchgetcontact
e webwxsync
. A serialização JSON usa nomes de campos enganosos.
Amigo WeChat em contactFactory#addContact
:
.Alias
: Name
em seu perfil.NickName
: WeChat ID
.RemarkName
: Set Remark and Tag
Amigo/não contato do WeChat em .MemberList
:
.DisplayName
: My Alias in Group
.NickName
: Name
em seu perfil ou WeChat ID
JSON para um usuário pode ser retornado repetidamente e todos esses campos podem estar vazios. Os nicks dos usuários são gerados procurando o primeiro valor não vazio destes campos: .RemarkName
, .NickName
, .DisplayName
. Você poderá ver xx now known as yy
em seu cliente de IRC se um contato de sala compartilhar várias salas com você.
Uncaught TypeError: angular.extend is not a function
Você pode ver estas mensagens no console do 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
deve ser executado depois de vendor_*.js
e antes de index_*.js
. No entanto, o TamperMonkey não consegue controlar com precisão o tempo de execução devido à limitação do Chrome.
A conexão WebSocket com wechatircd.py
deve ser fechada neste caso, para que os usuários saibam que devem recarregar a página da web.
:
:) no WindowsPART (Change name)
JOIN
. Os nomes dos canais são gerados a partir de .NickName
(nome do grupo) e o nome do grupo pode mudar. Não conheço nenhum ID persistente de uma conta/grupo porque UserName
muda a cada nova sessão.