HoneyTalk——我和我女朋友的專屬情侶聊天器
- 2019 年 12 月 26 日
- 筆記
特別爛的Arduino聊天器 聰明的瓦肯人,公眾號:工業光線噓~~聽說有逼格的人都基於Arduino搭建個人聊天室了!
見過爛的 沒見過這麼爛的
當然 這本身就不是什麼主流玩意兒 一些軟件適配做的非常糟糕 也是在情理之中
Arduino聊天室是一個匿名群聊應用 但是今天的應用是一對一 專屬情侶聊天 話不多說 還不快來看看 1 情侶聊天 最重要的是什麼? 當然是隱私 隱私是什麼 隱私就是隱藏在個人心中的私事 由此看來 今天我們在社交軟件上說的 每一句話都掌握在第三方機構中 這還得了


so 我們急需重新定義個人聊天 尤其是情侶聊天 讓人民群眾掌握自己的信息 才是最大的幸福

所以 為了拯救人民於水深火熱之中 今天我(們)重磅推出 C2C聊天應用 HoneyTalk (以下簡稱HT)


HoneyTalk分為 He和She 實際上 HT是偽C2C,真S2C 因為其中一端就是服務端 直接將服務端作為客戶端的方式 繞過了第三方服務器 在最大程度上保護了隱私 所有數據只有對話雙方知道 當然這種方式增加了聯通的複雜性 這是因為以現狀來看 如果你想要聯通任何人 每人既需要服務端用來等待連接 也需要客戶端發起連接 非常不方便 目前看來 只適合情侶聊天這種單一簡單場景 我們先來看看界面

顯而易見
這高貴的0.9透明度
彰顯着年輕人的不拘一格 交互界面非常簡單 其中藍色界面是服務端界面 粉色界面是客戶端界面
1區是對話顯示區
2區是消息發送區 設計初衷一目了然 男生是服務端 女生是客戶端
但不僅僅如此
你們一定以為
作為服務器的男生一定佔據着主動
而女生則處處被動

確切的說
服務器是否運行確實決定了軟件是否運行
但是
作為寵妻狂魔
我……呃呃呃
emmmm~
不對呀
嘴巴不受控制了
(不好意思,這是未來的事)
反正
我是不可能讓我廣大女朋友吃虧的
只要廣大女朋友
能說服你的直男啟動服務器
我小瓦就能幫你扳回一局
這是為什麼呢?
這是因為我小瓦賦予了
客戶端非常高的權限
什麼意思?
首先
服務器一旦啟動
男生沒有發起對話的權利
這一點很好理解
服務器總是在等待連接
只有當你心愛的女朋友
開心了、傷心了、寂寞了
打開了HT發起連接
服務器才響應啟動對話界面
可是很不幸
今天這個渣男非常不耐煩
企圖關掉對話界面
嘿嘿嘿!
不好意思你沒有這個權限

渣男不但沒有權限
而且這個危險的行為
會立刻被你女朋友知曉


可是如果情況恰恰相反
你的女朋友今天看你不爽
難得理你
她只需輕輕地抬起她的玉指
就可以了結此次對話
所有對話界面都將關閉
可是你還想你儂我儂
怎麼辦?
不要急,辦法總比困難多
這時候
你必須馬上送上

兄弟
聽我一句話
不在乎那點錢
保命要緊
2
介紹完了基本情況
再來點實在的
關於怎麼用的問題
當你下載了文件後
首先你需要注意的是
由於程序需要調用.ico圖標
所以你必須保證.ico圖片與程序在同一目錄下
然後
服務端很簡單
雙擊HoneyTalkHe.exe
等待一段時間,顯示基本信息
之後會隱藏在後台運行
要想關閉得去任務管理器進程界面
而客戶端
雙擊HoneyTalkShe.exe
等待之後出現如下

