简体中文
wechatircd는 WebSocket을 사용하여 IRC 서버( wechatircd.py
)와 통신하는 wx.qq.com에 JavaScript( injector.js
)를 주입하여 서버에 연결된 IRC 클라이언트가 WeChat에서 메시지를 보내고 받을 수 있도록 하고, 주제를 설정하고, 초대합니다. /회원 삭제, ...
IRC WebSocket HTTPS
IRC client --- wechatircd.py --------- browser ----- wx.qq.com
injector.user.js
injector.js
freenode에서 #wechatircd에 가입하거나 Telegram의 사용자 그룹에 가입하여 wechatircd에 대해 토론하세요. WeeChat에서 WeChat을 사용하는 방법에 대한 비디오
yaourt -S wechatircd-git
. 자체 서명된 CA 키/인증서 쌍 /etc/wechatircd/ca.{cert,key}.pem
및 키/인증서 쌍 {cert,key}.pem
(아래 참조)을 생성합니다./etc/wechatircd/ca.cert.pem
을 브라우저로 가져옵니다(아래 참조).systemctl start wechatircd
, 이는 /usr/bin/wechatircd --http-cert /etc/wechatircd/cert.pem --http-key /etc/wechatircd/key.pem --http-root /usr/share/wechatircd
실행합니다. /etc/systemd/system/wechatircd.service
사용자 정의할 수 있습니다. wechatircd.py
(서버)는 127.0.0.1:6667(IRC) 및 127.0.0.1:9000(HTTPS + TLS를 통한 WebSocket)을 수신합니다.
다른 시스템에서 서버를 실행하는 경우 몇 가지 추가 옵션을 사용하여 TLS를 통한 IRC 및 IRC 연결 비밀번호를 설정하는 것이 좋습니다: --irc-cert /path/to/irc.key --irc-key /path/to/irc.cert --irc-password yourpassword
. IRC 연결 비밀번호 대신 --sasl-password yourpassword
지정하고 SASL PLAIN으로 인증할 수 있습니다. HTTPS 인증서+키를 재사용할 수 있습니다. WeeChat을 사용하고 유효한 인증서를 설정하기 어려운 경우(gnutls가 호스트 이름 확인) 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
브라우저로 가져옵니다../wechatircd.py --http-cert cert.pem --http-key key.pem
injector.js
및 injector.user.js
제공하는 데 사용되는 IP 주소 또는 도메인 이름은 subjectAlternativeName
필드와 일치해야 합니다. Chrome은 버전 58부터 인증서의 commonName
일치에 대한 지원을 제거했습니다. 자세한 내용은 https://developers.google.com/web/updates/2017/03/chrome-58-deprecations#remove_support_for_commonname_matching_in_certificates를 참조하세요.
크롬/크롬
chrome://settings/certificates
방문하고, ca.cert.pem
가져오고, Authorities
탭을 클릭하고, 127.0.0.1
인증서를 선택하고, 편집->웹 사이트 식별을 위해 이 인증서를 신뢰합니다.127.0.0.1:9000
변경해야 합니다.파이어폭스
서버는 기본적으로 127.0.0.1:9000에서 injector.js
및 WebSocket 연결을 제공하며 이는 --http-listen 0.0.0.0 --http-port 9000
으로 재정의될 수 있습니다.
다음 두 가지 방법으로 HTTPS를 활성화할 수 있습니다.
--http-cert cert.pem --http-key key.pem
wechatircd가 HTTPS를 제공하도록 합니다.--http-cert --http-key
생략하여 wechatircd가 HTTP를 제공하도록 하고 Nginx(HTTPS 활성화)를 역방향 프록시로 사용합니다. 이 경우 브라우저에서 지정한 Host:
에 따라 injector.js
에 정의된 WebSocket URL이 변경되므로 Host:
를 wechatircd( proxy_set_header Host $http_host;
)에 전달해야 합니다. wechatircd.py
실행injector.run()
실행하세요. +wechat
채널에 자동으로 가입하고 거기에서 연락처 목록을 찾으세요. 일부 명령을 사용할 수 있습니다:
help
eval
, eval Python 표현식(예: eval server.nick2special_user
eval server.name2special_room
status
, 연락처/채널 표시reload_contact __all__
, privmsg에 no such nick/channel
경우 모든 연락처 정보를 다시 로드합니다.서버는 하나의 wx.qq.com 계정에만 바인딩될 수 있지만 서버에 연결된 IRC 클라이언트가 두 개 이상 있을 수 있습니다.
#
으로 시작됩니다.&
로 시작됩니다. 채널 이름은 그룹 제목에서 생성됩니다. SpecialChannel#update
+v
모드(음성, 일반적으로 접두사 +
가 표시됨)가 있습니다. SpecialChannel#update_detail
!m line0nline1
!html line0<br>line1
nick0: nick1: test
@GroupAlias0 @GroupAlias1 test
로 변환됩니다. 여기서 GroupAlias0
은 My Alias in Group
/프로필의 Name
/해당 사용자가 설정한 WeChat ID
입니다. 모바일 애플리케이션의 On-screen names
에 해당합니다.@1234 !m multinlinenreply
. 이 메시지는 「Re GroupAlias: text」text
로 전송됩니다.!m @123456 multinlinenreply
@2 reply
--http-url https://127.0.0.1:9000
미디어 URL을 https://127.0.0.1:9000/media/0
과 같이 단축하려는 경우 !m
, @3
, nick:
순서에 상관없이 배열할 수 있습니다.
WeeChat의 경우 홍수 방지 메커니즘으로 인해 두 개의 사용자 메시지가 동시에 IRC 서버로 전송되는 것을 방지할 수 있습니다. 페이스트 감지를 활성화하려면 홍수 방지를 비활성화하십시오.
/set irc.server.wechat.anti_flood_prio_high 0
IRC 버전 3.1, 3.2의 server-time
확장입니다. wechatircd.py
IRC 클라이언트에게 해당 메시지가 지정된 시간에 발생했음을 알리기 위해 메시지에 타임스탬프(JavaScript에서 가져옴)를 포함합니다. http://ircv3.net/irc/를 참조하세요. IRCv3의 클라이언트 지원은 http://ircv3.net/software/clients.html을 참조하세요.
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"
지원되는 IRC 명령:
/cap
, 지원되는 기능./dcc send $nick/$channel $filename
, 이미지 또는 파일 전송。이 기능은 IRC 클라이언트에서 잘 지원되는 /dcc send
명령을 차용합니다. https://en.wikipedia.org/wiki/Direct_Client-to-Client#DCC_SEND를 참조하세요./invite $nick [$channel]
, 그룹에 연락처를 초대합니다./kick $nick
, 그룹 구성원을 삭제합니다. 이 작업을 수행하려면 그룹 리더가 되어야 합니다. 웹 클라이언트의 결함으로 인해 회원 변경에 대한 알림을 받지 못할 수도 있습니다./kill $nick [$reason]
, 해당 클라이언트의 연결을 닫습니다./list
, 그룹 목록을 표시합니다./mode +m
, --join new
모드에서 다시 조인하지 않습니다. /mode -m
되돌리려면/motd
, 이 저장소의 최근 5개 커밋 보기/names
, 채널의 닉네임을 업데이트합니다./part [$channel]
, 더 이상 채널에서 메시지를 받지 않습니다. 단지 /part
명령을 차용하고 그룹을 떠나지 않을 것입니다./query $nick
, $nick
으로 채팅 창을 엽니다./squit $any
, 로그아웃/summon $nick $message
,연락처를 추가하세요./topic topic
, 그룹의 주제를 변경합니다. IRC는 채널 이름 변경을 지원하지 않으므로 이전 이름으로 채널을 떠나 새 이름으로 채널에 가입하게 됩니다./who $channel
, 회원 목록을 확인하세요.MSGTYPE_TEXT
,문자 또는 음성/화상 통화 초대MSGTYPE_IMG
,이미지, [Image] $url
로 표시됨MSGTYPE_VOICE
,오디오, [Voice] $url
로 표시됨MSGTYPE_VIDEO
,동영상, [Video] $url
로 표시됨MSGTYPE_MICROVIDEO
,마이크로 비디오?, [MicroVideo] $url
로 표시됨MSGTYPE_APP
,구독 계정의 기사, 레드 패킷, URL, ..., [App] $title $url
로 표시됨 QQ 이모티콘은 <img class="qqemoji qqemoji0" text="[Smile]_web" src="/zh_CN/htmledition/v2/images/spacer.gif">
로 표시되며, 보낸 메시지의 [Smile]
이 이모티콘으로 대체됩니다. .
이모티콘은 <img class="emoji emoji1f604" text="_web" src="/zh_CN/htmledition/v2/images/spacer.gif">
으로 렌더링됩니다. 각 이모티콘은 IRC 클라이언트에 전달되기 전에 단일 문자로 변환됩니다. 터미널 에뮬레이터는 이모티콘의 너비가 2라는 것을 알지 못할 수 있으므로 이모티콘이 겹칠 수 있습니다.
--config
, 짧은 옵션 -c
, 구성 파일 경로, 구성 참조--http-cert cert.pem
, HTTPS/WebSocket용 TLS 인증서. 인증서+키를 연결하고 단일 PEM 파일을 지정하고 --http-key
생략할 수 있습니다. --http-cert
또는 --http-key
모두 지정되지 않은 경우 HTTP를 사용합니다.--http-key key.pem
, HTTPS/WebSocket용 TLS 키--http-listen 127.1 ::1
, HTTPS/WebSocket 수신 주소를 127.1
및 ::1
로 변경하고 --listen
재정의--http-port 9000
, HTTPS/WebSocket 수신 포트를 9000으로 변경합니다.--http-root .
, injector.js
제공할 루트 디렉터리--http-url https://127.0.0.1:9000
, 지정된 경우 미디어 링크를 https://127.0.0.1:9000/document/$id 로 표시합니다. 그렇지 않다면 https://wx.qq.com/cgi-bin/...
--ignore '&fo[o]' '&bar'
, 이름(그룹 이름에서 생성됨)이 정규식 &fo[o]
또는 &bar
부분적으로 일치하는 채널에 자동으로 참여하지 않습니다.--ignore-display-name 'fo[o]' bar
, 짧은 옵션 -I
, 그룹 이름이 정규식 fo[o]
또는 bar
부분적으로 일치하는 채널에 자동으로 참여하지 않습니다.--ignore-brand
, 구독 계정의 메시지 무시( MM_USERATTRVERIFYFALG_BIZ_BRAND
)--irc-cert cert.pem
, TLS를 통한 IRC용 TLS 인증서. 인증서+키를 연결하고 단일 PEM 파일을 지정하고 --irc-key
생략할 수 있습니다. --irc-cert 또는 --irc-key가 지정되지 않은 경우 일반 IRC를 사용합니다.--irc-key key.pem
, TLS를 통한 IRC용 TLS 키입니다.--irc-listen 127.1 ::1
, IRC 수신 주소를 127.1
및 ::1
로 변경하고 --listen
재정의합니다.--irc-nicks ray ray1
, 클라이언트의 닉을 되돌립니다. SpecialUser
이러한 별명이 없습니다.--irc-password pass
, 연결 비밀번호를 pass
로 설정합니다.--irc-port 6667
, IRC 서버 수신 포트.-j
--join auto
, 기본값: 첫 번째 메시지를 받으면 채널에 참여하고, /part
실행하고 나중에 메시지를 받은 후에는 다시 참여하지 않습니다.--join all
: 모든 채널에 참여--join manual
: 자동 가입 없음--join new
: auto
와 비슷하지만 /part
이후에도 새 메시지가 도착하면 다시 참여합니다.--listen 127.0.0.1
, 짧은 옵션 -l
, IRC/HTTP/WebSocket 수신 주소를 127.0.0.1
로 변경합니다.--logger-ignore '&test0' '&test1'
, 무시된 정규식 목록, 이름이 부분적으로 일치하는 연락처/그룹을 기록하지 않음--logger-mask '/tmp/wechat/$channel/%Y-%m-%d.log'
, 로그 파일 이름 형식--logger-time-format %H:%M
, 서버측 로그 항목의 시간 형식--paste-wait 0.1
, 전송하기 전에 행을 최대 0.1초 동안 보류합니다. 이 간격의 행은 여러 줄 메시지로 압축됩니다.--sasl-password pass
, SASL 비밀번호를 pass
로 설정합니다.--special-channel-prefix
, 선택 사항: &
, !
, #
, ##
, SpecialChannel의 접두사. Quassel은 Quassel을 만족시키기 위해 &
, --special-channel-prefix '##'
접두사가 있는 채널을 지원하지 않는 것 같습니다. /etc/systemd/system/wechatircd.service
템플릿은 wechatircd.service를 참조하세요.
injector.js
의 변경 사항contactFactory#{addContact,deleteContact}
후크하여 연락처 변경 사항을 확인합니다.CtrlServer#onmessage
, 서버의 명령(텍스트/파일 메시지, 그룹에 누군가 초대 등)을 처리합니다.CtrlServer#seenLocalID
는 클라이언트가 자체적으로 보낸 메시지를 수신하지 못하도록 합니다. 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
매일 휴대폰으로 QR 코드를 스캔할 수 없다면 无需每日扫码的IRC版微信와 QQ:wechatircd, webqqircd를 참조하세요.
일부 특수 계정의 UserName
에는 @
접두사가 없습니다: newsapp,fmessage,filehelper,weibo,qqmail,fmessage
。표준 계정의 UserName
@
로 시작합니다. 그룹의 UserName
@@
으로 시작합니다. UserName
세션마다 다릅니다. Uin
고유 식별자처럼 보이지만 대부분의 경우 그 값은 0입니다. 그룹의 OwnerUin
은 소유자의 Uin
이지만 대부분의 경우 Uin
은 0입니다.
내 계정
angular . element ( document . body ) . scope ( ) . account
모든 연락처 목록
angular . element ( $ ( '#navContact' ) [ 0 ] ) . scope ( ) . allContacts
그룹에서 구성원 삭제
var injector = angular . element ( document ) . injector ( )
# 这里获取了chatroomFactory,还可用于获取其他factory、service、controller等
var chatroomFactory = injector . get ( 'chatroomFactory' )
# 设置其中的`room`与`userToRemove`
chatroomFactory . delMember ( room . UserName , userToRemove . UserName ) `
현재 채팅에 메시지 보내기
angular . element ( 'pre:last' ) . scope ( ) . editAreaCtn = "Hello,微信" ;
angular . element ( 'pre:last' ) . scope ( ) . sendTextMessage ( ) ;
매일 휴대폰으로 QR 코드를 스캔할 수 없다면 서버에서 브라우저와 wechatircd를 실행할 수 있습니다.
chromium --user-data-dir=$HOME/.config/chromium-wechatircd
사용하여 새 브라우저 사용자 프로필을 생성하고 앞서 언급한 구성( injector.js
, Tampermonkey, injector.user.js
에 대한 인증서)을 수행한 다음 브라우저.xorg-server-xvfb
)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
, 스크린샷을 찍고 모바일 애플리케이션으로 QR 코드를 스캔하세요.VNC를 사용하여 브라우저와 상호 작용할 수 있습니다.
x11vnc -localhost -display :99
vncviewer localhost
대안은 x2go입니다. 无需每日扫码的IRC版微信와 QQ:wechatircd, webqqircd를 참조하세요.
모바일 애플리케이션에서 사용자의 On-screen Names
다음 순서로 확인됩니다.
Set Remark and Tag
My Alias in Group
( Group Alias
)(설정된 경우)Name
WeChat ID
연락처 정보는 batchgetcontact
및 webwxsync
API에 제공됩니다. JSON 직렬화는 오해의 소지가 있는 필드 이름을 사용합니다.
contactFactory#addContact
에 있는 WeChat 친구:
.Alias
: 프로필에 있는 Name
.NickName
: WeChat ID
.RemarkName
: Set Remark and Tag
.MemberList
의 WeChat 친구/비연락처:
.DisplayName
: My Alias in Group
.NickName
: 프로필 Name
또는 WeChat ID
한 사용자에 대한 JSON이 반복적으로 반환될 수 있으며 이러한 필드는 모두 비어 있을 수 있습니다. 사용자의 닉네임은 .RemarkName
, .NickName
, .DisplayName
필드에서 비어 있지 않은 첫 번째 값을 찾아서 생성됩니다. 방 연락처가 여러 방을 공유하는 경우 IRC 클라이언트에서 xx now known as yy
볼 수 있습니다.
Uncaught TypeError: angular.extend is not a function
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
vendor_*.js
이후, index_*.js
이전에 실행되어야 합니다. 하지만 TamperMonkey는 Chrome의 한계로 인해 실행 시간을 세밀하게 제어할 수 없습니다.
이 경우 wechatircd.py
에 대한 WebSocket 연결을 닫고 사용자에게 웹페이지를 다시 로드해야 함을 알려야 합니다.
:
:)이 포함될 수 있습니다.PART (Change name)
JOIN
메시지로 인해 주의가 산만해지지 않습니다. 채널 이름은 .NickName
(그룹 이름)에서 생성되며 그룹 이름은 변경될 수 있습니다. UserName
새 세션마다 변경되기 때문에 계정/그룹의 영구 ID를 모릅니다.