简体中文
wechatircd ฉีด JavaScript ( injector.js
) ไปที่ wx.qq.com ซึ่งใช้ WebSocket เพื่อสื่อสารกับเซิร์ฟเวอร์ IRC ( wechatircd.py
) จึงทำให้ไคลเอนต์ IRC ที่เชื่อมต่อกับเซิร์ฟเวอร์สามารถส่งและรับข้อความจาก WeChat ตั้งค่าหัวข้อ เชิญ /ลบสมาชิก, ...
IRC WebSocket HTTPS
IRC client --- wechatircd.py --------- browser ----- wx.qq.com
injector.user.js
injector.js
พูดคุยเรื่อง wechatircd โดยการเข้าร่วม #wechatircd บน freenode หรือกลุ่มผู้ใช้บน Telegram วิดีโอเกี่ยวกับการใช้ WeChat ใน 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 ผ่าน TLS)
หากคุณใช้งานเซิร์ฟเวอร์บนเครื่องอื่น ขอแนะนำให้ตั้งค่า IRC ผ่าน 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
ที่อยู่ IP หรือชื่อโดเมนที่ใช้ให้บริการ injector.js
และ injector.user.js
ควรตรงกับช่อง subjectAlternativeName
Chrome ได้ยกเลิกการสนับสนุนการจับคู่ commonName
ในใบรับรองตั้งแต่เวอร์ชัน 58 ดู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
หากคุณต้องการให้ wechatircd ฟังจากที่อยู่อื่นไฟร์ฟอกซ์
เซิร์ฟเวอร์ให้บริการการเชื่อมต่อ injector.js
และ WebSocket บน 127.0.0.1:9000 โดยค่าเริ่มต้น ซึ่งสามารถแทนที่ได้ด้วย --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;
) เนื่องจากจะเปลี่ยน WebSocket URL ที่กำหนดใน injector.js
ตาม Host:
ที่ระบุโดยเบราว์เซอร์ wechatircd.py
injector.run()
คุณจะเข้าร่วมช่อง +wechat
โดยอัตโนมัติและค้นหารายชื่อผู้ติดต่อของคุณที่นั่น มีคำสั่งบางคำสั่ง:
help
eval
ประเมินนิพจน์ Python เช่น: eval server.nick2special_user
eval server.name2special_room
status
แสดงรายชื่อ/ช่องทางreload_contact __all__
โหลดข้อมูลการติดต่อทั้งหมดใหม่ในกรณีที่ no such nick/channel
ใน privmsgเซิร์ฟเวอร์สามารถผูกกับบัญชี 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
การขยาย server-time
จาก IRC เวอร์ชัน 3.1, 3.2 wechatircd.py
รวมการประทับเวลา (ที่ได้รับจาก JavaScript) ในข้อความเพื่อแจ้งให้ลูกค้า IRC ทราบว่าข้อความดังกล่าวเกิดขึ้นในเวลาที่กำหนด ดู http://ircv3.net/irc/ ดูhttp://ircv3.net/software/clients.html สำหรับการสนับสนุนลูกค้าของ IRCv3
การกำหนดค่าสำหรับ 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
, ส่งรูปภาพหรือไฟล์ คุณสมบัตินี้ยืมคำสั่ง /dcc send
ซึ่งได้รับการสนับสนุนอย่างดีในไคลเอนต์ IRC ดู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 คอมมิตล่าสุดของ repo นี้/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
,บทความจากบัญชีสมัครสมาชิก, Red Packet, 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 โปรดดูที่ 终端模拟器下使用双倍宽度多色Emoji字体
--config
, ตัวเลือกสั้น -c
, พาธไฟล์ config ดูที่ config--http-cert cert.pem
ใบรับรอง TLS สำหรับ HTTPS/WebSocket คุณสามารถต่อใบรับรอง+คีย์ ระบุไฟล์ PEM ไฟล์เดียวและละเว้น --http-key
ใช้ HTTP หากไม่ได้ระบุ --http-cert
หรือ --http-key
--http-key key.pem
คีย์ TLS สำหรับ HTTPS/WebSocket--http-listen 127.1 ::1
เปลี่ยนที่อยู่การฟัง HTTPS/WebSocket เป็น 127.1
และ ::1
แทนที่ --listen
--http-port 9000
เปลี่ยนพอร์ต HTTPS/WebSocket Listen เป็น 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'
อย่าเข้าร่วมช่องอัตโนมัติที่มีชื่อ (สร้างจากชื่อกลุ่ม) ตรงกับ regex &fo[o]
หรือ &bar
บางส่วน--ignore-display-name 'fo[o]' bar
ตัวเลือกสั้น -I
อย่าเข้าร่วมช่องอัตโนมัติที่ชื่อกลุ่มตรงกับ regex fo[o]
หรือ bar
บางส่วน--ignore-brand
ละเว้นข้อความจากบัญชีสมัครสมาชิก ( MM_USERATTRVERIFYFALG_BIZ_BRAND
)--irc-cert cert.pem
ใบรับรอง TLS สำหรับ IRC ผ่าน TLS คุณสามารถเชื่อมต่อใบรับรอง+คีย์ ระบุไฟล์ PEM ไฟล์เดียวและละเว้น --irc-key
ใช้ IRC ธรรมดาหากไม่ได้ระบุ --irc-cert หรือ --irc-key--irc-key key.pem
, คีย์ TLS สำหรับ IRC ผ่าน TLS--irc-listen 127.1 ::1
เปลี่ยนที่อยู่ IRC Listen เป็น 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'
รายการ regex ที่ถูกละเลย อย่าบันทึกผู้ติดต่อ/กลุ่มที่มีชื่อตรงกันบางส่วน--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 มีความสุข ดูเทมเพลตของ /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
บน 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
ถ่ายภาพหน้าจอและสแกนโค้ด 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
ข้อมูลการติดต่อจะได้รับใน APIs batchgetcontact
และ webwxsync
การทำให้เป็นอนุกรม JSON ใช้ชื่อฟิลด์ที่ทำให้เข้าใจผิด
เพื่อน WeChat ใน contactFactory#addContact
:
.Alias
: Name
ในโปรไฟล์ของเขา/เธอ.NickName
: WeChat ID
.RemarkName
: Set Remark and Tag
เพื่อน WeChat/ไม่ติดต่อใน .MemberList
:
.DisplayName
: My Alias in Group
.NickName
: Name
ในโปรไฟล์ของเขา/เธอหรือ WeChat ID
JSON สำหรับผู้ใช้รายหนึ่งอาจถูกส่งคืนซ้ำๆ และช่องเหล่านี้ทั้งหมดอาจว่างเปล่า ชื่อเล่นของผู้ใช้สร้างขึ้นโดยการค้นหาค่าแรกที่ไม่ว่างเปล่าจากฟิลด์เหล่านี้: .RemarkName
, .NickName
, .DisplayName
คุณอาจเห็น xx now known as yy
ในไคลเอนต์ IRC ของคุณ หากผู้ติดต่อในห้องแชร์หลายห้องกับคุณ
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
การเชื่อมต่อ WebSocket กับ wechatircd.py
ควรปิดในกรณีนี้ ให้ผู้ใช้ทราบว่าควรโหลดหน้าเว็บซ้ำ
:
) บน WindowsPART (Change name)
JOIN
ชื่อช่องถูกสร้างขึ้นจาก .NickName
(ชื่อกลุ่ม) และชื่อกลุ่มอาจมีการเปลี่ยนแปลง ฉันไม่ทราบ ID ถาวรของบัญชี/กลุ่ม เนื่องจาก UserName
มีการเปลี่ยนแปลงในแต่ละเซสชันใหม่