你需要輸入地址與端口
局域網下
你得去問問渣男地址
端口我已設好
只能是8888
公網下
渣男得去做socket內網穿透
地址與端口視情況而定
每一次填好後然後回車
最後等待連接
成功後就能快樂的私密的聊天了
最後
請不要重複啟動
那樣你將打開一個無用界面
3
送上代碼是我一向的原則
本次練手小項目
結合了Socket網絡編程與GUI編程
這其中有一些坑得親自去踩才有意義
公眾號發送「HT」獲得軟件
或者
github地址:https://github.com/xjc-jim/HoneyTalk
服務端:
#!/usr/bin/env python3 # 文件名:socket_fuWu.py # 開發者:聰明的瓦肯人 # 微信公眾號:工業光線 # 個人主頁:http://www.tech-xjc.com import socket import time import win32api import win32gui from tkinter import * import threading from tkinter import scrolledtext from tkinter.messagebox import showerror from tkinter.messagebox import showinfo #回調函數事件 event = '<Return>' error = '注意:對面的渣男試圖關閉對話框,已被攔截!' # 創建 socket 對象 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #獲取本機電腦名 myname = socket.gethostname() #獲取本機ip myaddr = socket.gethostbyname(myname) print(myname) print(myaddr) s.bind((myaddr,8888)) s.listen(1) print("waiting......") print('5秒後將隱藏窗口!') time.sleep(5) #隱藏控制台窗口 ct = win32api.GetConsoleTitle() hd = win32gui.FindWindow(0,ct) win32gui.ShowWindow(hd,0) class GUI(object): def __init__(self,root): self.root = root self.root.geometry('270x360') self.root.resizable(width=False, height=False) self.root.title('HoneyTalk_HE') self.root.iconbitmap('boy.ico') self.root['background'] = 'lightskyblue' self.root.attributes('-alpha',0.9) # 檢測關閉按鈕 self.root.protocol('WM_DELETE_WINDOW',self.close) self.entry = Entry(self.root) self.entry.place(x=10,y=325) # 檢測回車 self.entry.bind("<Return>",self.callback) self.button = Button(self.root,text = 'send',command = self.sending) self.button.place(x=165,y=322) self.button0 = Button(self.root,text = 'More',command = self.more) self.button0.place(x=215,y=322) self.sock = sock self.out = scrolledtext.ScrolledText(self.root) self.out.place(x=10,y=0,width=250) #設置tag即插入文字的大小,顏色等 self.out.tag_config('tag0',foreground = 'hotpink') self.out.tag_config('tag1',foreground = '#1E90FF') def close(self): try: showerror('警告','渣男好大的膽,你無權關閉對話框!') self.sock.send(error.encode('utf-8')) except: self.sock.send(error.encode('utf-8')) pass return def sending(self): content = self.entry.get() if content != '': self.out.config(state = 'normal') self.out.insert(END,'HE:'+content+'nn','tag1') self.out.see(END) self.out.config(state = 'disable') try: self.sock.send(content.encode('utf-8')) self.entry.delete(0,END) except: sock.shutdown(2) sock.close() pass #回調函數 def callback(self,event): content = self.entry.get() if content != '': self.out.config(state = 'normal') self.out.insert(END,'HE:'+content+'nn','tag1') self.out.see(END) self.out.config(state = 'disable') try: self.sock.send(content.encode('utf-8')) self.entry.delete(0,END) except: pass def more(self): try: showinfo(title='關於',message='1.作者:聰明的瓦肯人 n2.公眾號:工業光線(GongYe_Light) n3.個人主頁:http://www.tech-xjc.com n4.公眾號發送「honeytalk」獲得詳細介紹 n5.網絡問題會造成回復延遲 n6.正常使用時請勿重複啟動 n7.請先啟動該服務器再啟動客戶端 n') except: pass def create(): global gui global root root = Tk() gui = GUI(root) def rec(): while True: try: msg = sock.recv(1024) gui.out.config(state = 'normal') con = bytes.decode(msg) gui.out.insert(END,'SHE:'+con+'nn','tag0') gui.out.see(END) gui.out.config(state = 'disable') except: sock.shutdown(2) sock.close() break # 退出mainloop root.quit() if __name__ == '__main__': while True: sock,addr = s.accept() t1 = threading.Thread(target = rec,name = 'rec') t1.setDaemon(True) create() t1.start() root.mainloop() # 徹底關掉界面 root.destroy()
客戶端:
#!/usr/bin/env python3 # 文件名:socket_keHu.py # 作者:聰明的瓦肯人 # 微信公眾號:工業光線 # 個人主頁:http://www.tech-xjc.com # 導入 socket 等模塊 import os import time import socket import sqlite3 import win32api import win32gui from tkinter import * import threading from tkinter import scrolledtext from tkinter.messagebox import showinfo adr = input('>>請輸入局域網或公網地址:') port = input('>>請輸入局域網或公網端口:') #回調函數事件 event = '<Return>' error = '注意:對面的渣男試圖關閉對話框,已被攔截!' # 創建 socket 對象 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 連接服務,指定主機和端口 try: s.connect((adr, int(port))) print('連接成功!') print('5秒後隱藏窗口!') time.sleep(5) #隱藏控制台窗口 ct = win32api.GetConsoleTitle() hd = win32gui.FindWindow(0,ct) win32gui.ShowWindow(hd,0) except: print('連接失敗,地址端口錯誤或服務器未啟動!') print('5秒後關閉程序') time.sleep(5) os._exit(0) class GUI(object): def __init__(self,root): self.root = root self.root.geometry('270x360') self.root.resizable(width=False, height=False) self.root.title('HoneyTalk_SHE') self.root.iconbitmap('girl.ico') self.root['background'] = 'pink' self.root.attributes('-alpha',0.9) self.root.protocol('WM_DELETE_WINDOW',self.close) self.entry = Entry(self.root) self.entry.place(x=10,y=325) self.entry.bind("<Return>",self.callback) self.button = Button(self.root,text = 'Send',command = self.send) self.button.place(x=165,y=322) self.button0 = Button(self.root,text = 'More',command = self.more) self.button0.place(x=215,y=322) self.out = scrolledtext.ScrolledText(self.root) self.out.place(x=10,y=0,width=250) #設置tag即插入文字的大小,顏色等 self.out.tag_config('tag0',foreground = 'hotpink') self.out.tag_config('tag1',foreground = '#1E90FF') def close(self): #showinfo('提示','確認關閉程序嗎?') s.close() os._exit(0) def send(self): content = self.entry.get() if content != '': self.out.config(state = 'normal') self.out.insert(END,'SHE:'+content+'nn','tag0') self.out.see(END) self.out.config(state = 'disable') try: s.send(content.encode('utf-8')) self.entry.delete(0,END) except: pass def callback(self,event): content = self.entry.get() if content != '': self.out.config(state = 'normal') self.out.insert(END,'SHE:'+content+'nn','tag0') self.out.see(END) self.out.config(state = 'disable') try: s.send(content.encode('utf-8')) self.entry.delete(0,END) except: pass def more(self): showinfo(title='關於',message='1.作者:聰明的瓦肯人 n2.公眾號:工業光線(GongYe_Light) n3.個人主頁:http://www.tech-xjc.com n4.公眾號發送「honeytalk」獲得詳細介紹 n5.網絡問題會造成回復延遲 n6.正常使用時請勿重複啟動 n7.請先啟動服務器再啟動該客戶端 n') def create(): global gui global root root = Tk() gui = GUI(root) root.mainloop() def rec(): while True: try: msg = s.recv(1024) gui.out.config(state = 'normal') con = msg.decode('utf-8') if con == error: gui.out.insert(END,con+'nn') else: gui.out.insert(END,'HE:'+con+'nn','tag1') gui.out.see(END) gui.out.config(state = 'disable') except: gui.out.config(state = 'normal') gui.out.insert(END,'啊哦~!服務器疑似下線!請敦促男友重啟!然後再重啟客戶端!nn') gui.out.see(END) gui.out.config(state = 'disable') break if __name__ == '__main__': t1 = threading.Thread(target = create,name = 'create') t1.start() try: rec() except: pass
over!

