簡體中文
wechatircd 向 wx.qq.com 注入 JavaScript( injector.js
),wx.qq.com 使用 WebSocket 與 IRC 伺服器( wechatircd.py
)通信,從而使連接到伺服器的IRC 用戶端能夠與微信發送和接收訊息、設定主題、邀請/刪除成員,...
IRC WebSocket HTTPS
IRC client --- wechatircd.py --------- browser ----- wx.qq.com
injector.user.js
injector.js
透過加入 freenode 上的 #wechatircd 或 Telegram 上的使用者群組來討論 wechatircd。在WeeChat中使用微信的視頻
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 + WebSocket over TLS)。
如果您在另一台電腦上執行伺服器,建議使用更多選項設定 IRC over TLS 和 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
欄位相符。自版本 58 起,Chrome 已刪除對證書中的commonName
匹配的支援。
鉻/鉻
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:
傳遞給 wechatircd ( proxy_set_header Host $http_host;
),因為它會根據瀏覽器指定的Host:
更改injector.js
中定義的 WebSocket URL。 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
在訊息中包含時間戳記(從 JavaScript 取得),以告訴 IRC 用戶端訊息在給定時間發生。請參閱http://ircv3.net/irc/。有關 IRCv3 的客戶端支持,請參閱http://ircv3.net/software/clients.html。
微信配置:
/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
/dcc send $nick/$channel $filename
,傳送映像或檔案。請參閱 https://en.wikipedia.org/wiki/Direct_Client-to-Client#DCC_SEND。/invite $nick [$channel]
,邀請聯絡人加入群組。/kick $nick
,刪除群組成員。您必須是小組負責人才能執行此操作。由於Web用戶端的缺陷,您可能無法收到會員變更的通知。/kill $nick [$reason]
,導致該客戶端的連線關閉/list
,列出組。/mode +m
,在--join new
模式下不重新加入。 /mode -m
恢復。/motd
,請參閱此 repo 的最新 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
,來自訂閱號碼、紅包、網址等的文章,顯示為[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
,設定檔路徑,請參閱 config--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 似乎不支援帶有前綴的頻道&
, --special-channel-prefix '##'
以使 Quassel 高興請參閱 wechatircd.service 以取得/etc/systemd/system/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
如果你無法忍受每天用手機掃描二維碼,請參閱每日掃碼的IRC版微信和QQ:wechatircd、webqqircd。
部分特殊帳號的UserName
UserName
不含@
前綴: newsapp,fmessage,filehelper,weibo,qqmail,fmessage
@
UserName
的UserName
以@@
開頭。 Uin
看起來Uin
唯一標識符,但大多OwnerUin
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 ( ) ;
如果你不能忍受每天用手機掃描二維碼,你可以在伺服器上運行瀏覽器和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
,截圖並使用行動應用程式掃描二維碼。您可以使用 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
聯絡資訊在 API batchgetcontact
和webwxsync
中給出。 JSON 序列化使用誤導性的欄位名稱。
contactFactory#addContact
中的微信好友:
.Alias
:他/她的個人資料中的Name
.NickName
: WeChat ID
.RemarkName
: Set Remark and Tag
.MemberList
中的微信好友/非聯絡人:
.DisplayName
: My Alias in Group
.NickName
: 個人資料或WeChat ID
中的Name
一個使用者的 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
之前執行。但由於Chrome的限制,TamperMonkey無法精細控制執行時間。
在這種情況下,應關閉與wechatircd.py
的 WebSocket 連接,讓使用者知道他們應該重新載入網頁。
:
PART (Change name)
JOIN
訊息而分心。頻道名稱是從.NickName
(群組名稱)產生的,群組名稱可能會變更。我不知道帳戶/群組的任何持久 ID,因為UserName
在每個新會話中都會更改。